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.collections.CollectionUtils;
019    import org.apache.commons.lang.StringUtils;
020    import org.joda.time.DateTime;
021    import org.kuali.rice.core.api.CoreConstants;
022    import org.kuali.rice.core.api.delegation.DelegationType;
023    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
024    import org.kuali.rice.core.api.mo.ModelBuilder;
025    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
026    import org.w3c.dom.Element;
027    
028    import javax.xml.bind.annotation.XmlAccessType;
029    import javax.xml.bind.annotation.XmlAccessorType;
030    import javax.xml.bind.annotation.XmlAnyElement;
031    import javax.xml.bind.annotation.XmlElement;
032    import javax.xml.bind.annotation.XmlRootElement;
033    import javax.xml.bind.annotation.XmlType;
034    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
035    import java.io.Serializable;
036    import java.util.Collection;
037    import 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    })
061    public 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    }