001/** 002 * Copyright 2005-2016 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.rule.service.impl; 017 018import java.io.InputStream; 019import java.util.ArrayList; 020import java.util.Collection; 021import java.util.List; 022 023import org.jdom.Element; 024import org.kuali.rice.core.api.impex.ExportDataSet; 025import org.kuali.rice.kew.exception.WorkflowServiceErrorException; 026import org.kuali.rice.kew.exception.WorkflowServiceErrorImpl; 027import org.kuali.rice.kew.rule.RuleBaseValues; 028import org.kuali.rice.kew.rule.RuleDelegationBo; 029import org.kuali.rice.kew.rule.RuleTemplateOptionBo; 030import org.kuali.rice.kew.rule.bo.RuleTemplateBo; 031import org.kuali.rice.kew.rule.bo.RuleTemplateAttributeBo; 032import org.kuali.rice.kew.rule.dao.RuleDAO; 033import org.kuali.rice.kew.rule.dao.RuleDelegationDAO; 034import org.kuali.rice.kew.rule.dao.RuleTemplateAttributeDAO; 035import org.kuali.rice.kew.rule.dao.RuleTemplateDAO; 036import org.kuali.rice.kew.rule.dao.RuleTemplateOptionDAO; 037import org.kuali.rice.kew.rule.service.RuleAttributeService; 038import org.kuali.rice.kew.rule.service.RuleTemplateService; 039import org.kuali.rice.kew.service.KEWServiceLocator; 040import org.kuali.rice.kew.xml.RuleTemplateXmlParser; 041import org.kuali.rice.kew.xml.export.RuleTemplateXmlExporter; 042 043 044public 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}