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    }