001 /** 002 * Copyright 2005-2011 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.peopleflow; 017 018 import org.apache.commons.collections.CollectionUtils; 019 import org.apache.commons.lang.StringUtils; 020 import org.kuali.rice.core.api.CoreConstants; 021 import org.kuali.rice.core.api.membership.MemberType; 022 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 023 import org.kuali.rice.core.api.mo.ModelBuilder; 024 import org.kuali.rice.core.api.mo.ModelObjectUtils; 025 import org.kuali.rice.kew.api.action.ActionRequestPolicy; 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.XmlElementWrapper; 033 import javax.xml.bind.annotation.XmlRootElement; 034 import javax.xml.bind.annotation.XmlType; 035 import java.io.Serializable; 036 import java.util.ArrayList; 037 import java.util.Collection; 038 import java.util.List; 039 040 @XmlRootElement(name = PeopleFlowMember.Constants.ROOT_ELEMENT_NAME) 041 @XmlAccessorType(XmlAccessType.NONE) 042 @XmlType(name = PeopleFlowMember.Constants.TYPE_NAME, propOrder = { 043 PeopleFlowMember.Elements.MEMBER_ID, 044 PeopleFlowMember.Elements.MEMBER_TYPE, 045 PeopleFlowMember.Elements.ACTION_REQUEST_POLICY, 046 PeopleFlowMember.Elements.RESPONSIBILITY_ID, 047 PeopleFlowMember.Elements.PRIORITY, 048 PeopleFlowMember.Elements.DELEGATES, 049 CoreConstants.CommonElements.FUTURE_ELEMENTS 050 }) 051 public final class PeopleFlowMember extends AbstractDataTransferObject implements PeopleFlowMemberContract { 052 053 private static final int STARTING_PRIORITY = 1; 054 055 @XmlElement(name = Elements.MEMBER_ID, required = true) 056 private final String memberId; 057 058 @XmlElement(name = Elements.MEMBER_TYPE, required = true) 059 private final MemberType memberType; 060 061 @XmlElement(name = Elements.ACTION_REQUEST_POLICY, required = false) 062 private final ActionRequestPolicy actionRequestPolicy; 063 064 @XmlElement(name = Elements.RESPONSIBILITY_ID, required = false) 065 private final String responsibilityId; 066 067 @XmlElement(name = Elements.PRIORITY, required = true) 068 private final int priority; 069 070 @XmlElementWrapper(name = Elements.DELEGATES, required = false) 071 @XmlElement(name = Elements.DELEGATE, required = false) 072 private final List<PeopleFlowDelegate> delegates; 073 074 @SuppressWarnings("unused") 075 @XmlAnyElement 076 private final Collection<Element> _futureElements = null; 077 078 /** 079 * Private constructor used only by JAXB. 080 */ 081 private PeopleFlowMember() { 082 this.memberId = null; 083 this.memberType = null; 084 this.actionRequestPolicy = null; 085 this.responsibilityId = null; 086 this.priority = STARTING_PRIORITY; 087 this.delegates = null; 088 } 089 090 private PeopleFlowMember(Builder builder) { 091 this.memberId = builder.getMemberId(); 092 this.memberType = builder.getMemberType(); 093 this.actionRequestPolicy = builder.getActionRequestPolicy(); 094 this.responsibilityId = builder.getResponsibilityId(); 095 this.priority = builder.getPriority(); 096 this.delegates = ModelObjectUtils.buildImmutableCopy(builder.getDelegates()); 097 } 098 099 @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 if (contract == null) { 155 throw new IllegalArgumentException("contract was null"); 156 } 157 Builder builder = create(contract.getMemberId(), contract.getMemberType()); 158 builder.setActionRequestPolicy(contract.getActionRequestPolicy()); 159 builder.setResponsibilityId(contract.getResponsibilityId()); 160 builder.setPriority(contract.getPriority()); 161 if (CollectionUtils.isNotEmpty(contract.getDelegates())) { 162 for (PeopleFlowDelegateContract delegate : contract.getDelegates()) { 163 builder.getDelegates().add(PeopleFlowDelegate.Builder.create(delegate)); 164 } 165 } 166 return builder; 167 } 168 169 public PeopleFlowMember build() { 170 return new PeopleFlowMember(this); 171 } 172 173 @Override 174 public String getMemberId() { 175 return this.memberId; 176 } 177 178 @Override 179 public MemberType getMemberType() { 180 return this.memberType; 181 } 182 183 @Override 184 public ActionRequestPolicy getActionRequestPolicy() { 185 return this.actionRequestPolicy; 186 } 187 188 @Override 189 public String getResponsibilityId() { 190 return this.responsibilityId; 191 } 192 193 @Override 194 public int getPriority() { 195 return this.priority; 196 } 197 198 @Override 199 public List<PeopleFlowDelegate.Builder> getDelegates() { 200 return delegates; 201 } 202 203 public void setMemberId(String memberId) { 204 if (StringUtils.isBlank(memberId)) { 205 throw new IllegalArgumentException("memberId was null or blank"); 206 } 207 this.memberId = memberId; 208 } 209 210 public void setMemberType(MemberType memberType) { 211 if (memberType == null) { 212 throw new IllegalArgumentException("memberType was null"); 213 } 214 this.memberType = memberType; 215 } 216 217 public void setActionRequestPolicy(ActionRequestPolicy actionRequestPolicy) { 218 this.actionRequestPolicy = actionRequestPolicy; 219 } 220 221 public void setResponsibilityId(String responsibilityId) { 222 this.responsibilityId = responsibilityId; 223 } 224 225 public void setPriority(int priority) { 226 if (priority < STARTING_PRIORITY) { 227 throw new IllegalArgumentException("Given priority was smaller than the minimum prior value of " + STARTING_PRIORITY); 228 } 229 this.priority = priority; 230 } 231 232 public void setDelegates(List<PeopleFlowDelegate.Builder> delegates) { 233 this.delegates = delegates; 234 } 235 } 236 237 /** 238 * Defines some internal constants used on this class. 239 */ 240 static class Constants { 241 final static String ROOT_ELEMENT_NAME = "peopleFlowMember"; 242 final static String TYPE_NAME = "PeopleFlowMemberType"; 243 } 244 245 /** 246 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 247 */ 248 static class Elements { 249 final static String MEMBER_ID = "memberId"; 250 final static String MEMBER_TYPE = "memberType"; 251 final static String ACTION_REQUEST_POLICY = "actionRequestPolicy"; 252 final static String RESPONSIBILITY_ID = "responsibilityId"; 253 final static String PRIORITY = "priority"; 254 final static String DELEGATES = "delegates"; 255 final static String DELEGATE = "delegate"; 256 } 257 258 }