KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > ipanema > person > util > PersonSearchFilter


1 /*
2  * Created on Dec 14, 2004
3  * by alex
4  *
5  */

6 package com.nightlabs.ipanema.person.util;
7
8 import java.io.Serializable JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.List JavaDoc;
13 import java.util.Map JavaDoc;
14 import java.util.Set JavaDoc;
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 /**
24  * Builds and executes a {@link javax.jdo.Query} for searching {@link com.nightlabs.ipanema.person.Person}s.
25  *
26  * @author Alexander Bieber <alex[AT]nightlabs[DOT]de>
27  */

28 public class PersonSearchFilter extends SearchFilter {
29     
30     public static class ResultField implements Serializable JavaDoc {
31         private Class JavaDoc fieldClass;
32         private PersonStructFieldID fieldID;
33         private String JavaDoc personMember;
34         private boolean dataFieldType;
35         
36         public ResultField(Class JavaDoc fieldClass, PersonStructFieldID fieldID) {
37             setFieldClass(fieldClass);
38             setFieldID(fieldID);
39             setPersonMember("");
40             setDataFieldType(true);
41         }
42         
43         public ResultField(String JavaDoc personMember) {
44             setPersonMember("");
45             setFieldClass(null);
46             setFieldID(null);
47             setDataFieldType(false);
48         }
49         
50         public Class JavaDoc getFieldClass() {
51             return fieldClass;
52         }
53         public void setFieldClass(Class JavaDoc 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 JavaDoc getPersonMember() {
69             return personMember;
70         }
71         public void setPersonMember(String JavaDoc personMember) {
72             this.personMember = personMember;
73         }
74     }
75     
76     private String JavaDoc 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 JavaDoc personType) {
87         this(_conjunction);
88         this.personType = personType;
89     }
90     
91     
92     /**
93      * value: ResultField
94      */

95     private List JavaDoc resultFields = new ArrayList JavaDoc();
96     
97     public void addResultPersonStructFieldID(Class JavaDoc 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 JavaDoc 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     /**
123      *
124      * @see com.nightlabs.jdo.search.SearchFilter#executeQuery(javax.jdo.PersistenceManager)
125      */

126 /*
127     public Collection executeQuery(PersistenceManager pm) {
128         Query query = pm.newQuery(Person.class);
129                 
130         Set imports = new HashSet();
131         imports.add(Person.class);
132         imports.add(String.class);
133
134         Map paramMap = new HashMap();
135         StringBuffer vars = new StringBuffer();
136         StringBuffer filter = new StringBuffer();
137         StringBuffer params = new StringBuffer();
138         
139         int n = 0;
140         for (Iterator it = getFilters().iterator(); it.hasNext(); ) {
141             SearchFilterItem searchFilterItem = (SearchFilterItem) it.next();
142             if (!PersonSearchFilterItem.class.isAssignableFrom(searchFilterItem.getClass())) {
143                 n++;
144                 continue;
145             }
146             PersonSearchFilterItem item = (PersonSearchFilterItem)searchFilterItem;
147                 
148             vars.append(PersonDataBlockGroup.class.getName()+" personDataBlockGroup"+n);
149             vars.append("; ");
150             vars.append(PersonDataBlock.class.getName()+" personDataBlock"+n);
151             
152             // class of data field
153             Class itemDataFieldClass = item.getItemTargetClass();
154             if (itemDataFieldClass == null)
155                 throw new IllegalArgumentException("PersonSearchFilterItem("+item+") has to return non null value in getPersonDataFieldClass().");
156             if (!AbstractPersonDataField.class.isAssignableFrom(itemDataFieldClass))
157                 throw new IllegalArgumentException("PersonSearchFilterItem("+item+") has to return an inheritor of AbstractPersonDataField in getPersonDataFieldClass().");
158             vars.append("; ");
159             vars.append(itemDataFieldClass.getName()+" personDataField"+n);
160
161             // begin primary key PersonStructField
162 // params.append(", ");
163             params.append(String.class.getName()+" personStructBlockOrganisationID"+n);
164             paramMap.put("personStructBlockOrganisationID"+n, item.getPersonStructFieldID().personStructBlockOrganisationID);
165
166             params.append(", ");
167             params.append(String.class.getName()+" personStructBlockID"+n);
168             paramMap.put("personStructBlockID"+n, item.getPersonStructFieldID().personStructBlockID);
169
170             params.append(", ");
171             params.append(String.class.getName()+" personStructFieldOrganisationID"+n);
172             paramMap.put("personStructFieldOrganisationID"+n, item.getPersonStructFieldID().personStructFieldOrganisationID);
173
174             params.append(", ");
175             params.append(String.class.getName()+" personStructFieldID"+n);
176             paramMap.put("personStructFieldID"+n, item.getPersonStructFieldID().personStructFieldID);
177             // end primary key PersonStructField
178
179             // TODO: Add personTypes
180             
181             // begin filter
182             filter.append("(");
183             filter.append("this.personDataBlockGroups.containsValue(personDataBlockGroup"+n+")");
184             filter.append(" && ");
185             filter.append("personDataBlockGroup"+n+".personDataBlocks.containsValue(personDataBlock"+n+")");
186             filter.append(" && ");
187             filter.append("personDataBlock"+n+".personDataFields.containsValue(personDataField"+n+")");
188
189             // begin primary key of PersonStructField
190             filter.append(" && ");
191             filter.append("personDataField"+n+".personStructBlockOrganisationID == personStructBlockOrganisationID"+n);
192             filter.append(" && ");
193             filter.append("personDataField"+n+".personStructBlockID == personStructBlockID"+n);
194             filter.append(" && ");
195             filter.append("personDataField"+n+".personStructFieldOrganisationID == personStructFieldOrganisationID"+n);
196             filter.append(" && ");
197             filter.append("personDataField"+n+".personStructFieldID == personStructFieldID"+n);
198             // end primary key of PersonStructField
199
200             filter.append(" && ");
201
202             item.appendSubQuery(n, imports, vars, filter, params, paramMap);
203
204             filter.append(")");
205
206             if (it.hasNext()) {
207                 vars.append("; ");
208                 params.append(", ");
209                 
210                 switch (getConjunction())
211                 {
212                     case SearchFilter.CONJUNCTION_AND:
213                         filter.append(" && ");
214                         break;
215                     case SearchFilter.CONJUNCTION_OR:
216                         filter.append(" || ");
217                         break;
218                     default:
219                         throw new IllegalStateException("conjunction invalid!");
220                 }
221             }
222             
223             n++;
224         }
225
226         StringBuffer importsSB = new StringBuffer();
227         for (Iterator it = imports.iterator(); it.hasNext(); ) {
228             Class clazz = (Class) it.next();
229             importsSB.append("import ");
230             importsSB.append(clazz.getName());
231             if (it.hasNext())
232                 importsSB.append("; ");
233         }
234         query.declareImports(importsSB.toString());
235         query.declareVariables(vars.toString());
236         query.declareParameters(params.toString());
237         query.setFilter(filter.toString());
238
239         return (Collection)query.executeWithMap(paramMap);
240     }
241 */

242     
243
244     /**
245      * @see com.nightlabs.jdo.search.SearchFilter#getExtendClass()
246      */

247     protected Class JavaDoc getExtendClass() {
248         return Person.class;
249     }
250     
251     
252     protected void declarePersonVaraible(StringBuffer JavaDoc vars) {
253         vars.append(Person.class.getName()+" queryPerson");
254     }
255     
256     /**
257      * Should be used for setPersonVariableCondition
258      */

259     public static final String JavaDoc PERSON_VARNAME = "queryPerson";
260     
261     /**
262      *
263      *
264      */

265     public void setPersonVariableCondition(StringBuffer JavaDoc filter){
266         filter.append(PERSON_VARNAME+" == this");
267     }
268     
269     
270     
271     public void addPersonFilterItems(Set JavaDoc imports, StringBuffer JavaDoc vars, StringBuffer JavaDoc filter, StringBuffer JavaDoc params, Map JavaDoc paramMap) {
272         boolean firstItemProcessed = false;
273         Map JavaDoc personFilterItemsPerClass = new HashMap JavaDoc();
274         
275         // check if it does constrain at all
276
// and if query has to be executed
277
// sort all filterItems by targetClasses in personFilterItemsPerClass
278
for (Iterator JavaDoc 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 JavaDoc itemList = (List JavaDoc)personFilterItemsPerClass.get(item.getItemTargetClass());
288             if (itemList == null) {
289                 itemList = new ArrayList JavaDoc();
290                 personFilterItemsPerClass.put(item.getItemTargetClass(),itemList);
291             }
292             itemList.add(item);
293                 
294         }
295         
296         if (!firstItemProcessed) {
297             // no PersonSearchFilterItem found
298
// or none was constraining
299
// find nothing
300
filter.append("1 == 0");
301             return;
302         }
303         
304         firstItemProcessed = false;
305         
306 // vars.append("; ");
307
// vars.append(PersonDataBlockGroup.class.getName()+" personDataBlockGroup");
308
// vars.append("; ");
309
// vars.append(PersonDataBlock.class.getName()+" personDataBlock");
310

311 // filter.append("(");
312
// filter.append(PERSON_VARNAME+".personDataBlockGroups.containsValue(personDataBlockGroup)");
313
// filter.append(" && ");
314
// filter.append("personDataBlockGroup.personDataBlocks.containsValue(personDataBlock)");
315

316 // filter.append((PERSON_VARNAME+".personDataFields.contains(personDataField)");
317
// filter.append(" && ");
318
filter.append("(");
319
320         if (params.length() > 0)
321             params.append(", ");
322
323         int n = 0;
324         int fieldClassNo = 0;
325         // itearte a second time to fill the query
326
for (Iterator JavaDoc it = personFilterItemsPerClass.entrySet().iterator(); it.hasNext(); ) {
327             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)it.next();
328
329             // class of data field
330
Class JavaDoc itemDataFieldClass = (Class JavaDoc)entry.getKey();
331             if (itemDataFieldClass == null)
332                 throw new IllegalArgumentException JavaDoc("Some PersonSearchFilterItem returned null value in getPersonDataFieldClass().");
333             if (!AbstractPersonDataField.class.isAssignableFrom(itemDataFieldClass))
334                 throw new IllegalArgumentException JavaDoc("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("personDataBlock.personDataFields.containsValue(personDataField"+n+")");
340
filter.append(PERSON_VARNAME+".personDataFields.contains(personDataField"+fieldClassNo+")");
341             filter.append(" && ");
342             
343             
344             List JavaDoc itemList = (List JavaDoc)entry.getValue();
345             for (Iterator JavaDoc iter = itemList.iterator(); iter.hasNext();) {
346                 PersonSearchFilterItem item = (PersonSearchFilterItem) iter.next();
347                 
348                 // begin primary key PersonStructField
349
params.append(String JavaDoc.class.getName()+" personStructBlockOrganisationID"+n);
350                 paramMap.put("personStructBlockOrganisationID"+n, item.getPersonStructFieldID().personStructBlockOrganisationID);
351                 
352                 params.append(", ");
353                 params.append(String JavaDoc.class.getName()+" personStructBlockID"+n);
354                 paramMap.put("personStructBlockID"+n, item.getPersonStructFieldID().personStructBlockID);
355                 
356                 params.append(", ");
357                 params.append(String JavaDoc.class.getName()+" personStructFieldOrganisationID"+n);
358                 paramMap.put("personStructFieldOrganisationID"+n, item.getPersonStructFieldID().personStructFieldOrganisationID);
359                 
360                 params.append(", ");
361                 params.append(String JavaDoc.class.getName()+" personStructFieldID"+n);
362                 paramMap.put("personStructFieldID"+n, item.getPersonStructFieldID().personStructFieldID);
363                 // end primary key PersonStructField
364
// params.append(String.class.getName()+" personStructFieldPK"+n);
365
// paramMap.put(
366
// "personStructFieldPK"+n,
367
// AbstractPersonStructField.getPrimaryKey(
368
// item.getPersonStructFieldID().personStructBlockOrganisationID,
369
// item.getPersonStructFieldID().personStructBlockID,
370
// item.getPersonStructFieldID().personStructFieldOrganisationID,
371
// item.getPersonStructFieldID().personStructFieldID
372
// ));
373

374                 // TODO: Add personTypes
375
// begin filter
376
filter.append("(");
377
378                 // begin primary key of PersonStructField
379
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                 // end primary key of PersonStructField
387

388 // filter.append("personDataField"+fieldClassNo+".structFieldPK == personStructFieldPK"+n);
389
filter.append(" && ");
390                 
391                 // TODO add parameter
392
item.appendSubQuery(n, fieldClassNo, imports, vars, filter, params, paramMap);
393                 
394                 filter.append(")");
395                 
396                 n++;
397                 if (iter.hasNext()) {
398                     // vars.append("; ");
399
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 JavaDoc("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 JavaDoc("conjunction invalid!");
426                 }
427             }
428             filter.append(")");
429             
430         }
431         filter.append(")");
432     }
433
434     /**
435      *
436      * @see com.nightlabs.jdo.search.SearchFilter#doExecuteQuery(java.util.Set, java.lang.StringBuffer, java.lang.StringBuffer, java.lang.StringBuffer)
437      */

438     protected void prepareQuery(Set JavaDoc imports, StringBuffer JavaDoc vars, StringBuffer JavaDoc filter, StringBuffer JavaDoc params, Map JavaDoc paramMap, StringBuffer JavaDoc result) {
439         declarePersonVaraible(vars);
440         setPersonVariableCondition(filter);
441         
442         // result stuff
443
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 JavaDoc 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 JavaDoc.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         // real person criteria
490
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