View Javadoc

1   /**
2    * Copyright 2005-2012 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.rice.kew.document;
17  
18  import java.util.Collections;
19  import java.util.List;
20  import java.util.Map;
21  
22  import org.kuali.rice.core.api.exception.RiceRuntimeException;
23  import org.kuali.rice.kew.api.KEWPropertyConstants;
24  import org.kuali.rice.kew.rule.RuleBaseValues;
25  import org.kuali.rice.kew.rule.RuleResponsibilityBo;
26  import org.kuali.rice.kew.rule.bo.RuleTemplateBo;
27  import org.kuali.rice.kew.rule.web.WebRuleUtils;
28  import org.kuali.rice.kew.service.KEWServiceLocator;
29  import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
30  import org.kuali.rice.kns.web.ui.Section;
31  import org.kuali.rice.krad.bo.PersistableBusinessObject;
32  import org.kuali.rice.kns.document.MaintenanceDocument;
33  import org.kuali.rice.krad.maintenance.MaintenanceLock;
34  import org.kuali.rice.kns.maintenance.Maintainable;
35  
36  /**
37   * This class is the maintainable implementation for Routing Rules 
38   * in KEW (represented by the {@link RuleBaseValues} business object). 
39   * 
40   * @author Kuali Rice Team (rice.collab@kuali.org)
41   *
42   */
43  public class RoutingRuleMaintainable extends KualiMaintainableImpl {
44  
45  	private static final long serialVersionUID = -5920808902137192662L;
46      
47  	/**
48  	 * Override the getSections method on this maintainable so that the Section Containing the various Rule Attributes
49  	 * can be dynamically generated based on the RuleTemplate which is selected.
50  	 */
51  	@Override
52  	public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
53  		List<Section> sections = super.getSections(document, oldMaintainable);
54  		return WebRuleUtils.customizeSections(getThisRule(), sections, false);
55  		
56  	}
57  	
58  	/**
59  	 * On creation of a new rule document, we must validate that a rule template and document type are set. 
60  	 */
61  	@Override
62  	public void processAfterNew(MaintenanceDocument document,
63  			Map<String, String[]> parameters) {
64  		WebRuleUtils.validateRuleTemplateAndDocumentType(getOldRule(document), getNewRule(document), parameters);
65  		WebRuleUtils.establishDefaultRuleValues(getNewRule(document));
66  		getNewRule(document).setDocumentId(document.getDocumentHeader().getDocumentNumber());
67  	}
68  	
69  	/**
70  	 * This is a hack to get around the fact that when a document is first created, this value is
71   	 * true which causes issues if you want to be able to initialize fields on  the document using
72   	 * request parameters.  See SectionBridge.toSection for the "if" block where it populates
73   	 * Field.propertyValue to see why this causes problems
74  	 */
75  	@Override
76  	public void setGenerateBlankRequiredValues(String docTypeName) {		
77  		
78  	}
79  			
80      /**
81       * A complete override of the implementation for saving a Rule
82       */
83      @Override
84      public void saveBusinessObject() {
85      	WebRuleUtils.clearKeysForSave(getThisRule());
86      	WebRuleUtils.translateResponsibilitiesForSave(getThisRule());
87      	WebRuleUtils.translateFieldValuesForSave(getThisRule());
88      	KEWServiceLocator.getRuleService().makeCurrent(getThisRule(), true);
89      }
90  
91      /**
92       * A complete override of the implementation for saving a Rule
93       */
94      @Override
95      public void saveDataObject() {
96      	WebRuleUtils.clearKeysForSave(getThisRule());
97      	WebRuleUtils.translateResponsibilitiesForSave(getThisRule());
98      	WebRuleUtils.translateFieldValuesForSave(getThisRule());
99      	KEWServiceLocator.getRuleService().makeCurrent(getThisRule(), true);
100     }
101     
102     @Override
103     public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) {
104     	WebRuleUtils.processRuleForCopy(document.getDocumentNumber(), getOldRule(document), getNewRule(document));
105         super.processAfterCopy(document, parameters);
106     }
107     
108 	@Override
109 	public void processAfterEdit(MaintenanceDocument document,
110 			Map<String, String[]> parameters) {
111 		if (!getOldRule(document).getCurrentInd()) {
112 			throw new RiceRuntimeException("Cannot edit a non-current version of a rule.");
113 		}
114 		WebRuleUtils.populateForCopyOrEdit(getOldRule(document), getNewRule(document));
115 		
116 		getNewRule(document).setPreviousRuleId(getOldRule(document).getId());
117 
118 		getNewRule(document).setDocumentId(document.getDocumentHeader().getDocumentNumber());
119 		super.processAfterEdit(document, parameters);
120 	}
121 
122 	/**
123 	 * Returns the new RuleBaseValues business object.
124 	 */
125 	protected RuleBaseValues getNewRule(MaintenanceDocument document) {
126 		return (RuleBaseValues)document.getNewMaintainableObject().getBusinessObject();
127 	}
128 	
129 	/**
130 	 * Returns the old RuleBaseValues business object.
131 	 */
132 	protected RuleBaseValues getOldRule(MaintenanceDocument document) {
133 		return (RuleBaseValues)document.getOldMaintainableObject().getBusinessObject();
134 	}
135 	
136 	/**
137 	 * Returns the RuleBaseValues business object associated with this Maintainable.
138 	 */
139 	protected RuleBaseValues getThisRule() {
140 		return (RuleBaseValues)getBusinessObject();
141 	}
142 
143 	/**
144 	 * Overridden implementation of maintenance locks.  The default locking for Routing Rules
145 	 * is based on previous version (can't route more than one rule based off the same 
146 	 * previous verison).  However, for the first version of a rule, the previous version id
147 	 * will be null.
148 	 * 
149 	 * So for a new Route Rule maintenance document we don't want any locks generated.
150 	 * 
151 	 * TODO can we just let the locking key be the primary key? (ruleBaseValuesId)
152 	 */
153 	@Override
154 	public List<MaintenanceLock> generateMaintenanceLocks() {
155 		if (getThisRule().getPreviousRuleId() == null) {
156 			return Collections.emptyList();
157 		}
158 		return super.generateMaintenanceLocks();
159 	}
160 
161 	@Override
162 	public String getDocumentTitle(MaintenanceDocument document) {
163 		StringBuffer title = new StringBuffer();
164         RuleBaseValues rule = getThisRule();
165         if (rule.getPreviousRuleId() != null) {
166             title.append("Editing Rule '").append(rule.getDescription()).append("'");
167         } else {
168             title.append("Adding Rule '").append(rule.getDescription()).append("'");
169         }
170         return title.toString();
171 	}
172 
173 	/**
174 	 * This overridden method ...
175 	 *
176 	 * @see org.kuali.rice.krad.maintenance.KualiMaintainableImpl#prepareForSave()
177 	 */
178 	@Override
179 	public void prepareForSave() {
180 		super.prepareForSave();
181 		WebRuleUtils.translateResponsibilitiesForSave(getThisRule());
182 	}
183 
184     /**
185 	 * @see org.kuali.rice.krad.maintenance.KualiMaintainableImpl#setNewCollectionLineDefaultValues(java.lang.String, org.kuali.rice.krad.bo.PersistableBusinessObject)
186 	 */
187 	@Override
188 	protected void setNewCollectionLineDefaultValues(String collectionName,
189 			PersistableBusinessObject addLine) {
190 		super.setNewCollectionLineDefaultValues(collectionName, addLine);
191 		if (KEWPropertyConstants.RESP_SECTION_NAME_SET.contains(collectionName)) {
192 			RuleTemplateBo ruleTemplate = getThisRule().getRuleTemplate();
193 			if(ruleTemplate.getDefaultActionRequestValue() != null && ruleTemplate.getDefaultActionRequestValue().getValue() != null){
194 				((RuleResponsibilityBo) addLine).setActionRequestedCd(ruleTemplate.getDefaultActionRequestValue().getValue());
195 	        }
196 		}
197 	}
198 	
199 }