1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.core.api.criteria;
17
18 import org.kuali.rice.core.api.CoreConstants;
19 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
20 import org.kuali.rice.core.api.mo.ModelBuilder;
21 import org.w3c.dom.Element;
22
23 import javax.xml.bind.annotation.XmlAccessType;
24 import javax.xml.bind.annotation.XmlAccessorType;
25 import javax.xml.bind.annotation.XmlAnyElement;
26 import javax.xml.bind.annotation.XmlElement;
27 import javax.xml.bind.annotation.XmlElements;
28 import javax.xml.bind.annotation.XmlRootElement;
29 import javax.xml.bind.annotation.XmlType;
30 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
31 import java.io.Serializable;
32 import java.util.Arrays;
33 import java.util.Collection;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 @XmlRootElement(name = QueryByCriteria.Constants.ROOT_ELEMENT_NAME)
58 @XmlAccessorType(XmlAccessType.NONE)
59 @XmlType(name = QueryByCriteria.Constants.TYPE_NAME, propOrder = {
60 QueryByCriteria.Elements.PREDICATE,
61 QueryByCriteria.Elements.START_AT_INDEX,
62 QueryByCriteria.Elements.MAX_RESULTS,
63 QueryByCriteria.Elements.COUNT_FLAG,
64 CoreConstants.CommonElements.FUTURE_ELEMENTS })
65 public final class QueryByCriteria extends AbstractDataTransferObject {
66
67 private static final long serialVersionUID = 2210627777648920180L;
68
69 @XmlElements(value = {
70 @XmlElement(name = AndPredicate.Constants.ROOT_ELEMENT_NAME, type = AndPredicate.class, required = false),
71 @XmlElement(name = EqualPredicate.Constants.ROOT_ELEMENT_NAME, type = EqualPredicate.class, required = false),
72 @XmlElement(name = EqualIgnoreCasePredicate.Constants.ROOT_ELEMENT_NAME, type = EqualIgnoreCasePredicate.class, required = false),
73 @XmlElement(name = GreaterThanPredicate.Constants.ROOT_ELEMENT_NAME, type = GreaterThanPredicate.class, required = false),
74 @XmlElement(name = GreaterThanOrEqualPredicate.Constants.ROOT_ELEMENT_NAME, type = GreaterThanOrEqualPredicate.class, required = false),
75 @XmlElement(name = InPredicate.Constants.ROOT_ELEMENT_NAME, type = InPredicate.class, required = false),
76 @XmlElement(name = InIgnoreCasePredicate.Constants.ROOT_ELEMENT_NAME, type = InIgnoreCasePredicate.class, required = false),
77 @XmlElement(name = LessThanPredicate.Constants.ROOT_ELEMENT_NAME, type = LessThanPredicate.class, required = false),
78 @XmlElement(name = LessThanOrEqualPredicate.Constants.ROOT_ELEMENT_NAME, type = LessThanOrEqualPredicate.class, required = false),
79 @XmlElement(name = LikePredicate.Constants.ROOT_ELEMENT_NAME, type = LikePredicate.class, required = false),
80 @XmlElement(name = NotEqualPredicate.Constants.ROOT_ELEMENT_NAME, type = NotEqualPredicate.class, required = false),
81 @XmlElement(name = NotEqualIgnoreCasePredicate.Constants.ROOT_ELEMENT_NAME, type = NotEqualIgnoreCasePredicate.class, required = false),
82 @XmlElement(name = NotInPredicate.Constants.ROOT_ELEMENT_NAME, type = NotInPredicate.class, required = false),
83 @XmlElement(name = NotInIgnoreCasePredicate.Constants.ROOT_ELEMENT_NAME, type = NotInIgnoreCasePredicate.class, required = false),
84 @XmlElement(name = NotLikePredicate.Constants.ROOT_ELEMENT_NAME, type = NotLikePredicate.class, required = false),
85 @XmlElement(name = NotNullPredicate.Constants.ROOT_ELEMENT_NAME, type = NotNullPredicate.class, required = false),
86 @XmlElement(name = NullPredicate.Constants.ROOT_ELEMENT_NAME, type = NullPredicate.class, required = false),
87 @XmlElement(name = OrPredicate.Constants.ROOT_ELEMENT_NAME, type = OrPredicate.class, required = false)
88 })
89 private final Predicate predicate;
90
91 @XmlElement(name = Elements.START_AT_INDEX, required = false)
92 private final Integer startAtIndex;
93
94 @XmlElement(name = Elements.MAX_RESULTS, required = false)
95 private final Integer maxResults;
96
97 @XmlJavaTypeAdapter(CountFlag.Adapter.class)
98 @XmlElement(name = Elements.COUNT_FLAG, required = true)
99 private final String countFlag;
100
101 @SuppressWarnings("unused")
102 @XmlAnyElement
103 private final Collection<Element> _futureElements = null;
104
105 private QueryByCriteria() {
106 this.predicate = null;
107 this.startAtIndex = null;
108 this.maxResults = null;
109 this.countFlag = null;
110 }
111
112 private QueryByCriteria(Builder builder) {
113 final Predicate[] preds = builder.predicates;
114 if (preds != null && preds.length > 1) {
115
116 this.predicate = PredicateFactory.and(builder.predicates);
117 } else if (preds != null && preds.length == 1) {
118 this.predicate = builder.predicates[0];
119 } else {
120 this.predicate = null;
121 }
122
123 this.startAtIndex = builder.getStartAtIndex();
124 this.maxResults = builder.getMaxResults();
125 this.countFlag = builder.getCountFlag() == null ? null : builder.getCountFlag().getFlag();
126 }
127
128
129
130
131
132
133 public Predicate getPredicate() {
134 return this.predicate;
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152 public Integer getStartAtIndex() {
153 return this.startAtIndex;
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167 public Integer getMaxResults() {
168 return this.maxResults;
169 }
170
171
172
173
174
175
176
177
178
179
180 public CountFlag getCountFlag() {
181 return this.countFlag == null ? null : CountFlag.valueOf(this.countFlag);
182 }
183
184 public static final class Builder implements ModelBuilder, Serializable {
185
186 private Predicate[] predicates;
187 private Integer startAtIndex;
188 private Integer maxResults;
189 private CountFlag countFlag;
190
191 private Builder() {
192 this.countFlag = CountFlag.NONE;
193 }
194
195 public static Builder create() {
196 return new Builder();
197 }
198
199 public Integer getStartAtIndex() {
200 return this.startAtIndex;
201 }
202
203 public void setStartAtIndex(Integer startAtIndex) {
204 if (startAtIndex != null && startAtIndex < 0) {
205 throw new IllegalArgumentException("startAtIndex < 0");
206 }
207
208 this.startAtIndex = startAtIndex;
209 }
210
211 public Integer getMaxResults() {
212 return this.maxResults;
213 }
214
215 public void setMaxResults(Integer maxResults) {
216 if (maxResults != null && maxResults < 0) {
217 throw new IllegalArgumentException("maxResults < 0");
218 }
219
220 this.maxResults = maxResults;
221 }
222
223 public CountFlag getCountFlag() {
224 return this.countFlag;
225 }
226
227 public void setCountFlag(CountFlag countFlag) {
228 if (countFlag == null) {
229 throw new IllegalArgumentException("countFlag was null");
230 }
231
232 this.countFlag = countFlag;
233 }
234
235
236
237
238
239 public Predicate[] getPredicates() {
240 if (this.predicates == null) {
241 return null;
242 }
243
244
245 return Arrays.copyOf(predicates, predicates.length);
246 }
247
248
249
250
251
252
253
254 public void setPredicates(Predicate... predicates) {
255
256 this.predicates = predicates != null ? Arrays.copyOf(predicates, predicates.length) : null;
257 }
258
259 @Override
260 public QueryByCriteria build() {
261 return new QueryByCriteria(this);
262 }
263
264
265 public static QueryByCriteria fromPredicates(Predicate... predicates) {
266 final Builder b = Builder.create();
267 b.setPredicates(predicates);
268 return b.build();
269 }
270 }
271
272
273
274
275 static class Constants {
276 final static String ROOT_ELEMENT_NAME = "queryByCriteria";
277 final static String TYPE_NAME = "QueryByCriteriaType";
278 }
279
280
281
282
283
284 static class Elements {
285 final static String PREDICATE = "predicate";
286 final static String START_AT_INDEX = "startAtIndex";
287 final static String MAX_RESULTS = "maxResults";
288 final static String COUNT_FLAG = "countFlag";
289 }
290
291 }