001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kew.api.action;
017
018import org.apache.commons.collections.CollectionUtils;
019import org.apache.commons.lang.StringUtils;
020import org.joda.time.DateTime;
021import org.kuali.rice.core.api.CoreConstants;
022import org.kuali.rice.core.api.delegation.DelegationType;
023import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
024import org.kuali.rice.core.api.mo.ModelBuilder;
025import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
026import org.w3c.dom.Element;
027
028import javax.xml.bind.annotation.XmlAccessType;
029import javax.xml.bind.annotation.XmlAccessorType;
030import javax.xml.bind.annotation.XmlAnyElement;
031import javax.xml.bind.annotation.XmlElement;
032import javax.xml.bind.annotation.XmlRootElement;
033import javax.xml.bind.annotation.XmlType;
034import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
035import java.io.Serializable;
036import java.util.Collection;
037import java.util.Collections;
038
039@XmlRootElement(name = ActionItem.Constants.ROOT_ELEMENT_NAME)
040@XmlAccessorType(XmlAccessType.NONE)
041@XmlType(name = ActionItem.Constants.TYPE_NAME, propOrder = {
042    ActionItem.Elements.ID,
043    ActionItem.Elements.DATE_TIME_ASSIGNED,
044    ActionItem.Elements.ACTION_REQUEST_CD,
045    ActionItem.Elements.ACTION_REQUEST_ID,
046    ActionItem.Elements.DOCUMENT_ID,
047    ActionItem.Elements.DOC_TITLE,
048    ActionItem.Elements.DOC_LABEL,
049    ActionItem.Elements.DOC_HANDLER_U_R_L,
050    ActionItem.Elements.DOC_NAME,
051    ActionItem.Elements.RESPONSIBILITY_ID,
052    ActionItem.Elements.ROLE_NAME,
053    ActionItem.Elements.DELEGATION_TYPE,
054    ActionItem.Elements.GROUP_ID,
055    ActionItem.Elements.PRINCIPAL_ID,
056    ActionItem.Elements.DELEGATOR_GROUP_ID,
057    ActionItem.Elements.DELEGATOR_PRINCIPAL_ID,
058    ActionItem.Elements.DATE_TIME_ASSIGNED_VALUE,
059    CoreConstants.CommonElements.FUTURE_ELEMENTS
060})
061public final class ActionItem
062    extends AbstractDataTransferObject
063    implements ActionItemContract
064{
065
066    @XmlElement(name = Elements.ID, required = false)
067    private final String id;
068    @Deprecated
069    @XmlElement(name = Elements.DATE_TIME_ASSIGNED, required = false)
070    private final DateTime dateTimeAssigned;
071    @XmlElement(name = Elements.ACTION_REQUEST_CD, required = true)
072    private final String actionRequestCd;
073    @XmlElement(name = Elements.ACTION_REQUEST_ID, required = true)
074    private final String actionRequestId;
075    @XmlElement(name = Elements.DOCUMENT_ID, required = true)
076    private final String documentId;
077    @XmlElement(name = Elements.DOC_TITLE, required = false)
078    private final String docTitle;
079    @XmlElement(name = Elements.DOC_LABEL, required = true)
080    private final String docLabel;
081    @XmlElement(name = Elements.DOC_HANDLER_U_R_L, required = true)
082    private final String docHandlerURL;
083    @XmlElement(name = Elements.DOC_NAME, required = true)
084    private final String docName;
085    @XmlElement(name = Elements.RESPONSIBILITY_ID, required = true)
086    private final String responsibilityId;
087    @XmlElement(name = Elements.ROLE_NAME, required = false)
088    private final String roleName;
089    @XmlElement(name = Elements.DELEGATION_TYPE, required = false)
090    private final String delegationType;
091    @XmlElement(name = Elements.GROUP_ID, required = false)
092    private final String groupId;
093    @XmlElement(name = Elements.PRINCIPAL_ID, required = true)
094    private final String principalId;
095    @XmlElement(name = Elements.DELEGATOR_GROUP_ID, required = false)
096    private final String delegatorGroupId;
097    @XmlElement(name = Elements.DELEGATOR_PRINCIPAL_ID, required = false)
098    private final String delegatorPrincipalId;
099    @XmlElement(name = Elements.DATE_TIME_ASSIGNED_VALUE, required = false)
100    @XmlJavaTypeAdapter(DateTimeAdapter.class)
101    private final DateTime dateTimeAssignedValue;
102    @SuppressWarnings("unused")
103    @XmlAnyElement
104    private final Collection<Element> _futureElements = null;
105
106    /**
107     * Private constructor used only by JAXB.
108     * 
109     */
110    private ActionItem() {
111        this.id = null;
112        this.dateTimeAssigned = null;
113        this.dateTimeAssignedValue = null;
114        this.actionRequestCd = null;
115        this.actionRequestId = null;
116        this.documentId = null;
117        this.docTitle = null;
118        this.docLabel = null;
119        this.docHandlerURL = null;
120        this.docName = null;
121        this.responsibilityId = null;
122        this.roleName = null;
123        this.delegationType = null;
124        this.groupId = null;
125        this.principalId = null;
126        this.delegatorGroupId = null;
127        this.delegatorPrincipalId = null;
128    }
129
130    private ActionItem(Builder builder) {
131        this.id = builder.getId();
132        this.dateTimeAssigned = builder.getDateTimeAssigned();
133        this.dateTimeAssignedValue = builder.getDateTimeAssigned();
134        this.actionRequestCd = builder.getActionRequestCd();
135        this.actionRequestId = builder.getActionRequestId();
136        this.documentId = builder.getDocumentId();
137        this.docTitle = builder.getDocTitle();
138        this.docLabel = builder.getDocLabel();
139        this.docHandlerURL = builder.getDocHandlerURL();
140        this.docName = builder.getDocName();
141        this.responsibilityId = builder.getResponsibilityId();
142        this.roleName = builder.getRoleName();
143        this.delegationType = builder.getDelegationType() != null ? builder.getDelegationType().getCode() : null;
144        this.groupId = builder.getGroupId();
145        this.principalId = builder.getPrincipalId();
146        this.delegatorGroupId = builder.getDelegatorGroupId();
147        this.delegatorPrincipalId = builder.getDelegatorPrincipalId();
148    }
149
150    @Override
151    public String getId() {
152        return this.id;
153    }
154
155    @Override
156    public DateTime getDateTimeAssigned() {
157        return this.dateTimeAssignedValue == null ? this.dateTimeAssigned : this.dateTimeAssignedValue;
158    }
159
160    @Override
161    public String getActionRequestCd() {
162        return this.actionRequestCd;
163    }
164
165    @Override
166    public String getActionRequestId() {
167        return this.actionRequestId;
168    }
169
170    @Override
171    public String getDocumentId() {
172        return this.documentId;
173    }
174
175    @Override
176    public String getDocTitle() {
177        return this.docTitle;
178    }
179
180    @Override
181    public String getDocLabel() {
182        return this.docLabel;
183    }
184
185    @Override
186    public String getDocHandlerURL() {
187        return this.docHandlerURL;
188    }
189
190    @Override
191    public String getDocName() {
192        return this.docName;
193    }
194
195    @Override
196    public String getResponsibilityId() {
197        return this.responsibilityId;
198    }
199
200    @Override
201    public String getRoleName() {
202        return this.roleName;
203    }
204
205    @Deprecated
206    @Override
207    public String getDateAssignedString() {
208        // deprecated, always return null (see the contract javadoc for more details)
209        return null;
210    }
211
212    @Deprecated
213    @Override
214    public String getActionToTake() {
215        // deprecated, always return null (see the contract javadoc for more details)
216        return null;
217    }
218
219    @Deprecated
220    @Override
221    public Integer getActionItemIndex() {
222        // deprecated, always return null (see the contract javadoc for more details)
223        return null;
224    }
225
226    @Override
227    public DelegationType getDelegationType() {
228        return DelegationType.fromCode(this.delegationType);
229    }
230
231
232
233    @Override
234    public String getGroupId() {
235        return this.groupId;
236    }
237
238    @Override
239    public String getPrincipalId() {
240        return this.principalId;
241    }
242
243    @Override
244    public String getDelegatorGroupId() {
245        return this.delegatorGroupId;
246    }
247
248    @Override
249    public String getDelegatorPrincipalId() {
250        return this.delegatorPrincipalId;
251    }
252
253
254    /**
255     * A builder which can be used to construct {@link ActionItem} instances.  Enforces the constraints of the {@link ActionItemContract}.
256     * 
257     */
258    public final static class Builder
259        implements Serializable, ModelBuilder, ActionItemContract
260    {
261
262        private String id;
263        private DateTime dateTimeAssigned;
264        private String actionRequestCd;
265        private String actionRequestId;
266        private String documentId;
267        private String docTitle;
268        private String docLabel;
269        private String docHandlerURL;
270        private String docName;
271        private String responsibilityId;
272        private String roleName;
273        private DelegationType delegationType;
274        private String groupId;
275        private String principalId;
276        private String delegatorGroupId;
277        private String delegatorPrincipalId;
278
279        private Builder(String documentId, String actionRequestCd, String actionRequestId,
280                DateTime dateTimeAssigned, String docLabel, String docHanderlURL,
281                String docName, String responsibilityId, String principalId) {
282            setDocumentId(documentId);
283            setActionRequestCd(actionRequestCd);
284            setActionRequestId(actionRequestId);
285            setDateTimeAssigned(dateTimeAssigned);
286            setDocLabel(docLabel);
287            setDocHandlerURL(docHanderlURL);
288            setDocName(docName);
289            setResponsibilityId(responsibilityId);
290            setPrincipalId(principalId);
291        }
292
293        public static Builder create(String documentId, String actionRequestCd, String actionRequestId,
294                DateTime dateTimeAssigned, String docLabel, String docHanderlURL,
295                String docName, String responsibilityId, String principalId) {
296            return new Builder(documentId, actionRequestCd, actionRequestId, dateTimeAssigned, docLabel,
297                    docHanderlURL, docName, responsibilityId, principalId);
298        }
299
300        public static Builder create(ActionItemContract contract) {
301            if (contract == null) {
302                throw new IllegalArgumentException("contract was null");
303            }
304            Builder builder = create(contract.getDocumentId(), contract.getActionRequestCd(), contract.getActionRequestId(),
305                    contract.getDateTimeAssigned(), contract.getDocLabel(), contract.getDocHandlerURL(), contract.getDocName(),
306                    contract.getResponsibilityId(), contract.getPrincipalId());
307            builder.setId(contract.getId());
308            builder.setRoleName(contract.getRoleName());
309            builder.setDocTitle(contract.getDocTitle());
310            builder.setDelegationType(contract.getDelegationType());
311            builder.setGroupId(contract.getGroupId());
312            builder.setPrincipalId(contract.getPrincipalId());
313            builder.setDelegatorGroupId(contract.getDelegatorGroupId());
314            builder.setDelegatorPrincipalId(contract.getDelegatorPrincipalId());
315            return builder;
316        }
317
318        public ActionItem build() {
319            return new ActionItem(this);
320        }
321
322        @Override
323        public String getId() {
324            return this.id;
325        }
326
327        @Override
328        public DateTime getDateTimeAssigned() {
329            return this.dateTimeAssigned;
330        }
331
332        @Override
333        public String getActionRequestCd() {
334            return this.actionRequestCd;
335        }
336
337        @Override
338        public String getActionRequestId() {
339            return this.actionRequestId;
340        }
341
342        @Override
343        public String getDocumentId() {
344            return this.documentId;
345        }
346
347        @Override
348        public String getDocTitle() {
349            return this.docTitle;
350        }
351
352        @Override
353        public String getDocLabel() {
354            return this.docLabel;
355        }
356
357        @Override
358        public String getDocHandlerURL() {
359            return this.docHandlerURL;
360        }
361
362        @Override
363        public String getDocName() {
364            return this.docName;
365        }
366
367        @Override
368        public String getResponsibilityId() {
369            return this.responsibilityId;
370        }
371
372        @Override
373        public String getRoleName() {
374            return this.roleName;
375        }
376
377        @Deprecated
378        @Override
379        public String getDateAssignedString() {
380            // deprecated, always return null (see the contract javadoc for more details)
381            return null;
382        }
383
384        @Deprecated
385        @Override
386        public String getActionToTake() {
387            // deprecated, always return null (see the contract javadoc for more details)
388            return null;
389        }
390
391        @Deprecated
392        @Override
393        public Integer getActionItemIndex() {
394            // deprecated, always return null (see the contract javadoc for more details)
395            return null;
396        }
397
398        @Override
399        public DelegationType getDelegationType() {
400            return this.delegationType;
401        }
402
403        @Override
404        public String getGroupId() {
405            return this.groupId;
406        }
407
408        @Override
409        public String getPrincipalId() {
410            return this.principalId;
411        }
412
413        @Override
414        public String getDelegatorGroupId() {
415            return this.delegatorGroupId;
416        }
417
418        @Override
419        public String getDelegatorPrincipalId() {
420            return this.delegatorPrincipalId;
421        }
422
423        public void setId(String id) {
424            if (StringUtils.isWhitespace(id)) {
425                throw new IllegalArgumentException("id is blank");
426            }
427            this.id = id;
428        }
429
430        public void setDateTimeAssigned(DateTime dateTimeAssigned) {
431            if (dateTimeAssigned == null) {
432                throw new IllegalArgumentException("dateTimeAssigned is null");
433            }
434            this.dateTimeAssigned = dateTimeAssigned;
435        }
436
437        public void setActionRequestCd(String actionRequestCd) {
438            if (StringUtils.isBlank(actionRequestCd)) {
439                throw new IllegalArgumentException("actionRequestCd is blank");
440            }
441            this.actionRequestCd = actionRequestCd;
442        }
443
444        public void setActionRequestId(String actionRequestId) {
445            if (StringUtils.isBlank(actionRequestId)) {
446                throw new IllegalArgumentException("actionRequestId is blank");
447            }
448            this.actionRequestId = actionRequestId;
449        }
450
451        public void setDocumentId(String documentId) {
452            if (StringUtils.isBlank(documentId)) {
453                throw new IllegalArgumentException("documentId is blank");
454            }
455            this.documentId = documentId;
456        }
457
458        public void setDocTitle(String docTitle) {
459            this.docTitle = docTitle;
460        }
461
462        public void setDocLabel(String docLabel) {
463            if (StringUtils.isBlank(docLabel)) {
464                throw new IllegalArgumentException("docLabel is blank");
465            }
466            this.docLabel = docLabel;
467        }
468
469        public void setDocHandlerURL(String docHandlerURL) {
470            // can be empty, but not null
471            if (docHandlerURL == null) {
472                throw new IllegalArgumentException("docHandlerURL is null");
473            }
474            this.docHandlerURL = docHandlerURL;
475        }
476
477        public void setDocName(String docName) {
478            if (StringUtils.isBlank(docName)) {
479                throw new IllegalArgumentException("docName is blank");
480            }
481            this.docName = docName;
482        }
483
484        public void setResponsibilityId(String responsibilityId) {
485            if (StringUtils.isBlank(responsibilityId)) {
486                throw new IllegalArgumentException("responsibilityId is blank");
487            }
488            this.responsibilityId = responsibilityId;
489        }
490
491        public void setRoleName(String roleName) {
492            this.roleName = roleName;
493        }
494
495        /**
496         * This method has been deprecated and should not be called. If it is, then it will have no effect.
497         * It was mistakenly added to this interface when it was created and has been left here for compatibility
498         * purposes.
499         *
500         * @deprecated dateAssignedString is never used
501         */
502        @Deprecated
503        public void setDateAssignedString(String dateAssignedString) {
504            // deprecated, does nothing
505        }
506
507        /**
508         * This method has been deprecated and should not be called. If it is, then it will have no effect.
509         * It was mistakenly added to this interface when it was created and has been left here for compatibility
510         * purposes.
511         *
512         * @deprecated actionToTake is never used
513         */
514        @Deprecated
515        public void setActionToTake(String actionToTake) {
516            // deprecated, does nothing
517        }
518
519        public void setDelegationType(DelegationType delegationType) {
520            this.delegationType = delegationType;
521        }
522
523        /**
524         * This method has been deprecated and should not be called. If it is, then it will have no effect.
525         * It was mistakenly added to this interface when it was created and has been left here for compatibility
526         * purposes.
527         *
528         * @deprecated actionItemIndex is never used
529         */
530        @Deprecated
531        public void setActionItemIndex(Integer actionItemIndex) {
532            // deprecated, does nothing
533        }
534
535        public void setGroupId(String groupId) {
536            this.groupId = groupId;
537        }
538
539        public void setPrincipalId(String principalId) {
540            if (StringUtils.isBlank(principalId)) {
541                throw new IllegalArgumentException("principalId is blank");
542            }
543            this.principalId = principalId;
544        }
545
546        public void setDelegatorGroupId(String delegatorGroupId) {
547            this.delegatorGroupId = delegatorGroupId;
548        }
549
550        public void setDelegatorPrincipalId(String delegatorPrincipalId) {
551            this.delegatorPrincipalId = delegatorPrincipalId;
552        }
553
554    }
555
556    @Override
557    public boolean equals(Object obj) {
558        return equalsExcludeFields(obj, Constants.excludeFields);
559    }
560
561    @Override
562    public int hashCode() {
563        return hashCodeExcludeFields(Constants.excludeFields);
564    }
565
566    /**
567     * Defines some internal constants used on this class.
568     * 
569     */
570    static class Constants {
571
572        final static String ROOT_ELEMENT_NAME = "actionItem";
573        final static String TYPE_NAME = "ActionItemType";
574
575
576        final static Collection<String> excludeFields;
577
578        static {
579            excludeFields = Collections.unmodifiableCollection( (Collection<String>)
580                    CollectionUtils.union(
581                            Collections.singletonList("dateTimeAssigned"),
582                            getDefaultHashCodeEqualsExcludeFields()
583                    )
584            );
585        }
586    }
587
588
589    /**
590     * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
591     * 
592     */
593    static class Elements {
594
595        final static String ID = "id";
596        final static String DATE_TIME_ASSIGNED = "dateTimeAssigned";
597        final static String DATE_TIME_ASSIGNED_VALUE = "dateTimeAssignedValue";
598        final static String ACTION_REQUEST_CD = "actionRequestCd";
599        final static String ACTION_REQUEST_ID = "actionRequestId";
600        final static String DOCUMENT_ID = "documentId";
601        final static String DOC_TITLE = "docTitle";
602        final static String DOC_LABEL = "docLabel";
603        final static String DOC_HANDLER_U_R_L = "docHandlerURL";
604        final static String DOC_NAME = "docName";
605        final static String RESPONSIBILITY_ID = "responsibilityId";
606        final static String ROLE_NAME = "roleName";
607        final static String DELEGATION_TYPE = "delegationType";
608        final static String GROUP_ID = "groupId";
609        final static String PRINCIPAL_ID = "principalId";
610        final static String DELEGATOR_GROUP_ID = "delegatorGroupId";
611        final static String DELEGATOR_PRINCIPAL_ID = "delegatorPrincipalId";
612
613    }
614
615}