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 }