View Javadoc
1   /**
2    * Copyright 2005-2016 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.api.peopleflow;
17  
18  import org.apache.commons.collections.CollectionUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.kuali.rice.core.api.CoreConstants;
21  import org.kuali.rice.core.api.membership.MemberType;
22  import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
23  import org.kuali.rice.core.api.mo.ModelBuilder;
24  import org.kuali.rice.core.api.mo.ModelObjectUtils;
25  import org.kuali.rice.kew.api.action.ActionRequestPolicy;
26  import org.w3c.dom.Element;
27  
28  import javax.xml.bind.annotation.XmlAccessType;
29  import javax.xml.bind.annotation.XmlAccessorType;
30  import javax.xml.bind.annotation.XmlAnyElement;
31  import javax.xml.bind.annotation.XmlElement;
32  import javax.xml.bind.annotation.XmlElementWrapper;
33  import javax.xml.bind.annotation.XmlRootElement;
34  import javax.xml.bind.annotation.XmlType;
35  import java.io.Serializable;
36  import java.util.ArrayList;
37  import java.util.Collection;
38  import java.util.List;
39  
40  @XmlRootElement(name = PeopleFlowMember.Constants.ROOT_ELEMENT_NAME)
41  @XmlAccessorType(XmlAccessType.NONE)
42  @XmlType(name = PeopleFlowMember.Constants.TYPE_NAME, propOrder = {
43          PeopleFlowMember.Elements.MEMBER_ID,
44          PeopleFlowMember.Elements.MEMBER_TYPE,
45          PeopleFlowMember.Elements.ACTION_REQUEST_POLICY,
46          PeopleFlowMember.Elements.RESPONSIBILITY_ID,
47          PeopleFlowMember.Elements.PRIORITY,
48          PeopleFlowMember.Elements.DELEGATES,
49          CoreConstants.CommonElements.FUTURE_ELEMENTS
50  })
51  public final class PeopleFlowMember extends AbstractDataTransferObject implements PeopleFlowMemberContract {
52  
53      private static final int STARTING_PRIORITY = 1;
54  
55      @XmlElement(name = Elements.MEMBER_ID, required = true)
56      private final String memberId;
57  
58      @XmlElement(name = Elements.MEMBER_TYPE, required = true)
59      private final MemberType memberType;
60  
61      @XmlElement(name = Elements.ACTION_REQUEST_POLICY, required = false)
62      private final ActionRequestPolicy actionRequestPolicy;
63  
64      @XmlElement(name = Elements.RESPONSIBILITY_ID, required = false)
65      private final String responsibilityId;
66  
67      @XmlElement(name = Elements.PRIORITY, required = true)
68      private final int priority;
69  
70      @XmlElementWrapper(name = Elements.DELEGATES, required = false)
71      @XmlElement(name = Elements.DELEGATE, required = false)
72      private final List<PeopleFlowDelegate> delegates;
73  
74      @SuppressWarnings("unused")
75      @XmlAnyElement
76      private final Collection<Element> _futureElements = null;
77  
78      /**
79       * Private constructor used only by JAXB.
80       */
81      private PeopleFlowMember() {
82          this.memberId = null;
83          this.memberType = null;
84          this.actionRequestPolicy = null;
85          this.responsibilityId = null;
86          this.priority = STARTING_PRIORITY;
87          this.delegates = null;
88      }
89  
90      private PeopleFlowMember(Builder builder) {
91          this.memberId = builder.getMemberId();
92          this.memberType = builder.getMemberType();
93          this.actionRequestPolicy = builder.getActionRequestPolicy();
94          this.responsibilityId = builder.getResponsibilityId();
95          this.priority = builder.getPriority();
96          this.delegates = ModelObjectUtils.buildImmutableCopy(builder.getDelegates());
97      }
98  
99      @Override
100     public String getMemberId() {
101         return this.memberId;
102     }
103 
104     @Override
105     public MemberType getMemberType() {
106         return this.memberType;
107     }
108 
109     @Override
110     public ActionRequestPolicy getActionRequestPolicy() {
111         return this.actionRequestPolicy;
112     }
113 
114     @Override
115     public String getResponsibilityId() {
116         return this.responsibilityId;
117     }
118 
119     @Override
120     public int getPriority() {
121         return this.priority;
122     }
123 
124     @Override
125     public List<PeopleFlowDelegate> getDelegates() {
126         return this.delegates;
127     }
128 
129     /**
130      * A builder which can be used to construct {@link PeopleFlowMember} instances.  Enforces the constraints of the
131      * {@link PeopleFlowMemberContract}.
132      */
133     public final static class Builder implements Serializable, ModelBuilder, PeopleFlowMemberContract {
134 
135         private String memberId;
136         private MemberType memberType;
137         private ActionRequestPolicy actionRequestPolicy;
138         private String responsibilityId;
139         private int priority;
140         private List<PeopleFlowDelegate.Builder> delegates;
141 
142         private Builder(String memberId, MemberType memberType) {
143             setMemberId(memberId);
144             setMemberType(memberType);
145             setPriority(STARTING_PRIORITY);
146             setDelegates(new ArrayList<PeopleFlowDelegate.Builder>());
147         }
148 
149         public static Builder create(String memberId, MemberType memberType) {
150             return new Builder(memberId, memberType);
151         }
152 
153         public static Builder create(PeopleFlowMemberContract contract) {
154             Builder builder = createCopy(contract);
155 
156             builder.setResponsibilityId(contract.getResponsibilityId());
157             return builder;
158         }
159 
160         public static Builder createCopy(PeopleFlowMemberContract contract) {
161             if (contract == null) {
162                 throw new IllegalArgumentException("contract was null");
163             }
164             Builder builder = create(contract.getMemberId(), contract.getMemberType());
165             builder.setActionRequestPolicy(contract.getActionRequestPolicy());
166             builder.setPriority(contract.getPriority());
167             if (CollectionUtils.isNotEmpty(contract.getDelegates())) {
168                 for (PeopleFlowDelegateContract delegate : contract.getDelegates()) {
169                     builder.getDelegates().add(PeopleFlowDelegate.Builder.create(delegate));
170                 }
171             }
172             return builder;
173         }
174 
175         public PeopleFlowMember build() {
176             return new PeopleFlowMember(this);
177         }
178 
179         @Override
180         public String getMemberId() {
181             return this.memberId;
182         }
183 
184         @Override
185         public MemberType getMemberType() {
186             return this.memberType;
187         }
188 
189         @Override
190         public ActionRequestPolicy getActionRequestPolicy() {
191             return this.actionRequestPolicy;
192         }
193 
194         @Override
195         public String getResponsibilityId() {
196             return this.responsibilityId;
197         }
198 
199         @Override
200         public int getPriority() {
201             return this.priority;
202         }
203 
204         @Override
205         public List<PeopleFlowDelegate.Builder> getDelegates() {
206             return delegates;
207         }
208 
209         public void setMemberId(String memberId) {
210             if (StringUtils.isBlank(memberId)) {
211                 throw new IllegalArgumentException("memberId was null or blank");
212             }
213             this.memberId = memberId;
214         }
215 
216         public void setMemberType(MemberType memberType) {
217             if (memberType == null) {
218                 throw new IllegalArgumentException("memberType was null");
219             }
220             this.memberType = memberType;
221         }
222 
223         public void setActionRequestPolicy(ActionRequestPolicy actionRequestPolicy) {
224             this.actionRequestPolicy = actionRequestPolicy;
225         }
226 
227         public void setResponsibilityId(String responsibilityId) {
228             this.responsibilityId = responsibilityId;
229         }
230 
231         public void setPriority(int priority) {
232             if (priority < STARTING_PRIORITY) {
233                 throw new IllegalArgumentException("Given priority was smaller than the minimum prior value of " + STARTING_PRIORITY);
234             }
235             this.priority = priority;
236         }
237 
238         public void setDelegates(List<PeopleFlowDelegate.Builder> delegates) {
239             this.delegates = delegates;
240         }
241     }
242 
243     /**
244      * Defines some internal constants used on this class.
245      */
246     static class Constants {
247         final static String ROOT_ELEMENT_NAME = "peopleFlowMember";
248         final static String TYPE_NAME = "PeopleFlowMemberType";
249     }
250 
251     /**
252      * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
253      */
254     static class Elements {
255         final static String MEMBER_ID = "memberId";
256         final static String MEMBER_TYPE = "memberType";
257         final static String ACTION_REQUEST_POLICY = "actionRequestPolicy";
258         final static String RESPONSIBILITY_ID = "responsibilityId";
259         final static String PRIORITY = "priority";
260         final static String DELEGATES = "delegates";
261         final static String DELEGATE = "delegate";
262     }
263 
264 }