View Javadoc
1   /**
2    * Copyright 2005-2015 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.lang.StringUtils;
19  import org.kuali.rice.core.api.CoreConstants;
20  import org.kuali.rice.core.api.delegation.DelegationType;
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.kew.api.action.ActionRequestPolicy;
25  import org.w3c.dom.Element;
26  
27  import javax.xml.bind.annotation.XmlAccessType;
28  import javax.xml.bind.annotation.XmlAccessorType;
29  import javax.xml.bind.annotation.XmlAnyElement;
30  import javax.xml.bind.annotation.XmlElement;
31  import javax.xml.bind.annotation.XmlRootElement;
32  import javax.xml.bind.annotation.XmlType;
33  import java.io.Serializable;
34  import java.util.Collection;
35  
36  @XmlRootElement(name = PeopleFlowDelegate.Constants.ROOT_ELEMENT_NAME)
37  @XmlAccessorType(XmlAccessType.NONE)
38  @XmlType(name = PeopleFlowDelegate.Constants.TYPE_NAME, propOrder = {
39          PeopleFlowDelegate.Elements.MEMBER_ID,
40          PeopleFlowDelegate.Elements.MEMBER_TYPE,
41          PeopleFlowDelegate.Elements.ACTION_REQUEST_POLICY,
42          PeopleFlowDelegate.Elements.DELEGATION_TYPE,
43          PeopleFlowDelegate.Elements.RESPONSIBILITY_ID,
44          CoreConstants.CommonElements.FUTURE_ELEMENTS
45  })
46  public final class PeopleFlowDelegate extends AbstractDataTransferObject implements PeopleFlowDelegateContract {
47  
48      @XmlElement(name = Elements.MEMBER_ID, required = true)
49      private final String memberId;
50  
51      @XmlElement(name = Elements.MEMBER_TYPE, required = true)
52      private final MemberType memberType;
53  
54      @XmlElement(name = Elements.ACTION_REQUEST_POLICY, required = false)
55      private final ActionRequestPolicy actionRequestPolicy;
56  
57      @XmlElement(name = Elements.DELEGATION_TYPE, required = true)
58      private final DelegationType delegationType;
59  
60      @XmlElement(name = Elements.RESPONSIBILITY_ID, required = false)
61      private final String responsibilityId;
62  
63      @SuppressWarnings("unused")
64      @XmlAnyElement
65      private final Collection<Element> _futureElements = null;
66  
67      /**
68       * Private constructor used only by JAXB.
69       */
70      @SuppressWarnings("unused")
71      private PeopleFlowDelegate() {
72          this.memberId = null;
73          this.memberType = null;
74          this.actionRequestPolicy = null;
75          this.delegationType = null;
76          this.responsibilityId = null;
77      }
78  
79      private PeopleFlowDelegate(Builder builder) {
80          this.memberId = builder.getMemberId();
81          this.memberType = builder.getMemberType();
82          this.actionRequestPolicy = builder.getActionRequestPolicy();
83          this.delegationType = builder.getDelegationType();
84          this.responsibilityId = builder.getResponsibilityId();
85      }
86  
87      @Override
88      public String getMemberId() {
89          return this.memberId;
90      }
91  
92      @Override
93      public MemberType getMemberType() {
94          return this.memberType;
95      }
96  
97      @Override
98      public ActionRequestPolicy getActionRequestPolicy() {
99          return actionRequestPolicy;
100     }
101 
102     @Override
103     public DelegationType getDelegationType() {
104         return this.delegationType;
105     }
106 
107     @Override
108     public String getResponsibilityId() {
109         return responsibilityId;
110     }
111 
112     /**
113      * A builder which can be used to construct {@link PeopleFlowDelegate} instances.  Enforces the constraints of the
114      * {@link PeopleFlowDelegateContract}.
115      * 
116      */
117     public final static class Builder implements Serializable, ModelBuilder, PeopleFlowDelegateContract {
118 
119         private String memberId;
120         private MemberType memberType;
121         private ActionRequestPolicy actionRequestPolicy;
122         private DelegationType delegationType;
123         private String responsibilityId;
124 
125         private Builder(String memberId, MemberType memberType) {
126             setMemberId(memberId);
127             setMemberType(memberType);
128             setDelegationType(DelegationType.SECONDARY);
129         }
130 
131         public static Builder create(String memberId, MemberType memberType) {
132             return new Builder(memberId, memberType);
133         }
134 
135         public static Builder create(PeopleFlowDelegateContract contract) {
136             if (contract == null) {
137                 throw new IllegalArgumentException("contract was null");
138             }
139             Builder builder = create(contract.getMemberId(), contract.getMemberType());
140             builder.setActionRequestPolicy(contract.getActionRequestPolicy());
141             builder.setDelegationType(contract.getDelegationType());
142             builder.setResponsibilityId(contract.getResponsibilityId());
143             return builder;
144         }
145 
146         public PeopleFlowDelegate build() {
147             return new PeopleFlowDelegate(this);
148         }
149 
150         @Override
151         public String getMemberId() {
152             return this.memberId;
153         }
154 
155         @Override
156         public MemberType getMemberType() {
157             return this.memberType;
158         }
159 
160         @Override
161         public ActionRequestPolicy getActionRequestPolicy() {
162             return actionRequestPolicy;
163         }
164 
165         @Override
166         public DelegationType getDelegationType() {
167             return this.delegationType;
168         }
169 
170         @Override
171         public String getResponsibilityId() {
172             return responsibilityId;
173         }
174 
175         public void setMemberId(String memberId) {
176             if (StringUtils.isBlank(memberId)) {
177                 throw new IllegalArgumentException("memberId was a null or blank value");
178             }
179             this.memberId = memberId;
180         }
181 
182         public void setMemberType(MemberType memberType) {
183             if (memberType == null) {
184                 throw new IllegalArgumentException("memberType was null");
185             }
186             this.memberType = memberType;
187         }
188 
189         public void setActionRequestPolicy(ActionRequestPolicy actionRequestPolicy) {
190             if (this.memberType.equals(MemberType.ROLE)) {
191                 if (actionRequestPolicy == null) {
192                     throw new IllegalArgumentException("actionRequestPolicy was null");
193                 }
194                 this.actionRequestPolicy = actionRequestPolicy;
195             }
196         }
197 
198         public void setDelegationType(DelegationType delegationType) {
199             if (delegationType == null) {
200                 throw new IllegalArgumentException("delegationType was null");
201             }
202             this.delegationType = delegationType;
203         }
204 
205         public void setResponsibilityId(String responsibilityId) {
206             this.responsibilityId = responsibilityId;
207         }
208         
209     }
210 
211     /**
212      * Defines some internal constants used on this class.
213      */
214     static class Constants {
215         final static String ROOT_ELEMENT_NAME = "peopleFlowDelegate";
216         final static String TYPE_NAME = "PeopleFlowDelegateType";
217     }
218 
219     /**
220      * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
221      */
222     static class Elements {
223         final static String MEMBER_ID = "memberId";
224         final static String MEMBER_TYPE = "memberType";
225         final static String ACTION_REQUEST_POLICY = "actionRequestPolicy";
226         final static String DELEGATION_TYPE = "delegationType";
227         final static String RESPONSIBILITY_ID = "responsibilityId";
228     }
229 
230 }