Author: sumedha
Date: Sun Jan 13 20:40:42 2008
New Revision: 12176

Log:

Fix for codegen failure when reusing same result element(complex type) in more 
than one query

Modified:
   
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBConstants.java
   
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBDeployer.java
   
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java

Modified: 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBConstants.java
==============================================================================
--- 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBConstants.java
  (original)
+++ 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBConstants.java
  Sun Jan 13 20:40:42 2008
@@ -39,6 +39,11 @@
        public static final String DB_SERVICE_REPO = 
"local_org.wso2.ws.dataservice.db_service_repo";
        public static final String DB_SERVICE_EXTENSION = 
"local_org.wso2.ws.dataservice.db_service_extension";
        public static final String DB_CONNECTION = 
"org.wso2.ws.dataservice.dbconnection";
+       public static final String NAMESPACE_PREFIX_MAP = 
"org.wso2.ws.dataservice.namespaceprefixmap";
+       public static final String QUERYLEVEL_PREFIX_MAP = 
"org.wso2.ws.dataservice.querylevelprefixmap";
+       public static final String QUERYLEVEL_NAMESPACE_MAP = 
"org.wso2.ws.dataservice.querylevelnamespacemap";
+       public static final String RESULT_PREFIX = "data"; 
+       
     
        public interface DataTypes{
            public static final String CHAR = "CHAR";

Modified: 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBDeployer.java
==============================================================================
--- 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBDeployer.java
   (original)
+++ 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBDeployer.java
   Sun Jan 13 20:40:42 2008
@@ -358,8 +358,10 @@
         }
         DataServiceDocLitWrappedSchemaGenerator schemaGenerator =
                 new 
DataServiceDocLitWrappedSchemaGenerator(axisService,callQueryMap);
-        
schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED);
-        
//schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_QUALIFIED);
+        
//schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED);
+        
//schemaGenerator.setAttrFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED);
+        
schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_QUALIFIED);
+        
schemaGenerator.setAttrFormDefault(Java2WSDLConstants.FORM_DEFAULT_QUALIFIED);
         NamespaceMap map = new NamespaceMap();
         if(baseURI == null){
             map.put(Java2WSDLConstants.AXIS2_NAMESPACE_PREFIX,
@@ -370,9 +372,8 @@
         }
         map.put(Java2WSDLConstants.DEFAULT_SCHEMA_NAMESPACE_PREFIX,
                 Java2WSDLConstants.URI_2001_SCHEMA_XSD);
-        //map.put("ns1", "http://oldcustomers.ws.wso2.org";);
         axisService.setNameSpacesMap(map);
-        axisService.setElementFormDefault(false);
+        //axisService.setElementFormDefault(false);
         schemaGenerator.generateSchema();
         return axisService;
     }

Modified: 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java
==============================================================================
--- 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java  
    (original)
+++ 
trunk/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java  
    Sun Jan 13 20:40:42 2008
@@ -57,6 +57,7 @@
 import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.databinding.utils.BeanUtil;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
