001    /**
002     * Copyright 2005-2014 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     */
016    package org.kuali.rice.kew.rule.service.impl;
017    
018    import java.io.InputStream;
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.List;
022    
023    import org.jdom.Element;
024    import org.kuali.rice.core.api.impex.ExportDataSet;
025    import org.kuali.rice.kew.exception.WorkflowServiceErrorException;
026    import org.kuali.rice.kew.exception.WorkflowServiceErrorImpl;
027    import org.kuali.rice.kew.rule.RuleBaseValues;
028    import org.kuali.rice.kew.rule.RuleDelegationBo;
029    import org.kuali.rice.kew.rule.RuleTemplateOptionBo;
030    import org.kuali.rice.kew.rule.bo.RuleTemplateBo;
031    import org.kuali.rice.kew.rule.bo.RuleTemplateAttributeBo;
032    import org.kuali.rice.kew.rule.dao.RuleDAO;
033    import org.kuali.rice.kew.rule.dao.RuleDelegationDAO;
034    import org.kuali.rice.kew.rule.dao.RuleTemplateAttributeDAO;
035    import org.kuali.rice.kew.rule.dao.RuleTemplateDAO;
036    import org.kuali.rice.kew.rule.dao.RuleTemplateOptionDAO;
037    import org.kuali.rice.kew.rule.service.RuleAttributeService;
038    import org.kuali.rice.kew.rule.service.RuleTemplateService;
039    import org.kuali.rice.kew.service.KEWServiceLocator;
040    import org.kuali.rice.kew.xml.RuleTemplateXmlParser;
041    import org.kuali.rice.kew.xml.export.RuleTemplateXmlExporter;
042    
043    
044    public class RuleTemplateServiceImpl implements RuleTemplateService {
045    
046        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(RuleTemplateServiceImpl.class);
047    
048        private static final String RULE_TEMPLATE_NAME_REQUIRED = "rule.template.name.required";
049    
050        private static final String RULE_TEMPLATE_DESCRIPTION_REQUIRED = "rule.template.description.required";
051    
052        private static final String XML_PARSE_ERROR = "general.error.parsexml";
053    
054        private RuleTemplateDAO ruleTemplateDAO;
055    
056        private RuleTemplateAttributeDAO ruleTemplateAttributeDAO;
057    
058        private RuleTemplateOptionDAO ruleTemplateOptionDAO;
059    
060        private RuleDAO ruleDAO;
061    
062        private RuleDelegationDAO ruleDelegationDAO;
063    
064        /*
065         * (non-Javadoc)
066         *
067         * @see org.kuali.rice.kew.rule.RuleTemplateAttributeService#delete(java.lang.Long)
068         */
069    //    public void deleteRuleTemplateAttribute(Long ruleTemplateAttributeId, List ruleTemplateAttributes) {
070    //
071    //        RuleTemplateAttribute ruleTemplateAttributeRemove = findByRuleTemplateAttributeId(ruleTemplateAttributeId);
072    //
073    //        for (int i = ruleTemplateAttributeRemove.getDisplayOrder().intValue() + 1; i <= ruleTemplateAttributes.size(); i++) {
074    //            RuleTemplateAttribute ruleTemplateAttributeUpdate = (RuleTemplateAttribute) ruleTemplateAttributes.get(i - 1);
075    //            ruleTemplateAttributeUpdate.setDisplayOrder(new Integer(i - 1));
076    //            getRuleTemplateAttributeDAO().save(ruleTemplateAttributeUpdate);
077    //        }
078    //        getRuleTemplateAttributeDAO().delete(ruleTemplateAttributeId);
079    //    }
080    
081        public void deleteRuleTemplateOption(String ruleTemplateOptionId) {
082            getRuleTemplateOptionDAO().delete(ruleTemplateOptionId);
083        }
084    
085        public RuleTemplateBo findByRuleTemplateName(String ruleTemplateName) {
086            return (getRuleTemplateDAO().findByRuleTemplateName(ruleTemplateName));
087        }
088    
089        /*
090         * (non-Javadoc)
091         *
092         * @see org.kuali.rice.kew.rule.RuleTemplateAttributeService#findByRuleTemplateAttributeId(java.lang.Long)
093         */
094        public RuleTemplateAttributeBo findByRuleTemplateAttributeId(String ruleTemplateAttributeId) {
095            return getRuleTemplateAttributeDAO().findByRuleTemplateAttributeId(ruleTemplateAttributeId);
096        }
097    
098        public List<RuleTemplateBo> findAll() {
099            return ruleTemplateDAO.findAll();
100        }
101    
102        public List findByRuleTemplate(RuleTemplateBo ruleTemplate) {
103            return ruleTemplateDAO.findByRuleTemplate(ruleTemplate);
104        }
105    
106        public void save(RuleTemplateBo ruleTemplate) {
107            LOG.debug("save RuleTemplateServiceImpl");
108            validate(ruleTemplate);
109            fixAssociations(ruleTemplate);
110    //        if (ruleTemplate.getId() != null) {
111    //            RuleTemplate previousRuleTemplate = findByRuleTemplateId(ruleTemplate.getId());
112    //            if (previousRuleTemplate != null) {
113    //                for (Iterator iter = previousRuleTemplate.getRuleTemplateAttributes().iterator(); iter.hasNext();) {
114    //                    RuleTemplateAttribute previousAttribute = (RuleTemplateAttribute) iter.next();
115    //                    boolean found = false;
116    //
117    //                    for (Iterator iter2 = ruleTemplate.getRuleTemplateAttributes().iterator(); iter2.hasNext();) {
118    //                        RuleTemplateAttribute attribute = (RuleTemplateAttribute) iter2.next();
119    //                        if (previousAttribute.getRuleAttribute().getName().equals(attribute.getRuleAttribute().getName())) {
120    //                            found = true;
121    //                            break;
122    //                        }
123    //                    }
124    //                    if (!found) {
125    //                        getRuleTemplateAttributeDAO().delete(previousAttribute.getId());
126    //                    }
127    //                }
128    //            }
129    //        }
130    
131            getRuleTemplateDAO().save(ruleTemplate);
132            LOG.debug("end save RuleTemplateServiceImpl");
133        }
134    
135        public void save(RuleTemplateAttributeBo ruleTemplateAttribute) {
136            ruleTemplateAttributeDAO.save(ruleTemplateAttribute);
137        }
138    
139        /**
140         * Saves the given RuleDelegation and RuleBaseValues as the defaults for this RuleTemplate
141         */
142        public void saveRuleDefaults(RuleDelegationBo ruleDelegation, RuleBaseValues ruleBaseValues) {
143            KEWServiceLocator.getRuleService().saveRule(ruleBaseValues, false);
144            if (ruleDelegation != null) {
145                    KEWServiceLocator.getRuleService().saveRule(ruleDelegation.getDelegationRule(), false);
146                KEWServiceLocator.getRuleDelegationService().save(ruleDelegation);
147            }
148        }
149    
150        /**
151         * Ensures that dependent objects have a reference to the specified rule template
152         * @param ruleTemplate the rule template whose associates to check
153         */
154        private void fixAssociations(RuleTemplateBo ruleTemplate) {
155            // if it's a valid rule template instance
156            if (ruleTemplate != null && ruleTemplate.getId() != null) {
157                // for every rule template attribute
158                for (RuleTemplateAttributeBo ruleTemplateAttribute: ruleTemplate.getRuleTemplateAttributes()) {
159                    // if the rule template is not set on the attribute, set it
160                    if (ruleTemplateAttribute.getRuleTemplate() == null || ruleTemplateAttribute.getRuleTemplateId() == null) {
161                        ruleTemplateAttribute.setRuleTemplate(ruleTemplate);
162                    }
163                    // if the rule attribute is set, load up the rule attribute and set the BO on the ruletemplateattribute association object
164                    if (ruleTemplateAttribute.getRuleAttribute() == null) {
165                        RuleAttributeService ruleAttributeService = (RuleAttributeService) KEWServiceLocator.getService(KEWServiceLocator.RULE_ATTRIBUTE_SERVICE);
166                        ruleTemplateAttribute.setRuleAttribute(ruleAttributeService.findByRuleAttributeId(ruleTemplateAttribute.getRuleAttributeId()));
167                    }
168                }
169                // for every rule template option
170                for (RuleTemplateOptionBo option: ruleTemplate.getRuleTemplateOptions()) {
171                    // if the rule template is not set on the option, set it
172                    if (option.getRuleTemplate() == null || option.getRuleTemplateId() == null) {
173                        option.setRuleTemplate(ruleTemplate);
174                    }
175                }
176            }
177        }
178    
179        private void validate(RuleTemplateBo ruleTemplate) {
180            LOG.debug("validating ruleTemplate");
181            Collection errors = new ArrayList();
182            if (ruleTemplate.getName() == null || ruleTemplate.getName().trim().equals("")) {
183                errors.add(new WorkflowServiceErrorImpl("Please enter a rule template name.", RULE_TEMPLATE_NAME_REQUIRED));
184                LOG.error("Rule template name is missing");
185            } else {
186                ruleTemplate.setName(ruleTemplate.getName().trim());
187                if (ruleTemplate.getId() == null) {
188                    RuleTemplateBo nameInUse = findByRuleTemplateName(ruleTemplate.getName());
189                    if (nameInUse != null) {
190                        errors.add(new WorkflowServiceErrorImpl("Rule template name already in use", "rule.template.name.duplicate"));
191                        LOG.error("Rule template name already in use");
192                    }
193                }
194            }
195            if (ruleTemplate.getDescription() == null || ruleTemplate.getDescription().equals("")) {
196                errors.add(new WorkflowServiceErrorImpl("Please enter a rule template description.", RULE_TEMPLATE_DESCRIPTION_REQUIRED));
197                LOG.error("Rule template description is missing");
198            }
199            //        if (ruleTemplate.getRuleTemplateAttributes() == null ||
200            // ruleTemplate.getRuleTemplateAttributes().isEmpty()) {
201            //            errors.add(new WorkflowServiceErrorImpl("Please select at least one a
202            // rule template attribute.", RULE_TEMPLATE_ATTRIBUTE_REQUIRED));
203            //        }
204    
205            LOG.debug("end validating ruleTemplate");
206            if (!errors.isEmpty()) {
207                throw new WorkflowServiceErrorException("RuleTemplate Validation Error", errors);
208            }
209        }
210    
211        public RuleTemplateBo findByRuleTemplateId(String ruleTemplateId) {
212            LOG.debug("findByRuleTemplateId RuleTemplateServiceImpl");
213            return getRuleTemplateDAO().findByRuleTemplateId(ruleTemplateId);
214        }
215    
216        public void delete(String ruleTemplateId) {
217            LOG.debug("delete RuleTemplateServiceImpl");
218            getRuleTemplateDAO().delete(ruleTemplateId);
219            LOG.debug("end delete RuleTemplateServiceImpl");
220        }
221    
222        public RuleTemplateDAO getRuleTemplateDAO() {
223            return ruleTemplateDAO;
224        }
225    
226        public void setRuleTemplateDAO(RuleTemplateDAO ruleTemplateDAO) {
227            this.ruleTemplateDAO = ruleTemplateDAO;
228        }
229    
230        /**
231         * @return Returns the ruleTemplateAttributeDAO.
232         */
233        public RuleTemplateAttributeDAO getRuleTemplateAttributeDAO() {
234            return ruleTemplateAttributeDAO;
235        }
236    
237        /**
238         * @param ruleTemplateAttributeDAO
239         *            The ruleTemplateAttributeDAO to set.
240         */
241        public void setRuleTemplateAttributeDAO(RuleTemplateAttributeDAO ruleTemplateAttributeDAO) {
242            this.ruleTemplateAttributeDAO = ruleTemplateAttributeDAO;
243        }
244    
245        public RuleDAO getRuleDAO() {
246            return ruleDAO;
247        }
248    
249        public void setRuleDAO(RuleDAO ruleDAO) {
250            this.ruleDAO = ruleDAO;
251        }
252    
253        public RuleDelegationDAO getRuleDelegationDAO() {
254            return ruleDelegationDAO;
255        }
256    
257        public void setRuleDelegationDAO(RuleDelegationDAO ruleDelegationDAO) {
258            this.ruleDelegationDAO = ruleDelegationDAO;
259        }
260    
261        /**
262         * @return Returns the ruleTemplateOptionDAO.
263         */
264        public RuleTemplateOptionDAO getRuleTemplateOptionDAO() {
265            return ruleTemplateOptionDAO;
266        }
267    
268        /**
269         * @param ruleTemplateOptionDAO
270         *            The ruleTemplateOptionDAO to set.
271         */
272        public void setRuleTemplateOptionDAO(RuleTemplateOptionDAO ruleTemplateOptionDAO) {
273            this.ruleTemplateOptionDAO = ruleTemplateOptionDAO;
274        }
275    
276        public void loadXml(InputStream inputStream, String principalId) {
277            RuleTemplateXmlParser parser = new RuleTemplateXmlParser();
278            try {
279                parser.parseRuleTemplates(inputStream);
280            } catch (Exception e) { //any other exception
281                LOG.error("Error loading xml file", e);
282                WorkflowServiceErrorException wsee = new WorkflowServiceErrorException("Error loading xml file", new WorkflowServiceErrorImpl("Error loading xml file", XML_PARSE_ERROR));
283                wsee.initCause(e);
284                throw wsee;
285            }
286        }
287    
288        public Element export(ExportDataSet dataSet) {
289            RuleTemplateXmlExporter exporter = new RuleTemplateXmlExporter();
290            return exporter.export(dataSet);
291        }
292        
293        @Override
294            public boolean supportPrettyPrint() {
295                    return true;
296            }
297    
298        public String getNextRuleTemplateId() {
299            return getRuleTemplateDAO().getNextRuleTemplateId();
300        }
301    
302    }