[teiid-commits] teiid SVN: r4366 - trunk/jboss-integration/src/main/java/org/teiid/jboss/rest.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Sat Aug 25 16:38:37 EDT 2012


Author: rareddy
Date: 2012-08-25 16:38:37 -0400 (Sat, 25 Aug 2012)
New Revision: 4366

Modified:
   trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/RestASMBasedWebArchiveBuilder.java
   trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/TeiidRSProvider.java
Log:
TEIID-2158: changing to prepare call, and handling the result as return parameter. Patch by SteveH.

Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/RestASMBasedWebArchiveBuilder.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/RestASMBasedWebArchiveBuilder.java	2012-08-24 21:00:59 UTC (rev 4365)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/RestASMBasedWebArchiveBuilder.java	2012-08-25 20:38:37 UTC (rev 4366)
@@ -32,6 +32,7 @@
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Properties;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
@@ -56,6 +57,7 @@
 import org.teiid.metadata.Procedure;
 import org.teiid.metadata.ProcedureParameter;
 import org.teiid.metadata.Schema;
+import org.teiid.metadata.ProcedureParameter.Type;
 import org.teiid.query.metadata.TransformationMetadata;
 
 
@@ -115,7 +117,7 @@
 	}
     
     private static ArrayList<String> getPathParameters(String uri ) {
-        ArrayList pathParams = new ArrayList();
+        ArrayList<String> pathParams = new ArrayList<String>();
         String param;
         if (uri.contains("{")) { 
             while (uri.indexOf("}") > -1) { 
@@ -255,7 +257,7 @@
 					else if (contentType.equals("plain")) {
 						contentType = "text/plain";
 					}
-			    	buildRestService(modelName, procedure, method, uri, cw, contentType, charSet==null?"US-ASCII":charSet);
+			    	buildRestService(modelName, procedure, method, uri, cw, contentType, charSet);
 			    	hasValidProcedures = true;
 				}
 			}
@@ -316,7 +318,16 @@
 			String method, String uri, ClassWriter cw, String contentType,
 			String charSet) {
 		
-		int paramsSize = procedure.getParameters().size();
+		List<ProcedureParameter> params = new ArrayList<ProcedureParameter>(procedure.getParameters().size());
+		boolean usingReturn = false;
+		for (ProcedureParameter p : procedure.getParameters()) {
+			if (p.getType() == Type.In || p.getType() == Type.InOut) {
+				params.add(p);
+			} else if (p.getType() == Type.ReturnValue && procedure.getResultSet() == null) {
+				usingReturn = true;
+			}
+		}
+		int paramsSize = params.size();
 		MethodVisitor mv;
 		
 		AnnotationVisitor av0;
@@ -355,7 +366,7 @@
     	for (int i = 0; i < paramsSize; i++)
     	{
 		av0 = mv.visitParameterAnnotation(i, "Ljavax/ws/rs/PathParam;", true);
-		av0.visit("value", procedure.getParameters().get(i).getName());
+		av0.visit("value", params.get(i).getName());
 		av0.visitEnd();
 		}
     	
@@ -372,7 +383,7 @@
     	mv.visitVarInsn(ASTORE, paramsSize+1);
     	for (int i = 0; i < paramsSize; i++) {
     		mv.visitVarInsn(ALOAD, paramsSize+1);
-    		mv.visitLdcInsn(procedure.getParameters().get(i).getName());
+    		mv.visitLdcInsn(params.get(i).getName());
     		mv.visitVarInsn(ALOAD, i+1);
     		mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
     		mv.visitInsn(POP);
@@ -382,11 +393,20 @@
     	
     	// send parametr type information the procedure name
     	StringBuilder sb = new StringBuilder();
-    	sb.append(procedure.getFullName()).append("(");
-    	for (ProcedureParameter pp:procedure.getParameters()) {
-    		sb.append(pp.getRuntimeType()).append(",");
+    	sb.append("{ ");
+    	if (usingReturn) {
+    		sb.append("? = ");
     	}
-    	sb.append(")");
+    	sb.append("CALL ");
+    	procedure.getSQLString(sb);
+    	sb.append("(");
+    	for (int i = 0; i < paramsSize; i++) {
+    		if (i > 0) {
+    			sb.append(", ");
+    		}
+    		sb.append("?");
+    	}
+    	sb.append(") }");
     	mv.visitLdcInsn(sb.toString());
     	
     	mv.visitVarInsn(ALOAD, paramsSize+1);

Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/TeiidRSProvider.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/TeiidRSProvider.java	2012-08-24 21:00:59 UTC (rev 4365)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/rest/TeiidRSProvider.java	2012-08-25 20:38:37 UTC (rev 4366)
@@ -25,47 +25,38 @@
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.sql.Blob;
+import java.sql.CallableStatement;
 import java.sql.Clob;
 import java.sql.Connection;
-import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLXML;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.LinkedHashMap;
 
-import org.teiid.core.types.DataTypeManager;
-import org.teiid.core.types.Transform;
+import org.teiid.core.types.BlobType;
 import org.teiid.core.types.TransformationException;
+import org.teiid.core.types.XMLType;
 import org.teiid.core.util.ReaderInputStream;
 import org.teiid.jboss.IntegrationPlugin;
+import org.teiid.query.function.source.XMLSystemFunctions;
+import org.teiid.query.sql.symbol.XMLSerialize;
 
 public abstract class TeiidRSProvider {
 
-    public InputStream execute(String procedureSignature, Map<String, String> parameters, String charSet) throws SQLException {
+    public InputStream execute(String procedureSignature, LinkedHashMap<String, String> parameters, String charSet) throws SQLException {
         Object result = null;
         Connection conn = getConnection();
+        boolean usingReturn = procedureSignature.startsWith("{ ?"); //$NON-NLS-1$
         try {
-        	List<String> paramTypes = getPathTypes(procedureSignature);
-            final String executeStatement = "call " + procedureSignature.substring(0, procedureSignature.indexOf('(')) + (parameters.isEmpty() ? "()" : createParmString(parameters.size())) + ";"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-
-            PreparedStatement statement = conn.prepareStatement(executeStatement);
+        	//TODO: an alternative strategy would be to set the parameters based upon name
+        	// which would also allow for less parameters to be passed than the procedure requires
+        	// however an enhancement would be needed to support named parameters with callable syntax
+        	// alternatively if the end parameters are defaultable, then they can be omitted.
+            CallableStatement statement = conn.prepareCall(procedureSignature);
             if (!parameters.isEmpty()) {
-                int i = 1;
-                for (Object value : parameters.values()) {
-                	try {
-						Transform t = DataTypeManager.getTransform(DataTypeManager.DefaultDataTypes.STRING, paramTypes.get(i-1));
-						if (t != null) {
-							statement.setObject(i++, t.transform(value));
-						}
-						else {
-							statement.setString(i++, (String)value);
-						}
-					} catch (TransformationException e) {
-						throw new SQLException(e);
-					}
+                int i = usingReturn?2:1;
+                for (String value : parameters.values()) {
+					statement.setString(i++, value);
                 }
             }
 
@@ -79,22 +70,38 @@
                 }
                 rs.close();
             }
-            else {
+            else if (!usingReturn){
             	throw new SQLException(IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50092)); 
+            } else {
+            	result = statement.getObject(1);
             }
-
             statement.close();
+            if (result == null) {
+            	return null; //or should this be an empty result?
+            }
             
             if (result instanceof SQLXML) {
+            	if (charSet != null) {
+	            	XMLSerialize serialize = new XMLSerialize();
+	            	serialize.setTypeString("blob"); //$NON-NLS-1$
+	            	serialize.setDeclaration(true);
+	            	serialize.setEncoding(charSet);
+	            	serialize.setDocument(true);
+	            	try {
+						return ((BlobType)XMLSystemFunctions.serialize(serialize, (XMLType)result)).getBinaryStream();
+					} catch (TransformationException e) {
+						throw new SQLException(e);
+					}
+            	}
             	return ((SQLXML)result).getBinaryStream();
             }
             else if (result instanceof Blob) {
             	return ((Blob)result).getBinaryStream();
             }
             else if (result instanceof Clob) {
-            	return new ReaderInputStream(((Clob)result).getCharacterStream(), Charset.forName(charSet));
+            	return new ReaderInputStream(((Clob)result).getCharacterStream(), charSet==null?Charset.defaultCharset():Charset.forName(charSet));
             }
-            return new ByteArrayInputStream(result.toString().getBytes());
+            return new ByteArrayInputStream(result.toString().getBytes(charSet==null?Charset.defaultCharset():Charset.forName(charSet)));
         } finally {
             if (conn != null) {
                 try {
@@ -105,28 +112,6 @@
         }
     }
 
-    protected String createParmString(int paramCount ) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("(?"); //$NON-NLS-1$
-        for (int i = 1; i < paramCount; i++) {
-            sb.append(","); //$NON-NLS-1$
-            sb.append("?"); //$NON-NLS-1$
-        }
-        sb.append(")"); //$NON-NLS-1$
-        return sb.toString();
-    }
-    
-    private ArrayList<String> getPathTypes(String pathStr ) {
-        ArrayList pathParams = new ArrayList();
-        
-        String parms = pathStr.substring(pathStr.indexOf('(')+1, pathStr.indexOf(')'));
-        StringTokenizer st = new StringTokenizer(parms, ","); //$NON-NLS-1$
-        while (st.hasMoreTokens()) {
-        	pathParams.add(st.nextToken());
-        }
-        return pathParams;
-    }    
-    
     protected abstract Connection getConnection() throws SQLException;
 
 }



More information about the teiid-commits mailing list