001 /**
002 * Copyright 2005-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kew.api.action;
017
018 import java.io.Serializable;
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.Collections;
022 import java.util.List;
023 import javax.xml.bind.annotation.XmlAccessType;
024 import javax.xml.bind.annotation.XmlAccessorType;
025 import javax.xml.bind.annotation.XmlAnyElement;
026 import javax.xml.bind.annotation.XmlElement;
027 import javax.xml.bind.annotation.XmlElementWrapper;
028 import javax.xml.bind.annotation.XmlRootElement;
029 import javax.xml.bind.annotation.XmlType;
030
031 import org.kuali.rice.core.api.CoreConstants;
032 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
033 import org.kuali.rice.core.api.mo.ModelBuilder;
034 import org.w3c.dom.Element;
035
036 @XmlRootElement(name = RoutingReportCriteria.Constants.ROOT_ELEMENT_NAME)
037 @XmlAccessorType(XmlAccessType.NONE)
038 @XmlType(name = RoutingReportCriteria.Constants.TYPE_NAME, propOrder = {
039 RoutingReportCriteria.Elements.DOCUMENT_ID,
040 RoutingReportCriteria.Elements.TARGET_NODE_NAME,
041 RoutingReportCriteria.Elements.TARGET_PRINCIPAL_IDS,
042 RoutingReportCriteria.Elements.ROUTING_PRINCIPAL_ID,
043 RoutingReportCriteria.Elements.DOCUMENT_TYPE_NAME,
044 RoutingReportCriteria.Elements.XML_CONTENT,
045 RoutingReportCriteria.Elements.RULE_TEMPLATE_NAMES,
046 RoutingReportCriteria.Elements.NODE_NAMES,
047 RoutingReportCriteria.Elements.ACTIONS_TO_TAKE,
048 RoutingReportCriteria.Elements.ACTIVATE_REQUESTS,
049 RoutingReportCriteria.Elements.FLATTEN_NODES,
050 CoreConstants.CommonElements.FUTURE_ELEMENTS})
051 public final class RoutingReportCriteria extends AbstractDataTransferObject implements RoutingReportCriteriaContract {
052
053 @XmlElement(name = Elements.DOCUMENT_ID, required = false)
054 private final String documentId;
055
056 @XmlElement(name = Elements.TARGET_NODE_NAME, required = false)
057 private final String targetNodeName;
058
059 @XmlElementWrapper(name = Elements.TARGET_PRINCIPAL_IDS, required = false)
060 @XmlElement(name = Elements.TARGET_PRINCIPAL_ID, required = false)
061 private final List<String> targetPrincipalIds;
062
063 @XmlElement(name = Elements.ROUTING_PRINCIPAL_ID, required = false)
064 private final String routingPrincipalId;
065
066 @XmlElement(name = Elements.DOCUMENT_TYPE_NAME, required = false)
067 private final String documentTypeName;
068
069 @XmlElement(name = Elements.XML_CONTENT, required = false)
070 private final String xmlContent;
071
072 @XmlElementWrapper(name = Elements.RULE_TEMPLATE_NAMES, required = false)
073 @XmlElement(name = Elements.RULE_TEMPLATE_NAME, required = false)
074 private final List<String> ruleTemplateNames;
075
076 @XmlElementWrapper(name = Elements.NODE_NAMES, required = false)
077 @XmlElement(name = Elements.NODE_NAME, required = false)
078 private final List<String> nodeNames;
079
080 @XmlElementWrapper(name = Elements.ACTIONS_TO_TAKE, required = false)
081 @XmlElement(name = Elements.ACTION_TO_TAKE, required = false)
082 private final List<RoutingReportActionToTake> actionsToTake;
083
084 @XmlElement(name = Elements.ACTIVATE_REQUESTS, required = false)
085 private final boolean activateRequests;
086
087 @XmlElement(name = Elements.FLATTEN_NODES, required = false)
088 private final boolean flattenNodes;
089
090 @SuppressWarnings("unused")
091 @XmlAnyElement
092 private final Collection<Element> _futureElements = null;
093
094 /**
095 * Private constructor used only by JAXB.
096 */
097 private RoutingReportCriteria() {
098 this.documentId = null;
099 this.targetNodeName = null;
100 this.targetPrincipalIds = null;
101 this.routingPrincipalId = null;
102 this.documentTypeName = null;
103 this.xmlContent = null;
104 this.ruleTemplateNames = null;
105 this.nodeNames = null;
106 this.actionsToTake = null;
107 this.flattenNodes = false;
108 this.activateRequests = false;
109 }
110
111 private RoutingReportCriteria(Builder builder) {
112 this.documentId = builder.getDocumentId();
113 this.targetNodeName = builder.getTargetNodeName();
114 this.targetPrincipalIds = builder.getTargetPrincipalIds();
115 this.routingPrincipalId = builder.getRoutingPrincipalId();
116 this.documentTypeName = builder.getDocumentTypeName();
117 this.xmlContent = builder.getXmlContent();
118 this.ruleTemplateNames = builder.getRuleTemplateNames();
119 this.nodeNames = builder.getNodeNames();
120 if (builder.getActionsToTake() != null) {
121 List<RoutingReportActionToTake> actions = new ArrayList<RoutingReportActionToTake>();
122 for (RoutingReportActionToTake.Builder actionBuilder : builder.getActionsToTake()) {
123 actions.add(actionBuilder.build());
124 }
125 this.actionsToTake = actions;
126 } else {
127 this.actionsToTake = Collections.emptyList();
128 }
129 this.flattenNodes = builder.isFlattenNodes();
130 this.activateRequests = builder.isActivateRequests();
131 }
132
133 @Override
134 public String getDocumentId() {
135 return this.documentId;
136 }
137
138 @Override
139 public String getTargetNodeName() {
140 return this.targetNodeName;
141 }
142
143 @Override
144 public List<String> getTargetPrincipalIds() {
145 return this.targetPrincipalIds;
146 }
147
148 @Override
149 public String getRoutingPrincipalId() {
150 return this.routingPrincipalId;
151 }
152
153 @Override
154 public String getDocumentTypeName() {
155 return this.documentTypeName;
156 }
157
158 @Override
159 public String getXmlContent() {
160 return this.xmlContent;
161 }
162
163 @Override
164 public List<String> getRuleTemplateNames() {
165 return this.ruleTemplateNames;
166 }
167
168 @Override
169 public List<String> getNodeNames() {
170 return this.nodeNames;
171 }
172
173 @Override
174 public List<RoutingReportActionToTake> getActionsToTake() {
175 return this.actionsToTake;
176 }
177
178 @Override
179 public boolean isActivateRequests() {
180 return this.activateRequests;
181 }
182
183 @Override
184 public boolean isFlattenNodes() {
185 return this.flattenNodes;
186 }
187
188 /**
189 * A builder which can be used to construct {@link RoutingReportCriteria} instances. Enforces the constraints of
190 * the {@link RoutingReportCriteriaContract}.
191 */
192 public final static class Builder implements Serializable, ModelBuilder, RoutingReportCriteriaContract {
193
194 private String documentId;
195 private String targetNodeName;
196 private List<String> targetPrincipalIds;
197 private String routingPrincipalId;
198 private String documentTypeName;
199 private String xmlContent;
200 private List<String> ruleTemplateNames;
201 private List<String> nodeNames;
202 private List<RoutingReportActionToTake.Builder> actionsToTake;
203 private boolean activateRequests;
204 private boolean flattenNodes;
205
206 private Builder(String documentId, String targetNodeName) {
207 this.setDocumentId(documentId);
208 this.setTargetNodeName(targetNodeName);
209 }
210
211 private Builder(String documentTypeName) {
212 this.setDocumentTypeName(documentTypeName);
213 }
214
215 public static Builder createByDocumentTypeName(String documentTypeName) {
216 return new Builder(documentTypeName);
217 }
218
219 public static Builder createByDocumentId(String documentId) {
220 return new Builder(documentId, null);
221 }
222
223 public static Builder createByDocumentIdAndTargetNodeName(String documentId, String targetNodeName) {
224 return new Builder(documentId, targetNodeName);
225 }
226
227 public static Builder create(RoutingReportCriteriaContract contract) {
228 if (contract == null) {
229 throw new IllegalArgumentException("contract was null");
230 }
231 Builder builder =
232 createByDocumentIdAndTargetNodeName(contract.getDocumentId(), contract.getTargetNodeName());
233 builder.setDocumentId(contract.getDocumentId());
234 builder.setTargetNodeName(contract.getTargetNodeName());
235 builder.setTargetPrincipalIds(contract.getTargetPrincipalIds());
236 builder.setRoutingPrincipalId(contract.getRoutingPrincipalId());
237 builder.setDocumentTypeName(contract.getDocumentTypeName());
238 builder.setXmlContent(contract.getXmlContent());
239 builder.setRuleTemplateNames(contract.getRuleTemplateNames());
240 builder.setNodeNames(contract.getNodeNames());
241 if (contract.getActionsToTake() != null) {
242 List<RoutingReportActionToTake.Builder> actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>();
243 for (RoutingReportActionToTakeContract action : contract.getActionsToTake()) {
244 actionsToTake.add(RoutingReportActionToTake.Builder.create(action));
245 }
246 builder.setActionsToTake(actionsToTake);
247 }
248 builder.setActivateRequests(contract.isActivateRequests());
249 builder.setFlattenNodes(contract.isFlattenNodes());
250
251 return builder;
252 }
253
254 public RoutingReportCriteria build() {
255 return new RoutingReportCriteria(this);
256 }
257
258 @Override
259 public String getDocumentId() {
260 return this.documentId;
261 }
262
263 @Override
264 public String getTargetNodeName() {
265 return this.targetNodeName;
266 }
267
268 @Override
269 public List<String> getTargetPrincipalIds() {
270 return this.targetPrincipalIds;
271 }
272
273 @Override
274 public String getRoutingPrincipalId() {
275 return this.routingPrincipalId;
276 }
277
278 @Override
279 public String getDocumentTypeName() {
280 return this.documentTypeName;
281 }
282
283 @Override
284 public String getXmlContent() {
285 return this.xmlContent;
286 }
287
288 @Override
289 public List<String> getRuleTemplateNames() {
290 return this.ruleTemplateNames;
291 }
292
293 @Override
294 public List<String> getNodeNames() {
295 return this.nodeNames;
296 }
297
298 @Override
299 public List<RoutingReportActionToTake.Builder> getActionsToTake() {
300 return this.actionsToTake;
301 }
302
303 @Override
304 public boolean isActivateRequests() {
305 return this.activateRequests;
306 }
307
308 @Override
309 public boolean isFlattenNodes() {
310 return this.flattenNodes;
311 }
312
313 public void setDocumentId(String documentId) {
314 // TODO add validation of input value if required and throw IllegalArgumentException if needed
315 this.documentId = documentId;
316 }
317
318 public void setTargetNodeName(String targetNodeName) {
319 // TODO add validation of input value if required and throw IllegalArgumentException if needed
320 this.targetNodeName = targetNodeName;
321 }
322
323 public void setTargetPrincipalIds(List<String> targetPrincipalIds) {
324 // TODO add validation of input value if required and throw IllegalArgumentException if needed
325 this.targetPrincipalIds = Collections.unmodifiableList(targetPrincipalIds);
326 }
327
328 public void setRoutingPrincipalId(String routingPrincipalId) {
329 // TODO add validation of input value if required and throw IllegalArgumentException if needed
330 this.routingPrincipalId = routingPrincipalId;
331 }
332
333 public void setDocumentTypeName(String documentTypeName) {
334 // TODO add validation of input value if required and throw IllegalArgumentException if needed
335 this.documentTypeName = documentTypeName;
336 }
337
338 public void setXmlContent(String xmlContent) {
339 // TODO add validation of input value if required and throw IllegalArgumentException if needed
340 this.xmlContent = xmlContent;
341 }
342
343 public void setRuleTemplateNames(List<String> ruleTemplateNames) {
344 // TODO add validation of input value if required and throw IllegalArgumentException if needed
345 this.ruleTemplateNames = Collections.unmodifiableList(ruleTemplateNames);
346 }
347
348 public void setNodeNames(List<String> nodeNames) {
349 // TODO add validation of input value if required and throw IllegalArgumentException if needed
350 this.nodeNames = Collections.unmodifiableList(nodeNames);
351 }
352
353 public void setActionsToTake(List<RoutingReportActionToTake.Builder> actionsToTake) {
354 // TODO add validation of input value if required and throw IllegalArgumentException if needed
355 this.actionsToTake = Collections.unmodifiableList(actionsToTake);
356 }
357
358 public void setActivateRequests(boolean activateRequests) {
359 // TODO add validation of input value if required and throw IllegalArgumentException if needed
360 this.activateRequests = activateRequests;
361 }
362
363 public void setFlattenNodes(boolean flattenNodes) {
364 // TODO add validation of input value if required and throw IllegalArgumentException if needed
365 this.flattenNodes = flattenNodes;
366 }
367 }
368
369 /**
370 * Defines some internal constants used on this class.
371 */
372 static class Constants {
373
374 final static String ROOT_ELEMENT_NAME = "routingReportCriteria";
375 final static String TYPE_NAME = "RoutingReportCriteriaType";
376 }
377
378 /**
379 * A private class which exposes constants which define the XML element names to use when this object is marshalled
380 * to XML.
381 */
382 static class Elements {
383
384 final static String DOCUMENT_ID = "documentId";
385 final static String TARGET_NODE_NAME = "targetNodeName";
386 final static String TARGET_PRINCIPAL_IDS = "targetPrincipalIds";
387 final static String TARGET_PRINCIPAL_ID = "targetPrincipalId";
388 final static String ROUTING_PRINCIPAL_ID = "routingPrincipalId";
389 final static String DOCUMENT_TYPE_NAME = "documentTypeName";
390 final static String XML_CONTENT = "xmlContent";
391 final static String RULE_TEMPLATE_NAMES = "ruleTemplateNames";
392 final static String RULE_TEMPLATE_NAME = "ruleTemplateName";
393 final static String NODE_NAMES = "nodeNames";
394 final static String NODE_NAME = "nodeName";
395 final static String ACTIONS_TO_TAKE = "actionsToTake";
396 final static String ACTION_TO_TAKE = "actionToTake";
397 final static String ACTIVATE_REQUESTS = "activateRequests";
398 final static String FLATTEN_NODES = "flattenNodes";
399 }
400 }