KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > slide > projector > processor > sql > SQLProcessor


1 package org.apache.slide.projector.processor.sql;
2
3 import java.math.BigDecimal JavaDoc;
4 import java.sql.Connection JavaDoc;
5 import java.sql.PreparedStatement JavaDoc;
6 import java.sql.ResultSet JavaDoc;
7 import java.sql.ResultSetMetaData JavaDoc;
8 import java.sql.SQLException JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.List JavaDoc;
12 import java.util.Map JavaDoc;
13
14 import javax.naming.InitialContext JavaDoc;
15 import javax.sql.DataSource JavaDoc;
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 /**
39  * @version $Revision: 1.4 $
40  */

41
42 public class SQLProcessor implements Processor {
43     private final static String JavaDoc STATEMENT = "statement";
44     private final static String JavaDoc VALUES = "values";
45     private final static String JavaDoc RESULT = "result";
46     private final static String JavaDoc 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 JavaDoc parameter, Context JavaDoc context) throws Exception JavaDoc {
61         String JavaDoc statemenet = parameter.get(STATEMENT).toString();
62         Value []values = ((ArrayValue)parameter.get(VALUES)).getArray();
63         javax.naming.Context JavaDoc ctx = new InitialContext JavaDoc();
64
65         if ( ctx == null ) throw new ProcessException(new ErrorMessage("noInitialContextAvailable"));
66
67         DataSource JavaDoc ds = (DataSource JavaDoc)ctx.lookup("java:comp/env/jdbc/TestDB");
68         Result result = new Result(StateDescriptor.OK);
69         if (ds != null) {
70             ResultSet JavaDoc resultSet = null;
71             PreparedStatement JavaDoc preparedStatement = null;
72             Connection JavaDoc 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                         // FIXME: We need a mapping for every sql type that should be supported
79
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 JavaDoc resultSetResources = new ArrayList JavaDoc();
90                         ResultSetMetaData JavaDoc metaData = resultSet.getMetaData();
91                         while ( resultSet.next() ) {
92                             Map JavaDoc rowMap = new HashMap JavaDoc();
93                             int columnCount = metaData.getColumnCount();
94                             for ( int i = 0; i < columnCount; i++ ) {
95                                 String JavaDoc key = metaData.getColumnLabel(i+1);
96                                 Object JavaDoc object = resultSet.getObject(i+1);
97                                 if ( object instanceof String JavaDoc ) {
98                                     rowMap.put(key, new StringValue((String JavaDoc)object));
99                                 } else if ( object instanceof Integer JavaDoc ) {
100                                     rowMap.put(key, new NumberValue((Integer JavaDoc)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 JavaDoc(preparedStatement.getUpdateCount())));
109                     }
110                     conn.close();
111                 }
112             } catch (SQLException JavaDoc e) {
113                 throw new ProcessException(new ErrorMessage("sqlException"), e);
114             } finally {
115                 // Always make sure result sets and statements are closed,
116
// and the connection is returned to the pool
117
if (resultSet != null) {
118                     try { resultSet.close(); } catch (SQLException JavaDoc e) { ; }
119                     resultSet = null;
120                 }
121                 if (preparedStatement != null) {
122                     try { preparedStatement.close(); } catch (SQLException JavaDoc e) { ; }
123                     preparedStatement = null;
124                 }
125                 if (conn != null) {
126                     try { conn.close(); } catch (SQLException JavaDoc 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