@@ -105,11 +106,11 @@
 
                OMElement callQueryElement =
                        operationElement.getFirstChildWithName(new 
QName("call-query"));
-               return getRDBMSResult(callQueryElement, axisService, 
inputs,false);
+               return getRDBMSResult(callQueryElement, axisService, inputs,0);
        }
 
        private static OMElement getRDBMSResult(OMElement callQueryElement, 
AxisService axisService,
-                       HashMap inputs,boolean callFromNestedQuery) {
+                       HashMap inputs,int queryLevel) {
                OMElement resultElement = null;
                OMElement queryElement ;
                try {
@@ -128,6 +129,8 @@
                        // in the spec.
                        // Right now order in which it appears in taken.
                        HashMap paramOrder = new HashMap();
+                       //To keep track of parameter names with original case
+                       HashMap originalParamNames = new HashMap();
                        
                        //parameter type(IN/OUT/INOUT) for stored procedures
                        //For SQL queries, default is IN
@@ -137,19 +140,20 @@
                        while (iParams.hasNext()) {                             
                                OMElement param = (OMElement) iParams.next();
                                String inOutType = param.getAttributeValue(new 
QName("type"));
-                               //OUT params are used for stored procedures only
-                               //if(!("OUT".equals(inOutType))){
+
                                        String paramName = 
param.getAttributeValue(new QName("name"));
                                        String sqlType = 
param.getAttributeValue(new QName("sqlType"));                         
                                        //default is IN type
                                        if(inOutType == null){
                                                inOutType = "IN";
                                        }
+                                       
                                        params.put(paramName.toLowerCase(), 
sqlType);
                                        paramOrder.put(new Integer(position + 
1), paramName.toLowerCase());
+                                       originalParamNames.put(new 
Integer(position + 1), paramName);
                                        paramType.put(paramName.toLowerCase(), 
inOutType);
                                        position++;                             
        
-                               //}
+
                        }
 
                        String query = queryElement.getFirstChildWithName(new 
QName("sql")).getText();
@@ -160,18 +164,18 @@
 
                        if (firstPartOfSQL.equalsIgnoreCase("SELECT")) {
                                resultElement =
-                                       getSelectResult(queryElement, inputs, 
params, paramOrder,paramType, axisService, false,callFromNestedQuery);
+                                       getSelectResult(queryElement, inputs, 
params, paramOrder,originalParamNames,paramType, axisService, false,queryLevel);
 
                        } else if (firstPartOfSQL.equalsIgnoreCase("INSERT")
                                        || 
firstPartOfSQL.equalsIgnoreCase("UPDATE")
                                        || 
firstPartOfSQL.equalsIgnoreCase("DELETE")
                                        || 
firstPartOfSQL.equalsIgnoreCase("CREATE")) {
-                               resultElement = getSelectResult(queryElement, 
inputs, params, paramOrder,paramType, axisService, true,callFromNestedQuery);
+                               resultElement = getSelectResult(queryElement, 
inputs, params, paramOrder,originalParamNames,paramType, axisService, 
true,queryLevel);
 
                        }else {
                                //This can be a stored procedure call
                                resultElement =
-                                       getStoredProcedureResult(queryElement, 
inputs, params, paramOrder,paramType, axisService,callFromNestedQuery);
+                                       getStoredProcedureResult(queryElement, 
inputs, params, paramOrder,originalParamNames,paramType, 
axisService,queryLevel);
 
                        }
                } catch (Exception e) {
@@ -250,13 +254,15 @@
        }
        
        private static OMElement getStoredProcedureResult(OMElement 
queryElement,HashMap inputValues,
-                       HashMap params, HashMap paramOrder,HashMap paramType, 
AxisService axisService
-                       ,boolean callFromNestedQuery)
+                       HashMap params, HashMap paramOrder,HashMap 
originalParamNames,HashMap paramType, AxisService axisService
+                       ,int queryLevel)
        throws AxisFault{
                OMElement resultElement = null;
                Connection conn = null;
                boolean noResultSet = false;
                String elementValue;
+               boolean hasResponse = true;
+               OMNamespace omNs = null;
                String sqlQuery = queryElement.getFirstChildWithName(new 
QName("sql")).getText();
                try {
                        Parameter dbConnectionParam = 
axisService.getParameter(DBConstants.DB_CONNECTION);  
@@ -267,7 +273,8 @@
                        conn = checkDBConnectionStatus(axisService, conn);
                        conn.setAutoCommit(false);
                        CallableStatement cs = 
(CallableStatement)getProcessedPreparedStatement
-                       (inputValues, params, paramOrder,paramType, conn, 
sqlQuery,"STORED-PROCEDURE");
+                       (inputValues, params, 
paramOrder,originalParamNames,paramType, conn
+                                       , 
sqlQuery,"STORED-PROCEDURE",axisService.getName());
                        
                        ResultSet rs = null;
                        try{
@@ -286,139 +293,191 @@
 
                        //check for out parameters                      
                        OMElement result = 
queryElement.getFirstChildWithName(new QName("result"));
+                       String prefix = null;
+                       String resultElementNS = null;
                        Query query = new 
Query(queryElement.getChildrenWithName(new QName("param")));
-                       Result resultObj = new Result(result);
-
-                       String columnDefalut = result.getAttributeValue(new 
QName("columnDefault"));
-
-                       OMFactory fac = OMAbstractFactory.getOMFactory();
-                       OMNamespace omNs = 
fac.createOMNamespace(axisService.getTargetNamespace(), "data");
-                       //OMNamespace omNs = fac.createOMNamespace("", "data");
-                       resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);
+                       if(result == null){
+                               hasResponse = false;
+                       }
                        
-
-                               //check if wrapper element should be qualified
-                               if ( !axisService.isElementFormDefault()) {
-                                       omNs =fac.createOMNamespace("", 
"data"); 
+                       if(hasResponse){
+                               Result resultObj = new Result(result);  
+                               resultElementNS = result.getAttributeValue(new 
QName("defaultNamespace"));
+                               if(resultElementNS == null || 
resultElementNS.trim().length() == 0){
+                                       resultElementNS = 
axisService.getTargetNamespace();
                                }
+
+                               String columnDefalut = 
result.getAttributeValue(new QName("columnDefault"));
+                               OMFactory fac = 
OMAbstractFactory.getOMFactory();
                                
-                               //put result elements into an array
-                Iterator tmpElements = result.getChildElements();
-                ArrayList tmpElementsArrayList = new ArrayList();
-                while(tmpElements.hasNext()){
-                   OMElement element = (OMElement) tmpElements.next();
-                   tmpElementsArrayList.add(element);
-                }
+                               //get prefix for namespace
+                               HashMap namespacePrefixMap = null;
+                               HashMap queryLevelNamespaceMap = null;
+                               HashMap queryLevelPrefixMap = null;
                                
-                if(! noResultSet && rs != null){
-                       
-                               while (rs.next()) {
-                                       HashMap elementValues = new HashMap();
-                                       int columnCount = 
rs.getMetaData().getColumnCount();
-
-                                       OMElement row = 
fac.createOMElement(resultObj.getRowName(), omNs);
-                                       if (resultObj.getRowName() == null) {
-                                               row = resultElement;
-                                       }
-                                       for (int i = 1; i <= columnCount; i++) {
-                                               String columnName = 
rs.getMetaData().getColumnLabel(i);
-                                               String columnValue = 
rs.getString(columnName);
-                                               elementValues.put(columnName, 
columnValue);
-                                       }
-
-                                       boolean useAsParamToNextQuery = false;
-                                       for(int a=0;a < 
resultObj.getDisplayColumnNames().length;a++){
-                                               //can be one of 
'element','attribute','text','link' or 'header' 
-                                               String outPutElementType = 
resultObj.getElementLocalNames()[a];
-                                               
-                                               if 
(outPutElementType.equals("element")
-                                                               || 
outPutElementType.equals("attribute")) {
-                                                   String displayTagName = 
resultObj.getDisplayColumnNames()[a];
-                                                   String resultSetFieldName = 
resultObj.getResultSetColumnNames()[a];
-
-                                                       // This means,the 
parameter is not part of the
-                                                       // resultset. i.e. it 
is being passed from user's
-                                                       // parameters.          
                                            
-
-                                                       if 
(useAsParamToNextQuery) {
-                                                               elementValue = 
(String) params.get(resultSetFieldName);
-                                                               
elementValues.put(resultSetFieldName, elementValue);
-                                                       } else {
-                                                               elementValue = 
(String) elementValues.get(resultSetFieldName);
-                                                       }
-                                                       
-                                                       if(elementValue == 
null){
-                                                               //This could be 
a OUT parameter of a stored procedure
-                                                                       
elementValue = setOutparameterValue(cs, query,resultSetFieldName);              
                                                
-                                                       }
-
-                                                       if 
(outPutElementType.equals("element")) {
-                                                               OMElement 
rowElement = fac.createOMElement(displayTagName, omNs);
-                                                               
rowElement.addChild(fac.createOMText(rowElement, elementValue));
-                                                               
row.addChild(rowElement);
-                                                       } else if 
(outPutElementType.equals("attribute")) {
-                                                               
row.addAttribute(displayTagName, elementValue, omNs);
-                                                       }
-                                               } else if 
(resultObj.getElementLocalNames()[a].equals("call-query")) {
-                                                   OMElement element = 
(OMElement)tmpElementsArrayList.get(a);
-                                                       OMElement rowElement = 
getRDBMSResult(element, axisService, elementValues,true);
-                                                       
row.addChild(rowElement);
-                                               }
-                                       }
-                                       if (resultObj.getRowName() != null) {
-                                               resultElement.addChild(row);
-                                       }
-                               }                       
-                }else{
-                       //No resultset, only out parameters are there.
-                       OMElement row = null;
-                       if(resultObj.getRowName() != null){
-                               //row name is OPTIONAL
-                               row = 
fac.createOMElement(resultObj.getRowName(), omNs);        
-                       }
+                               
if(axisService.getParameterValue(DBConstants.NAMESPACE_PREFIX_MAP)!= null){
+                                       namespacePrefixMap = 
(HashMap)axisService.getParameterValue(DBConstants.NAMESPACE_PREFIX_MAP);
+                                       queryLevelNamespaceMap = 
(HashMap)axisService.getParameterValue(DBConstants.QUERYLEVEL_NAMESPACE_MAP);
+                                       queryLevelPrefixMap = 
(HashMap)axisService.getParameterValue(DBConstants.QUERYLEVEL_PREFIX_MAP);
                                        
-                                       //if (resultObj.getRowName() == null) {
-                                       //      row = resultElement;
-                                       //}
-                       
-                       for(int a=0;a < 
resultObj.getDisplayColumnNames().length;a++){
-                               if 
(resultObj.getElementLocalNames()[a].equals("element")) {
-                                                   String displayTagName = 
resultObj.getDisplayColumnNames()[a];
-                                                   String resultSetFieldName = 
resultObj.getResultSetColumnNames()[a];
-                                                   elementValue = 
setOutparameterValue(cs, query, resultSetFieldName);
-                                                   
-                                                       if (columnDefalut == 
null || columnDefalut.equals("element")) {
-                                                               OMElement 
rowElement = fac.createOMElement(displayTagName, omNs);
-                                                               
rowElement.addChild(fac.createOMText(rowElement, elementValue));
-                                                               if(row != null){
-                                                                       
row.addChild(rowElement);       
-                                                               }else{
-                                                                       
resultElement.addChild(rowElement);
-                                                               }
-                                                               
-                                                       } else if 
(columnDefalut.equals("attribute")) {
-                                                               if(row != null){
-                                                                       
row.addAttribute(displayTagName, elementValue, omNs);   
-                                                               }else{
-                                                                       
resultElement.addAttribute(displayTagName, elementValue, omNs);
-                                                               }               
                                        
-                                                       }                       
                            
-                               }                               
-                       }
-                       if(row != null){
-                               resultElement.addChild(row);
-                       }                       
-                }
+                                       prefix = 
(String)namespacePrefixMap.get(resultElementNS);
+                                       if(prefix == null){
+                                               prefix = 
DBConstants.RESULT_PREFIX+BeanUtil.getUniquePrefix();
+                                               
namespacePrefixMap.put(resultElementNS, prefix);
+                                               queryLevelNamespaceMap.put(new 
Integer(queryLevel), resultElementNS);
+                                               queryLevelPrefixMap.put(new 
Integer(queryLevel), prefix);
+                                       }
+                               }else{
+                                       namespacePrefixMap = new HashMap();
+                                       queryLevelNamespaceMap = new HashMap();
+                                       queryLevelPrefixMap = new HashMap();
+                                       
+                                       prefix = 
DBConstants.RESULT_PREFIX+BeanUtil.getUniquePrefix();
+                                       namespacePrefixMap.put(resultElementNS, 
prefix);
+                                       queryLevelNamespaceMap.put(new 
Integer(queryLevel), resultElementNS);
+                                       queryLevelPrefixMap.put(new 
Integer(queryLevel), prefix);
+                                       
+                                       
axisService.addParameter(DBConstants.NAMESPACE_PREFIX_MAP,namespacePrefixMap);
+                                       
axisService.addParameter(DBConstants.QUERYLEVEL_NAMESPACE_MAP,queryLevelNamespaceMap);
+                                       
axisService.addParameter(DBConstants.QUERYLEVEL_PREFIX_MAP,queryLevelPrefixMap);
                                        
+                               }
+                               
+                               omNs = fac.createOMNamespace(resultElementNS, 
prefix);  
 
+                               if(queryLevel > 0){
+                                       String previousNS = 
(String)queryLevelNamespaceMap.get(new Integer(queryLevel - 1));
+                                       String previousNSPrefix = 
(String)queryLevelPrefixMap.get(new Integer(queryLevel - 1));
+                                       omNs = 
fac.createOMNamespace(previousNS, previousNSPrefix);
+                                       resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);        
+                               }else{
+                                       resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);
+                               }                       
+
+                                       
+                                       //put result elements into an array
+                       Iterator tmpElements = result.getChildElements();
+                       ArrayList tmpElementsArrayList = new ArrayList();
+                       while(tmpElements.hasNext()){
+                          OMElement element = (OMElement) tmpElements.next();
+                          tmpElementsArrayList.add(element);
+                       }
+                                       
+                       if(! noResultSet && rs != null){
+                               
+                                       while (rs.next()) {
+                                               HashMap elementValues = new 
HashMap();
+                                               int columnCount = 
rs.getMetaData().getColumnCount();
+
+                                               if(queryLevel > 0){
+                                                       omNs = 
fac.createOMNamespace(resultElementNS, prefix);  
+                                               }
+                                               
+                                               OMElement row = 
fac.createOMElement(resultObj.getRowName(), omNs);
+                                               if (resultObj.getRowName() == 
null) {
+                                                       row = resultElement;
+                                               }
+                                               for (int i = 1; i <= 
columnCount; i++) {
+                                                       String columnName = 
rs.getMetaData().getColumnLabel(i);
+                                                       //Some databases return 
columns in different cases
+                                                       columnName = 
columnName.toLowerCase();
+                                                       String columnValue = 
rs.getString(columnName);
+                                                       
elementValues.put(columnName, columnValue);
+                                               }
+
+                                               boolean useAsParamToNextQuery = 
false;
+                                               for(int a=0;a < 
resultObj.getDisplayColumnNames().length;a++){
+                                                       //can be one of 
'element','attribute','text','link' or 'header' 
+                                                       String 
outPutElementType = resultObj.getElementLocalNames()[a];
+                                                       
+                                                       if 
(outPutElementType.equals("element")
+                                                                       || 
outPutElementType.equals("attribute")) {
+                                                           String 
displayTagName = resultObj.getDisplayColumnNames()[a];
+                                                           String 
resultSetFieldName = resultObj.getResultSetColumnNames()[a];
+                                                           resultSetFieldName 
= resultSetFieldName.toLowerCase();
+
+                                                               // This 
means,the parameter is not part of the
+                                                               // resultset. 
i.e. it is being passed from user's
+                                                               // parameters.  
                                                    
+
+                                                               if 
(useAsParamToNextQuery) {
+                                                                       
elementValue = (String) params.get(resultSetFieldName);
+                                                                       
elementValues.put(resultSetFieldName, elementValue);
+                                                               } else {
+                                                                       
elementValue = (String) elementValues.get(resultSetFieldName);
+                                                               }
+                                                               
+                                                               if(elementValue 
== null){
+                                                                       //This 
could be a OUT parameter of a stored procedure
+                                                                       
elementValue = setOutparameterValue(cs, query,resultSetFieldName);              
                                                
+                                                               }
+
+                                                               if 
(outPutElementType.equals("element")) {
+                                                                       
OMElement rowElement = fac.createOMElement(displayTagName, omNs);
+                                                                       
rowElement.addChild(fac.createOMText(rowElement, elementValue));
+                                                                       
row.addChild(rowElement);
+                                                               } else if 
(outPutElementType.equals("attribute")) {
+                                                                       
row.addAttribute(displayTagName, elementValue, omNs);
+                                                               }
+                                                       } else if 
(resultObj.getElementLocalNames()[a].equals("call-query")) {
+                                                           OMElement element = 
(OMElement)tmpElementsArrayList.get(a);
+                                                               OMElement 
rowElement = getRDBMSResult(element, axisService, elementValues,queryLevel+1);
+                                                               queryLevel = 
queryLevel - 1;
+                                                               
row.addChild(rowElement);
+                                                       }
+                                               }
+                                               if (resultObj.getRowName() != 
null) {
+                                                       
resultElement.addChild(row);
+                                               }
+                                       }                       
+                       }else{
+                               //No resultset, only out parameters are there.
+                               OMElement row = null;
+                               if(resultObj.getRowName() != null){
+                                       //row name is OPTIONAL
+                                       row = 
fac.createOMElement(resultObj.getRowName(), omNs);        
+                               }
+                                               
+                                               //if (resultObj.getRowName() == 
null) {
+                                               //      row = resultElement;
+                                               //}
+                               
+                               for(int a=0;a < 
resultObj.getDisplayColumnNames().length;a++){
+                                       if 
(resultObj.getElementLocalNames()[a].equals("element")) {
+                                                           String 
displayTagName = resultObj.getDisplayColumnNames()[a];
+                                                           String 
resultSetFieldName = resultObj.getResultSetColumnNames()[a];
+                                                           elementValue = 
setOutparameterValue(cs, query, resultSetFieldName);
+                                                           
+                                                               if 
(columnDefalut == null || columnDefalut.equals("element")) {
+                                                                       
OMElement rowElement = fac.createOMElement(displayTagName, omNs);
+                                                                       
rowElement.addChild(fac.createOMText(rowElement, elementValue));
+                                                                       if(row 
!= null){
+                                                                               
row.addChild(rowElement);       
+                                                                       }else{
+                                                                               
resultElement.addChild(rowElement);
+                                                                       }
+                                                                       
+                                                               } else if 
(columnDefalut.equals("attribute")) {
+                                                                       if(row 
!= null){
+                                                                               
row.addAttribute(displayTagName, elementValue, omNs);   
+                                                                       }else{
+                                                                               
resultElement.addAttribute(displayTagName, elementValue, omNs);
+                                                                       }       
                                                
+                                                               }               
                                    
+                                       }                               
+                               }
+                               if(row != null){
+                                       resultElement.addChild(row);
+                               }                       
+                       }                               
+                       }               
                } catch (SQLException e) {
                    log.error("Exception occurred while trying to execute the 
SQL statement : "+sqlQuery, e);
                        throw new AxisFault("Exception occurred while trying to 
execute the SQL statement : "+sqlQuery, e);
-               } 
-               
+               }       
                
                finally {
                        try {
-                               if (conn != null && !callFromNestedQuery) {
+                               if (conn != null && queryLevel == 0) {
                                        conn.commit();
                                        conn.close();
                                }
@@ -480,8 +539,8 @@
        
        
        private static OMElement getSelectResult(OMElement queryElement, 
HashMap inputValues,
-                       HashMap params, HashMap paramOrder,HashMap paramType, 
AxisService axisService, boolean isDML
-                       ,boolean callFromNestedQuery)
+                       HashMap params, HashMap paramOrder,HashMap 
originalParamNames,HashMap paramType, AxisService axisService, boolean isDML
+                       ,int queryLevel)
        throws AxisFault {
                OMElement resultElement = null;
                Connection conn = null;
@@ -497,16 +556,20 @@
                try {
                        Parameter dbConnectionParam = 
axisService.getParameter(DBConstants.DB_CONNECTION);  
                        if(dbConnectionParam == null){
-                               throw new AxisFault("Database connection not 
found in Axis Configuration");
+                               throw new 
AxisFault("["+axisService.getName()+"] Database connection not found in Axis 
Configuration");
                        }
                        conn = (Connection)dbConnectionParam.getValue();
                        conn = checkDBConnectionStatus(axisService, conn);      
        
                        
                        conn.setAutoCommit(false);
                        PreparedStatement preparedStatement =
-                               getProcessedPreparedStatement(inputValues, 
params, paramOrder,paramType, conn, sqlQuery,"SQL");
+                               getProcessedPreparedStatement(inputValues, 
params, paramOrder,originalParamNames,paramType
+                                               , conn, 
sqlQuery,"SQL",axisService.getName());
                        int responseCode = -1;
                        ResultSet rs = null;
+                       OMElement result = 
queryElement.getFirstChildWithName(new QName("result"));
+                       String prefix = null;
+                       String resultElementNS = null;
                        
                        if (isDML) {
                                responseCode = 
preparedStatement.executeUpdate();
@@ -514,25 +577,66 @@
                                rs = preparedStatement.executeQuery();
                        }
 
-                       OMElement result = 
queryElement.getFirstChildWithName(new QName("result"));
                        if(result == null){
                                hasResponse = false;
                        }
                        
                        if(hasResponse){
                                resultObj = new Result(result);
+                               resultElementNS = result.getAttributeValue(new 
QName("defaultNamespace"));
+                               if(resultElementNS == null || 
resultElementNS.trim().length() == 0){
+                                       resultElementNS = 
axisService.getTargetNamespace();
+                               }                       
+                               
                        //TODO : need to define a way to get values 
automatically
                                
//getDefaultValuesForResultsWrapper(wrapperElementName,rowElementName);
                                // check ??
                                columnDefault = result.getAttributeValue(new 
QName("columnDefault"));
                                fac = OMAbstractFactory.getOMFactory();
-                               String resultElementNS = 
result.getAttributeValue(new QName("defaultNamespace"));
+
+                               //get prefix for namespace
+                               HashMap namespacePrefixMap = null;
+                               HashMap queryLevelNamespaceMap = null;
+                               HashMap queryLevelPrefixMap = null;
+                               
+                               
if(axisService.getParameterValue(DBConstants.NAMESPACE_PREFIX_MAP)!= null){
+                                       namespacePrefixMap = 
(HashMap)axisService.getParameterValue(DBConstants.NAMESPACE_PREFIX_MAP);
+                                       queryLevelNamespaceMap = 
(HashMap)axisService.getParameterValue(DBConstants.QUERYLEVEL_NAMESPACE_MAP);
+                                       queryLevelPrefixMap = 
(HashMap)axisService.getParameterValue(DBConstants.QUERYLEVEL_PREFIX_MAP);
+                                       
+                                       prefix = 
(String)namespacePrefixMap.get(resultElementNS);
+                                       if(prefix == null){
+                                               prefix = 
DBConstants.RESULT_PREFIX+BeanUtil.getUniquePrefix();                          
+                                               
namespacePrefixMap.put(resultElementNS, prefix);
+                                               queryLevelNamespaceMap.put(new 
Integer(queryLevel), resultElementNS);
+                                               queryLevelPrefixMap.put(new 
Integer(queryLevel), prefix);
+                                       }
+                               }else{
+                                       namespacePrefixMap = new HashMap();
+                                       queryLevelNamespaceMap = new HashMap();
+                                       queryLevelPrefixMap = new HashMap();
+                                       
+
+                                       prefix = 
DBConstants.RESULT_PREFIX+BeanUtil.getUniquePrefix();                          
+                                       namespacePrefixMap.put(resultElementNS, 
prefix);
+                                       queryLevelNamespaceMap.put(new 
Integer(queryLevel), resultElementNS);
+                                       queryLevelPrefixMap.put(new 
Integer(queryLevel), prefix);
+                                       
+                                       
axisService.addParameter(DBConstants.NAMESPACE_PREFIX_MAP,namespacePrefixMap);
+                                       
axisService.addParameter(DBConstants.QUERYLEVEL_NAMESPACE_MAP,queryLevelNamespaceMap);
+                                       
axisService.addParameter(DBConstants.QUERYLEVEL_PREFIX_MAP,queryLevelPrefixMap);
                                        
+                               }
                                
-                               //omNs = 
fac.createOMNamespace(axisService.getTargetNamespace(), "data");
-                               omNs = fac.createOMNamespace(resultElementNS, 
"data");
-                               //OMNamespace omNs = fac.createOMNamespace("", 
"data");
-                               resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);                        
-                               //resultElement = 
fac.createOMElement(resultObj.getResultWrapper(),null);
+                               omNs = fac.createOMNamespace(resultElementNS, 
prefix);  
+
+                               if(queryLevel > 0){
+                                       String previousNS = 
(String)queryLevelNamespaceMap.get(new Integer(queryLevel - 1));
+                                       String previousNSPrefix = 
(String)queryLevelPrefixMap.get(new Integer(queryLevel - 1));
+                                       omNs = 
fac.createOMNamespace(previousNS, previousNSPrefix);
+                                       resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);        
+                               }else{
+                                       resultElement = 
fac.createOMElement(resultObj.getResultWrapper(), omNs);
+                               }                       
                        }
                        
 
@@ -542,12 +646,7 @@
                                        .setText("Your query executed 
successfully. Return code from the database was "
                                                        + responseCode);        
                                
                                }
-                       } else {
-                               //check if wrapper element should be qualified
-                               if (hasResponse && 
!axisService.isElementFormDefault()) {
-                                       omNs =fac.createOMNamespace("", 
"data"); 
-                               }
-                               
+                       } else {                                
                                //put result elements into an array
                 Iterator tmpElements = result.getChildElements();
                 ArrayList tmpElementsArrayList = new ArrayList();
@@ -560,13 +659,19 @@
                                        HashMap elementValues = new HashMap();
                                        int columnCount = 
rs.getMetaData().getColumnCount();
 
+                                       if(queryLevel > 0){
+                                               omNs = 
fac.createOMNamespace(resultElementNS, prefix);  
+                                       }
+                                       
                                        OMElement row = 
fac.createOMElement(resultObj.getRowName(), omNs);
                                        if (resultObj.getRowName() == null) {
                                                row = resultElement;
                                        }
                                        for (int i = 1; i <= columnCount; i++) {
                                                String columnName = 
rs.getMetaData().getColumnLabel(i);
-                                               //Some databases return columns 
in different cases
+                                               //Some database drivers return 
column names in different cases
+                                               //while some return in all 
lower cases, this is a work-a-round
+                                               //to deal with all of those.
                                                columnName = 
columnName.toLowerCase();
                                                String columnValue = 
rs.getString(columnName);
                                                elementValues.put(columnName, 
columnValue);
@@ -611,9 +716,8 @@
                                                                
row.addAttribute(displayTagName, elementValue, omNs);
                                                        }
                                                } else if 
(resultObj.getElementLocalNames()[a].equals("call-query")) {
-                               //OMElement element = (OMElement) 
elements.next();
                                                    OMElement element = 
(OMElement)tmpElementsArrayList.get(a);
-                                                       OMElement rowElement = 
getRDBMSResult(element, axisService, elementValues,true);
+                                                       OMElement rowElement = 
getRDBMSResult(element, axisService, elementValues,queryLevel+1);
                                                        
row.addChild(rowElement);
                                                }
                                        }
@@ -624,14 +728,14 @@
                        }
 
                } catch (SQLException e) {
-                   log.error("Exception occurred while trying to execute the 
SQL statement : "+sqlQuery, e);
-                       throw new AxisFault("Exception occurred while trying to 
execute the SQL statement : "+sqlQuery, e);
+                   log.error("["+axisService.getName()+"] Exception occurred 
while trying to execute the SQL statement : "+sqlQuery, e);
+                       throw new AxisFault("["+axisService.getName()+"] 
Exception occurred while trying to execute the SQL statement : "+sqlQuery, e);
                } 
                
                
                finally {
                        try {
-                               if (conn != null && !callFromNestedQuery) {
+                               if (conn != null && queryLevel == 0) {
                                        conn.commit();
                                        conn.close();
                                }
@@ -641,6 +745,18 @@
                                                "Exception occurred while 
trying to commit.", e);
                        }
                }
+               
+               //Add all namespaces to root level element
+               if(!(queryLevel > 0) && hasResponse){
+                       HashMap allNamespaces = 
(HashMap)axisService.getParameterValue(DBConstants.NAMESPACE_PREFIX_MAP);
+                       Set keySet = allNamespaces.keySet();
+                       Iterator keySetItr = keySet.iterator();
+                       while(keySetItr.hasNext()){
+                               String namespaceURI = (String)keySetItr.next();
+                               String prefix = 
(String)allNamespaces.get(namespaceURI);
+                               resultElement.declareNamespace(namespaceURI, 
prefix);
+                       }                       
+               }
                return resultElement;
        }
 
@@ -1118,6 +1234,7 @@
                        log.error("Error reading CSV file.",e);
                        throw new AxisFault("Error reading CSV file.",e);
                }
+
                return resultElement;
        }
 
@@ -1161,14 +1278,18 @@
        }
 
        public static PreparedStatement getProcessedPreparedStatement(HashMap 
inputs, HashMap params,
-                       HashMap paramOrder,HashMap paramTypes, Connection conn, 
String sqlStatement,String callee) throws AxisFault {
+                       HashMap paramOrder,HashMap originalParamNames,HashMap 
paramTypes, Connection conn
+                       , String sqlStatement
+                       ,String callee
+                       ,String serviceName) throws AxisFault {
            
         String paramName = null;
+        String originalParamName = null;
         String sqlType = null;
         String value = null;
         String paramType = null;
         
-               log.debug("Processing prepared statement for SQL " + 
sqlStatement);
+               log.debug("["+serviceName+"] Processing prepared statement for 
SQL " + sqlStatement);
                Set paramNames = params.keySet();
                Object pramNameArray[] = paramNames.toArray();        
 
@@ -1178,7 +1299,7 @@
                sqlQuery = conn.prepareStatement(sqlStatement);
                        //SQL expects parameters, but not params set in config 
file
                        if(sqlStatement.indexOf("?") > -1 && 
pramNameArray.length == 0){
-                               throw new AxisFault("SQL : "+sqlStatement+" 
expects one or more parameters. " +
+                               throw new AxisFault("["+serviceName+"]  SQL : 
"+sqlStatement+" expects one or more parameters. " +
                                                "But none is mentioned in the 
configuration file.");
                        }               
            }else if("STORED-PROCEDURE".equals(callee)){
@@ -1187,17 +1308,18 @@
 
                for (int i = 0; i < pramNameArray.length; i++) {
                        paramName = (String) paramOrder.get(new Integer(i + 1));
+                       originalParamName = (String) originalParamNames.get(new 
Integer(i + 1));
                        sqlType = (String) params.get(paramName);
                        paramType = (String)paramTypes.get(paramName);
                        value = (String) inputs.get(paramName);
-                       log.debug("Param name : "+paramName
+                       log.debug("["+serviceName+"]  Param name : "+paramName
                                +" SQL Type : "+sqlType
                                +" Value : "+value);
                        
                        if("IN".equals(paramType)){
                            if(value == null || value.trim().length() == 0){
-                           log.error("Empty value found for parameter : 
"+paramName);
-                           throw new AxisFault("Empty value found for 
parameter : "+paramName);                                
+                           log.error("["+serviceName+"]  Empty value found for 
parameter : "+originalParamName);
+                           throw new AxisFault("["+serviceName+"]  Empty value 
found for parameter : "+originalParamName);                             
                            }                           
                        }
                    //work-a-round for setting NULL
@@ -1284,18 +1406,18 @@
                                        
((CallableStatement)sqlQuery).registerOutParameter(i+1, java.sql.Types.TIME);
                                }                               
                        }else{
-                               log.error("Unsupported data type : "+sqlType+" 
as input parameter.");
-                               throw new AxisFault("Found Unsupported data 
type : "+sqlType+" as input parameter.");
+                               log.error("["+serviceName+"]  Unsupported data 
type : "+sqlType+" as input parameter.");
+                               throw new AxisFault("["+serviceName+"]  Found 
Unsupported data type : "+sqlType+" as input parameter.");
                        }
                }
                return sqlQuery;
            }
            catch(NumberFormatException e){
-               log.error("Incorrect value found for parameter : "+paramName, 
e);
-               throw new AxisFault("Incorrect value found for parameter : 
"+paramName, e);
+               log.error("["+serviceName+"]  Incorrect value found for 
parameter : "+originalParamName, e);
+               throw new AxisFault("["+serviceName+"]  Incorrect value found 
for parameter : "+originalParamName, e);
            }catch(SQLException e){
-               log.error("Error occurred while preparing prepared statement 
for sql : "+sqlStatement, e);
-               throw new AxisFault("Error occurred while preparing prepared 
statement for sql : "+sqlStatement, e); 
+               log.error("["+serviceName+"]  Error occurred while preparing 
prepared statement for sql : "+sqlStatement, e);
+               throw new AxisFault("["+serviceName+"]  Error occurred while 
preparing prepared statement for sql : "+sqlStatement, e); 
            }
        }
        

_______________________________________________
Commons-dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/commons-dev

Reply via email to