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.impl.peopleflow; 017 018import org.apache.commons.lang.StringUtils; 019import org.kuali.rice.core.api.membership.MemberType; 020import org.kuali.rice.kew.api.action.ActionRequestPolicy; 021import org.kuali.rice.kew.api.peopleflow.PeopleFlowDelegate; 022import org.kuali.rice.kew.api.peopleflow.PeopleFlowMember; 023import org.kuali.rice.kew.api.peopleflow.PeopleFlowMemberContract; 024import org.kuali.rice.kim.api.identity.Person; 025import org.kuali.rice.kim.api.services.KimApiServiceLocator; 026import org.kuali.rice.kim.framework.group.GroupEbo; 027import org.kuali.rice.kim.framework.role.RoleEbo; 028import org.kuali.rice.krad.bo.BusinessObject; 029import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator; 030import org.kuali.rice.krad.data.jpa.converters.Boolean01Converter; 031import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 032import org.kuali.rice.krad.service.ModuleService; 033 034import javax.persistence.CascadeType; 035import javax.persistence.Column; 036import javax.persistence.Convert; 037import javax.persistence.Entity; 038import javax.persistence.GeneratedValue; 039import javax.persistence.Id; 040import javax.persistence.JoinColumn; 041import javax.persistence.ManyToOne; 042import javax.persistence.OneToMany; 043import javax.persistence.Table; 044import javax.persistence.Transient; 045import javax.persistence.Version; 046import java.io.Serializable; 047import java.util.ArrayList; 048import java.util.List; 049 050@Entity 051@Table(name = "KREW_PPL_FLW_MBR_T") 052public class PeopleFlowMemberBo implements Serializable, PeopleFlowMemberContract,BusinessObject { 053 054 @Id 055 @GeneratedValue(generator = "KREW_PPL_FLW_S") 056 @PortableSequenceGenerator(name = "KREW_PPL_FLW_MBR_S") 057 @Column(name = "PPL_FLW_MBR_ID", nullable = false) 058 private String id; 059 060 @Column(name = "MBR_ID", nullable = false) 061 private String memberId; 062 063 @Column(name = "MBR_TYP_CD", nullable = false) 064 private String memberTypeCode; 065 066 @Column(name = "ACTN_RQST_PLCY_CD") 067 private String actionRequestPolicyCode; 068 069 @Column(name = "RSP_ID", nullable = false) 070 private String responsibilityId; 071 072 @Column(name = "PRIO") 073 int priority = 1; 074 075 @Version 076 @Column(name = "VER_NBR", nullable = false) 077 Long versionNumber; 078 079 @ManyToOne 080 @JoinColumn(name = "PPL_FLW_ID", nullable = false) 081 private PeopleFlowBo peopleFlow; 082 083 @OneToMany(cascade = CascadeType.ALL, mappedBy = "peopleFlowMember", orphanRemoval = true) 084 List<PeopleFlowDelegateBo> delegates = new ArrayList<PeopleFlowDelegateBo>(); 085 086 @Column(name = "FRC_ACTN", nullable = false) 087 @Convert(converter = Boolean01Converter.class) 088 private Boolean forceAction = true; 089 090 // non-persisted 091 @Transient 092 private String memberName; 093 094 @Transient 095 private Person person; 096 097 @Transient 098 private GroupEbo group; 099 100 @Transient 101 private RoleEbo role; 102 103 public String getId() { 104 return id; 105 } 106 107 public void setId(String id) { 108 this.id = id; 109 } 110 111 public PeopleFlowBo getPeopleFlow() { 112 return peopleFlow; 113 } 114 115 public void setPeopleFlow(PeopleFlowBo peopleFlow) { 116 this.peopleFlow = peopleFlow; 117 } 118 119 public String getMemberId() { 120 return memberId; 121 } 122 123 public String getMemberTypeCode() { 124 return memberTypeCode; 125 } 126 127 public void setMemberTypeCode(String memberTypeCode) { 128 this.memberTypeCode = memberTypeCode; 129 } 130 131 public String getActionRequestPolicyCode() { 132 return actionRequestPolicyCode; 133 } 134 135 public void setActionRequestPolicyCode(String actionRequestPolicyCode) { 136 this.actionRequestPolicyCode = actionRequestPolicyCode; 137 } 138 139 public String getResponsibilityId() { 140 return responsibilityId; 141 } 142 143 public void setResponsibilityId(String responsibilityId) { 144 this.responsibilityId = responsibilityId; 145 } 146 147 public int getPriority() { 148 return priority; 149 } 150 151 public void setPriority(int priority) { 152 this.priority = priority; 153 } 154 155 public Long getVersionNumber() { 156 return versionNumber; 157 } 158 159 public void setVersionNumber(Long versionNumber) { 160 this.versionNumber = versionNumber; 161 } 162 163 public String getMemberName() { 164 return memberName; 165 } 166 167 public void setPerson(Person person) { 168 this.person = person; 169 } 170 171 172 public List<PeopleFlowDelegateBo> getDelegates() { 173 return delegates; 174 } 175 176 public void setDelegates(List<PeopleFlowDelegateBo> delegates) { 177 this.delegates = delegates; 178 } 179 180 public Boolean getForceAction() { 181 return forceAction; 182 } 183 184 public void setForceAction(Boolean forceAction) { 185 this.forceAction = forceAction; 186 187 if (forceAction == null) { 188 forceAction = true; 189 } 190 } 191 192 public Person getPerson() { 193 if (MemberType.PRINCIPAL.getCode().equals(this.memberTypeCode)) { 194 if ((this.person == null) || !this.person.getPrincipalId().equals(this.memberId) || 195 !this.person.getPrincipalName().equals(this.memberName)) { 196 197 // use member name first 198 if (StringUtils.isNotBlank(this.memberName)) { 199 this.person = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(this.memberName); 200 } else { 201 this.person = KimApiServiceLocator.getPersonService().getPerson(this.memberId); 202 } 203 } 204 205 if (this.person != null) { 206 this.memberId = this.person.getPrincipalId(); 207 this.memberName = this.person.getPrincipalName(); 208 209 return this.person; 210 } 211 } 212 213 214 215 Person newPerson = null; 216 217 try { 218 newPerson = KimApiServiceLocator.getPersonService().getPersonImplementationClass().newInstance(); 219 } catch (InstantiationException ie) { 220 throw new IllegalStateException(ie); 221 } catch (IllegalAccessException iae) { 222 throw new IllegalStateException(iae); 223 } 224 return newPerson; 225 } 226 227 public GroupEbo getGroup() { 228 if (MemberType.GROUP.getCode().equals(memberTypeCode)) { 229 ModuleService eboModuleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(GroupEbo.class); 230 group = eboModuleService.retrieveExternalizableBusinessObjectIfNecessary(this, group, "group"); 231 if (group != null) { 232 memberId = group.getId(); 233 memberName = group.getNamespaceCode() + " : " + group.getName(); 234 235 } 236 } 237 return group; 238 } 239 240 241 public RoleEbo getRole() { 242 if (MemberType.ROLE.getCode().equals(memberTypeCode)) { 243 ModuleService eboModuleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(RoleEbo.class); 244 role = eboModuleService.retrieveExternalizableBusinessObjectIfNecessary(this, role, "role"); 245 if (role != null) { 246 memberId = role.getId(); 247 memberName = role.getNamespaceCode() + " : " + role.getName(); 248 } 249 } 250 return role; 251 } 252 253 public void setMemberName(String memberName) throws InstantiationException, IllegalAccessException { 254 this.memberName = memberName; 255 256 // trigger update of related object (only person can be updated by name) 257 if (MemberType.PRINCIPAL.getCode().equals(memberTypeCode)) { 258 getPerson(); 259 } 260 } 261 262 public void setMemberId(String memberId) { 263 this.memberId = memberId; 264 updateRelatedObject(); 265 } 266 267 // trigger update of related object 268 public void updateRelatedObject() { 269 if (MemberType.PRINCIPAL.getCode().equals(memberTypeCode)) { 270 getPerson(); 271 } else if (MemberType.GROUP.getCode().equals(memberTypeCode)) { 272 getGroup(); 273 } else if (MemberType.ROLE.getCode().equals(memberTypeCode)) { 274 getRole(); 275 } 276 } 277 278 @Override 279 public MemberType getMemberType() { 280 return MemberType.fromCode(memberTypeCode); 281 } 282 283 public void setMemberType(MemberType type) { 284 memberTypeCode = type.getCode(); 285 } 286 287 @Override 288 public ActionRequestPolicy getActionRequestPolicy() { 289 return ActionRequestPolicy.fromCode(actionRequestPolicyCode); 290 } 291 292 public static PeopleFlowMember to(PeopleFlowMemberBo memberBo) { 293 if (memberBo == null) { 294 return null; 295 } 296 PeopleFlowMember.Builder member = PeopleFlowMember.Builder.create(memberBo); 297 return member.build(); 298 } 299 300 public static PeopleFlowMemberBo from(PeopleFlowMember member, PeopleFlowBo peopleFlow) { 301 302 if (member == null) { 303 return null; 304 } 305 306 PeopleFlowMemberBo memberBo = new PeopleFlowMemberBo(); 307 memberBo.setPeopleFlow(peopleFlow); 308 memberBo.setMemberId(member.getMemberId()); 309 memberBo.setMemberType(member.getMemberType()); 310 311 if (member.getActionRequestPolicy() != null) { 312 memberBo.setActionRequestPolicyCode(member.getActionRequestPolicy().getCode()); 313 } 314 315 memberBo.setResponsibilityId(member.getResponsibilityId()); 316 memberBo.setPriority(member.getPriority()); 317 memberBo.setDelegates(new ArrayList<PeopleFlowDelegateBo>()); 318 319 for (PeopleFlowDelegate delegate : member.getDelegates()) { 320 memberBo.getDelegates().add(PeopleFlowDelegateBo.from(delegate, memberBo)); 321 } 322 323 memberBo.setForceAction(member.getForceAction()); 324 325 return memberBo; 326 } 327 328 329 @Override 330 public void refresh() { 331 //To change body of implemented methods use File | Settings | File Templates. 332 } 333}