1 package org.apache.slide.projector.processor.sql; 2 3 import java.math.BigDecimal ; 4 import java.sql.Connection ; 5 import java.sql.PreparedStatement ; 6 import java.sql.ResultSet ; 7 import java.sql.ResultSetMetaData ; 8 import java.sql.SQLException ; 9 import java.util.ArrayList ; 10 import java.util.HashMap ; 11 import java.util.List ; 12 import java.util.Map ; 13 14 import javax.naming.InitialContext ; 15 import javax.sql.DataSource ; 16 17 import org.apache.slide.projector.Context; 18 import org.apache.slide.projector.ProcessException; 19 import org.apache.slide.projector.Processor; 20 import org.apache.slide.projector.Result; 21 import org.apache.slide.projector.descriptor.AnyValueDescriptor; 22 import org.apache.slide.projector.descriptor.ArrayValueDescriptor; 23 import org.apache.slide.projector.descriptor.ParameterDescriptor; 24 import org.apache.slide.projector.descriptor.ResultDescriptor; 25 import org.apache.slide.projector.descriptor.ResultEntryDescriptor; 26 import org.apache.slide.projector.descriptor.StateDescriptor; 27 import org.apache.slide.projector.descriptor.StringValueDescriptor; 28 import org.apache.slide.projector.i18n.DefaultMessage; 29 import org.apache.slide.projector.i18n.ErrorMessage; 30 import org.apache.slide.projector.i18n.ParameterMessage; 31 import org.apache.slide.projector.value.ArrayValue; 32 import org.apache.slide.projector.value.MapValue; 33 import org.apache.slide.projector.value.NumberValue; 34 import org.apache.slide.projector.value.StreamableValue; 35 import org.apache.slide.projector.value.StringValue; 36 import org.apache.slide.projector.value.Value; 37 38 41 42 public class SQLProcessor implements Processor { 43 private final static String STATEMENT = "statement"; 44 private final static String VALUES = "values"; 45 private final static String RESULT = "result"; 46 private final static String ROW_COUNT = "row-count"; 47 48 private final static ParameterDescriptor[] parameterDescriptors = new ParameterDescriptor[] { 49 new ParameterDescriptor("statement", new ParameterMessage("update/statement"), new StringValueDescriptor()), 50 new ParameterDescriptor("values", new ParameterMessage("update/values"), new ArrayValueDescriptor(new AnyValueDescriptor()), new ArrayValue(new Value[0])) 51 }; 52 53 private final static ResultDescriptor resultDescriptor = new ResultDescriptor( 54 new StateDescriptor[] { StateDescriptor.OK_DESCRIPTOR }, 55 new ResultEntryDescriptor[] { 56 new ResultEntryDescriptor(ROW_COUNT, new DefaultMessage("sql/row-count"), NumberValue.CONTENT_TYPE, false), 57 new ResultEntryDescriptor(RESULT, new DefaultMessage("sql/result"), ArrayValue.CONTENT_TYPE, false) 58 }); 59 60 public Result process(Map parameter, Context context) throws Exception { 61 String statemenet = parameter.get(STATEMENT).toString(); 62 Value []values = ((ArrayValue)parameter.get(VALUES)).getArray(); 63 javax.naming.Context ctx = new InitialContext (); 64 65 if ( ctx == null ) throw new ProcessException(new ErrorMessage("noInitialContextAvailable")); 66 67 DataSource ds = (DataSource )ctx.lookup("java:comp/env/jdbc/TestDB"); 68 Result result = new Result(StateDescriptor.OK); 69 if (ds != null) { 70 ResultSet resultSet = null; 71 PreparedStatement preparedStatement = null; 72 Connection conn = null; 73 try { 74 conn = ds.getConnection(); 75 if(conn != null) { 76 preparedStatement = conn.prepareStatement(statemenet); 77 for ( int i = 0; i < values.length; i++ ) { 78 if ( values[i] instanceof StringValue ) { 80 preparedStatement.setString(i+1, values[i].toString()); 81 } else if ( values[i] instanceof NumberValue ) { 82 preparedStatement.setInt(i+1, ((NumberValue)values[i]).getNumber().intValue()); 83 } else if ( values[i] instanceof StreamableValue ) { 84 preparedStatement.setBinaryStream(i+1, ((StreamableValue)values[i]).getInputStream(), ((StreamableValue)values[i]).getContentLength()); 85 } 86 } 87 if ( preparedStatement.execute() ) { 88 resultSet = preparedStatement.getResultSet(); 89 List resultSetResources = new ArrayList (); 90 ResultSetMetaData metaData = resultSet.getMetaData(); 91 while ( resultSet.next() ) { 92 Map rowMap = new HashMap (); 93 int columnCount = metaData.getColumnCount(); 94 for ( int i = 0; i < columnCount; i++ ) { 95 String key = metaData.getColumnLabel(i+1); 96 Object object = resultSet.getObject(i+1); 97 if ( object instanceof String ) { 98 rowMap.put(key, new StringValue((String )object)); 99 } else if ( object instanceof Integer ) { 100 rowMap.put(key, new NumberValue((Integer )object)); 101 } 102 } 103 resultSetResources.add(new MapValue(rowMap)); 104 } 105 Value[] resultEntries = new Value[resultSetResources.size()]; 106 result.addResultEntry(RESULT, new ArrayValue((Value[] )resultSetResources.toArray(resultEntries))); 107 } else { 108 result.addResultEntry(ROW_COUNT, new NumberValue(new BigDecimal (preparedStatement.getUpdateCount()))); 109 } 110 conn.close(); 111 } 112 } catch (SQLException e) { 113 throw new ProcessException(new ErrorMessage("sqlException"), e); 114 } finally { 115 if (resultSet != null) { 118 try { resultSet.close(); } catch (SQLException e) { ; } 119 resultSet = null; 120 } 121 if (preparedStatement != null) { 122 try { preparedStatement.close(); } catch (SQLException e) { ; } 123 preparedStatement = null; 124 } 125 if (conn != null) { 126 try { conn.close(); } catch (SQLException e) { ; } 127 conn = null; 128 } 129 } 130 } 131 return result; 132 } 133 134 public ParameterDescriptor[] getParameterDescriptors() { 135 return parameterDescriptors; 136 } 137 138 public ResultDescriptor getResultDescriptor() { 139 return resultDescriptor; 140 } 141 } 142 | Popular Tags |