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.Collection;
020 import javax.xml.bind.annotation.XmlAccessType;
021 import javax.xml.bind.annotation.XmlAccessorType;
022 import javax.xml.bind.annotation.XmlAnyElement;
023 import javax.xml.bind.annotation.XmlElement;
024 import javax.xml.bind.annotation.XmlRootElement;
025 import javax.xml.bind.annotation.XmlType;
026 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
027
028 import org.joda.time.DateTime;
029 import org.kuali.rice.core.api.CoreConstants;
030 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
031 import org.kuali.rice.core.api.mo.ModelBuilder;
032 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
033 import org.w3c.dom.Element;
034
035 @XmlRootElement(name = DocumentStatusTransition.Constants.ROOT_ELEMENT_NAME)
036 @XmlAccessorType(XmlAccessType.NONE)
037 @XmlType(name = DocumentStatusTransition.Constants.TYPE_NAME, propOrder = {
038 DocumentStatusTransition.Elements.ID,
039 DocumentStatusTransition.Elements.DOCUMENT_ID,
040 DocumentStatusTransition.Elements.OLD_APP_DOC_STATUS,
041 DocumentStatusTransition.Elements.NEW_APP_DOC_STATUS,
042 DocumentStatusTransition.Elements.STATUS_TRANSITION_DATE,
043 DocumentStatusTransition.Elements.STATUS_TRANSITION_DATE_VALUE,
044 CoreConstants.CommonElements.FUTURE_ELEMENTS
045 })
046 public final class DocumentStatusTransition
047 extends AbstractDataTransferObject
048 implements DocumentStatusTransitionContract
049 {
050
051 @XmlElement(name = Elements.ID, required = false)
052 private final String id;
053 @XmlElement(name = Elements.DOCUMENT_ID, required = false)
054 private final String documentId;
055 @XmlElement(name = Elements.OLD_APP_DOC_STATUS, required = false)
056 private final String oldStatus;
057 @XmlElement(name = Elements.NEW_APP_DOC_STATUS, required = false)
058 private final String newStatus;
059 @Deprecated
060 @XmlElement(name = Elements.STATUS_TRANSITION_DATE, required = false)
061 private final DateTime statusTransitionDate;
062 @XmlElement(name = Elements.STATUS_TRANSITION_DATE_VALUE, required = false)
063 @XmlJavaTypeAdapter(DateTimeAdapter.class)
064 private final DateTime statusTransitionDateValue;
065 @SuppressWarnings("unused")
066 @XmlAnyElement
067 private final Collection<Element> _futureElements = null;
068
069 /**
070 * Private constructor used only by JAXB.
071 *
072 */
073 private DocumentStatusTransition() {
074 this.id = null;
075 this.documentId = null;
076 this.oldStatus = null;
077 this.newStatus = null;
078 this.statusTransitionDate = null;
079 this.statusTransitionDateValue = null;
080
081 }
082
083 private DocumentStatusTransition(Builder builder) {
084 this.id = builder.getId();
085 this.documentId = builder.getDocumentId();
086 this.oldStatus = builder.getOldStatus();
087 this.newStatus = builder.getNewStatus();
088 this.statusTransitionDate = builder.getStatusTransitionDate();
089 this.statusTransitionDateValue = builder.getStatusTransitionDate();
090 }
091
092 @Override
093 public String getId() {
094 return this.id;
095 }
096
097 @Override
098 public String getDocumentId() {
099 return this.documentId;
100 }
101
102 @Override
103 public String getOldStatus() {
104 return this.oldStatus;
105 }
106
107 @Override
108 public String getNewStatus() {
109 return this.newStatus;
110 }
111
112 @Override
113 public DateTime getStatusTransitionDate() {
114 return this.statusTransitionDateValue == null ? this.statusTransitionDate : this.statusTransitionDateValue;
115 }
116
117
118 /**
119 * A builder which can be used to construct {@link DocumentStatusTransition} instances. Enforces the constraints of the {@link DocumentStatusTransitionContract}.
120 *
121 */
122 public final static class Builder
123 implements Serializable, ModelBuilder, DocumentStatusTransitionContract
124 {
125
126 private String id;
127 private String documentId;
128 private String oldStatus;
129 private String newStatus;
130 private DateTime statusTransitionDate;
131
132 private Builder(String documentId, String oldStatus, String newStatus) {
133 setDocumentId(documentId);
134 setOldStatus(oldStatus);
135 setNewStatus(newStatus);
136 }
137
138 public static Builder create(String documentId, String oldStatus, String newStatus) {
139 return new Builder(documentId, oldStatus, newStatus);
140 }
141
142 public static Builder create(DocumentStatusTransitionContract contract) {
143 if (contract == null) {
144 throw new IllegalArgumentException("contract was null");
145 }
146 Builder builder = create(contract.getDocumentId(), contract.getOldStatus(), contract.getNewStatus());
147 builder.setId(contract.getId());
148 builder.setStatusTransitionDate(contract.getStatusTransitionDate());
149 return builder;
150 }
151
152 public DocumentStatusTransition build() {
153 return new DocumentStatusTransition(this);
154 }
155
156 @Override
157 public String getId() {
158 return this.id;
159 }
160
161 @Override
162 public String getDocumentId() {
163 return this.documentId;
164 }
165
166 @Override
167 public String getOldStatus() {
168 return this.oldStatus;
169 }
170
171 @Override
172 public String getNewStatus() {
173 return this.newStatus;
174 }
175
176 @Override
177 public DateTime getStatusTransitionDate() {
178 return this.statusTransitionDate;
179 }
180
181 public void setId(String id) {
182 // TODO add validation of input value if required and throw IllegalArgumentException if needed
183 this.id = id;
184 }
185
186 public void setDocumentId(String documentId) {
187 // TODO add validation of input value if required and throw IllegalArgumentException if needed
188 this.documentId = documentId;
189 }
190
191 public void setOldStatus(String oldStatus) {
192 // TODO add validation of input value if required and throw IllegalArgumentException if needed
193 this.oldStatus = oldStatus;
194 }
195
196 public void setNewStatus(String newStatus) {
197 // TODO add validation of input value if required and throw IllegalArgumentException if needed
198 this.newStatus = newStatus;
199 }
200
201 public void setStatusTransitionDate(DateTime statusTransitionDate) {
202 // TODO add validation of input value if required and throw IllegalArgumentException if needed
203 this.statusTransitionDate = statusTransitionDate;
204 }
205
206 }
207
208
209 /**
210 * Defines some internal constants used on this class.
211 *
212 */
213 static class Constants {
214
215 final static String ROOT_ELEMENT_NAME = "documentStatusTransition";
216 final static String TYPE_NAME = "DocumentStatusTransitionType";
217
218 }
219
220
221 /**
222 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
223 *
224 */
225 static class Elements {
226
227 final static String ID = "id";
228 final static String DOCUMENT_ID = "documentId";
229 final static String OLD_APP_DOC_STATUS = "oldStatus";
230 final static String NEW_APP_DOC_STATUS = "newStatus";
231 final static String STATUS_TRANSITION_DATE = "statusTransitionDate";
232 final static String STATUS_TRANSITION_DATE_VALUE = "statusTransitionDateValue";
233
234 }
235
236 }