1 16 package org.pentaho.core.connection.javascript; 17 18 import java.text.SimpleDateFormat ; 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 36 private static final long serialVersionUID = -2303805979176976941L; 37 private IPentahoResultSet results; 38 private MemoryResultSet writeableResults; 39 private StringBuffer description; 43 44 public JavaScriptResultSet() { 45 description = new StringBuffer (); 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 getClassName() { 57 return "JavaScriptResultSet"; } 59 60 public static Object jsFunction_getColumnCount(Context cx, Scriptable thisObj, Object [] 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 (resultSet.getColumnCount()); 70 } 71 72 public static Object jsFunction_getRowCount(Context cx, Scriptable thisObj, Object [] 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 (resultSet.getRowCount()); 82 } 83 84 public static Object jsFunction_getValueAt(Context cx, Scriptable thisObj, Object [] 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 ) { 99 row = ((Number ) args[0]).intValue(); 100 } else if (args[0] instanceof String ) { 101 row = Integer.parseInt((String ) args[0]); 102 } else { 103 return null; 104 } 105 if (args[1] instanceof Number ) { 106 column = ((Number ) args[1]).intValue(); 107 } else if (args[1] instanceof String ) { 108 column = Integer.parseInt((String ) args[1]); 109 } else { 110 return null; 111 } 112 } catch (Exception e) { 113 return null; 114 } 115 return resultSet.getValueAt(row, column); 116 } 117 118 public static Object jsFunction_setColumnHeaders(Context cx, Scriptable thisObj, Object [] 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 array = (NativeArray) args[1]; 138 int length = (int) array.getLength(); 139 String columnTypes[] = new String [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 columnHeaders[] = new String [length]; 148 for (int i = 0; i < length; i++) { 149 columnHeaders[i] = args[i].toString(); 150 } 151 MemoryMetaData metaData = new MemoryMetaData(new String [][] { 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 columnHeaders[] = new String [length]; 160 for (int i = 0; i < length; i++) { 161 columnHeaders[i] = array.get(i, thisObj).toString(); 162 } 163 return new MemoryMetaData(new String [][] { columnHeaders }, null); 164 } 165 166 public static Object jsFunction_addRow(Context cx, Scriptable thisObj, Object [] 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 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 row[] = new Object [length]; 183 String columnTypes[] = ((MemoryMetaData) resultSet.getMetaData()).getColumnTypes(); 184 for (int i = 0; i < length; i++) { 185 Object data = array.get(i, thisObj); 186 if (data == null) { 187 row[i] = null; 188 } else if (columnTypes != null) { 189 if (data instanceof NativeJavaObject) { 190 Object outputClass = null; 192 if ("string".equalsIgnoreCase(columnTypes[i])) { outputClass = java.lang.String .class; 194 } else if ("date".equalsIgnoreCase(columnTypes[i])) { outputClass = java.util.Date .class; 196 } else if ("int".equalsIgnoreCase(columnTypes[i])) { outputClass = java.lang.Integer .class; 198 } else if ("float".equalsIgnoreCase(columnTypes[i])) { outputClass = java.lang.Float .class; 200 } else if ("double".equalsIgnoreCase(columnTypes[i])) { outputClass = java.lang.Double .class; 202 } 203 if ((NativeJavaObject.canConvert(data, outputClass.getClass()))) { 204 row[i] = Context.jsToJava(data, java.lang.String .class); 205 } else { 206 row[i] = null; 207 } 208 } 209 if ("string".equalsIgnoreCase(columnTypes[i])) { row[i] = data.toString(); 211 } else if ("date".equalsIgnoreCase(columnTypes[i]) && data instanceof String ) { SimpleDateFormat format = new SimpleDateFormat ("yyyy-MM-dd"); try { 214 row[i] = format.parse((String ) data); 215 } catch (Throwable t) { 216 row[i] = null; 217 } 218 } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof Integer ) { row[i] = data; 220 } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof Double ) { row[i] = new Integer (((Double ) data).intValue()); 222 } else if ("int".equalsIgnoreCase(columnTypes[i]) && data instanceof String ) { row[i] = new Integer ((String ) data); 224 } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof Double ) { row[i] = data; 226 } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof Integer ) { row[i] = new Double (((Integer ) data).floatValue()); 228 } else if ("float".equalsIgnoreCase(columnTypes[i]) && data instanceof String ) { row[i] = new Integer ((String ) data); 230 } else if ("double".equalsIgnoreCase(columnTypes[i]) && data instanceof Double ) { row[i] = data; 232 } 233 } else if (data instanceof NativeJavaObject) { 234 Object 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 row[] = new String [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 } 258 259 260 public void addRow(String [] row) { 261 if (writeableResults != null) { 262 writeableResults.addRow(row); 263 } 264 if (description.length() < 100) { 266 description.append(row); 267 } 268 } 269 270 public void addRow(Object [] row) { 271 if (writeableResults != null) { 272 writeableResults.addRow(row); 273 } 274 if (description.length() < 100) { 276 description.append(row); 277 } 278 } 279 280 public String 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 [] next() { 292 return results.next(); 293 296 } 297 298 public void close() { 299 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 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 [] getDataColumn(int column) { 336 return results.getDataColumn(column); 337 } 338 339 public Object [] getDataRow(int row) { 340 return results.getDataRow(row); 341 } 342 } 343 | Popular Tags |