001/**
002 * Copyright 2005-2015 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.document;
017
018import java.util.Collections;
019import java.util.List;
020import java.util.Map;
021
022import org.kuali.rice.core.api.exception.RiceRuntimeException;
023import org.kuali.rice.kew.rule.RuleBaseValues;
024import org.kuali.rice.kew.rule.RuleDelegationBo;
025import org.kuali.rice.kew.rule.web.WebRuleUtils;
026import org.kuali.rice.kew.service.KEWServiceLocator;
027import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
028import org.kuali.rice.kns.document.MaintenanceDocument;
029import org.kuali.rice.kns.web.ui.Section;
030import org.kuali.rice.krad.maintenance.MaintenanceLock;
031import org.kuali.rice.kns.maintenance.Maintainable;
032
033/**
034 * This class is the maintainable implementation for Routing Rules 
035 * in KEW (represented by the {@link RuleBaseValues} business object). 
036 * 
037 * @author Kuali Rice Team (rice.collab@kuali.org)
038 *
039 */
040public class RoutingRuleDelegationMaintainable extends KualiMaintainableImpl {
041        
042        /**
043         * Override the getSections method on this maintainable so that the Section Containing the various Rule Attributes
044         * can be dynamically generated based on the RuleTemplate which is selected.
045         */
046        @Override
047        public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
048                List<Section> sections = super.getSections(document, oldMaintainable);
049                return WebRuleUtils.customizeSections(getThisRule(), sections, true);
050        }
051        
052        /**
053         * On creation of a new rule document, we must validate that a rule template and document type are set. 
054         */
055        @Override
056        public void processAfterNew(MaintenanceDocument document,
057                        Map<String, String[]> parameters) {
058                initializeBusinessObjects(document);
059                WebRuleUtils.validateRuleAndResponsibility(getOldRuleDelegation(document), getNewRuleDelegation(document), parameters);
060                WebRuleUtils.validateRuleTemplateAndDocumentType(getOldRule(document), getNewRule(document), parameters);
061                WebRuleUtils.establishDefaultRuleValues(getNewRule(document));
062                getNewRule(document).setDocumentId(document.getDocumentHeader().getDocumentNumber());
063        }
064                
065        /**
066         * Creates the initial structure of the new business object so that it can be properly
067         * populated with non-null object references.
068         */
069        private void initializeBusinessObjects(MaintenanceDocument document) {
070                RuleDelegationBo oldRuleDelegation = getOldRuleDelegation(document);
071                RuleDelegationBo newRuleDelegation = getNewRuleDelegation(document);
072        
073                if (oldRuleDelegation.getDelegationRule() == null) {
074                        oldRuleDelegation.setDelegationRule(new RuleBaseValues());
075                }
076                if (newRuleDelegation.getDelegationRule() == null) {
077                        newRuleDelegation.setDelegationRule(new RuleBaseValues());
078                }
079        }
080        
081        /**
082         * This is a hack to get around the fact that when a document is first created, this value is
083         * true which causes issues if you want to be able to initialize fields on  the document using
084         * request parameters.  See SectionBridge.toSection for the "if" block where it populates
085         * Field.propertyValue to see why this causes problems
086         */
087        @Override
088        public void setGenerateDefaultValues(String docTypeName) {              
089                
090        }
091        
092        /**
093     * A complete override of the implementation for saving a Rule
094     */
095    @Override
096    public void saveBusinessObject() {
097        WebRuleUtils.clearKeysForSave(getThisRuleDelegation());
098        WebRuleUtils.translateResponsibilitiesForSave(getThisRule());
099        WebRuleUtils.translateFieldValuesForSave(getThisRule());
100        WebRuleUtils.processRuleForDelegationSave(getThisRuleDelegation());
101        KEWServiceLocator.getRuleService().makeCurrent(getThisRuleDelegation(), true);
102    }
103
104    @Override
105    public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) {
106        WebRuleUtils.processRuleForCopy(document.getDocumentNumber(), getOldRule(document), getNewRule(document));
107        super.processAfterCopy(document, parameters);
108    }
109    
110        @Override
111        public void processAfterEdit(MaintenanceDocument document,
112                        Map<String, String[]> parameters) {
113                if (!getOldRule(document).getCurrentInd()) {
114                        throw new RiceRuntimeException("Cannot edit a non-current version of a rule.");
115                }
116                WebRuleUtils.populateForCopyOrEdit(getOldRule(document), getNewRule(document));
117                getNewRule(document).setPreviousRuleId(getOldRule(document).getId());
118                getNewRule(document).setDocumentId(document.getDocumentHeader().getDocumentNumber());
119                super.processAfterEdit(document, parameters);
120        }
121
122    
123        @Override
124        public List<MaintenanceLock> generateMaintenanceLocks() {
125                if (getThisRule().getId() == null) {
126                        return Collections.emptyList();
127                }
128                return super.generateMaintenanceLocks();
129        }
130    
131    @Override
132        public String getDocumentTitle(MaintenanceDocument document) {
133                StringBuffer title = new StringBuffer();
134        RuleBaseValues rule = getThisRule();
135        if (rule.getPreviousRuleId() != null) {
136            title.append("Editing Rule Delegation '").append(rule.getDescription()).append("'");
137        } else {
138            title.append("Adding Rule Delegation '").append(rule.getDescription()).append("'");
139        }
140        return title.toString();
141        }
142        
143        protected RuleDelegationBo getNewRuleDelegation(MaintenanceDocument document) {
144                return (RuleDelegationBo)document.getNewMaintainableObject().getDataObject();
145        }
146        
147        protected RuleDelegationBo getOldRuleDelegation(MaintenanceDocument document) {
148                return (RuleDelegationBo)document.getOldMaintainableObject().getDataObject();
149        }
150
151        protected RuleDelegationBo getThisRuleDelegation() {
152                return (RuleDelegationBo)getDataObject();
153        }
154
155        protected RuleBaseValues getNewRule(MaintenanceDocument document) {
156                return getNewRuleDelegation(document).getDelegationRule();
157        }
158
159        protected RuleBaseValues getOldRule(MaintenanceDocument document) {
160                return getOldRuleDelegation(document).getDelegationRule();
161        }
162
163        protected RuleBaseValues getThisRule() {
164                return getThisRuleDelegation().getDelegationRule();
165        }
166        
167        /**
168         * This overridden method ...
169         *
170         * @see org.kuali.rice.krad.maintenance.KualiMaintainableImpl#prepareForSave()
171         */
172        @Override
173        public void prepareForSave() {
174                super.prepareForSave();
175//              WebRuleUtils.translateResponsibilitiesForSave(getThisRule());
176        }
177        
178
179        
180        
181}