KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > pentaho > core > connection > javascript > JavaScriptResultSet


1 /*
2  * Copyright 2006 Pentaho Corporation. All rights reserved.
3  * This software was developed by Pentaho Corporation and is provided under the terms
4  * of the Mozilla Public License, Version 1.1, or any later version. You may not use
5  * this file except in compliance with the license. If you need a copy of the license,
6  * please go to http://www.mozilla.org/MPL/MPL-1.1.txt. The Original Code is the Pentaho
7  * BI Platform. The Initial Developer is Pentaho Corporation.
8  *
9  * Software distributed under the Mozilla Public License is distributed on an "AS IS"
10  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
11  * the license for the specific language governing your rights and limitations.
12  *
13  * @created Sep 12, 2005
14  * @author James Dixon
15  */

16 package org.pentaho.core.connection.javascript;
17
18 import java.text.SimpleDateFormat JavaDoc;
19
20 import org.mozilla.javascript.Context;
21 import org.mozilla.javascript.Function;
22 import org.mozilla.javascript.NativeArray;
23 import org.mozilla.javascript.NativeJavaObject;
24 import org.mozilla.javascript.Scriptable;
25 import org.mozilla.javascript.ScriptableObject;
26 import org.pentaho.core.connection.IPentahoMetaData;
27 import org.pentaho.core.connection.IPentahoResultSet;
28 import org.pentaho.core.connection.memory.MemoryMetaData;
29 import org.pentaho.core.connection.memory.MemoryResultSet;
30 import org.pentaho.core.system.PentahoSystem;
31
32 public class JavaScriptResultSet extends ScriptableObject implements IPentahoResultSet {
33   /**
34    *
35    */

36   private static final long serialVersionUID = -2303805979176976941L;
37   private IPentahoResultSet results;
38   private MemoryResultSet writeableResults;
39   // private IPentahoMetaData metaData;
40
// private List rows;
41
// private Iterator iterator = null;
42
private StringBuffer JavaDoc description;
43
44   public JavaScriptResultSet() {
45     description = new StringBuffer JavaDoc();
46     results = null;
47   }
48
49   public void setResultSet(IPentahoResultSet pResults) {
50     this.results = pResults;
51     if (results instanceof MemoryResultSet) {
52       writeableResults = (MemoryResultSet) results;
53     }
54   }
55
56   public String JavaDoc getClassName() {
57     return "JavaScriptResultSet"; //$NON-NLS-1$
58
}
59
60   public static Object JavaDoc jsFunction_getColumnCount(Context cx, Scriptable thisObj, Object JavaDoc[] args, Function funObj) {
61     if (PentahoSystem.ignored)
62       cx.getClass();
63     if (PentahoSystem.ignored)
64       funObj.getClass();
65     if (args != null && args.length > 0) {
66       return null;
67     }
68     JavaScriptResultSet resultSet = (JavaScriptResultSet) thisObj;
69     return new Integer JavaDoc(resultSet.getColumnCount());
70   }
71
72   public static Object JavaDoc jsFunction_getRowCount(Context cx, Scriptable thisObj, Object JavaDoc[] args, Function funObj) {
73     if (PentahoSystem.ignored)
74       cx.getClass();
75     if (PentahoSystem.ignored)
76       funObj.getClass();
77     if (args != null && args.length > 0) {
78       return null;
79     }
80     JavaScriptResultSet resultSet = (JavaScriptResultSet) thisObj;
81     return new Integer JavaDoc(resultSet.getRowCount());
82   }
83
84   public static Object JavaDoc jsFunction_getValueAt(Context cx, Scriptable thisObj, Object JavaDoc[] args, Function funObj) {
85     if (PentahoSystem.ignored)
86       cx.getClass();
87     if (PentahoSystem.ignored)
88       funObj.getClass();
89     if (args == null) {
90       return null;
91     }
92     if (args.length < 2) {
93       return null;
94     }
95     JavaScriptResultSet resultSet = (JavaScriptResultSet) thisObj;
96     int row = 0, column = 0;
97     try {
98       if (args[0] instanceof Number JavaDoc) {
99         row = ((Number JavaDoc) args[0]).intValue();
100       } else if (args[0] instanceof String JavaDoc) {
101         row = Integer.parseInt((String JavaDoc) args[0]);
102       } else {
103         return null;
104       }
105       if (args[1] instanceof Number JavaDoc) {
106         column = ((Number JavaDoc) args[1]).intValue();
107       } else if (args[1] instanceof String JavaDoc) {
108         column = Integer.parseInt((String JavaDoc) args[1]);
109       } else {
110         return null;
111       }
112     } catch (Exception JavaDoc e) {
113       return null;
114     }
115     return resultSet.getValueAt(row, column);
116   }
117
118   public static Object JavaDoc jsFunction_setColumnHeaders(Context cx, Scriptable thisObj, Object JavaDoc[] args, Function funObj) {
119     if (PentahoSystem.ignored)
120       cx.getClass();
121     if (PentahoSystem.ignored)
122       funObj.getClass();
123     if (args == null) {
124       return null;
125     }
126     if (args.length == 0) {
127       return null;
128     }
129     JavaScriptResultSet resultSet = (JavaScriptResultSet) thisObj;
130     if (args.length == 1 && args[0] instanceof NativeArray) {
131       NativeArray array = (NativeArray) args[0];
132       resultSet.setMetaData(createMetadata(array, thisObj));
133     } else if (args.length == 2 && args[0] instanceof NativeArray && args[1] instanceof NativeArray) {
134       NativeArray array = (NativeArray) args[0];
135       MemoryMetaData metaData = createMetadata(array, thisObj);
136       // create some metadata objects
137
array = (NativeArray) args[1];
138       int length = (int) array.getLength();
139       String JavaDoc columnTypes[] = new String JavaDoc[length];
140       for (int i = 0; i < length; i++) {
141         columnTypes[i] = array.get(i, thisObj).toString();
142       }
143       metaData.setColumnTypes(columnTypes);
144       resultSet.setMetaData(metaData);
145     } else {
146       int length = args.length;
147       String JavaDoc columnHeaders[] = new String JavaDoc[length];
148       for (int i = 0; i < length; i++) {
149         columnHeaders[i] = args[i].toString();
150       }
151       MemoryMetaData metaData = new MemoryMetaData(new String JavaDoc[][] { columnHeaders }, null);
152       resultSet.setMetaData(metaData);
153     }
154     return null;
155   }
156
157   private static MemoryMetaData createMetadata(NativeArray array, Scriptable thisObj) {
158     int length = (int) array.getLength();
159     String JavaDoc columnHeaders[] = new String JavaDoc[length];
160     for (int i = 0; i < length; i++) {
161       columnHeaders[i] = array.get(i, thisObj).toString();
162     }
163     return new MemoryMetaData(new String JavaDoc[][] { columnHeaders }, null);
164   }
165
166   public static Object JavaDoc jsFunction_addRow(Context cx, Scriptable thisObj, Object JavaDoc[] args, Function funObj) {
167     if (PentahoSystem.ignored)
168       cx.getClass();
169     if (PentahoSystem.ignored)
170       funObj.getClass();
171     if (args == null) {
172       return null;
173     }
174     if (args.length == 0) {
175       return null;
176     }
177     // TODO support dates
178
JavaScriptResultSet resultSet = (JavaScriptResultSet) thisObj;
179     if (args.length == 1 && args[0] instanceof NativeArray) {
180       NativeArray array = (NativeArray) args[0];
181       int length = (int) array.getLength();
182       Object JavaDoc row[] = new Object JavaDoc[length];
183       String JavaDoc columnTypes[] = ((MemoryMetaData) resultSet.getMetaData()).getColumnTypes();
184       for (int i = 0; i < length; i++) {
185         Object JavaDoc data = array.get(i, thisObj);
186         if (data == null) {
187           row[i] = null;
188         } else if (columnTypes != null) {
189           if (data instanceof NativeJavaObject) {
190             // see if we can force a conversion
191
Object JavaDoc outputClass = null;
192             if ("string".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
193
outputClass = java.lang.String JavaDoc.class;
194             } else if ("date".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
195
outputClass = java.util.Date JavaDoc.class;
196             } else if ("int".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
197
outputClass = java.lang.Integer JavaDoc.class;
198             } else if ("float".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
199
outputClass = java.lang.Float JavaDoc.class;
200             } else if ("double".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
201
outputClass = java.lang.Double JavaDoc.class;
202             }
203             if ((NativeJavaObject.canConvert(data, outputClass.getClass()))) {
204               row[i] = Context.jsToJava(data, java.lang.String JavaDoc.class);
205             } else {
206               row[i] = null;
207             }
208           }
209           if ("string".equalsIgnoreCase(columnTypes[i])) { //$NON-NLS-1$
210
row[i] = data.toString();
211           } else if ("date".equalsIgnoreCase(columnTypes[i]) && data instanceof String JavaDoc) { //$NON-NLS-1$
212
SimpleDateFormat JavaDoc format = new SimpleDateFormat JavaDoc("yyyy-MM-dd"); //$NON-NLS-1$
213
try {
214               row[i] = format.parse((String JavaDoc) data);
215             } catch (Throwable JavaDoc t) {
216               row[i] = null;
217             }
218           } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof Integer JavaDoc) { //$NON-NLS-1$
219
row[i] = data;
220           } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof Double JavaDoc) { //$NON-NLS-1$
221
row[i] = new Integer JavaDoc(((Double JavaDoc) data).intValue());
222           } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof String JavaDoc) { //$NON-NLS-1$
223
row[i] = new Integer JavaDoc((String JavaDoc) data);
224           } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof Double JavaDoc) { //$NON-NLS-1$
225
row[i] = data;
226           } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof Integer JavaDoc) { //$NON-NLS-1$
227
row[i] = new Double JavaDoc(((Integer JavaDoc) data).floatValue());
228           } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof String JavaDoc) { //$NON-NLS-1$
229
row[i] = new Integer JavaDoc((String JavaDoc) data);
230           } else if ("double".equalsIgnoreCase(columnTypes[i]) && data instanceof Double JavaDoc) { //$NON-NLS-1$
231
row[i] = data;
232           }
233         } else if (data instanceof NativeJavaObject) {
234           Object JavaDoc obj = ((NativeJavaObject)data).unwrap();
235           row[i] = obj;
236         } else {
237           row[i] = data;
238         }
239       }
240       resultSet.addRow(row);
241     } else {
242       int length = args.length;
243       String JavaDoc row[] = new String JavaDoc[length];
244       for (int i = 0; i < length; i++) {
245         row[i] = args[i].toString();
246       }
247       resultSet.addRow(row);
248     }
249     return null;
250   }
251
252   public void setMetaData(IPentahoMetaData metaData) {
253     results = new MemoryResultSet(metaData);
254     writeableResults = (MemoryResultSet) results;
255     // this.metaData = metaData;
256
// rows = new ArrayList();
257
}
258
259   /* IPentahoResultSet methods */
260   public void addRow(String JavaDoc[] row) {
261     if (writeableResults != null) {
262       writeableResults.addRow(row);
263     }
264     // rows.add( row );
265
if (description.length() < 100) {
266       description.append(row);
267     }
268   }
269
270   public void addRow(Object JavaDoc[] row) {
271     if (writeableResults != null) {
272       writeableResults.addRow(row);
273     }
274     // rows.add( row );
275
if (description.length() < 100) {
276       description.append(row);
277     }
278   }
279
280   public String JavaDoc toString() {
281     if (results.getMetaData().getColumnHeaders() != null) {
282       return results.getMetaData().getColumnHeaders().toString() + description.toString();
283     }
284     return description.toString();
285   }
286
287   public IPentahoMetaData getMetaData() {
288     return results.getMetaData();
289   }
290
291   public Object JavaDoc[] next() {
292     return results.next();
293     /*
294      * if( iterator == null ) { iterator = rows.iterator(); } if( iterator.hasNext() ) { return (Object[]) iterator.next(); } else { return null; }
295      */

296   }
297
298   public void close() {
299     // dispose of the iterator so the rows can be iterated again
300
results.close();
301   }
302
303   public void closeConnection() {
304     close();
305   }
306
307   public void dispose() {
308     close();
309   }
310
311   public boolean isScrollable() {
312     return true;
313   }
314
315   public int getColumnCount() {
316     return results.getMetaData().getColumnCount();
317   }
318
319   public int getRowCount() {
320     return results.getRowCount();
321   }
322
323   public Object JavaDoc getValueAt(int row, int column) {
324     return results.getValueAt(row, column);
325   }
326
327   public IPentahoResultSet memoryCopy() {
328     return results.memoryCopy();
329   }
330
331   public void beforeFirst() {
332     results.beforeFirst();
333   }
334
335   public Object JavaDoc[] getDataColumn(int column) {
336     return results.getDataColumn(column);
337   }
338
339   public Object JavaDoc[] getDataRow(int row) {
340     return results.getDataRow(row);
341   }
342 }
343
Popular Tags