1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.impl.peopleflow;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.core.api.membership.MemberType;
20 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
21 import org.kuali.rice.core.api.uif.RemotableAttributeField;
22 import org.kuali.rice.kew.api.KewApiServiceLocator;
23 import org.kuali.rice.kew.api.peopleflow.PeopleFlowDefinition;
24 import org.kuali.rice.kew.api.repository.type.KewTypeDefinition;
25 import org.kuali.rice.kew.framework.peopleflow.PeopleFlowTypeService;
26 import org.kuali.rice.krad.bo.Note;
27 import org.kuali.rice.krad.maintenance.MaintainableImpl;
28 import org.kuali.rice.krad.uif.container.CollectionGroup;
29 import org.kuali.rice.krad.uif.container.Container;
30 import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
31 import org.kuali.rice.krad.uif.view.View;
32 import org.kuali.rice.krad.util.KRADConstants;
33 import org.kuali.rice.krad.web.form.MaintenanceDocumentForm;
34
35 import javax.xml.namespace.QName;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.Comparator;
40 import java.util.List;
41
42
43
44
45
46
47 public class PeopleFlowMaintainableImpl extends MaintainableImpl {
48
49
50
51
52
53
54
55
56
57
58 @Override
59 protected void addLine(Collection<Object> collection, Object addLine, boolean insertFirst) {
60 if (collection instanceof List) {
61 ((List) collection).add(0, addLine);
62 if (addLine instanceof PeopleFlowMemberBo) {
63
64
65 PeopleFlowMemberBo member = (PeopleFlowMemberBo) addLine;
66 if (member.getMemberType() != MemberType.ROLE) {
67 member.setActionRequestPolicyCode(null);
68 }
69
70 Collections.sort((List) collection, new Comparator<Object>() {
71 public int compare(Object o1, Object o2) {
72 if ((o1 instanceof PeopleFlowMemberBo) && (o1 instanceof PeopleFlowMemberBo)) {
73 return ((PeopleFlowMemberBo) o1).getPriority() - ((PeopleFlowMemberBo) o2)
74 .getPriority();
75 }
76 return 0;
77 }
78 });
79 }
80 } else {
81 collection.add(addLine);
82 }
83 }
84
85
86
87
88
89
90
91
92
93
94 public List<RemotableAttributeField> retrieveTypeAttributes(View view, Object model, Container container) {
95 List<RemotableAttributeField> remoteFields = new ArrayList<RemotableAttributeField>();
96
97 PeopleFlowBo peopleFlow =
98 (PeopleFlowBo) ((MaintenanceDocumentForm) model).getDocument().getNewMaintainableObject().getDataObject();
99
100
101 String typeId = peopleFlow.getTypeId();
102 if (StringUtils.isNotBlank(typeId)) {
103 KewTypeDefinition typeDefinition = KewApiServiceLocator.getKewTypeRepositoryService().getTypeById(typeId);
104 PeopleFlowTypeService peopleFlowTypeService = GlobalResourceLoader.<PeopleFlowTypeService>getService(
105 QName.valueOf(typeDefinition.getServiceName()));
106 remoteFields = peopleFlowTypeService.getAttributeFields(typeId);
107 }
108
109 return remoteFields;
110 }
111
112
113
114
115
116 @Override
117 public void saveDataObject() {
118 ((PeopleFlowBo) getDataObject()).updateAttributeBoValues();
119
120 PeopleFlowDefinition peopleFlowDefinition;
121 if (KRADConstants.MAINTENANCE_COPY_ACTION.equals(getMaintenanceAction())) {
122 peopleFlowDefinition = PeopleFlowBo.maintenanceCopy(((PeopleFlowBo) getDataObject()));
123 } else {
124
125 peopleFlowDefinition = PeopleFlowBo.to(((PeopleFlowBo) getDataObject()));
126 }
127 if (StringUtils.isNotBlank(peopleFlowDefinition.getId())) {
128 KewApiServiceLocator.getPeopleFlowService().updatePeopleFlow(peopleFlowDefinition);
129 } else {
130 KewApiServiceLocator.getPeopleFlowService().createPeopleFlow(peopleFlowDefinition);
131 }
132 }
133
134
135
136
137
138
139
140
141
142
143
144
145 protected void processAfterAddLine(View view, CollectionGroup collectionGroup, Object model, Object addLine, String collectionPath) {
146
147 if (model instanceof MaintenanceDocumentForm
148 && KRADConstants.MAINTENANCE_EDIT_ACTION.equals(((MaintenanceDocumentForm)model).getMaintenanceAction()) && !(addLine instanceof Note)) {
149
150
151
152
153 String oldCollectionPath = collectionPath.replace("newMaintainableObject","oldMaintainableObject");
154 Collection<Object> oldCollection = ObjectPropertyUtils.getPropertyValue(model, oldCollectionPath );
155 try {
156 Object blankLine = collectionGroup.getCollectionObjectClass().newInstance();
157 oldCollection.add(blankLine);
158 } catch (Exception e) {
159 throw new RuntimeException("Unable to create new line instance for old maintenance object", e);
160 }
161 }
162 }
163
164
165
166
167
168
169
170
171
172 @Override
173 public void processCollectionDeleteLine(View view, Object model, String collectionPath, int lineIndex) {
174
175 CollectionGroup collectionGroup = view.getViewIndex().getCollectionGroupByPath(collectionPath);
176 if (collectionGroup == null) {
177 logAndThrowRuntime("Unable to get collection group component for path: " + collectionPath);
178 }
179
180
181 Collection<Object> collection = ObjectPropertyUtils.getPropertyValue(model, collectionPath);
182 if (collection == null) {
183 logAndThrowRuntime("Unable to get collection property from model for path: " + collectionPath);
184 }
185
186
187
188 if (collection instanceof List) {
189 Object deleteLine = ((List<Object>) collection).get(lineIndex);
190
191
192 boolean isValid = performDeleteLineValidation(view, collectionGroup, deleteLine);
193 if (isValid) {
194 ((List<Object>) collection).remove(lineIndex);
195 processAfterDeleteLine(view, collectionPath, model, lineIndex);
196 }
197 } else {
198 logAndThrowRuntime("Only List collection implementations are supported for the delete by index method");
199 }
200 }
201
202
203
204
205
206
207
208
209
210
211
212
213
214 protected void processAfterDeleteLine(View view, String collectionPath, Object model, int lineIndex) {
215
216
217 if (model instanceof MaintenanceDocumentForm
218 && KRADConstants.MAINTENANCE_EDIT_ACTION.equals(((MaintenanceDocumentForm)model).getMaintenanceAction())) {
219
220
221 String oldCollectionPath = collectionPath.replace("newMaintainableObject","oldMaintainableObject");
222 Collection<Object> oldCollection = ObjectPropertyUtils.getPropertyValue(model, oldCollectionPath);
223 try {
224
225 oldCollection.remove(oldCollection.toArray()[lineIndex]);
226 } catch (Exception e) {
227 throw new RuntimeException("Unable to delete line instance for old maintenance object", e);
228 }
229 }
230 }
231
232
233 }