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.note;
017    
018    import java.io.Serializable;
019    import java.util.Collection;
020    
021    import javax.xml.bind.annotation.XmlAccessType;
022    import javax.xml.bind.annotation.XmlAccessorType;
023    import javax.xml.bind.annotation.XmlAnyElement;
024    import javax.xml.bind.annotation.XmlElement;
025    import javax.xml.bind.annotation.XmlRootElement;
026    import javax.xml.bind.annotation.XmlType;
027    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
028    
029    import org.apache.commons.lang.StringUtils;
030    import org.joda.time.DateTime;
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.core.api.util.jaxb.DateTimeAdapter;
035    import org.w3c.dom.Element;
036    
037    @XmlRootElement(name = Note.Constants.ROOT_ELEMENT_NAME)
038    @XmlAccessorType(XmlAccessType.NONE)
039    @XmlType(name = Note.Constants.TYPE_NAME, propOrder = {
040                Note.Elements.ID,
041                    Note.Elements.DOCUMENT_ID,
042                    Note.Elements.AUTHOR_PRINCIPAL_ID,
043                    Note.Elements.CREATE_DATE,
044                    Note.Elements.TEXT,
045                    Note.Elements.CREATE_DATE_VALUE,
046            CoreConstants.CommonElements.VERSION_NUMBER,
047                    CoreConstants.CommonElements.FUTURE_ELEMENTS
048    })
049    public final class Note extends AbstractDataTransferObject implements NoteContract {
050    
051            private static final long serialVersionUID = 6619061362854480922L;
052    
053            @XmlElement(name = Elements.ID, required = false)
054        private final String id;
055            
056        @XmlElement(name = Elements.DOCUMENT_ID, required = true)
057        private final String documentId;
058        
059        @XmlElement(name = Elements.AUTHOR_PRINCIPAL_ID, required = true)
060        private final String authorPrincipalId;
061    
062        @Deprecated
063        @XmlElement(name = Elements.CREATE_DATE, required = false)
064        private final DateTime createDate;
065    
066        @XmlElement(name = Elements.CREATE_DATE_VALUE, required = false)
067        @XmlJavaTypeAdapter(DateTimeAdapter.class)
068        private final DateTime createDateValue;
069        
070        @XmlElement(name = Elements.TEXT, required = false)
071        private final String text;
072        
073        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
074        private final Long versionNumber;
075        
076        @SuppressWarnings("unused")
077        @XmlAnyElement
078        private final Collection<Element> _futureElements = null;
079    
080        /**
081         * Private constructor used only by JAXB.
082         * 
083         */
084        private Note() {
085            this.id = null;
086            this.documentId = null;
087            this.authorPrincipalId = null;
088            this.createDate = null;
089            this.createDateValue = null;
090            this.text = null;
091            this.versionNumber = null;
092        }
093    
094        private Note(Builder builder) {
095            this.id = builder.getId();
096            this.documentId = builder.getDocumentId();
097            this.authorPrincipalId = builder.getAuthorPrincipalId();
098            this.createDate = builder.getCreateDate();
099            this.createDateValue = builder.getCreateDate();
100            this.text = builder.getText();
101            this.versionNumber = builder.getVersionNumber();
102        }
103    
104        @Override
105        public String getId() {
106            return this.id;
107        }
108    
109        @Override
110        public String getDocumentId() {
111            return this.documentId;
112        }
113    
114        @Override
115        public String getAuthorPrincipalId() {
116            return this.authorPrincipalId;
117        }
118    
119        @Override
120        public DateTime getCreateDate() {
121            return this.createDateValue == null ? this.createDate : this.createDateValue;
122        }
123    
124        @Override
125        public String getText() {
126            return this.text;
127        }
128    
129        @Override
130        public Long getVersionNumber() {
131            return this.versionNumber;
132        }
133    
134        /**
135         * A builder which can be used to construct {@link Note} instances.  Enforces the constraints of the {@link NoteContract}.
136         */
137        public final static class Builder implements Serializable, ModelBuilder, NoteContract {
138    
139                    private static final long serialVersionUID = 6457130539374835936L;
140    
141                    private String id;
142            private String documentId;
143            private String authorPrincipalId;
144            private DateTime createDate;
145            private String text;
146            private Long versionNumber;
147    
148            private Builder(String documentId, String authorPrincipalId) {
149                setDocumentId(documentId);
150                setAuthorPrincipalId(authorPrincipalId);
151            }
152    
153            public static Builder create(String documentId, String authorPrincipalId) {
154                return new Builder(documentId, authorPrincipalId);
155            }
156    
157            public static Builder create(NoteContract contract) {
158                if (contract == null) {
159                    throw new IllegalArgumentException("contract was null");
160                }
161                // TODO if create() is modified to accept required parameters, this will need to be modified
162                Builder builder = create(contract.getDocumentId(), contract.getAuthorPrincipalId());
163                builder.setId(contract.getId());
164                builder.setCreateDate(contract.getCreateDate());
165                builder.setText(contract.getText());
166                builder.setVersionNumber(contract.getVersionNumber());
167                return builder;
168            }
169    
170            public Note build() {
171                return new Note(this);
172            }
173            
174            @Override
175            public String getId() {
176                return this.id;
177            }
178    
179            @Override
180            public String getDocumentId() {
181                return this.documentId;
182            }
183    
184            @Override
185            public String getAuthorPrincipalId() {
186                return this.authorPrincipalId;
187            }
188    
189            @Override
190            public DateTime getCreateDate() {
191                return this.createDate;
192            }
193    
194            @Override
195            public String getText() {
196                return this.text;
197            }
198    
199            @Override
200            public Long getVersionNumber() {
201                return this.versionNumber;
202            }
203    
204            public void setId(String id) {
205                this.id = id;
206            }
207    
208            public void setDocumentId(String documentId) {
209                    if (StringUtils.isBlank(documentId)) {
210                            throw new IllegalArgumentException("documentId was null or blank");
211                    }
212                this.documentId = documentId;
213            }
214    
215            public void setAuthorPrincipalId(String authorPrincipalId) {
216                    if (StringUtils.isBlank(authorPrincipalId)) {
217                            throw new IllegalArgumentException("authorPrincipalId was null or blank");
218                    }
219                this.authorPrincipalId = authorPrincipalId;
220            }
221    
222            public void setCreateDate(DateTime createDate) {
223                this.createDate = createDate;
224            }
225    
226            public void setText(String text) {
227                this.text = text;
228            }
229            
230            public void setVersionNumber(Long versionNumber) {
231                this.versionNumber = versionNumber;
232            }
233    
234        }
235    
236        /**
237         * Defines some internal constants used on this class.
238         */
239        static class Constants {
240            final static String ROOT_ELEMENT_NAME = "note";
241            final static String TYPE_NAME = "NoteType";
242        }
243    
244        /**
245         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
246         */
247        static class Elements {
248            final static String DOCUMENT_ID = "documentId";
249            final static String AUTHOR_PRINCIPAL_ID = "authorPrincipalId";
250            final static String CREATE_DATE = "createDate";
251            final static String CREATE_DATE_VALUE = "createDateValue";
252            final static String TEXT = "text";
253            final static String ID = "id";
254        }
255    
256    }
257