001    /**
002     * Copyright 2005-2012 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.document.node;
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    
024    import javax.xml.bind.annotation.XmlAccessType;
025    import javax.xml.bind.annotation.XmlAccessorType;
026    import javax.xml.bind.annotation.XmlAnyElement;
027    import javax.xml.bind.annotation.XmlElement;
028    import javax.xml.bind.annotation.XmlElementWrapper;
029    import javax.xml.bind.annotation.XmlRootElement;
030    import javax.xml.bind.annotation.XmlType;
031    
032    import org.kuali.rice.core.api.CoreConstants;
033    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
034    import org.kuali.rice.core.api.mo.ModelBuilder;
035    import org.w3c.dom.Element;
036    
037    @XmlRootElement(name = RouteNodeInstance.Constants.ROOT_ELEMENT_NAME)
038    @XmlAccessorType(XmlAccessType.NONE)
039    @XmlType(name = RouteNodeInstance.Constants.TYPE_NAME, propOrder = {
040        RouteNodeInstance.Elements.ID,
041        RouteNodeInstance.Elements.NAME,
042        RouteNodeInstance.Elements.STATE,
043        RouteNodeInstance.Elements.DOCUMENT_ID,
044        RouteNodeInstance.Elements.BRANCH_ID,
045        RouteNodeInstance.Elements.ROUTE_NODE_ID,
046        RouteNodeInstance.Elements.PROCESS_ID,
047        RouteNodeInstance.Elements.ACTIVE,
048        RouteNodeInstance.Elements.COMPLETE,
049        RouteNodeInstance.Elements.INITIAL,
050        RouteNodeInstance.Elements.NEXT_NODE_INSTANCES,
051        CoreConstants.CommonElements.FUTURE_ELEMENTS
052    })
053    public final class RouteNodeInstance extends AbstractDataTransferObject
054        implements RouteNodeInstanceContract
055    {
056    
057        @XmlElement(name = Elements.NAME, required = false)
058        private final String name;
059    
060        @XmlElementWrapper(name = Elements.STATE, required = false)
061        @XmlElement(name = Elements.ROUTE_NODE_INSTANCE_STATE, required = false)
062        private final List<RouteNodeInstanceState> state;
063    
064        @XmlElement(name = Elements.DOCUMENT_ID, required = false)
065        private final String documentId;
066    
067        @XmlElement(name = Elements.BRANCH_ID, required = false)
068        private final String branchId;
069    
070        @XmlElement(name = Elements.ROUTE_NODE_ID, required = false)
071        private final String routeNodeId;
072    
073        @XmlElement(name = Elements.PROCESS_ID, required = false)
074        private final String processId;
075    
076        @XmlElement(name = Elements.ACTIVE, required = false)
077        private final boolean active;
078    
079        @XmlElement(name = Elements.COMPLETE, required = false)
080        private final boolean complete;
081    
082        @XmlElement(name = Elements.INITIAL, required = false)
083        private final boolean initial;
084    
085        @XmlElement(name = Elements.ID, required = false)
086        private final String id;
087    
088        @XmlElementWrapper(name = Elements.NEXT_NODE_INSTANCES, required = false)
089        @XmlElement(name = Elements.NEXT_NODE_INSTANCE, required = false)
090        private final List<RouteNodeInstance> nextNodeInstances;
091    
092        @SuppressWarnings("unused")
093        @XmlAnyElement
094        private final Collection<Element> _futureElements = null;
095    
096        /**
097         * Private constructor used only by JAXB.
098         * 
099         */
100        private RouteNodeInstance() {
101            this.name = null;
102            this.state = null;
103            this.documentId = null;
104            this.branchId = null;
105            this.routeNodeId = null;
106            this.processId = null;
107            this.active = false;
108            this.complete = false;
109            this.initial = false;
110            this.id = null;
111            this.nextNodeInstances = null;
112        }
113    
114        private RouteNodeInstance(Builder builder) {
115            this.name = builder.getName();
116            if (builder.getState() != null) {
117                List<RouteNodeInstanceState> states = new ArrayList<RouteNodeInstanceState>();
118                for(RouteNodeInstanceState.Builder stateBuilder : builder.getState()) {
119                    states.add(stateBuilder.build());
120                }
121                this.state = states;
122            } else {
123                this.state = Collections.emptyList();
124            }
125    
126            if (builder.getNextNodeInstances() != null) {
127                List<RouteNodeInstance> nextInstances = new ArrayList<RouteNodeInstance>();
128                for (RouteNodeInstance.Builder instance : builder.getNextNodeInstances()) {
129                    nextInstances.add(instance.build());
130                }
131                this.nextNodeInstances = nextInstances;
132            } else {
133                this.nextNodeInstances = Collections.emptyList();
134            }
135    
136    
137            this.documentId = builder.getDocumentId();
138            this.branchId = builder.getBranchId();
139            this.routeNodeId = builder.getRouteNodeId();
140            this.processId = builder.getProcessId();
141            this.active = builder.isActive();
142            this.complete = builder.isComplete();
143            this.initial = builder.isInitial();
144            this.id = builder.getId();
145        }
146    
147        @Override
148        public String getName() {
149            return this.name;
150        }
151    
152        @Override
153        public List<RouteNodeInstanceState> getState() {
154            return this.state;
155        }
156    
157        @Override
158        public String getDocumentId() {
159            return this.documentId;
160        }
161    
162        @Override
163        public String getBranchId() {
164            return this.branchId;
165        }
166    
167        @Override
168        public String getRouteNodeId() {
169            return this.routeNodeId;
170        }
171    
172        @Override
173        public String getProcessId() {
174            return this.processId;
175        }
176    
177        @Override
178        public boolean isActive() {
179            return this.active;
180        }
181    
182        @Override
183        public boolean isComplete() {
184            return this.complete;
185        }
186    
187        @Override
188        public boolean isInitial() {
189            return this.initial;
190        }
191    
192        @Override
193        public String getId() {
194            return this.id;
195        }
196    
197        @Override
198        public List<RouteNodeInstance> getNextNodeInstances() {
199            return this.nextNodeInstances;
200        }
201    
202    
203        /**
204         * A builder which can be used to construct {@link RouteNodeInstance} instances.  Enforces the constraints of the {@link RouteNodeInstanceContract}.
205         * 
206         */
207        public final static class Builder
208            implements Serializable, ModelBuilder, RouteNodeInstanceContract
209        {
210    
211            private String name;
212            private List<RouteNodeInstanceState.Builder> state;
213            private String documentId;
214            private String branchId;
215            private String routeNodeId;
216            private String processId;
217            private boolean active;
218            private boolean complete;
219            private boolean initial;
220            private String id;
221            private List<RouteNodeInstance.Builder> nextNodeInstances;
222    
223            private Builder() {
224                // TODO modify this constructor as needed to pass any required values and invoke the appropriate 'setter' methods
225            }
226    
227            public static Builder create() {
228                // TODO modify as needed to pass any required values and add them to the signature of the 'create' method
229                return new Builder();
230            }
231    
232            public static Builder create(RouteNodeInstanceContract contract) {
233                if (contract == null) {
234                    throw new IllegalArgumentException("contract was null");
235                }
236                // TODO if create() is modified to accept required parameters, this will need to be modified
237                Builder builder = create();
238                builder.setName(contract.getName());
239                if (contract.getState() != null) {
240                    List<RouteNodeInstanceState.Builder> stateBuilders = new ArrayList<RouteNodeInstanceState.Builder>();
241                    for (RouteNodeInstanceStateContract stateContract : contract.getState()) {
242                        stateBuilders.add(RouteNodeInstanceState.Builder.create(stateContract));
243                    }
244                    builder.setState(stateBuilders);
245                }
246    
247                builder.setDocumentId(contract.getDocumentId());
248                builder.setBranchId(contract.getBranchId());
249                builder.setRouteNodeId(contract.getRouteNodeId());
250                builder.setProcessId(contract.getProcessId());
251                builder.setActive(contract.isActive());
252                builder.setComplete(contract.isComplete());
253                builder.setInitial(contract.isInitial());
254                builder.setId(contract.getId());
255                if (contract.getNextNodeInstances() != null) {
256                    List<RouteNodeInstance.Builder> instanceBuilders = new ArrayList<RouteNodeInstance.Builder>();
257                    for(RouteNodeInstanceContract instanceContract : contract.getNextNodeInstances()) {
258                        instanceBuilders.add(RouteNodeInstance.Builder.create(instanceContract));
259                    }
260                    builder.setNextNodeInstances(instanceBuilders);
261                }
262                return builder;
263            }
264    
265            public RouteNodeInstance build() {
266                return new RouteNodeInstance(this);
267            }
268    
269            @Override
270            public String getName() {
271                return this.name;
272            }
273    
274            @Override
275            public List<RouteNodeInstanceState.Builder> getState() {
276                return this.state;
277            }
278    
279            @Override
280            public String getDocumentId() {
281                return this.documentId;
282            }
283    
284            @Override
285            public String getBranchId() {
286                return this.branchId;
287            }
288    
289            @Override
290            public String getRouteNodeId() {
291                return this.routeNodeId;
292            }
293    
294            @Override
295            public String getProcessId() {
296                return this.processId;
297            }
298    
299            @Override
300            public boolean isActive() {
301                return this.active;
302            }
303    
304            @Override
305            public boolean isComplete() {
306                return this.complete;
307            }
308    
309            @Override
310            public boolean isInitial() {
311                return this.initial;
312            }
313    
314            @Override
315            public String getId() {
316                return this.id;
317            }
318    
319            @Override
320            public List<RouteNodeInstance.Builder> getNextNodeInstances() {
321                return this.nextNodeInstances;
322            }
323    
324            public void setNextNodeInstances(List<RouteNodeInstance.Builder> nextNodeInstances) {
325                // TODO add validation of input value if required and throw IllegalArgumentException if needed
326                this.nextNodeInstances = Collections.unmodifiableList(nextNodeInstances);
327            }
328    
329            public void setName(String name) {
330                // TODO add validation of input value if required and throw IllegalArgumentException if needed
331                this.name = name;
332            }
333    
334            public void setState(List<RouteNodeInstanceState.Builder> state) {
335                // TODO add validation of input value if required and throw IllegalArgumentException if needed
336                this.state = state;
337            }
338    
339            public void setDocumentId(String documentId) {
340                // TODO add validation of input value if required and throw IllegalArgumentException if needed
341                this.documentId = documentId;
342            }
343    
344            public void setBranchId(String branchId) {
345                // TODO add validation of input value if required and throw IllegalArgumentException if needed
346                this.branchId = branchId;
347            }
348    
349            public void setRouteNodeId(String routeNodeId) {
350                // TODO add validation of input value if required and throw IllegalArgumentException if needed
351                this.routeNodeId = routeNodeId;
352            }
353    
354            public void setProcessId(String processId) {
355                // TODO add validation of input value if required and throw IllegalArgumentException if needed
356                this.processId = processId;
357            }
358    
359            public void setActive(boolean active) {
360                // TODO add validation of input value if required and throw IllegalArgumentException if needed
361                this.active = active;
362            }
363    
364            public void setComplete(boolean complete) {
365                // TODO add validation of input value if required and throw IllegalArgumentException if needed
366                this.complete = complete;
367            }
368    
369            public void setInitial(boolean initial) {
370                // TODO add validation of input value if required and throw IllegalArgumentException if needed
371                this.initial = initial;
372            }
373    
374            public void setId(String id) {
375                // TODO add validation of input value if required and throw IllegalArgumentException if needed
376                this.id = id;
377            }
378    
379        }
380    
381    
382        /**
383         * Defines some internal constants used on this class.
384         * 
385         */
386        static class Constants {
387    
388            final static String ROOT_ELEMENT_NAME = "routeNodeInstance";
389            final static String TYPE_NAME = "RouteNodeInstanceType";
390        }
391    
392    
393        /**
394         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
395         * 
396         */
397        static class Elements {
398    
399            final static String NAME = "name";
400            final static String STATE = "state";
401            final static String ROUTE_NODE_INSTANCE_STATE = "routeNodeInstanceState";
402            final static String DOCUMENT_ID = "documentId";
403            final static String BRANCH_ID = "branchId";
404            final static String ROUTE_NODE_ID = "routeNodeId";
405            final static String PROCESS_ID = "processId";
406            final static String ACTIVE = "active";
407            final static String COMPLETE = "complete";
408            final static String INITIAL = "initial";
409            final static String ID = "id";
410            final static String NEXT_NODE_INSTANCES = "nextNodeInstances";
411            final static String NEXT_NODE_INSTANCE = "nextNodeInstance";
412        }
413    
414    }