1 package com.teamkonzept.db; 2 3 import java.sql.*; 4 import java.util.*; 5 6 import com.teamkonzept.lib.*; 7 import org.apache.log4j.Category; 8 9 10 15 public abstract class CompositeQuery extends TKQuery 16 { 17 18 19 private static Category cat = Category.getInstance(CompositeQuery.class); 20 21 22 TKVector queries = new TKVector(); 23 24 25 26 boolean defaultParameterPropagation = false; 27 28 34 TKHashtable parameterMapping = new TKHashtable(); 35 36 39 TKHashtable queryResults = new TKHashtable(); 40 41 42 47 TKHashtable requiredParams = new TKHashtable(); 48 49 52 TKQuery relevantQuery = null; 53 54 55 63 protected abstract void initConcreteCompositeQuery() throws SQLException; 64 65 71 public void initQuery( final TKSQLTypeConverter conv, final TKDBConnection tkdbConn, Object queryID){ 72 73 queryParams = new TKHashtable(); 74 75 84 } 85 86 89 public void initQuery( final Connection conn ){ 90 } 92 93 94 97 protected boolean beforeExecution(int i){ 98 return true; 99 } 100 101 104 protected TKQuery registerQuery(Class queryClass)throws SQLException{ 105 TKQuery query = TKDBManager.newQuery(queryClass); 106 107 queries.addElement(query); 109 110 return query; 111 } 112 113 117 protected boolean setInternalParameter(TKQuery destQuery, TKQuery sourceQuery, String destParam, String sourceParam)throws SQLException{ 118 119 if(!new TKVector(((TKPrepQuery)destQuery).paramOrder).contains(destParam)){ 121 throw new SQLException( 122 " Attempt to reference nonexisting query input parameter: " + 123 destParam + " in query " + destQuery + " by CompositeQuery " +this 124 ); 125 } 126 127 Object [] keyList = {destQuery, sourceQuery, destParam}; 129 parameterMapping.put(keyList, sourceParam); 130 131 return true; 132 } 133 134 137 boolean internalParamsPropagation(int i)throws SQLException{ 138 TKQuery destQuery = getQuery(i); 139 TKHashtable sourceQueries = (TKHashtable)parameterMapping.get(destQuery); 140 if(sourceQueries == null){ 142 return true; 143 } 144 Enumeration sourceQueriesEnum = sourceQueries.keys(); 145 while(sourceQueriesEnum.hasMoreElements()){ 146 TKQuery sourceQuery = (TKQuery) sourceQueriesEnum.nextElement(); 147 TKHashtable paramPairs = (TKHashtable)sourceQueries.get(sourceQuery); 148 Enumeration destParams = paramPairs.keys(); 149 while(destParams.hasMoreElements()){ 150 String destParameter = (String ) destParams.nextElement(); 151 String sourceParameter = (String ) paramPairs.get(destParameter); 152 Object parameterValue = getResult(sourceQuery, sourceParameter); 153 destQuery.setQueryParams(destParameter, parameterValue); 154 } 156 } 157 return true; 158 } 159 160 Object getResult(TKQuery query, String resultName)throws SQLException{ 161 ResultSet rs = (ResultSet) getResultSet(query); 162 if(rs != null && hasColumn(query, resultName)){ 163 return rs.getObject(resultName); 164 } 165 else return null; 166 } 167 168 171 ResultSet getResultSet(TKQuery query)throws SQLException{ 172 ResultSet rs = (ResultSet)queryResults.get(query); 173 if(rs == null){ 174 rs = query.fetchResultSet(); 175 if(rs != null && rs.next()){ 176 177 queryResults.put(query, rs); 178 } 179 } 180 return rs; 181 } 182 183 204 211 225 229 TKVector sourceQueries(){ 230 TKVector allSourceQueries = new TKVector(); 231 Enumeration sourceHashes = parameterMapping.elements(); 232 while(sourceHashes.hasMoreElements()){ 233 TKHashtable currSourceHash = (TKHashtable) sourceHashes.nextElement(); 234 Enumeration currSourceQueries = currSourceHash.keys(); 235 while(currSourceQueries.hasMoreElements()){ 236 allSourceQueries.addElement(currSourceQueries.nextElement()); 237 } 238 } 239 return allSourceQueries; 240 } 241 242 243 244 protected void setDefaultParameterPropagation(){ 245 defaultParameterPropagation = true; 246 } 247 248 boolean defaultPropagation(int i)throws SQLException{ 249 if(queries.elementAt(i) instanceof TKNull){ 250 return false; 251 } 252 TKPrepQuery destQ = (TKPrepQuery)getQuery(i); 253 for(int j = 0 ; j<i ; j++){ 254 TKQuery sourceQuery = getQuery(j); 255 if(sourceQuery == null){ 256 continue; 257 } 258 retrieveValues(destQ,sourceQuery); 259 260 } 261 return true; 262 } 263 264 boolean retrieveValues(TKPrepQuery destQ, TKQuery sourceQ)throws SQLException{ 265 TKVector unsetParams = getUnsetParams(destQ); 266 ListIterator unsetParamsIter = unsetParams.listIterator(); 267 while(unsetParamsIter.hasNext()){ 268 String paramName = (String )unsetParamsIter.next(); 269 Object paramVal = getResult(sourceQ, paramName); 270 if(paramVal !=null){ 271 destQ.setQueryParams(paramName, paramVal); 272 cat.debug(" sets " + paramName + " to " + paramVal + " from " + sourceQ); 273 274 275 } 276 277 } 278 return true; 279 } 280 281 282 285 protected void setQueryParams(){ 286 Enumeration queryEnum = queriesEnumeration(); 287 while( queryEnum.hasMoreElements() ){ 288 TKQuery query = (TKQuery) queryEnum.nextElement(); 289 Enumeration names = queryParams.keys(); 290 while( names.hasMoreElements()){ 291 String name = (String ) names.nextElement(); 292 query.setQueryParams(name, queryParams.get(name)); 293 } 294 } 295 } 296 305 306 311 public boolean execute()throws SQLException{ 312 313 initConcreteCompositeQuery(); 314 315 setQueryParams(); 316 317 boolean hasResultset = false; 318 319 320 321 for(int i=0; i< queries.size(); i++){ 322 323 boolean doIt; 326 327 TKQuery query = getQuery(i); 328 if(query == null){ 329 continue; 330 } 331 internalParamsPropagation(i); 333 334 doIt = beforeExecution(i); 336 337 doIt = checkRequiredParameters(query); 338 339 if(doIt){ 340 if(defaultParameterPropagation){ 341 defaultPropagation(i); 342 } 343 cat.debug(" execute " + query ); 344 cat.debug(" with set params: " + query.queryParams); 345 if(query instanceof TKPrepQuery) cat.debug(" and with unset params: " + getUnsetParams((TKPrepQuery)query)); 346 TKVector req= (TKVector)requiredParams.get(query); 347 cat.debug(" requiredParams: "+ (req != null? req.toString(): "NULL")); 348 hasResultset = query.execute(); 349 } 350 else{ 351 queries.set(i, new TKNull()); 352 } 353 355 } 356 return hasResultset; 357 } 358 359 360 public ResultSet fetchResultSet(){ 361 TKQuery query; 362 if(relevantQuery != null){ 363 query = relevantQuery; 364 } 365 else{ 366 query = getQuery(queries.size()-1); 367 } 368 if (query == null) { return null; 370 } 371 return query.fetchResultSet(); 372 } 373 374 375 public void close()throws SQLException{ 376 Enumeration queryEnum = queriesEnumeration(); 377 while(queryEnum.hasMoreElements()){ 378 Object next = queryEnum.nextElement(); 379 if(next instanceof TKQuery){ 380 TKQuery query = (TKQuery) next; 381 query.close(); 382 } 383 } 384 } 385 386 public TKQuery getQuery(int i){ 387 TKQuery query; 388 Object obj = queries.get(i); 389 if(obj == null || obj instanceof TKNull){ 390 return null; 391 } 392 else{ 393 query =(TKQuery) queries.get(i); 394 return query; 395 } 396 } 397 398 public Enumeration queriesEnumeration(){ 399 return queries.elements(); 400 } 401 402 403 public void specClose(){ 404 } 406 407 protected void setRequiredParam(TKQuery query, String [] params){ 409 for(int i = 0; i< params.length; i++){ 410 setRequiredParam(query, params[i]); 411 } 412 } 413 protected void setRequiredParam(TKQuery query, String param){ 414 415 TKVector paramsVector = (TKVector)requiredParams.get(query); 416 if(paramsVector == null){ 417 paramsVector = new TKVector(); 418 requiredParams.put(query,paramsVector); 419 } 420 paramsVector.add(param); 421 } 422 427 428 429 public boolean checkRequiredParameters(TKQuery query){ 430 433 TKVector reqParams = (TKVector) requiredParams.get(query); 434 if(reqParams == null){ 435 return true; 436 } 437 Enumeration reqParamsEnum = reqParams.elements(); 438 while(reqParamsEnum.hasMoreElements()){ 439 String reqParam = (String )reqParamsEnum.nextElement(); 440 441 Object setParam = query.queryParams.get(reqParam); 443 if(setParam == null){ 444 return false; 445 } 446 else if(setParam instanceof TKNull){ 447 return false; 448 } 449 } 450 return true; 451 } 452 453 454 455 public boolean areAllParamsSet(TKPrepQuery query){ 457 return (getUnsetParams(query).size() == 0); 458 } 459 460 461 462 public boolean isParameterSet( String paramName){ 463 if(queryParams == null) return false; 464 Object parameterValue = queryParams.get(paramName); 465 return parameterValue != null && !( parameterValue instanceof TKNull); 466 } 467 468 483 484 public boolean isParameterSet(TKPrepQuery query, String paramName){ 485 Object parameterValue = query.queryParams.get(paramName); 486 return parameterValue != null && !( parameterValue instanceof TKNull); 487 } 488 489 public TKVector getUnsetParams(TKPrepQuery query){ 490 TKVector unsParams = new TKVector(); 491 if(query.paramOrder == null) return unsParams; 492 for(int i=0; i < query.paramOrder.length; i++){ 493 String currParam = query.paramOrder[i]; 494 Object currVal = query.queryParams.get(currParam); 495 if(currVal == null || (currVal instanceof TKNull) ){ 496 unsParams.addElement(currParam); 497 } 498 503 } 504 return unsParams; 505 } 506 507 public boolean hasColumn(TKQuery query, String colName)throws SQLException{ 508 ResultSet rs = getResultSet(query); 509 if(rs != null){ 510 return hasColumn(rs, colName); 511 } 512 else return false; 513 } 514 public boolean hasColumn(ResultSet rs, String colName)throws SQLException{ 515 ResultSetMetaData meta = rs.getMetaData(); 516 int colCount = meta.getColumnCount(); 517 for(int i = 1; i <= colCount;i++){ 518 if(colName.equals(meta.getColumnName(i).toUpperCase())){ 519 return true; 520 } 521 522 } 523 return false; 524 } 525 526 protected Object searchParamInResults(String paramName){ 527 return null; 528 529 } 530 531 public void setRelevantQuery(TKQuery query){ 532 relevantQuery = query; 533 } 534 } 535 | Popular Tags |