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