View Javadoc

1   /**
2    * Copyright 2004-2013 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.kpme.core.department.web;
17  
18  import java.sql.Timestamp;
19  import java.util.ArrayList;
20  import java.util.Collections;
21  import java.util.List;
22  import java.util.Map;
23  
24  import org.apache.commons.lang.StringUtils;
25  import org.joda.time.DateTime;
26  import org.kuali.kpme.core.bo.HrBusinessObject;
27  import org.kuali.kpme.core.bo.HrBusinessObjectMaintainableImpl;
28  import org.kuali.kpme.core.department.Department;
29  import org.kuali.kpme.core.role.KPMERoleMemberAttribute;
30  import org.kuali.kpme.core.role.department.DepartmentPrincipalRoleMemberBo;
31  import org.kuali.kpme.core.service.HrServiceLocator;
32  import org.kuali.rice.kim.api.identity.principal.Principal;
33  import org.kuali.rice.kim.api.role.RoleMember;
34  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
35  import org.kuali.rice.kim.impl.role.RoleMemberBo;
36  import org.kuali.rice.kns.document.MaintenanceDocument;
37  import org.kuali.rice.kns.maintenance.Maintainable;
38  import org.kuali.rice.kns.web.ui.Section;
39  import org.kuali.rice.krad.bo.PersistableBusinessObject;
40  import org.kuali.rice.krad.util.GlobalVariables;
41  import org.kuali.rice.krad.util.KRADConstants;
42  
43  @SuppressWarnings("deprecation")
44  public class DepartmentMaintainableImpl extends HrBusinessObjectMaintainableImpl {
45  
46  	private static final long serialVersionUID = -330523155799598560L;
47  	
48  	@Override
49  	public HrBusinessObject getObjectById(String id) {
50  		return HrServiceLocator.getDepartmentService().getDepartment(id);
51  	}
52  	
53  	@Override
54  	@SuppressWarnings("rawtypes")
55  	public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
56  		List sections = super.getSections(document, oldMaintainable);
57  		
58  		for (Object obj : sections) {
59  			Section sec = (Section) obj;
60  			if (sec.getSectionId().equals("inactiveRoleMembers")) {
61              	sec.setHidden(!document.isOldBusinessObjectInDocument());
62              }
63  		}
64  		
65  		return sections;
66  	}
67  	
68      @Override
69      public void processAfterEdit(MaintenanceDocument document, Map<String, String[]> parameters) {
70          Department oldMaintainableObject = (Department) document.getOldMaintainableObject().getBusinessObject();
71          Department newMaintainableObject = (Department) document.getNewMaintainableObject().getBusinessObject();
72          
73          Department oldDepartment = oldMaintainableObject;
74          if(StringUtils.isNotBlank(oldMaintainableObject.getHrDeptId())) {
75          	oldDepartment = HrServiceLocator.getDepartmentService().getDepartment(oldMaintainableObject.getHrDeptId());
76          } else {
77          	oldDepartment = HrServiceLocator.getDepartmentService().getDepartment(oldMaintainableObject.getDept(), oldMaintainableObject.getEffectiveLocalDate());
78          }
79          
80          oldMaintainableObject.setRoleMembers(oldDepartment.getRoleMembers());
81          oldMaintainableObject.setInactiveRoleMembers(oldDepartment.getInactiveRoleMembers());
82          
83          Department newDepartment = newMaintainableObject;
84          if(StringUtils.isNotBlank(newMaintainableObject.getHrDeptId())) {
85          	newDepartment = HrServiceLocator.getDepartmentService().getDepartment(newMaintainableObject.getHrDeptId());
86          } else {
87          	newDepartment = HrServiceLocator.getDepartmentService().getDepartment(newMaintainableObject.getDept(), newMaintainableObject.getEffectiveLocalDate());
88          }
89          
90          newMaintainableObject.setRoleMembers(newDepartment.getRoleMembers());
91          newMaintainableObject.setInactiveRoleMembers(newDepartment.getInactiveRoleMembers());
92          
93          super.processAfterEdit(document, parameters);
94      }
95  
96      @Override
97  	protected void setNewCollectionLineDefaultValues(String collectionName, PersistableBusinessObject addLine) {
98      	Department department = (Department) this.getBusinessObject();
99      	
100     	if (department.getEffectiveDate() != null) {
101 	    	if (addLine instanceof RoleMemberBo) {
102 	        	RoleMemberBo roleMember = (RoleMemberBo) addLine;
103 	        	roleMember.setActiveFromDateValue(new Timestamp(department.getEffectiveDate().getTime()));
104 	    	}
105     	}
106     	
107     	super.setNewCollectionLineDefaultValues(collectionName, addLine);
108 	}
109 	
110 	@Override
111     public void addNewLineToCollection(String collectionName) {
112 		if (collectionName.equals("roleMembers")) {
113 			RoleMemberBo roleMember = (RoleMemberBo) newCollectionLines.get(collectionName);
114             if (roleMember != null) {
115             	if(!StringUtils.isEmpty(roleMember.getMemberId())) {
116             		Principal person = KimApiServiceLocator.getIdentityService().getPrincipal(roleMember.getMemberId());
117             		if (person == null) {
118             			GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roleMembers", 
119                 				"dept.role.person.notExist",roleMember.getMemberId());
120                 		return;
121             		}
122             	}
123             }
124         }
125 		
126         super.addNewLineToCollection(collectionName);
127 	}
128 
129     @Override
130 	public void customSaveLogic(HrBusinessObject hrObj) {
131 		Department department = (Department) hrObj;
132 		
133 		List<DepartmentPrincipalRoleMemberBo> newInactiveRoleMembers = createInactiveRoleMembers(department.getRoleMembers());
134 		List<DepartmentPrincipalRoleMemberBo> roleList = new ArrayList<DepartmentPrincipalRoleMemberBo> ();
135 		roleList.addAll(department.getRoleMembers());
136 		
137     	for (DepartmentPrincipalRoleMemberBo newInactiveRoleMember : newInactiveRoleMembers) {
138     		department.addInactiveRoleMember(newInactiveRoleMember);
139     		List<DepartmentPrincipalRoleMemberBo> tempRoleList = department.getRoleMembers();
140     		for(DepartmentPrincipalRoleMemberBo role : tempRoleList) {
141     			if(StringUtils.isNotEmpty(role.getId())
142     					&& StringUtils.isNotEmpty(newInactiveRoleMember.getId())
143     					&& StringUtils.equals(role.getId(), newInactiveRoleMember.getId())) {
144     				roleList.remove(role);
145     			}
146     		}
147     	}
148     	
149     	for (DepartmentPrincipalRoleMemberBo roleMember : roleList) {
150     		RoleMember.Builder builder = RoleMember.Builder.create(roleMember);
151     		builder.setAttributes(Collections.singletonMap(KPMERoleMemberAttribute.DEPARTMENT.getRoleMemberAttributeName(), department.getDept()));
152     		
153     		if (StringUtils.isBlank(roleMember.getId())) {
154     			KimApiServiceLocator.getRoleService().createRoleMember(builder.build());
155     		} else {
156     			KimApiServiceLocator.getRoleService().updateRoleMember(builder.build());
157     		}
158     	}
159     	for (DepartmentPrincipalRoleMemberBo inactiveRoleMember : department.getInactiveRoleMembers()) {
160     		RoleMember.Builder builder = RoleMember.Builder.create(inactiveRoleMember);
161     		builder.setAttributes(Collections.singletonMap(KPMERoleMemberAttribute.DEPARTMENT.getRoleMemberAttributeName(),  department.getDept()));
162     		
163     		if (StringUtils.isBlank(inactiveRoleMember.getId())) {
164     			KimApiServiceLocator.getRoleService().createRoleMember(builder.build());
165     		} else {
166     			KimApiServiceLocator.getRoleService().updateRoleMember(builder.build());
167     		}
168     	}
169 	}
170     
171     private List<DepartmentPrincipalRoleMemberBo> createInactiveRoleMembers(List<DepartmentPrincipalRoleMemberBo> roleMembers) {
172     	List<DepartmentPrincipalRoleMemberBo> inactiveRoleMembers = new ArrayList<DepartmentPrincipalRoleMemberBo>();
173     	
174         List<RoleMemberBo> oldRoleMembers = new ArrayList<RoleMemberBo>();
175         List<RoleMemberBo> newRoleMembers = new ArrayList<RoleMemberBo>();
176         for (RoleMemberBo roleMember : roleMembers) {
177 		  	if (!StringUtils.isEmpty(roleMember.getId())) {
178 		  		oldRoleMembers.add(roleMember);
179 		  	} else {
180 		  		newRoleMembers.add(roleMember);
181 		  	}
182         }
183         
184         for (RoleMemberBo newRoleMember : newRoleMembers) {
185         	for (RoleMemberBo oldRoleMember : oldRoleMembers) {
186         		if (StringUtils.equals(newRoleMember.getRoleId(), oldRoleMember.getRoleId()) 
187                            && StringUtils.equals(newRoleMember.getMemberId(), oldRoleMember.getMemberId()) ) {
188     				DepartmentPrincipalRoleMemberBo.Builder builder = DepartmentPrincipalRoleMemberBo.Builder.create(oldRoleMember);
189     				builder.setActiveToDate(DateTime.now());
190     				
191 			  		inactiveRoleMembers.add(builder.build());
192 			  	}
193         	}
194         }
195         
196         return inactiveRoleMembers;
197     }
198         
199     @Override
200     public Map<String, String> populateNewCollectionLines(Map<String, String> fieldValues,
201 			MaintenanceDocument maintenanceDocument, String methodToCall) {
202     	if(fieldValues.containsKey("roleMembers.roleName") && StringUtils.isEmpty(fieldValues.get("roleMembers.roleName"))) {
203     		fieldValues.put("roleMembers.roleName", null);
204     	}
205     	return super.populateNewCollectionLines(fieldValues, maintenanceDocument, methodToCall);
206     }   
207 }