1 6 package com.nightlabs.ipanema.person.util; 7 8 import java.io.Serializable ; 9 import java.util.ArrayList ; 10 import java.util.HashMap ; 11 import java.util.Iterator ; 12 import java.util.List ; 13 import java.util.Map ; 14 import java.util.Set ; 15 16 import com.nightlabs.ipanema.person.AbstractPersonDataField; 17 import com.nightlabs.ipanema.person.AbstractPersonStructField; 18 import com.nightlabs.ipanema.person.Person; 19 import com.nightlabs.ipanema.person.id.PersonStructFieldID; 20 import com.nightlabs.jdo.search.SearchFilter; 21 import com.nightlabs.jdo.search.SearchFilterItem; 22 23 28 public class PersonSearchFilter extends SearchFilter { 29 30 public static class ResultField implements Serializable { 31 private Class fieldClass; 32 private PersonStructFieldID fieldID; 33 private String personMember; 34 private boolean dataFieldType; 35 36 public ResultField(Class fieldClass, PersonStructFieldID fieldID) { 37 setFieldClass(fieldClass); 38 setFieldID(fieldID); 39 setPersonMember(""); 40 setDataFieldType(true); 41 } 42 43 public ResultField(String personMember) { 44 setPersonMember(""); 45 setFieldClass(null); 46 setFieldID(null); 47 setDataFieldType(false); 48 } 49 50 public Class getFieldClass() { 51 return fieldClass; 52 } 53 public void setFieldClass(Class fieldClass) { 54 this.fieldClass = fieldClass; 55 } 56 public PersonStructFieldID getFieldID() { 57 return fieldID; 58 } 59 public void setFieldID(PersonStructFieldID fieldID) { 60 this.fieldID = fieldID; 61 } 62 public boolean isDataFieldType() { 63 return dataFieldType; 64 } 65 public void setDataFieldType(boolean dataFieldType) { 66 this.dataFieldType = dataFieldType; 67 } 68 public String getPersonMember() { 69 return personMember; 70 } 71 public void setPersonMember(String personMember) { 72 this.personMember = personMember; 73 } 74 } 75 76 private String personType; 77 78 public PersonSearchFilter() { 79 super(CONJUNCTION_DEFAULT); 80 } 81 82 public PersonSearchFilter(int _conjunction) { 83 super(_conjunction); 84 } 85 86 public PersonSearchFilter(int _conjunction, String personType) { 87 this(_conjunction); 88 this.personType = personType; 89 } 90 91 92 95 private List resultFields = new ArrayList (); 96 97 public void addResultPersonStructFieldID(Class resultFieldClass, PersonStructFieldID resultFieldID) { 98 resultFields.add(new ResultField(resultFieldClass, resultFieldID)); 99 } 100 public void addResultField(ResultField resultField) { 101 resultFields.add(resultField); 102 } 103 public void clearResultFields() { 104 resultFields.clear(); 105 } 106 107 protected boolean hasDataFieldTypeResultField() { 108 for (Iterator iter = resultFields.iterator(); iter.hasNext();) { 109 ResultField field = (ResultField) iter.next(); 110 if (field.isDataFieldType()) 111 return true; 112 } 113 return false; 114 } 115 116 protected boolean hasResultFields() { 117 return resultFields.size() > 0; 118 } 119 120 121 122 126 242 243 244 247 protected Class getExtendClass() { 248 return Person.class; 249 } 250 251 252 protected void declarePersonVaraible(StringBuffer vars) { 253 vars.append(Person.class.getName()+" queryPerson"); 254 } 255 256 259 public static final String PERSON_VARNAME = "queryPerson"; 260 261 265 public void setPersonVariableCondition(StringBuffer filter){ 266 filter.append(PERSON_VARNAME+" == this"); 267 } 268 269 270 271 public void addPersonFilterItems(Set imports, StringBuffer vars, StringBuffer filter, StringBuffer params, Map paramMap) { 272 boolean firstItemProcessed = false; 273 Map personFilterItemsPerClass = new HashMap (); 274 275 for (Iterator it = getFilters().iterator(); it.hasNext(); ) { 279 SearchFilterItem searchFilterItem = (SearchFilterItem) it.next(); 280 if (!PersonSearchFilterItem.class.isAssignableFrom(searchFilterItem.getClass())) { 281 continue; 282 } 283 PersonSearchFilterItem item = (PersonSearchFilterItem)searchFilterItem; 284 if (item.isConstraint()) { 285 if (!firstItemProcessed) { firstItemProcessed = true;} 286 } 287 List itemList = (List )personFilterItemsPerClass.get(item.getItemTargetClass()); 288 if (itemList == null) { 289 itemList = new ArrayList (); 290 personFilterItemsPerClass.put(item.getItemTargetClass(),itemList); 291 } 292 itemList.add(item); 293 294 } 295 296 if (!firstItemProcessed) { 297 filter.append("1 == 0"); 301 return; 302 } 303 304 firstItemProcessed = false; 305 306 311 316 filter.append("("); 319 320 if (params.length() > 0) 321 params.append(", "); 322 323 int n = 0; 324 int fieldClassNo = 0; 325 for (Iterator it = personFilterItemsPerClass.entrySet().iterator(); it.hasNext(); ) { 327 Map.Entry entry = (Map.Entry )it.next(); 328 329 Class itemDataFieldClass = (Class )entry.getKey(); 331 if (itemDataFieldClass == null) 332 throw new IllegalArgumentException ("Some PersonSearchFilterItem returned null value in getPersonDataFieldClass()."); 333 if (!AbstractPersonDataField.class.isAssignableFrom(itemDataFieldClass)) 334 throw new IllegalArgumentException ("Some PersonSearchFilterItem did not return an inheritor of AbstractPersonDataField in getPersonDataFieldClass() but instead "+itemDataFieldClass.getName()); 335 vars.append("; "); 336 vars.append(itemDataFieldClass.getName()+" personDataField"+fieldClassNo); 337 338 filter.append("("); 339 filter.append(PERSON_VARNAME+".personDataFields.contains(personDataField"+fieldClassNo+")"); 341 filter.append(" && "); 342 343 344 List itemList = (List )entry.getValue(); 345 for (Iterator iter = itemList.iterator(); iter.hasNext();) { 346 PersonSearchFilterItem item = (PersonSearchFilterItem) iter.next(); 347 348 params.append(String .class.getName()+" personStructBlockOrganisationID"+n); 350 paramMap.put("personStructBlockOrganisationID"+n, item.getPersonStructFieldID().personStructBlockOrganisationID); 351 352 params.append(", "); 353 params.append(String .class.getName()+" personStructBlockID"+n); 354 paramMap.put("personStructBlockID"+n, item.getPersonStructFieldID().personStructBlockID); 355 356 params.append(", "); 357 params.append(String .class.getName()+" personStructFieldOrganisationID"+n); 358 paramMap.put("personStructFieldOrganisationID"+n, item.getPersonStructFieldID().personStructFieldOrganisationID); 359 360 params.append(", "); 361 params.append(String .class.getName()+" personStructFieldID"+n); 362 paramMap.put("personStructFieldID"+n, item.getPersonStructFieldID().personStructFieldID); 363 374 filter.append("("); 377 378 filter.append("personDataField"+fieldClassNo+".personStructBlockOrganisationID == personStructBlockOrganisationID"+n); 380 filter.append(" && "); 381 filter.append("personDataField"+fieldClassNo+".personStructBlockID == personStructBlockID"+n); 382 filter.append(" && "); 383 filter.append("personDataField"+fieldClassNo+".personStructFieldOrganisationID == personStructFieldOrganisationID"+n); 384 filter.append(" && "); 385 filter.append("personDataField"+fieldClassNo+".personStructFieldID == personStructFieldID"+n); 386 388 filter.append(" && "); 390 391 item.appendSubQuery(n, fieldClassNo, imports, vars, filter, params, paramMap); 393 394 filter.append(")"); 395 396 n++; 397 if (iter.hasNext()) { 398 params.append(", "); 400 401 switch (getConjunction()) 402 { 403 case SearchFilter.CONJUNCTION_AND: 404 filter.append(" && "); 405 break; 406 case SearchFilter.CONJUNCTION_OR: 407 filter.append(" || "); 408 break; 409 default: 410 throw new IllegalStateException ("conjunction invalid!"); 411 } 412 } 413 } 414 fieldClassNo++; 415 if (it.hasNext()) { 416 switch (getConjunction()) 417 { 418 case SearchFilter.CONJUNCTION_AND: 419 filter.append(" && "); 420 break; 421 case SearchFilter.CONJUNCTION_OR: 422 filter.append(" || "); 423 break; 424 default: 425 throw new IllegalStateException ("conjunction invalid!"); 426 } 427 } 428 filter.append(")"); 429 430 } 431 filter.append(")"); 432 } 433 434 438 protected void prepareQuery(Set imports, StringBuffer vars, StringBuffer filter, StringBuffer params, Map paramMap, StringBuffer result) { 439 declarePersonVaraible(vars); 440 setPersonVariableCondition(filter); 441 442 filter.append(" && "); 444 if (hasDataFieldTypeResultField()) { 445 filter.append("( ( "); 446 filter.append(" (1 == 2) && ("); 447 if (vars.length() > 0) 448 vars.append("; "); 449 } 450 int n = 0; 451 for (Iterator iter = resultFields.iterator(); iter.hasNext();) { 452 ResultField resultField = (ResultField) iter.next(); 453 if (hasDataFieldTypeResultField()) { 454 imports.add(resultField.getFieldClass()); 455 vars.append(resultField.getFieldClass().getName()+" resultField"+n); 456 if (iter.hasNext()) 457 vars.append("; "); 458 459 if (params.length() > 0) 460 params.append(", "); 461 params.append(String .class.getName()+" resultStructFieldKey"+n); 462 paramMap.put( 463 "resultStructFieldKey"+n, 464 AbstractPersonStructField.getPrimaryKey( 465 resultField.getFieldID().personStructBlockOrganisationID, 466 resultField.getFieldID().personStructBlockID, 467 resultField.getFieldID().personStructFieldOrganisationID, 468 resultField.getFieldID().personStructFieldID 469 )); 470 filter.append("( "+PERSON_VARNAME+".personDataFields.contains(resultField"+n+") && resultField"+n+".structFieldKey == resultStructFieldKey"+n+" )"); 471 if (iter.hasNext()) 472 filter.append(" && "); 473 if (result.length() > 0) 474 result.append(", "); 475 result.append(" resultField"+n); 476 } 477 else { 478 if (result.length() > 0) 479 result.append(", "); 480 result.append(" "+PERSON_VARNAME+"."+resultField.getPersonMember()); 481 } 482 n++; 483 } 484 if (hasDataFieldTypeResultField()) { 485 filter.append(")"); 486 filter.append(") || "); 487 } 488 489 filter.append("("); 491 addPersonFilterItems(imports,vars,filter,params,paramMap); 492 filter.append(")"); 493 if (resultFields.size() > 0) 494 filter.append(")"); 495 496 } 497 498 } 499 | Popular Tags |