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
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 }