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