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.delegation.DelegationType;
020import org.kuali.rice.core.api.membership.MemberType;
021import org.kuali.rice.kew.api.action.ActionRequestPolicy;
022import org.kuali.rice.kew.api.peopleflow.PeopleFlowDelegate;
023import org.kuali.rice.kew.api.peopleflow.PeopleFlowDelegateContract;
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.service.KRADServiceLocatorWeb;
031import org.kuali.rice.krad.service.ModuleService;
032
033import javax.persistence.Column;
034import javax.persistence.Entity;
035import javax.persistence.GeneratedValue;
036import javax.persistence.Id;
037import javax.persistence.JoinColumn;
038import javax.persistence.ManyToOne;
039import javax.persistence.Table;
040import javax.persistence.Transient;
041import javax.persistence.Version;
042import java.io.Serializable;
043
044@Entity
045@Table(name = "KREW_PPL_FLW_DLGT_T")
046public class PeopleFlowDelegateBo implements Serializable, PeopleFlowDelegateContract, BusinessObject {
047
048    @Id
049    @GeneratedValue(generator = "KREW_PPL_FLW_DLGT_S")
050    @PortableSequenceGenerator(name = "KREW_PPL_FLW_DLGT_S")
051    @Column(name = "PPL_FLW_DLGT_ID", nullable = false)
052    private String id;
053
054    @Column(name = "MBR_ID", nullable = false)
055    private String memberId;
056
057    @Column(name = "MBR_TYP_CD", nullable = false)
058    private String memberTypeCode;
059
060    @Column(name = "ACTN_RQST_PLCY_CD")
061    private String actionRequestPolicyCode;
062
063    @Column(name = "DLGN_TYP_CD", nullable = false)
064    private String delegationTypeCode;
065
066    @Column(name = "RSP_ID", nullable = false)
067    private String responsibilityId;
068
069    @Version
070    @Column(name = "VER_NBR", nullable = false)
071    private Long versionNumber;
072
073    @ManyToOne
074    @JoinColumn(name = "PPL_FLW_MBR_ID", nullable = false)
075    private PeopleFlowMemberBo peopleFlowMember;
076
077    // not-persisted
078    @Transient
079    private String memberName;
080
081    @Transient
082    private Person person;
083
084    @Transient
085    private GroupEbo group;
086
087    @Transient
088    private RoleEbo role;
089
090    public static PeopleFlowDelegate to(PeopleFlowDelegateBo delegateBo) {
091        if (delegateBo == null) {
092            return null;
093        }
094        PeopleFlowDelegate.Builder builder = PeopleFlowDelegate.Builder.create(delegateBo);
095
096        return builder.build();
097    }
098
099    public static PeopleFlowDelegateBo from(PeopleFlowDelegate delegate, PeopleFlowMemberBo peopleFlowMember) {
100
101        if (delegate == null) {
102            return null;
103        }
104        PeopleFlowDelegateBo delegateBo = new PeopleFlowDelegateBo();
105        delegateBo.setPeopleFlowMember(peopleFlowMember);
106        delegateBo.setMemberId(delegate.getMemberId());
107        delegateBo.setMemberType(delegate.getMemberType());
108        if (delegate.getActionRequestPolicy() != null) {
109            delegateBo.setActionRequestPolicyCode(delegate.getActionRequestPolicy().getCode());
110        }
111        if (delegate.getDelegationType() != null) {
112            delegateBo.setDelegationTypeCode(delegate.getDelegationType().getCode());
113        }
114        delegateBo.setResponsibilityId(delegate.getResponsibilityId());
115        return delegateBo;
116    }
117
118    public String getId() {
119        return id;
120    }
121
122    public void setId(String id) {
123        this.id = id;
124    }
125
126    public String getMemberId() {
127        return memberId;
128    }
129
130    public String getMemberTypeCode() {
131        return memberTypeCode;
132    }
133
134    public void setMemberTypeCode(String memberTypeCode) {
135        this.memberTypeCode = memberTypeCode;
136    }
137
138    public String getActionRequestPolicyCode() {
139        return actionRequestPolicyCode;
140    }
141
142    public void setActionRequestPolicyCode(String actionRequestPolicyCode) {
143        this.actionRequestPolicyCode = actionRequestPolicyCode;
144    }
145
146    public String getDelegationTypeCode() {
147        return delegationTypeCode;
148    }
149
150    public void setDelegationTypeCode(String delegationTypeCode) {
151        this.delegationTypeCode = delegationTypeCode;
152    }
153
154    public String getResponsibilityId() {
155        return responsibilityId;
156    }
157
158    public void setResponsibilityId(String responsibilityId) {
159        this.responsibilityId = responsibilityId;
160    }
161
162    public Long getVersionNumber() {
163        return versionNumber;
164    }
165
166    public void setVersionNumber(Long versionNumber) {
167        this.versionNumber = versionNumber;
168    }
169
170    public PeopleFlowMemberBo getPeopleFlowMember() {
171        return peopleFlowMember;
172    }
173
174    public void setPeopleFlowMember(PeopleFlowMemberBo peopleFlowMember) {
175        this.peopleFlowMember = peopleFlowMember;
176    }
177
178    public String getMemberName() {
179        return memberName;
180    }
181
182    public void setPerson(Person person) {
183        this.person = person;
184    }
185
186    public Person getPerson() {
187        if (MemberType.PRINCIPAL.getCode().equals(memberTypeCode)) {
188            if ((this.person == null) || !person.getPrincipalId().equals(memberId) || !person.getPrincipalName().equals(memberName)) {
189                // use member name first
190                if (StringUtils.isNotBlank(memberName)) {
191                    this.person = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(memberName);
192                } else {
193                    this.person = KimApiServiceLocator.getPersonService().getPerson(memberId);
194                }
195            }
196
197            if (this.person != null) {
198                memberId = person.getPrincipalId();
199                memberName = person.getPrincipalName();
200
201                return this.person;
202            }
203        }
204
205        Person newPerson = null;
206        // TODO - figure out a better way to do this.
207        try {
208            newPerson = KimApiServiceLocator.getPersonService().getPersonImplementationClass().newInstance();
209        } catch(InstantiationException ie) {
210            throw new IllegalStateException(ie);
211        } catch (IllegalAccessException iae) {
212            throw new IllegalStateException(iae);
213        }
214
215        return newPerson;
216    }
217
218    public GroupEbo getGroup() {
219        if (MemberType.GROUP.getCode().equals(memberTypeCode)) {
220            ModuleService eboModuleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(GroupEbo.class);
221            group = eboModuleService.retrieveExternalizableBusinessObjectIfNecessary(this, group, "group");
222             if (group != null) {
223                memberId = group.getId();
224                memberName = group.getNamespaceCode() + " : " + group.getName();
225
226             }
227        }
228        return group;
229    }
230
231
232    public RoleEbo getRole() {
233        if (MemberType.ROLE.getCode().equals(memberTypeCode)) {
234            ModuleService eboModuleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(RoleEbo.class);
235            role = eboModuleService.retrieveExternalizableBusinessObjectIfNecessary(this, role, "role");
236            if (role != null) {
237                memberId = role.getId();
238                memberName = role.getNamespaceCode() + " : " + role.getName();
239            }
240         }
241         return role;
242    }
243
244    public void setMemberName(String memberName) throws InstantiationException, IllegalAccessException {
245        this.memberName = memberName;
246
247        // trigger update of related object (only person can be updated by name)
248        if (MemberType.PRINCIPAL.getCode().equals(memberTypeCode)) {
249            getPerson();
250        }
251    }
252
253    public void setMemberId(String memberId) {
254        this.memberId = memberId;
255        updateRelatedObject();
256    }
257
258    // trigger update of related object
259    public void updateRelatedObject() {
260        if (MemberType.PRINCIPAL.getCode().equals(memberTypeCode)) {
261            getPerson();
262        } else if (MemberType.GROUP.getCode().equals(memberTypeCode)) {
263            getGroup();
264        } else if (MemberType.ROLE.getCode().equals(memberTypeCode)) {
265            getRole();
266        }
267    }
268
269    @Override
270    public MemberType getMemberType() {
271        return MemberType.fromCode(memberTypeCode);
272    }
273
274    public void setMemberType(MemberType type) {
275        memberTypeCode = type.getCode();
276    }
277
278    @Override
279    public ActionRequestPolicy getActionRequestPolicy() {
280        return ActionRequestPolicy.fromCode(actionRequestPolicyCode);
281    }
282
283    @Override
284    public DelegationType getDelegationType() {
285        return DelegationType.fromCode(delegationTypeCode);
286    }
287
288    public void setDelegationType(DelegationType delegationType) {
289        this.delegationTypeCode = delegationType.getCode();
290    }
291
292    @Override
293    public void refresh() {
294        //To change body of implemented methods use File | Settings | File Templates.
295    }
296}