001 /** 002 * Copyright 2005-2013 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.bo; 017 018 import org.hibernate.annotations.GenericGenerator; 019 import org.hibernate.annotations.Parameter; 020 import org.kuali.rice.core.api.mo.common.active.MutableInactivatable; 021 import org.kuali.rice.kew.api.KewApiConstants; 022 import org.kuali.rice.kew.api.KewApiServiceLocator; 023 import org.kuali.rice.kew.api.WorkflowRuntimeException; 024 import org.kuali.rice.kew.api.extension.ExtensionUtils; 025 import org.kuali.rice.kew.api.rule.RuleTemplateAttributeContract; 026 import org.kuali.rice.kew.rule.RuleExtensionBo; 027 import org.kuali.rice.kew.rule.RuleExtensionValue; 028 import org.kuali.rice.kew.rule.RuleValidationAttribute; 029 import org.kuali.rice.kew.rule.WorkflowRuleAttribute; 030 import org.kuali.rice.kew.service.KEWServiceLocator; 031 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; 032 033 import javax.persistence.Column; 034 import javax.persistence.Entity; 035 import javax.persistence.FetchType; 036 import javax.persistence.GeneratedValue; 037 import javax.persistence.Id; 038 import javax.persistence.JoinColumn; 039 import javax.persistence.ManyToOne; 040 import javax.persistence.OneToMany; 041 import javax.persistence.Table; 042 import java.util.HashMap; 043 import java.util.List; 044 import java.util.Map; 045 046 /** 047 * A model bean which services as the link between a {@link RuleTemplateBo} and 048 * a {@link RuleAttribute}. 049 * 050 * @author Kuali Rice Team (rice.collab@kuali.org) 051 */ 052 @Entity 053 @Table(name="KREW_RULE_TMPL_ATTR_T") 054 //@Sequence(name="KREW_RTE_TMPL_S", property="id") 055 public class RuleTemplateAttributeBo extends PersistableBusinessObjectBase 056 implements Comparable<RuleTemplateAttributeBo>, MutableInactivatable, RuleTemplateAttributeContract { 057 058 private static final long serialVersionUID = -3580049225424553828L; 059 @Id 060 @GeneratedValue(generator="KREW_RTE_TMPL_S") 061 @GenericGenerator(name="KREW_RTE_TMPL_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={ 062 @Parameter(name="sequence_name",value="KREW_RTE_TMPL_S"), 063 @Parameter(name="value_column",value="id") 064 }) 065 @Column(name="RULE_TMPL_ATTR_ID") 066 private String id; 067 @Column(name="RULE_TMPL_ID", insertable=false, updatable=false) 068 private String ruleTemplateId; 069 @Column(name="RULE_ATTR_ID", insertable=false, updatable=false) 070 private String ruleAttributeId; 071 @Column(name="REQ_IND") 072 private Boolean required; 073 @Column(name="ACTV_IND") 074 private Boolean active; 075 @Column(name="DSPL_ORD") 076 private Integer displayOrder; 077 @Column(name="DFLT_VAL") 078 private String defaultValue; 079 080 @ManyToOne(fetch=FetchType.EAGER) 081 @JoinColumn(name="RULE_TMPL_ID") 082 private RuleTemplateBo ruleTemplate; 083 @ManyToOne(fetch=FetchType.EAGER) 084 @JoinColumn(name="RULE_ATTR_ID") 085 private RuleAttribute ruleAttribute; 086 @OneToMany(fetch=FetchType.LAZY,mappedBy="ruleTemplateAttribute") 087 private List<RuleExtensionBo> ruleExtensions; 088 089 090 public RuleTemplateAttributeBo() { 091 this.required = Boolean.FALSE; 092 this.active = Boolean.TRUE; 093 } 094 095 public int compareTo(RuleTemplateAttributeBo ruleTemplateAttribute) { 096 if ((this.getDisplayOrder() != null) && (ruleTemplateAttribute.getDisplayOrder() != null)) { 097 return this.getDisplayOrder().compareTo(ruleTemplateAttribute.getDisplayOrder()); 098 } 099 return 0; 100 } 101 102 public Object getAttribute() { 103 try { 104 //ObjectDefinition objectDefinition = new ObjectDefinition(getRuleAttribute().getResourceDescriptor(), getRuleAttribute().getApplicationId()); 105 Object attribute = ExtensionUtils.loadExtension(RuleAttribute.to(getRuleAttribute()), getRuleAttribute().getApplicationId()); 106 if (attribute == null) { 107 throw new WorkflowRuntimeException("Could not find attribute " + getRuleAttribute().getName()); 108 } 109 if (attribute instanceof WorkflowRuleAttribute) { 110 ((WorkflowRuleAttribute) attribute).setRequired(required.booleanValue()); 111 } 112 return attribute; 113 } catch (Exception e) { 114 throw new RuntimeException("Caught error attempting to load attribute class: " + getRuleAttribute().getResourceDescriptor(), e); 115 } 116 } 117 118 public boolean isWorkflowAttribute() { 119 return getRuleAttribute().isWorkflowAttribute(); 120 } 121 122 public boolean isRuleValidationAttribute() { 123 // just check the type here to avoid having to load the class from the class loader if it's not actually there 124 return KewApiConstants.RULE_VALIDATION_ATTRIBUTE_TYPE.equals(getRuleAttribute().getType()); 125 } 126 127 /** 128 * Instantiates and returns a new instance of the WorkflowAttribute class configured on this template. 129 * The calling code should be sure to call isWorkflowAttribute first to verify the type of this attribute 130 * is that of a WorkflowAttribute. Otherwise a RuntimeException will be thrown. 131 */ 132 public WorkflowRuleAttribute getWorkflowAttribute() { 133 try { 134 Object tempAttr = ExtensionUtils.loadExtension(RuleAttribute.to(getRuleAttribute()), getRuleAttribute().getApplicationId()); 135 136 if (tempAttr == null 137 || !WorkflowRuleAttribute.class.isAssignableFrom(tempAttr.getClass())) { 138 throw new WorkflowRuntimeException("Could not find workflow attribute " + getRuleAttribute().getName()); 139 } 140 WorkflowRuleAttribute workflowAttribute = (WorkflowRuleAttribute)tempAttr; 141 workflowAttribute.setRequired(required.booleanValue()); 142 return workflowAttribute; 143 } catch (Exception e) { 144 throw new RuntimeException("Caught exception instantiating new " + getRuleAttribute().getResourceDescriptor(), e); 145 } 146 } 147 148 /** 149 * Instantiates and returns a new instance of the RuleValidationAttribute class configured on this template. 150 * The calling code should be sure to call isRuleValidationAttribute first to verify the type of this attribute 151 * is that of a RuleValidationAttribute. Otherwise a RuntimeException will be thrown. 152 */ 153 public RuleValidationAttribute getRuleValidationAttribute() { 154 try { 155 RuleAttribute attrib = getRuleAttribute(); 156 return KEWServiceLocator.getRuleValidationAttributeResolver().resolveRuleValidationAttribute(attrib.getName(), attrib.getApplicationId()); 157 } catch (Exception e) { 158 throw new RuntimeException("Caught exception instantiating new " + getRuleAttribute().getResourceDescriptor(), e); 159 } 160 } 161 162 public List<RuleExtensionBo> getRuleExtensions() { 163 return ruleExtensions; 164 } 165 166 public Map<String, String> getRuleExtensionMap() { 167 Map<String, String> extensions = new HashMap<String, String>(); 168 if (this.getRuleExtensions() != null) { 169 for (RuleExtensionBo ext : this.getRuleExtensions()) { 170 for (RuleExtensionValue value : ext.getExtensionValues()) { 171 extensions.put(value.getKey(), value.getValue()); 172 } 173 } 174 } 175 return extensions; 176 } 177 178 public void setRuleExtensions(List<RuleExtensionBo> ruleExtensions) { 179 this.ruleExtensions = ruleExtensions; 180 } 181 182 public RuleAttribute getRuleAttribute() { 183 if (ruleAttribute == null && ruleAttributeId != null) { 184 ruleAttribute = RuleAttribute.from(KewApiServiceLocator.getExtensionRepositoryService().getExtensionById(ruleAttributeId)); 185 } 186 return ruleAttribute; 187 } 188 189 public void setRuleAttribute(org.kuali.rice.kew.rule.bo.RuleAttribute ruleAttribute) { 190 this.ruleAttribute = ruleAttribute; 191 } 192 193 public RuleTemplateBo getRuleTemplate() { 194 return ruleTemplate; 195 } 196 197 public void setRuleTemplate(RuleTemplateBo ruleTemplate) { 198 this.ruleTemplate = ruleTemplate; 199 } 200 201 public String getDefaultValue() { 202 return defaultValue; 203 } 204 205 public void setDefaultValue(String defaultValue) { 206 this.defaultValue = defaultValue; 207 } 208 209 public Integer getDisplayOrder() { 210 return displayOrder; 211 } 212 213 public void setDisplayOrder(Integer displayOrder) { 214 this.displayOrder = displayOrder; 215 } 216 217 public boolean isRequired() { 218 return (getRequired() == null) || (getRequired().booleanValue()); 219 } 220 221 public Boolean getRequired() { 222 return required; 223 } 224 225 public void setRequired(Boolean required) { 226 this.required = required; 227 } 228 229 public boolean isActive() { 230 return (getActive() == null) || (getActive().booleanValue()); 231 } 232 233 public Boolean getActive() { 234 return active; 235 } 236 237 public void setActive(Boolean active) { 238 this.active = active; 239 } 240 241 public void setActive(boolean active) { 242 this.active = active; 243 } 244 245 public String getRuleAttributeId() { 246 return ruleAttributeId; 247 } 248 249 public void setRuleAttributeId(String ruleAttributeId) { 250 this.ruleAttributeId = ruleAttributeId; 251 } 252 253 public String getId() { 254 return id; 255 } 256 257 public void setId(String id) { 258 this.id = id; 259 } 260 261 public String getRuleTemplateId() { 262 return ruleTemplateId; 263 } 264 265 public void setRuleTemplateId(String ruleTemplateId) { 266 this.ruleTemplateId = ruleTemplateId; 267 } 268 269 }