[wsas-java-dev] svn commit r9402 - in branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice: . beans

svn at wso2.org svn at wso2.org
Thu Nov 1 23:55:36 PDT 2007


Author: sumedha
Date: Thu Nov  1 23:55:28 2007
New Revision: 9402

Added:
   branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/beans/Result.java   (contents, props changed)
Modified:
   branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java
Log:
performance improvements/load tests done @ kaiser POC src/test/resources/many-columns.sql

Modified: branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java
==============================================================================
--- branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java	(original)
+++ branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/DBUtils.java	Thu Nov  1 23:55:28 2007
@@ -33,6 +33,7 @@
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Properties;
@@ -63,6 +64,7 @@
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.wso2.ws.dataservice.beans.CSVQuery;
 import org.wso2.ws.dataservice.beans.ExcelQuery;
+import org.wso2.ws.dataservice.beans.Result;
 
 import au.com.bytecode.opencsv.CSVReader;
 
@@ -198,7 +200,33 @@
 //            rowElementName = "row";             
 //        }	    
 //	}
-	
+
+	/*
+	 * For RDBMS & JNDI connections re-establishing connection, if existing connection is closed.
+	 */
+	private static Connection checkDBConnectionStatus(AxisService axisService,Connection conn) throws AxisFault{
+	    if(log.isDebugEnabled()){
+	        log.debug("checking database connection status");
+	    }	    
+	    if( DBConstants.DATASOURCE_TYPE_RDBMS.equals((String)axisService.getParameterValue(DBConstants.DATASOURCE_TYPE))
+	            || DBConstants.DATASOURCE_TYPE_JNDI.equals((String)axisService.getParameterValue(DBConstants.DATASOURCE_TYPE))){
+	        try {
+                if(conn.isClosed()){
+                    if(log.isDebugEnabled()){
+                        log.debug("Database connection is closed.Trying to re-establish.");
+                    }
+                    return createConnection(axisService);
+                }else{
+                    //existing connection is not closed. Return it.
+                    return conn;
+                }
+            } catch (SQLException e) {
+                log.error("Error occurred while trying to re-establish the database connection.", e);
+                throw new AxisFault("Error occurred while trying to re-establish the database connection.",e);
+            }
+	    }
+	    return null;
+	}
 	private static OMElement getSelectResult(OMElement queryElement, HashMap inputValues,
 			HashMap params, HashMap paramOrder, AxisService axisService, boolean isDML)
 	throws AxisFault {
@@ -211,6 +239,7 @@
 				throw new AxisFault("Database connection not found in Axis Configuration");
 			}
 			conn = (Connection)dbConnectionParam.getValue();
+			conn = checkDBConnectionStatus(axisService, conn);
 			conn.setAutoCommit(false);
 			PreparedStatement preparedStatement =
 				getProcessedPreparedStatement(inputValues, params, paramOrder, conn, sqlQuery);
@@ -223,18 +252,19 @@
 			}
 
 			OMElement result = queryElement.getFirstChildWithName(new QName("result"));
-			String wrapperElementName = result.getAttributeValue(new QName("element"));
-			String rowElementName = result.getAttributeValue(new QName("rowName"));
-			
-			//if wrapper element || row element is not set, set default values to them
-	        if(wrapperElementName == null || wrapperElementName.trim().length() == 0){
-	            //default value
-	            wrapperElementName = "results";             
-	        }
-	        if(rowElementName == null || rowElementName.trim().length() == 0){
-	            //default value
-	            rowElementName = "row";             
-	        } 
+			Result resultObj = new Result(result);
+//			String wrapperElementName = result.getAttributeValue(new QName("element"));
+//			String rowElementName = result.getAttributeValue(new QName("rowName"));
+//			
+//			//if wrapper element || row element is not set, set default values to them
+//	        if(wrapperElementName == null || wrapperElementName.trim().length() == 0){
+//	            //default value
+//	            wrapperElementName = "results";             
+//	        }
+//	        if(rowElementName == null || rowElementName.trim().length() == 0){
+//	            //default value
+//	            rowElementName = "row";             
+//	        } 
 	        
 	        //TODO : need to define a way to get values automatically
 			//getDefaultValuesForResultsWrapper(wrapperElementName,rowElementName);
