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    }