001    /**
002     * Copyright 2005-2011 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 org.apache.commons.lang.StringUtils;
019    import org.joda.time.DateTime;
020    import org.kuali.rice.core.api.CoreConstants;
021    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
022    import org.kuali.rice.core.api.mo.ModelBuilder;
023    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
024    import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
025    import org.w3c.dom.Element;
026    
027    import javax.xml.bind.annotation.XmlAccessType;
028    import javax.xml.bind.annotation.XmlAccessorType;
029    import javax.xml.bind.annotation.XmlAnyElement;
030    import javax.xml.bind.annotation.XmlElement;
031    import javax.xml.bind.annotation.XmlRootElement;
032    import javax.xml.bind.annotation.XmlType;
033    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
034    import java.io.Serializable;
035    import java.util.Collection;
036    import java.util.Collections;
037    import java.util.HashMap;
038    import java.util.Map;
039    
040    @XmlRootElement(name = Document.Constants.ROOT_ELEMENT_NAME)
041    @XmlAccessorType(XmlAccessType.NONE)
042    @XmlType(name = Document.Constants.TYPE_NAME, propOrder = {
043        Document.Elements.DOCUMENT_ID,
044        Document.Elements.STATUS,
045        Document.Elements.DATE_CREATED,
046        Document.Elements.DATE_LAST_MODIFIED,
047        Document.Elements.DATE_APPROVED,
048        Document.Elements.DATE_FINALIZED,
049        Document.Elements.TITLE,
050        Document.Elements.APPLICATION_DOCUMENT_ID,
051        Document.Elements.INITIATOR_PRINCIPAL_ID,
052        Document.Elements.ROUTED_BY_PRINCIPAL_ID,
053        Document.Elements.DOCUMENT_TYPE_NAME,
054        Document.Elements.DOCUMENT_TYPE_ID,
055        Document.Elements.DOCUMENT_HANDLER_URL,
056        Document.Elements.APPLICATION_DOCUMENT_STATUS,
057        Document.Elements.APPLICATION_DOCUMENT_STATUS_DATE,
058        Document.Elements.VARIABLES,
059        CoreConstants.CommonElements.FUTURE_ELEMENTS
060    })
061    public final class Document extends AbstractDataTransferObject implements DocumentContract {
062    
063            private static final long serialVersionUID = -6954090887747605047L;
064    
065            @XmlElement(name = Elements.DOCUMENT_ID, required = true)
066        private final String documentId;
067    
068        @XmlElement(name = Elements.STATUS, required = true)
069        private final String status;
070    
071        @XmlElement(name = Elements.DATE_CREATED, required = true)
072        @XmlJavaTypeAdapter(DateTimeAdapter.class)
073        private final DateTime dateCreated;
074    
075        @XmlElement(name = Elements.DATE_LAST_MODIFIED, required = true)
076        @XmlJavaTypeAdapter(DateTimeAdapter.class)
077        private final DateTime dateLastModified;
078    
079        @XmlElement(name = Elements.DATE_APPROVED, required = false)
080        @XmlJavaTypeAdapter(DateTimeAdapter.class)
081        private final DateTime dateApproved;
082    
083        @XmlElement(name = Elements.DATE_FINALIZED, required = false)
084        @XmlJavaTypeAdapter(DateTimeAdapter.class)
085        private final DateTime dateFinalized;
086    
087        @XmlElement(name = Elements.TITLE, required = false)
088        private final String title;
089    
090        @XmlElement(name = Elements.APPLICATION_DOCUMENT_ID, required = false)
091        private final String applicationDocumentId;
092    
093        @XmlElement(name = Elements.INITIATOR_PRINCIPAL_ID, required = true)
094        private final String initiatorPrincipalId;
095    
096        @XmlElement(name = Elements.ROUTED_BY_PRINCIPAL_ID, required = false)
097        private final String routedByPrincipalId;
098    
099        @XmlElement(name = Elements.DOCUMENT_TYPE_NAME, required = true)
100        private final String documentTypeName;
101    
102        @XmlElement(name = Elements.DOCUMENT_TYPE_ID, required = true)
103        private final String documentTypeId;
104    
105        @XmlElement(name = Elements.DOCUMENT_HANDLER_URL, required = false)
106        private final String documentHandlerUrl;
107    
108        @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS, required = false)
109        private final String applicationDocumentStatus;
110    
111        @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS_DATE, required = false)
112        @XmlJavaTypeAdapter(DateTimeAdapter.class)
113        private final DateTime applicationDocumentStatusDate;
114    
115        @XmlElement(name = Elements.VARIABLES, required = false)
116        @XmlJavaTypeAdapter(MapStringStringAdapter.class)
117        private final Map<String, String> variables;
118    
119        @SuppressWarnings("unused")
120        @XmlAnyElement
121        private final Collection<Element> _futureElements = null;
122    
123        /**
124         * Private constructor used only by JAXB.
125         */
126        private Document() {
127            this.documentId = null;
128            this.status = null;
129            this.dateCreated = null;
130            this.dateLastModified = null;
131            this.dateApproved = null;
132            this.dateFinalized = null;
133            this.title = null;
134            this.applicationDocumentId = null;
135            this.initiatorPrincipalId = null;
136            this.routedByPrincipalId = null;
137            this.documentTypeName = null;
138            this.documentTypeId = null;
139            this.documentHandlerUrl = null;
140            this.applicationDocumentStatus = null;
141            this.applicationDocumentStatusDate = null;
142            this.variables = null;
143        }
144    
145        private Document(Builder builder) {
146            this.documentId = builder.getDocumentId();
147            this.status = builder.getStatus().getCode();
148            this.dateCreated = builder.getDateCreated();
149            this.dateLastModified = builder.getDateLastModified();
150            this.dateApproved = builder.getDateApproved();
151            this.dateFinalized = builder.getDateFinalized();
152            this.title = builder.getTitle();
153            this.applicationDocumentId = builder.getApplicationDocumentId();
154            this.initiatorPrincipalId = builder.getInitiatorPrincipalId();
155            this.routedByPrincipalId = builder.getRoutedByPrincipalId();
156            this.documentTypeName = builder.getDocumentTypeName();
157            this.documentTypeId = builder.getDocumentTypeId();
158            this.documentHandlerUrl = builder.getDocumentHandlerUrl();
159            this.applicationDocumentStatus = builder.getApplicationDocumentStatus();
160            this.applicationDocumentStatusDate = builder.getApplicationDocumentStatusDate();
161            this.variables = new HashMap<String, String>(builder.getVariables());
162        }
163    
164        @Override
165        public String getDocumentId() {
166            return this.documentId;
167        }
168    
169        @Override
170        public DocumentStatus getStatus() {
171            if (StringUtils.isBlank(this.status)) {
172                    throw new IllegalStateException("Status should not be null");
173            }
174                    return DocumentStatus.fromCode(this.status);
175        }
176    
177        @Override
178        public DateTime getDateCreated() {
179            return this.dateCreated;
180        }
181    
182        @Override
183        public DateTime getDateLastModified() {
184            return this.dateLastModified;
185        }
186    
187        @Override
188        public DateTime getDateApproved() {
189            return this.dateApproved;
190        }
191    
192        @Override
193        public DateTime getDateFinalized() {
194            return this.dateFinalized;
195        }
196    
197        @Override
198        public String getTitle() {
199            return this.title;
200        }
201    
202        @Override
203        public String getApplicationDocumentId() {
204            return this.applicationDocumentId;
205        }
206    
207        @Override
208        public String getInitiatorPrincipalId() {
209            return this.initiatorPrincipalId;
210        }
211    
212        @Override
213        public String getRoutedByPrincipalId() {
214            return this.routedByPrincipalId;
215        }
216    
217        @Override
218        public String getDocumentTypeName() {
219            return this.documentTypeName;
220        }
221    
222        @Override
223        public String getDocumentTypeId() {
224            return this.documentTypeId;
225        }
226    
227        @Override
228        public String getDocumentHandlerUrl() {
229            return this.documentHandlerUrl;
230        }
231    
232        @Override
233        public String getApplicationDocumentStatus() {
234            return this.applicationDocumentStatus;
235        }
236    
237        @Override
238        public DateTime getApplicationDocumentStatusDate() {
239            return this.applicationDocumentStatusDate;
240        }
241    
242        @Override
243        public Map<String, String> getVariables() {
244            return Collections.unmodifiableMap(this.variables);
245        }
246    
247        /**
248         * A builder which can be used to construct {@link Document} instances.  Enforces the constraints of the {@link DocumentContract}.
249         *
250         */
251        public final static class Builder
252            implements Serializable, ModelBuilder, DocumentContract
253        {
254    
255                    private static final long serialVersionUID = -1584497024880308500L;
256    
257                    private String documentId;
258            private DocumentStatus status;
259            private DateTime dateCreated;
260            private DateTime dateLastModified;
261            private DateTime dateApproved;
262            private DateTime dateFinalized;
263            private String title;
264            private String applicationDocumentId;
265            private String initiatorPrincipalId;
266            private String routedByPrincipalId;
267            private String documentTypeName;
268            private String documentTypeId;
269            private String documentHandlerUrl;
270            private String applicationDocumentStatus;
271            private DateTime applicationDocumentStatusDate;
272            private Map<String, String> variables;
273    
274            private Builder(String documentId, DocumentStatus status, DateTime dateCreated, String initiatorPrincipalId, String documentTypeName, String documentTypeId) {
275                setDocumentId(documentId);
276                setStatus(status);
277                setDateCreated(dateCreated);
278                setTitle("");
279                setInitiatorPrincipalId(initiatorPrincipalId);
280                setDocumentTypeName(documentTypeName);
281                setDocumentTypeId(documentTypeId);
282                setVariables(new HashMap<String, String>());
283            }
284    
285            public static Builder create(String documentId, DocumentStatus status, DateTime dateCreated, String initiatorPrincipalId, String documentTypeName, String documentTypeId) {
286                return new Builder(documentId, status, dateCreated, initiatorPrincipalId, documentTypeName, documentTypeId);
287            }
288    
289            public static Builder create(String documentId, String initiatorPrinicpalId, String documentTypeName, String documentTypeId) {
290                    return new Builder(documentId, DocumentStatus.INITIATED, new DateTime(), initiatorPrinicpalId, documentTypeName, documentTypeId);
291            }
292    
293            public static Builder create(DocumentContract contract) {
294                if (contract == null) {
295                    throw new IllegalArgumentException("contract was null");
296                }
297                Builder builder = create(
298                            contract.getDocumentId(),
299                            contract.getStatus(),
300                            contract.getDateCreated(),
301                            contract.getInitiatorPrincipalId(),
302                            contract.getDocumentTypeName(),
303                            contract.getDocumentTypeId()
304                );
305                builder.setDateLastModified(contract.getDateLastModified());
306                builder.setDateApproved(contract.getDateApproved());
307                builder.setDateFinalized(contract.getDateFinalized());
308                builder.setTitle(contract.getTitle());
309                builder.setApplicationDocumentId(contract.getApplicationDocumentId());
310                builder.setRoutedByPrincipalId(contract.getRoutedByPrincipalId());
311                builder.setDocumentHandlerUrl(contract.getDocumentHandlerUrl());
312                builder.setApplicationDocumentStatus(contract.getApplicationDocumentStatus());
313                builder.setApplicationDocumentStatusDate(contract.getApplicationDocumentStatusDate());
314                builder.setVariables(new HashMap<String, String>(contract.getVariables()));
315                return builder;
316            }
317    
318            public Document build() {
319                return new Document(this);
320            }
321    
322            @Override
323            public String getDocumentId() {
324                return this.documentId;
325            }
326    
327            @Override
328            public DocumentStatus getStatus() {
329                return this.status;
330            }
331    
332            @Override
333            public DateTime getDateCreated() {
334                return this.dateCreated;
335            }
336    
337            @Override
338            public DateTime getDateLastModified() {
339                return this.dateLastModified;
340            }
341    
342            @Override
343            public DateTime getDateApproved() {
344                return this.dateApproved;
345            }
346    
347            @Override
348            public DateTime getDateFinalized() {
349                return this.dateFinalized;
350            }
351    
352            @Override
353            public String getTitle() {
354                return this.title;
355            }
356    
357            @Override
358            public String getApplicationDocumentId() {
359                return this.applicationDocumentId;
360            }
361    
362            @Override
363            public String getInitiatorPrincipalId() {
364                return this.initiatorPrincipalId;
365            }
366    
367            @Override
368            public String getRoutedByPrincipalId() {
369                return this.routedByPrincipalId;
370            }
371    
372            @Override
373            public String getDocumentTypeName() {
374                return this.documentTypeName;
375            }
376    
377            @Override
378            public String getDocumentTypeId() {
379                return this.documentTypeId;
380            }
381    
382            @Override
383            public String getDocumentHandlerUrl() {
384                return this.documentHandlerUrl;
385            }
386    
387            @Override
388            public String getApplicationDocumentStatus() {
389                return this.applicationDocumentStatus;
390            }
391    
392            @Override
393            public DateTime getApplicationDocumentStatusDate() {
394                return this.applicationDocumentStatusDate;
395            }
396    
397            @Override
398            public Map<String, String> getVariables() {
399                return this.variables;
400            }
401    
402            public void setDocumentId(String documentId) {
403                if (StringUtils.isBlank(documentId)) {
404                    throw new IllegalArgumentException("documentId was null or blank");
405                }
406                this.documentId = documentId;
407            }
408    
409            public void setStatus(DocumentStatus status) {
410                if (status == null) {
411                    throw new IllegalArgumentException("status was null");
412                }
413                this.status = status;
414            }
415    
416            public void setDateCreated(DateTime dateCreated) {
417                if (dateCreated == null) {
418                    throw new IllegalArgumentException("dateCreated was null");
419                }
420                this.dateCreated = dateCreated;
421            }
422    
423            public void setDateLastModified(DateTime dateLastModified) {
424                this.dateLastModified = dateLastModified;
425            }
426    
427            public void setDateApproved(DateTime dateApproved) {
428                this.dateApproved = dateApproved;
429            }
430    
431            public void setDateFinalized(DateTime dateFinalized) {
432                this.dateFinalized = dateFinalized;
433            }
434    
435            public void setTitle(String title) {
436                    if (title == null) {
437                            title = "";
438                    }
439                this.title = title;
440            }
441    
442            public void setApplicationDocumentId(String applicationDocumentId) {
443                this.applicationDocumentId = applicationDocumentId;
444            }
445    
446            public void setInitiatorPrincipalId(String initiatorPrincipalId) {
447                if (StringUtils.isBlank(initiatorPrincipalId)) {
448                    throw new IllegalArgumentException("initiatorPrincipalId was null or blank");
449                }
450                this.initiatorPrincipalId = initiatorPrincipalId;
451            }
452    
453            public void setRoutedByPrincipalId(String routedByPrincipalId) {
454                this.routedByPrincipalId = routedByPrincipalId;
455            }
456    
457            public void setDocumentTypeName(String documentTypeName) {
458                    if (StringUtils.isBlank(documentTypeName)) {
459                    throw new IllegalArgumentException("documentTypeName was null or blank");
460                }
461                this.documentTypeName = documentTypeName;
462            }
463    
464            public void setDocumentTypeId(String documentTypeId) {
465                    if (StringUtils.isBlank(documentTypeId)) {
466                    throw new IllegalArgumentException("documentTypeId was null or blank");
467                }
468                this.documentTypeId = documentTypeId;
469            }
470    
471            public void setDocumentHandlerUrl(String documentHandlerUrl) {
472                this.documentHandlerUrl = documentHandlerUrl;
473            }
474    
475            public void setApplicationDocumentStatus(String applicationDocumentStatus) {
476                this.applicationDocumentStatus = applicationDocumentStatus;
477            }
478    
479            public void setApplicationDocumentStatusDate(DateTime applicationDocumentStatusDate) {
480                this.applicationDocumentStatusDate = applicationDocumentStatusDate;
481            }
482    
483            public void setVariables(Map<String, String> variables) {
484                    if (variables == null) {
485                            variables = new HashMap<String, String>();
486                    }
487                this.variables = variables;
488            }
489    
490        }
491    
492        /**
493         * Defines some internal constants used on this class.
494         */
495        static class Constants {
496            final static String ROOT_ELEMENT_NAME = "document";
497            final static String TYPE_NAME = "DocumentType";
498        }
499    
500        /**
501         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
502         */
503        static class Elements {
504            final static String DOCUMENT_ID = "documentId";
505            final static String STATUS = "status";
506            final static String DATE_CREATED = "dateCreated";
507            final static String DATE_LAST_MODIFIED = "dateLastModified";
508            final static String DATE_APPROVED = "dateApproved";
509            final static String DATE_FINALIZED = "dateFinalized";
510            final static String TITLE = "title";
511            final static String APPLICATION_DOCUMENT_ID = "applicationDocumentId";
512            final static String INITIATOR_PRINCIPAL_ID = "initiatorPrincipalId";
513            final static String ROUTED_BY_PRINCIPAL_ID = "routedByPrincipalId";
514            final static String DOCUMENT_TYPE_NAME = "documentTypeName";
515            final static String DOCUMENT_TYPE_ID = "documentTypeId";
516            final static String DOCUMENT_HANDLER_URL = "documentHandlerUrl";
517            final static String APPLICATION_DOCUMENT_STATUS = "applicationDocumentStatus";
518            final static String APPLICATION_DOCUMENT_STATUS_DATE = "applicationDocumentStatusDate";
519            final static String VARIABLES = "variables";
520        }
521    
522    }
523