1 23 24 package org.dbforms.event.datalist.dao; 25 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 29 import org.dbforms.config.Constants; 30 import org.dbforms.config.DbFormsConfigRegistry; 31 import org.dbforms.config.Field; 32 import org.dbforms.config.FieldValue; 33 import org.dbforms.config.FieldValues; 34 35 import org.dbforms.dom.DOMFactory; 36 37 import org.dbforms.util.Util; 38 39 import org.w3c.dom.Document ; 40 import org.w3c.dom.Element ; 41 42 import java.net.URL ; 43 44 import java.sql.Connection ; 45 import java.sql.SQLException ; 46 47 import java.util.Hashtable ; 48 import java.util.Iterator ; 49 import java.util.Vector ; 50 51 52 53 58 public class DataSourceXML extends DataSource { 59 private Hashtable keys; 60 private Log logCat = LogFactory.getLog(this.getClass().getName()); 61 private String sqlFilter; 62 private XMLDataResult data; 63 private Object [][] dataObject = null; 64 private FieldValue[] filterConstraint; 65 private FieldValue[] orderConstraint; 66 private FieldValue[] sqlFilterParams; 67 68 69 80 public void setSelect(FieldValue[] filterConstraint, 81 FieldValue[] orderConstraint, 82 String sqlFilter, 83 FieldValue[] sqlFilterParams) { 84 this.filterConstraint = filterConstraint; 85 this.orderConstraint = orderConstraint; 86 this.sqlFilter = sqlFilter; 87 this.sqlFilterParams = sqlFilterParams; 88 } 89 90 91 106 public void doUpdate(Connection con, 107 FieldValues fieldValues, 108 String keyValuesStr) throws SQLException { 109 Integer row = (Integer ) keys.get(keyValuesStr); 110 111 if (row != null) { 112 int r = row.intValue(); 113 Iterator iter = fieldValues.elements(); 114 115 while (iter.hasNext()) { 116 FieldValue fv = (FieldValue) iter.next(); 117 Field f = fv.getField(); 118 data.setItemValue(r, 119 Util.isNull(f.getExpression()) ? f.getName() 120 : f.getExpression(), 121 f.getType(), fv.getFieldValueAsObject()); 122 } 123 124 dataObject[r] = null; 125 } 126 } 127 128 129 138 protected final Object [] getRow(int currRow) throws SQLException { 139 if ((currRow < 0) || (currRow >= size())) { 140 return null; 141 } 142 143 if (dataObject[currRow] == null) { 144 Vector fields = getTable() 145 .getFields(); 146 Object [] objectRow = new Object [fields.size()]; 147 String [] stringRow = new String [fields.size()]; 148 149 for (int i = 0; i < fields.size(); i++) { 150 Field f = (Field) fields.elementAt(i); 151 objectRow[i] = data.getItemValue(currRow, 152 Util.isNull(f.getExpression()) 153 ? f.getName() 154 : f.getExpression(), f.getType()); 155 stringRow[i] = (objectRow[i] != null) ? objectRow[i].toString() 156 : null; 157 } 158 159 String key = getTable() 160 .getKeyPositionString(stringRow); 161 keys.put(key, new Integer (currRow)); 162 dataObject[currRow] = objectRow; 163 } 164 165 return dataObject[currRow]; 166 } 167 168 169 172 protected final void close() { 173 if ((data != null) && data.hasChanged()) { 174 try { 175 String url = getFilePath() + getQuery(); 176 write(url, data.getRoot()); 177 } catch (Exception e) { 178 logCat.error(e); 179 } 180 } 181 182 if (keys != null) { 183 keys.clear(); 184 } 185 186 dataObject = null; 187 } 188 189 190 205 protected final int findStartRow(String startRow) throws SQLException { 206 Integer res = null; 207 208 if (!Util.isNull(startRow)) { 209 res = (Integer ) keys.get(startRow); 210 } 211 212 return (res != null) ? res.intValue() 213 : 0; 214 } 215 216 217 222 protected final void open() throws SQLException { 223 if (dataObject == null) { 224 try { 225 String qry = getQuery(); 226 String url = getFilePath() + qry; 227 228 try { 229 URL u = new URL (url); 230 qry = u.getQuery(); 231 } catch (Exception e) { 232 logCat.info("open", e); 233 } 234 235 Document doc = read(url); 236 237 if (doc != null) { 238 Element elem = doc.getDocumentElement(); 239 data = new XMLDataResult(elem, qry); 240 } 241 } catch (Exception e) { 242 logCat.error("open", e); 243 throw new SQLException (e.getMessage()); 244 } 245 246 keys = new Hashtable (); 247 dataObject = new Object [size()][]; 248 } 249 } 250 251 252 259 protected final int size() throws SQLException { 260 return (data != null) ? data.size() 261 : 0; 262 } 263 264 265 276 protected boolean hasMore(int i) throws SQLException { 277 return (i < size()); 278 } 279 280 281 290 protected Document read(String url) throws Exception { 291 return DOMFactory.instance() 292 .read(url); 293 } 294 295 296 304 protected void write(String url, 305 Element root) throws Exception { 306 DOMFactory.instance() 307 .write(url, root); 308 } 309 310 311 private String getFilePath() throws Exception { 312 return Util.replaceRealPath(getTable().getAlias(), 313 DbFormsConfigRegistry.instance().lookup().getRealPath()); 314 } 315 316 317 private String getQuery() throws SQLException { 318 StringBuffer buf = new StringBuffer (); 319 320 String filter = getWhereClause(); 321 String psqlFilter = getSQLFilter(); 322 323 if (!Util.isNull(filter) || !Util.isNull(sqlFilter)) { 324 buf.append("["); 325 buf.append(filter); 326 327 if (!Util.isNull(psqlFilter)) { 328 if (!Util.isNull(filter)) { 329 buf.append(" and "); 330 } 331 332 buf.append(sqlFilter); 333 } 334 335 buf.append("]"); 336 } 337 338 return buf.toString(); 339 } 340 341 342 private String getSQLFilter() { 343 344 int p1 = 0; 345 int p2 = sqlFilter.indexOf('?', p1); 346 StringBuffer buf = new StringBuffer (); 347 int cnt = 0; 348 349 while (p2 > -1) { 350 buf.append(sqlFilter.substring(p1, p2)); 352 353 if (cnt >= sqlFilterParams.length) { 355 logCat.error("reference to a missing filterValue in " + sqlFilter); 356 357 return null; 358 } 359 360 String value = sqlFilterParams[cnt].getFieldValue(); 362 363 if (!Util.isNull(value)) { 364 buf.append("\""); 366 buf.append(value); 367 buf.append("\""); 368 } 369 370 p1 = p2 + 1; 372 p2 = sqlFilter.indexOf('?', p1); 373 cnt++; 374 } 375 376 buf.append(sqlFilter.substring(p1)); 378 379 return buf.toString(); 380 } 381 382 383 private String getWhereClause() throws SQLException { 384 StringBuffer buf = new StringBuffer (); 385 386 if (!FieldValue.isNull(filterConstraint)) { 387 for (int i = 0; i < filterConstraint.length; i++) { 388 if (i != 0) { 389 if (filterConstraint[i].getLogicalOR()) { 390 buf.append(" or "); 391 } else { 392 buf.append(" and "); 393 } 394 } 395 396 Field f = filterConstraint[i].getField(); 397 buf.append(Util.isNull(f.getExpression()) ? f.getName() 398 : f.getExpression()); 399 400 switch (filterConstraint[i].getOperator()) { 402 case Constants.FILTER_EQUAL: 403 buf.append("="); 404 405 break; 406 407 case Constants.FILTER_NOT_EQUAL: 408 buf.append("!="); 409 410 break; 411 412 case Constants.FILTER_GREATER_THEN: 413 buf.append(">"); 414 415 break; 416 417 case Constants.FILTER_SMALLER_THEN: 418 buf.append("<"); 419 420 break; 421 422 case Constants.FILTER_GREATER_THEN_EQUAL: 423 buf.append(">="); 424 425 break; 426 427 case Constants.FILTER_SMALLER_THEN_EQUAL: 428 buf.append("<="); 429 430 break; 431 } 432 433 buf.append("\""); 434 buf.append(filterConstraint[i].getFieldValueAsObject().toString()); 435 buf.append("\""); 436 } 437 } 438 439 return buf.toString(); 440 } 441 } 442 | Popular Tags |