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.action;
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.w3c.dom.Element;
025    
026    import javax.xml.bind.annotation.XmlAccessType;
027    import javax.xml.bind.annotation.XmlAccessorType;
028    import javax.xml.bind.annotation.XmlAnyElement;
029    import javax.xml.bind.annotation.XmlElement;
030    import javax.xml.bind.annotation.XmlRootElement;
031    import javax.xml.bind.annotation.XmlType;
032    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
033    import java.io.Serializable;
034    import java.util.Collection;
035    
036    @XmlRootElement(name = ActionTaken.Constants.ROOT_ELEMENT_NAME)
037    @XmlAccessorType(XmlAccessType.NONE)
038    @XmlType(name = ActionTaken.Constants.TYPE_NAME, propOrder = {
039        ActionTaken.Elements.ID,
040        ActionTaken.Elements.DOCUMENT_ID,
041        ActionTaken.Elements.PRINCIPAL_ID,
042        ActionTaken.Elements.DELEGATOR_PRINCIPAL_ID,
043        ActionTaken.Elements.DELEGATOR_GROUP_ID,
044        ActionTaken.Elements.ACTION_TAKEN_CODE,
045        ActionTaken.Elements.ACTION_DATE,
046        ActionTaken.Elements.ANNOTATION,
047        ActionTaken.Elements.CURRENT,
048        CoreConstants.CommonElements.FUTURE_ELEMENTS
049    })
050    public final class ActionTaken extends AbstractDataTransferObject implements ActionTakenContract {
051    
052            private static final long serialVersionUID = 8411150332911080837L;
053    
054            @XmlElement(name = Elements.ID, required = true)
055        private final String id;
056        
057        @XmlElement(name = Elements.DOCUMENT_ID, required = true)
058        private final String documentId;
059        
060        @XmlElement(name = Elements.PRINCIPAL_ID, required = true)
061        private final String principalId;
062        
063        @XmlElement(name = Elements.DELEGATOR_PRINCIPAL_ID, required = false)
064        private final String delegatorPrincipalId;
065        
066        @XmlElement(name = Elements.DELEGATOR_GROUP_ID, required = false)
067        private final String delegatorGroupId;
068        
069        @XmlElement(name = Elements.ACTION_TAKEN_CODE, required = true)
070        private final String actionTakenCode;
071        
072        @XmlElement(name = Elements.ACTION_DATE, required = true)
073        @XmlJavaTypeAdapter(DateTimeAdapter.class)
074        private final DateTime actionDate;
075    
076        @XmlElement(name = Elements.ANNOTATION, required = false)
077        private final String annotation;
078    
079        @XmlElement(name = Elements.CURRENT, required = true)
080        private final boolean current;    
081        
082        @SuppressWarnings("unused")
083        @XmlAnyElement
084        private final Collection<Element> _futureElements = null;
085    
086        /**
087         * Private constructor used only by JAXB.
088         * 
089         */
090        private ActionTaken() {
091            this.id = null;
092            this.documentId = null;
093            this.principalId = null;
094            this.delegatorPrincipalId = null;
095            this.delegatorGroupId = null;
096            this.actionTakenCode = null;
097            this.actionDate = null;
098            this.annotation = null;
099            this.current = false;
100        }
101    
102        private ActionTaken(Builder builder) {
103            this.annotation = builder.getAnnotation();
104            this.id = builder.getId();
105            this.documentId = builder.getDocumentId();
106            this.principalId = builder.getPrincipalId();
107            this.delegatorPrincipalId = builder.getDelegatorPrincipalId();
108            this.delegatorGroupId = builder.getDelegatorGroupId();
109            this.actionTakenCode = builder.getActionTaken().getCode();
110            this.actionDate = builder.getActionDate();
111            this.current = builder.isCurrent();
112        }
113    
114        @Override
115        public String getId() {
116            return this.id;
117        }
118    
119        @Override
120        public String getDocumentId() {
121            return this.documentId;
122        }
123    
124        @Override
125        public String getPrincipalId() {
126            return this.principalId;
127        }
128    
129        @Override
130        public String getDelegatorPrincipalId() {
131            return this.delegatorPrincipalId;
132        }
133    
134        @Override
135        public String getDelegatorGroupId() {
136            return this.delegatorGroupId;
137        }
138    
139        @Override
140        public ActionType getActionTaken() {
141            return ActionType.fromCode(actionTakenCode);
142        }
143    
144        @Override
145        public DateTime getActionDate() {
146            return this.actionDate;
147        }
148        
149        @Override
150        public String getAnnotation() {
151            return this.annotation;
152        }
153    
154        @Override
155        public boolean isCurrent() {
156            return this.current;
157        }
158    
159        /**
160         * A builder which can be used to construct {@link ActionTaken} instances.  Enforces the constraints of the {@link ActionTakenContract}.
161         */
162        public final static class Builder implements Serializable, ModelBuilder, ActionTakenContract {
163    
164                    private static final long serialVersionUID = -1226075070994810756L;
165    
166                    private String id;
167            private String documentId;
168            private String principalId;
169            private String delegatorPrincipalId;
170            private String delegatorGroupId;
171            private ActionType actionTaken;
172            private DateTime actionDate;
173            private String annotation;
174            private boolean current;
175    
176            private Builder(String id, String documentId, String principalId, ActionType actionTaken) {
177                    setId(id);
178                    setDocumentId(documentId);
179                    setPrincipalId(principalId);
180                    setActionTaken(actionTaken);
181                setActionDate(new DateTime());
182                    setCurrent(true);
183            }
184    
185            public static Builder create(String id, String documentId, String principalId, ActionType actionTaken) {
186                return new Builder(id, documentId, principalId, actionTaken);
187            }
188    
189            public static Builder create(ActionTakenContract contract) {
190                if (contract == null) {
191                    throw new IllegalArgumentException("contract was null");
192                }
193                Builder builder = create(contract.getId(), contract.getDocumentId(), contract.getPrincipalId(), contract.getActionTaken());
194                builder.setDelegatorPrincipalId(contract.getDelegatorPrincipalId());
195                builder.setDelegatorGroupId(contract.getDelegatorGroupId());
196                builder.setActionDate(contract.getActionDate());
197                builder.setAnnotation(contract.getAnnotation());
198                builder.setCurrent(contract.isCurrent());
199                return builder;
200            }
201    
202            public ActionTaken build() {
203                return new ActionTaken(this);
204            }
205    
206            @Override
207            public String getId() {
208                return this.id;
209            }
210    
211            @Override
212            public String getDocumentId() {
213                return this.documentId;
214            }
215    
216            @Override
217            public String getPrincipalId() {
218                return this.principalId;
219            }
220    
221            @Override
222            public String getDelegatorPrincipalId() {
223                return this.delegatorPrincipalId;
224            }
225    
226            @Override
227            public String getDelegatorGroupId() {
228                return this.delegatorGroupId;
229            }
230    
231            @Override
232            public ActionType getActionTaken() {
233                return this.actionTaken;
234            }
235    
236            @Override
237            public DateTime getActionDate() {
238                return this.actionDate;
239            }
240            
241            @Override
242            public String getAnnotation() {
243                return this.annotation;
244            }
245    
246            @Override
247            public boolean isCurrent() {
248                return this.current;
249            }
250    
251            public void setId(String id) {
252                if (StringUtils.isWhitespace(id)) {
253                    throw new IllegalArgumentException("id was blank");
254                }
255                this.id = id;
256            }
257    
258            public void setDocumentId(String documentId) {
259                    if (StringUtils.isBlank(documentId)) {
260                    throw new IllegalArgumentException("documentId was null or blank");
261                }
262                this.documentId = documentId;
263            }
264    
265            public void setPrincipalId(String principalId) {
266                    if (StringUtils.isBlank(principalId)) {
267                    throw new IllegalArgumentException("principalId was null or blank");
268                }
269                this.principalId = principalId;
270            }
271    
272            public void setDelegatorPrincipalId(String delegatorPrincipalId) {
273                this.delegatorPrincipalId = delegatorPrincipalId;
274            }
275    
276            public void setDelegatorGroupId(String delegatorGroupId) {
277                this.delegatorGroupId = delegatorGroupId;
278            }
279    
280            public void setActionTaken(ActionType actionTaken) {
281                    if (actionTaken == null) {
282                    throw new IllegalArgumentException("actionTaken was null");
283                }
284                this.actionTaken = actionTaken;
285            }
286    
287            public void setActionDate(DateTime actionDate) {
288                if (actionDate == null) {
289                    throw new IllegalArgumentException("actionDate was null");
290                }
291                this.actionDate = actionDate;
292            }
293    
294            public void setAnnotation(String annotation) {
295                this.annotation = annotation;
296            }
297            
298            public void setCurrent(boolean current) {
299                this.current = current;
300            }
301    
302        }
303    
304        /**
305         * Defines some internal constants used on this class.
306         */
307        static class Constants {
308            final static String ROOT_ELEMENT_NAME = "actionTaken";
309            final static String TYPE_NAME = "ActionTakenType";
310        }
311    
312    
313        /**
314         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
315         */
316        static class Elements {
317            final static String ID = "id";
318            final static String DOCUMENT_ID = "documentId";
319            final static String PRINCIPAL_ID = "principalId";
320            final static String DELEGATOR_PRINCIPAL_ID = "delegatorPrincipalId";
321            final static String DELEGATOR_GROUP_ID = "delegatorGroupId";
322            final static String ACTION_TAKEN_CODE = "actionTakenCode";
323            final static String ACTION_DATE = "actionDate";
324            final static String ANNOTATION = "annotation";
325            final static String CURRENT = "current";
326        }
327    
328    }