1
2
3
4
5
6
7
8
9 package com.atlassian.core.ofbiz.util;
10
11 import com.atlassian.core.ofbiz.CoreFactory;
12 import com.atlassian.core.util.DateUtils;
13 import com.atlassian.core.util.ObjectUtils;
14
15 import org.ofbiz.core.entity.EntityExpr;
16 import org.ofbiz.core.entity.EntityOperator;
17 import org.ofbiz.core.entity.GenericEntityException;
18 import org.ofbiz.core.entity.GenericValue;
19
20 import java.sql.Timestamp;
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Map;
27
28 public class EntityUtils
29 {
30 private static final EntityOperator[] entityOperators = { EntityOperator.EQUALS, EntityOperator.NOT_EQUAL, EntityOperator.LESS_THAN, EntityOperator.GREATER_THAN, EntityOperator.LESS_THAN_EQUAL_TO, EntityOperator.GREATER_THAN_EQUAL_TO, EntityOperator.IN, EntityOperator.BETWEEN, EntityOperator.NOT, EntityOperator.AND, EntityOperator.OR };
31
32
33
34
35 public static EntityOperator getOperator(final String code)
36 {
37 for (int i = 0; i < entityOperators.length; i++)
38 {
39 final EntityOperator operator = entityOperators[i];
40 if (operator.toString().trim().equals(code.trim()))
41 {
42 return operator;
43 }
44 }
45 return null;
46 }
47
48
49
50
51
52
53 public static GenericValue createValue(final String entity, final Map paramMap) throws GenericEntityException
54 {
55 final Map params = (paramMap == null) ? new HashMap() : new HashMap(paramMap);
56
57 if (params.get("id") == null)
58 {
59 final Long id = CoreFactory.getGenericDelegator().getNextSeqId(entity);
60 params.put("id", id);
61 }
62
63 final GenericValue v = CoreFactory.getGenericDelegator().makeValue(entity, params);
64 v.create();
65 return v;
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79
80 public static boolean identical(final GenericValue v1, final GenericValue v2)
81 {
82 if ((v1 == null) && (v2 == null))
83 {
84 return true;
85 }
86 if ((v1 == null) || (v2 == null))
87 {
88 return false;
89 }
90
91 if (!v1.getEntityName().equals(v2.getEntityName()))
92 {
93 return false;
94 }
95
96
97 for (final Iterator iterator = v1.getAllKeys().iterator(); iterator.hasNext();)
98 {
99 final String key = (String) iterator.next();
100
101 if ((v1.get(key) == null) && (v2.get(key) == null))
102 {
103 continue;
104 }
105 if ((v1.get(key) == null) && (v2.get(key) != null))
106 {
107 return false;
108 }
109 else
110 {
111
112 if ((v1.get(key) instanceof Timestamp) && (v2.get(key) instanceof Timestamp))
113 {
114 final Timestamp t1 = (Timestamp) v1.get(key);
115 final Timestamp t2 = (Timestamp) v2.get(key);
116 if (!DateUtils.equalTimestamps(t1, t2))
117 {
118 return false;
119 }
120 }
121 else if (!v1.get(key).equals(v2.get(key)))
122 {
123 return false;
124 }
125 }
126 }
127
128
129 final Collection uncheckedKeys = new ArrayList(v2.getAllKeys());
130 uncheckedKeys.removeAll(v1.getAllKeys());
131
132
133 if (uncheckedKeys.size() > 0)
134 {
135 for (final Iterator iterator = uncheckedKeys.iterator(); iterator.hasNext();)
136 {
137 final String key = (String) iterator.next();
138 if (v2.get(key) == null)
139 {
140 continue;
141 }
142 else
143 {
144 return false;
145 }
146 }
147 }
148 return true;
149 }
150
151
152
153
154
155
156
157
158
159 public static boolean contains(final Collection entities, final GenericValue entity)
160 {
161 for (final Iterator iterator = entities.iterator(); iterator.hasNext();)
162 {
163 final GenericValue gv = (GenericValue) iterator.next();
164
165 if (identical(gv, entity))
166 {
167 return true;
168 }
169 }
170 return false;
171 }
172
173
174
175
176
177
178
179
180
181 public static List filterByAnd(final List values, final List exprs)
182 {
183 if (values == null)
184 {
185 return null;
186 }
187 if ((exprs == null) || (exprs.size() == 0))
188 {
189 return values;
190 }
191
192 final List result = new ArrayList();
193
194 for (final Iterator iterator = values.iterator(); iterator.hasNext();)
195 {
196 final GenericValue value = (GenericValue) iterator.next();
197 boolean include = true;
198
199 for (final Iterator exprIter = exprs.iterator(); exprIter.hasNext();)
200 {
201 final EntityExpr expr = (EntityExpr) exprIter.next();
202 final Object lhs = value.get((String) expr.getLhs());
203 final Object rhs = expr.getRhs();
204
205 if (EntityOperator.EQUALS.equals(expr.getOperator()))
206 {
207
208 include = ObjectUtils.isIdentical(lhs, rhs);
209
210 if (!include)
211 {
212 break;
213 }
214 }
215 else if (EntityOperator.NOT_EQUAL.equals(expr.getOperator()))
216 {
217 include = ObjectUtils.isDifferent(lhs, rhs);
218
219 if (!include)
220 {
221 break;
222 }
223 }
224 else if (EntityOperator.GREATER_THAN.equals(expr.getOperator()) || EntityOperator.GREATER_THAN_EQUAL_TO.equals(expr.getOperator()) || EntityOperator.LESS_THAN.equals(expr.getOperator()) || EntityOperator.LESS_THAN_EQUAL_TO.equals(expr.getOperator()))
225 {
226 if ((rhs != null) && (lhs != null) && (rhs instanceof Comparable))
227 {
228 final Comparable rhsComp = (Comparable) rhs;
229 final Comparable lhsComp = (Comparable) lhs;
230
231 final int comparison = lhsComp.compareTo(rhsComp);
232
233 if ((comparison <= 0) && EntityOperator.LESS_THAN_EQUAL_TO.equals(expr.getOperator()))
234 {
235 include = true;
236 }
237 else if ((comparison < 0) && EntityOperator.LESS_THAN.equals(expr.getOperator()))
238 {
239 include = true;
240 }
241 else if ((comparison >= 0) && EntityOperator.GREATER_THAN_EQUAL_TO.equals(expr.getOperator()))
242 {
243 include = true;
244 }
245 else if ((comparison > 0) && EntityOperator.GREATER_THAN.equals(expr.getOperator()))
246 {
247 include = true;
248 }
249 else
250 {
251 include = false;
252 break;
253 }
254 }
255 else
256 {
257 throw new IllegalArgumentException(
258 "Operation " + expr.getOperator().getCode() + " is not yet supported by filterByAnd with objects that do not implement Comparable");
259 }
260 }
261 else
262 {
263 throw new IllegalArgumentException("Operation " + expr.getOperator().getCode() + " is not yet supported by filterByAnd");
264 }
265 }
266
267 if (include)
268 {
269 result.add(value);
270 }
271 }
272 return result;
273 }
274
275
276
277
278
279 public static synchronized String getNextStringId(final String entityName) throws GenericEntityException
280 {
281 long maxID = 1;
282
283 for (final Iterator iterator = CoreFactory.getGenericDelegator().findAll(entityName).iterator(); iterator.hasNext();)
284 {
285 final GenericValue entity = (GenericValue) iterator.next();
286 try
287 {
288 final long entityId = Long.parseLong(entity.getString("id"));
289 if (entityId >= maxID)
290 {
291 maxID = entityId + 1;
292 }
293 }
294 catch (final NumberFormatException nfe)
295 {
296
297 }
298 }
299 return Long.toString(maxID);
300 }
301 }