View Javadoc

1   
2   package org.weda.store.impl;
3   
4   import java.util.ArrayList;
5   import java.util.Collection;
6   import java.util.HashMap;
7   import java.util.List;
8   import java.util.Map;
9   import org.apache.commons.lang.SerializationUtils;
10  import org.weda.common.NamesListRegistry;
11  import org.weda.enhance.InjectHivemindObject;
12  import org.weda.message.Messages;
13  import org.weda.property.PropertyDescriptor;
14  import org.weda.property.ObjectDescriptorRegistry;
15  import org.weda.converter.ValueTypeConverter;
16  import org.weda.store.QueryFilter;
17  import org.weda.store.QueryFilterElement;
18  import org.weda.store.QueryFilterElementException;
19  import org.weda.store.QueryFilterException;
20  import org.weda.message.impl.MessagesSubset;
21  
22  /**
23   *
24   * @author tim
25   */
26  public class QueryFilterImpl implements QueryFilter, Cloneable{
27      
28      @InjectHivemindObject()
29      private static ObjectDescriptorRegistry objectDescriptorRegistry;
30      @InjectHivemindObject()
31      private static ValueTypeConverter converter;
32      @InjectHivemindObject()
33      private static NamesListRegistry namesListRegistry;
34      //хеш хранит псевдонимы объектов. В качестве ключа испольуется ObjectAlias.alias
35      private Map<String, ObjectAlias> objectAliases=
36              new HashMap<String, ObjectAlias>();
37      private Map<String, QueryFilterElement> staticElements=
38              new HashMap<String, QueryFilterElement>();
39      private Map<String, QueryFilterElement> elements=
40              new HashMap<String, QueryFilterElement>();
41      private int lastParamNum=0;
42      private ObjectAlias defaultObjectAlias;
43      private String namesListName;
44      
45      public void init() throws QueryFilterException {
46          try{
47              initFilterElements(staticElements, true);
48              for (QueryFilterElement element: staticElements.values()){
49                  element.setExpression(element.getStaticExpression());
50              }
51              if (namesListName!=null)
52                  createFilterElementsFromNamesList();
53              initFilterElements(elements, false);
54          }catch(Exception e){
55              throw new QueryFilterException(
56                      "Can't initialize query filter", e);
57          }
58      }
59      
60      public void initFilterElements(
61              Map<String, QueryFilterElement> elems, boolean isStaticElement) 
62          throws QueryFilterException
63      {
64          List<QueryFilterElement> filterElems = 
65                  new ArrayList<QueryFilterElement>(elems.values());
66          for (QueryFilterElement element: filterElems){
67              initQueryFilterElement(element, isStaticElement);
68          }            
69      }
70      
71      public void initQueryFilterElement(
72              QueryFilterElement element, boolean isStaticElement)
73          throws QueryFilterException
74      {
75          ObjectAlias alias = null;
76          if (element.getObjectAlias()==null){
77              alias = defaultObjectAlias;            
78              Map<String, QueryFilterElement> elems = 
79                      isStaticElement ? staticElements : elements;
80              elems.remove(element.getId());
81              element.setId(
82                      createFilterElementId(
83                          element.getProperty(), alias.getAlias()));
84              element.setObjectAlias(defaultObjectAlias.getAlias());
85              elems.put(element.getId(), element);
86          }else
87              alias = objectAliases.get(element.getObjectAlias());
88          
89          if (alias==null)
90              throw new QueryFilterException(
91                  String.format(
92                      "Object alias (%s) does not exists " +
93                      "for query filter element (%s)"
94                      , element.getObjectAlias(), element.getProperty()));
95          try{
96              if (!element.isUseAliasAsProperty()){                
97                  PropertyDescriptor d = 
98                          objectDescriptorRegistry.getPropertyDescriptor(
99                              alias.getObjectClass(), element.getProperty());
100                 element.setPropertyDescriptor(d);
101             }
102         }catch(Exception e){
103             throw new QueryFilterException(
104                 String.format(
105                     "Can't create query filter element"
106                     , element.getProperty())
107                 , e);
108         }
109     }
110 
111     public void addObjectAlias(ObjectAlias objectAlias) {
112         objectAliases.put(objectAlias.getAlias(), objectAlias);
113     }
114     
115     public void addStaticFilterElement(QueryFilterElement filterElement) {
116         filterElement.setId(
117                 createFilterElementId(
118                     filterElement.getProperty()
119                     , filterElement.getObjectAlias()));
120         staticElements.put(filterElement.getId(), filterElement);
121     }
122     
123     public void removeStaticFilterElement(QueryFilterElement filterElement){
124         staticElements.remove(filterElement.getId());
125     }
126 
127     public void addFilterElement(QueryFilterElement filterElement) {
128         filterElement.setId(
129                 createFilterElementId(
130                     filterElement.getProperty()
131                     , filterElement.getObjectAlias()));
132         elements.put(filterElement.getId(), filterElement);
133     }
134     
135     public String createFilterElementId(
136             String propertyPath, String objectAlias)
137     {
138         return objectAlias+"."+(propertyPath==null?"":propertyPath);
139     }
140         
141     public QueryFilterElement getFilterElement(String id){
142         return elements.get(id);
143     }
144     
145     public QueryFilterElement getStaticFilterElement(String id){
146         return staticElements.get(id);
147     }
148     
149     public void removeFilterElement(QueryFilterElement filterElement){
150         elements.remove(filterElement.getId());
151     }
152     
153     public void enableFilterElements() {
154         for (QueryFilterElement element: elements.values())
155             element.setEnabled(true);
156     }
157 
158     public void disableFilterElements() {
159         for (QueryFilterElement element: elements.values())
160             element.setEnabled(false);
161     }        
162     
163     public void setExpression(String elementId, String expression) 
164         throws QueryFilterException 
165     {
166         elements.get(elementId).setExpression(expression);
167     }
168 
169     public Collection<QueryFilterElement> getStaticFilterElements() {
170         return staticElements.values();
171     }
172 
173     public Collection<QueryFilterElement> getFilterElements() {
174         return elements.values();
175     }
176 
177     public void setDefaultObjectAlias(ObjectAlias defaultObjectAlias) {
178         this.defaultObjectAlias = defaultObjectAlias;
179         addObjectAlias(defaultObjectAlias);
180     }
181 
182     public void clearFiltersExpressions() throws QueryFilterException {
183         try {
184             for (QueryFilterElement element: elements.values())
185                 element.setExpression(null);
186         } catch (QueryFilterElementException ex) {
187             throw new QueryFilterException(
188                     "Can't reset filter expressions.", ex);
189         }
190     }
191 
192     public QueryFilter cloneFilter() throws QueryFilterException {
193         QueryFilter newFilter = 
194             (QueryFilter)SerializationUtils.clone(this);
195         newFilter.init();
196         return newFilter;
197     }
198 
199     public Object clone() throws CloneNotSupportedException {
200         QueryFilterImpl clone = new QueryFilterImpl();
201         clone.objectAliases.putAll(objectAliases);
202         for (QueryFilterElement filterElement: elements.values())
203             clone.addFilterElement((QueryFilterElement)filterElement.clone());
204         for (QueryFilterElement filterElement: staticElements.values())
205             clone.addStaticFilterElement(
206                 (QueryFilterElement)filterElement.clone());
207         return clone;
208     }
209     
210     private void createFilterElementsFromNamesList() throws Exception{
211         List<String> names = namesListRegistry.getNamesList(namesListName);
212         for (String name: names) {
213             String id = createFilterElementId(
214                     name, defaultObjectAlias.getAlias());
215             if (!elements.containsKey(id)){
216                 QueryFilterElementImpl filterElement = 
217                         new QueryFilterElementImpl();
218                 filterElement.setObjectAlias(defaultObjectAlias.getAlias());
219                 filterElement.setProperty(name);
220                 elements.put(id, filterElement);
221             }
222         }
223     }
224     
225     /**Метод устанавливает название списка с именами которые будут использованы
226      * для создания элементов фильтра. При создании элемента списка 
227      * (QueryFilterElement) будут использованы следующие правила:
228      * <ul>
229      *  <li> в качестве значения QueryFilterElement.propertyName будет 
230  *           использовано имя из списка.
231      *  <li> в качестве значения QueryFilterElement.objectAlias будет 
232      *       использовано значение defaultObjectAlias.alias
233      * </ul>
234      */
235     public void setNamesListName(String namesListName) {
236         this.namesListName = namesListName;
237     }
238 
239 }