001 /**
002 * Copyright 2005-2013 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;
017
018 import java.io.Serializable;
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.List;
022
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.kuali.rice.kew.api.action.ActionRequest;
035 import org.kuali.rice.kew.api.action.ActionTaken;
036 import org.kuali.rice.kew.api.document.node.RouteNodeInstance;
037 import org.w3c.dom.Element;
038
039 @XmlRootElement(name = DocumentDetail.Constants.ROOT_ELEMENT_NAME)
040 @XmlAccessorType(XmlAccessType.NONE)
041 @XmlType(name = DocumentDetail.Constants.TYPE_NAME, propOrder = {
042 DocumentDetail.Elements.DOCUMENT,
043 DocumentDetail.Elements.ACTION_REQUESTS,
044 DocumentDetail.Elements.ACTIONS_TAKEN,
045 DocumentDetail.Elements.ROUTE_NODE_INSTANCES,
046 CoreConstants.CommonElements.FUTURE_ELEMENTS
047 })
048 public final class DocumentDetail extends AbstractDataTransferObject implements DocumentDetailContract {
049
050 private static final long serialVersionUID = -8569515693892958719L;
051
052 @XmlElement(name = Elements.DOCUMENT, required = true)
053 private final Document document;
054
055 @XmlElementWrapper(name = Elements.ACTION_REQUESTS, required = true)
056 @XmlElement(name = Elements.ACTION_REQUEST, required = false)
057 private final List<ActionRequest> actionRequests;
058
059 @XmlElementWrapper(name = Elements.ACTIONS_TAKEN, required = true)
060 @XmlElement(name = Elements.ACTION_TAKEN, required = false)
061 private final List<ActionTaken> actionsTaken;
062
063 @XmlElementWrapper(name = Elements.ROUTE_NODE_INSTANCES, required = true)
064 @XmlElement(name = Elements.ROUTE_NODE_INSTANCES, required = true)
065 private final List<RouteNodeInstance> routeNodeInstances;
066
067 @SuppressWarnings("unused")
068 @XmlAnyElement
069 private final Collection<Element> _futureElements = null;
070
071 /**
072 * Private constructor used only by JAXB.
073 */
074 private DocumentDetail() {
075 this.document = null;
076 this.actionRequests = null;
077 this.actionsTaken = null;
078 this.routeNodeInstances = null;
079 }
080
081 private DocumentDetail(Builder builder) {
082 this.document = builder.getDocument();
083 this.actionRequests = builder.getActionRequests();
084 this.actionsTaken = builder.getActionsTaken();
085 this.routeNodeInstances = builder.getRouteNodeInstances();
086 }
087
088 @Override
089 public Document getDocument() {
090 return this.document;
091 }
092
093 @Override
094 public List<ActionRequest> getActionRequests() {
095 return this.actionRequests;
096 }
097
098 @Override
099 public List<ActionTaken> getActionsTaken() {
100 return this.actionsTaken;
101 }
102
103 @Override
104 public List<RouteNodeInstance> getRouteNodeInstances() {
105 return this.routeNodeInstances;
106 }
107
108
109 /**
110 * A builder which can be used to construct {@link DocumentDetail} instances. Enforces the constraints of the {@link DocumentDetailContract}.
111 */
112 public final static class Builder implements Serializable, ModelBuilder, DocumentDetailContract {
113
114 private static final long serialVersionUID = 3108177943363491329L;
115
116 private Document document;
117 private List<ActionRequest> actionRequests;
118 private List<ActionTaken> actionsTaken;
119 private List<RouteNodeInstance> routeNodeInstances;
120
121 private Builder() {
122 // TODO modify this constructor as needed to pass any required values and invoke the appropriate 'setter' methods
123 }
124
125 public static Builder create(Document document) {
126 Builder builder = new Builder();
127 builder.setDocument(document);
128 builder.setActionRequests(new ArrayList<ActionRequest>());
129 builder.setActionsTaken(new ArrayList<ActionTaken>());
130 builder.setRouteNodeInstances(new ArrayList<RouteNodeInstance>());
131 return builder;
132 }
133
134 public static Builder create(DocumentDetailContract contract) {
135 if (contract == null) {
136 throw new IllegalArgumentException("contract was null");
137 }
138 Builder builder = create(contract.getDocument());
139 builder.setActionRequests(contract.getActionRequests());
140 builder.setActionsTaken(contract.getActionsTaken());
141 builder.setRouteNodeInstances(contract.getRouteNodeInstances());
142 return builder;
143 }
144
145 public DocumentDetail build() {
146 return new DocumentDetail(this);
147 }
148
149 @Override
150 public Document getDocument() {
151 return this.document;
152 }
153
154 @Override
155 public List<ActionRequest> getActionRequests() {
156 return this.actionRequests;
157 }
158
159 @Override
160 public List<ActionTaken> getActionsTaken() {
161 return this.actionsTaken;
162 }
163
164 @Override
165 public List<RouteNodeInstance> getRouteNodeInstances() {
166 return this.routeNodeInstances;
167 }
168
169 public void setDocument(Document document) {
170 if (document == null) {
171 throw new IllegalArgumentException("document was null");
172 }
173 this.document = document;
174 }
175
176 public void setActionRequests(List<ActionRequest> actionRequests) {
177 if (actionRequests == null) {
178 throw new IllegalArgumentException("actionRequests was null");
179 }
180 this.actionRequests = actionRequests;
181 }
182
183 public void setActionsTaken(List<ActionTaken> actionsTaken) {
184 if (actionsTaken == null) {
185 throw new IllegalArgumentException("actionsTaken was null");
186 }
187 this.actionsTaken = actionsTaken;
188 }
189
190 public void setRouteNodeInstances(List<RouteNodeInstance> routeNodeInstances) {
191 if (routeNodeInstances == null) {
192 throw new IllegalArgumentException("routeNodeInstances was null");
193 }
194 this.routeNodeInstances = routeNodeInstances;
195 }
196
197 }
198
199 /**
200 * Defines some internal constants used on this class.
201 */
202 static class Constants {
203 final static String ROOT_ELEMENT_NAME = "documentDetail";
204 final static String TYPE_NAME = "DocumentDetailType";
205 }
206
207 /**
208 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
209 */
210 static class Elements {
211 final static String DOCUMENT = "document";
212 final static String ACTION_REQUESTS = "actionRequests";
213 final static String ACTION_REQUEST = "actionRequest";
214 final static String ACTIONS_TAKEN = "actionsTaken";
215 final static String ACTION_TAKEN = "actionTaken";
216 final static String ROUTE_NODE_INSTANCES = "routeNodeInstances";
217 final static String ROUTE_NODE_INSTANCE = "routeNodeInstance";
218 }
219
220 }
221