@@ -244,7 +274,7 @@
 
 			OMFactory fac = OMAbstractFactory.getOMFactory();
 			OMNamespace omNs = fac.createOMNamespace(axisService.getTargetNamespace(), "data");
-			resultElement = fac.createOMElement(wrapperElementName, omNs);
+			resultElement = fac.createOMElement(resultObj.getResultWrapper(), omNs);
 
 			if (isDML) {
 				resultElement
@@ -255,12 +285,21 @@
 				if ( !axisService.isElementFormDefault()) {
 					omNs =fac.createOMNamespace("", "data"); 
 				}
+				
+				//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);
+                }
+				
 				while (rs.next()) {
 					HashMap elementValues = new HashMap();
 					int columnCount = rs.getMetaData().getColumnCount();
 
-					OMElement row = fac.createOMElement(rowElementName, omNs);
-					if (rowElementName == null) {
+					OMElement row = fac.createOMElement(resultObj.getRowName(), omNs);
+					if (resultObj.getRowName() == null) {
 						row = resultElement;
 					}
 					for (int i = 1; i <= columnCount; i++) {
@@ -269,22 +308,26 @@
 						elementValues.put(columnName, columnValue);
 					}
 
-					Iterator elements = result.getChildElements();
+					//Iterator elements = result.getChildElements();
 					boolean useAsParamToNextQuery = false;
-					while (elements.hasNext()) {
-						OMElement element = (OMElement) elements.next();
-						if (element.getLocalName().equals("element")) {
-							String displayTagName = element.getAttributeValue(new QName("name"));
-							String resultSetFieldName =
-								element.getAttributeValue(new QName("column"));
+					//while (elements.hasNext()) {
+					for(int a=0;a < resultObj.getDisplayColumnNames().length;a++){
+						//OMElement element = (OMElement) elements.next();
+						if (resultObj.getElementLocalNames()[a].equals("element")) {
+							//String displayTagName = element.getAttributeValue(new QName("name"));
+						    String displayTagName = resultObj.getDisplayColumnNames()[a];
+							//String resultSetFieldName =	element.getAttributeValue(new QName("column"));
+						    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 (resultSetFieldName == null) {
-								resultSetFieldName = element.getAttributeValue(new QName("param"));
-								useAsParamToNextQuery = true;
-							}
+						    
+							//TODO **********
+//						    if (resultSetFieldName == null) {
+//								resultSetFieldName = element.getAttributeValue(new QName("param"));
+//								useAsParamToNextQuery = true;
+//							}
 							String elementValue;
 
 							if (useAsParamToNextQuery) {
@@ -301,12 +344,14 @@
 							} else if (columnDefalut.equals("attribute")) {
 								row.addAttribute(displayTagName, elementValue, omNs);
 							}
-						} else if (element.getLocalName().equals("call-query")) {
+						} 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);
 							row.addChild(rowElement);
 						}
 					}
-					if (rowElementName != null) {
+					if (resultObj.getRowName() != null) {
 						resultElement.addChild(row);
 					}
 				}
@@ -851,7 +896,7 @@
 	    try{
 	    
 		PreparedStatement sqlQuery = conn.prepareStatement(sqlStatement);
-
+		log.debug("Processing prepared statement for SQL " + sqlStatement);
 		Set paramNames = params.keySet();
 		Object pramNameArray[] = paramNames.toArray();
 
@@ -859,7 +904,11 @@
 			paramName = (String) paramOrder.get(new Integer(i + 1));
 			sqlType = (String) params.get(paramName);
 			value = (String) inputs.get(paramName);
+			log.debug("Param name : "+paramName
+			        +" SQL Type : "+sqlType
+			        +" Value : "+value);
 
+			
 			if (sqlType == null) {
 				// Defaults to string
 				sqlQuery.setString(i + 1, value);

Added: branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/beans/Result.java
==============================================================================
--- (empty file)
+++ branches/wsas/java/2.1/commons/data-services/src/main/java/org/wso2/ws/dataservice/beans/Result.java	Thu Nov  1 23:55:28 2007
@@ -0,0 +1,102 @@
+package org.wso2.ws.dataservice.beans;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+
+public class Result {    
+    String resultWrapper = ""; //represents element attribute of result element
+    String rowName = ""; //represents rowName attribute of result element
+    String resultSetColumnNames[];
+    String displayColumnNames[];
+    String elementLocalNames[];
+    
+    public String getResultWrapper() {
+        return resultWrapper;
+    }
+    public void setResultWrapper(String resultWrapper) {
+        this.resultWrapper = resultWrapper;
+    }
+    public String getRowName() {
+        return rowName;
+    }
+    public void setRowName(String rowName) {
+        this.rowName = rowName;
+    }
+    public String[] getResultSetColumnNames() {
+        return resultSetColumnNames;
+    }
+    public void setResultSetColumnNames(String[] resultSetColumnNames) {
+        this.resultSetColumnNames = resultSetColumnNames;
+    }
+    public String[] getDisplayColumnNames() {
+        return displayColumnNames;
+    }
+    public void setDisplayColumnNames(String[] displayColumnNames) {
+        this.displayColumnNames = displayColumnNames;
+    }
+    
+    
+    public String[] getElementLocalNames() {
+        return elementLocalNames;
+    }
+    public void setElementLocalNames(String[] elementLocalNames) {
+        this.elementLocalNames = elementLocalNames;
+    }
+    public Result(OMElement result){
+        String wrapperElementName = result.getAttributeValue(new QName("element"));
+        String rowElementName = result.getAttributeValue(new QName("rowName"));
+        
+        //if wrapper element || row element is not set, set default values to them
+        if(wrapperElementName == null || wrapperElementName.trim().length() == 0){
+            //default value
+            wrapperElementName = "results";             
+        }
+        if(rowElementName == null || rowElementName.trim().length() == 0){
+            //default value
+            rowElementName = "row";             
+        }
+        this.resultWrapper = wrapperElementName;
+        this.rowName = rowElementName;
+        
+        Iterator elements = result.getChildElements();
+        ArrayList displayColumns = new ArrayList();
+        ArrayList resultSetColumns = new ArrayList();
+        ArrayList elementLclNames = new ArrayList();
+        
+        while (elements.hasNext()) {
+            OMElement element = (OMElement) elements.next();
+            String displayTagName = element
+                    .getAttributeValue(new QName("name"));
+            String resultSetFieldName = element.getAttributeValue(new QName(
+                    "column"));
+            displayColumns.add(displayTagName);
+            resultSetColumns.add(resultSetFieldName);
+            elementLclNames.add(element.getLocalName());
+        }
+
+        Object[] objDisplayColumns = displayColumns.toArray();
+        this.displayColumnNames = new String[objDisplayColumns.length];
+        for (int a = 0; a < objDisplayColumns.length; a++) {
+            this.displayColumnNames[a] = (String)objDisplayColumns[a];
+        }
+        
+        Object[] objResultSetColumns = resultSetColumns.toArray();
+        this.resultSetColumnNames = new String[objResultSetColumns.length];
+        for (int a = 0; a < objResultSetColumns.length; a++) {
+            this.resultSetColumnNames[a] = (String)objResultSetColumns[a];
+        }
+        
+        Object[] objElementLocalNames = elementLclNames.toArray();
+        this.elementLocalNames = new String[objElementLocalNames.length];
+        for (int a = 0; a < objElementLocalNames.length; a++) {
+            this.elementLocalNames[a] = (String)objElementLocalNames[a];
+        }
+        
+        
+    }
+
+}




More information about the Wsas-java-dev mailing list