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;
017
018import org.apache.commons.lang.ObjectUtils;
019import org.hibernate.annotations.Fetch;
020import org.hibernate.annotations.FetchMode;
021import org.hibernate.annotations.GenericGenerator;
022import org.hibernate.annotations.Parameter;
023import org.kuali.rice.core.api.util.collect.CollectionUtils;
024import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
025import org.kuali.rice.kew.api.rule.RuleExtension;
026import org.kuali.rice.kew.api.rule.RuleExtensionContract;
027import org.kuali.rice.kew.rule.bo.RuleTemplateAttributeBo;
028import org.kuali.rice.kew.service.KEWServiceLocator;
029
030import javax.persistence.CascadeType;
031import javax.persistence.Column;
032import javax.persistence.Entity;
033import javax.persistence.FetchType;
034import javax.persistence.GeneratedValue;
035import javax.persistence.Id;
036import javax.persistence.JoinColumn;
037import javax.persistence.ManyToOne;
038import javax.persistence.OneToMany;
039import javax.persistence.Table;
040import javax.persistence.Version;
041import java.io.Serializable;
042import java.util.ArrayList;
043import java.util.HashMap;
044import java.util.List;
045import java.util.Map;
046
047/**
048 * An extension of a {@link RuleBaseValues}.  Provides attribute-specific data
049 * extensions to the rule for a particular {@link org.kuali.rice.kew.rule.bo.RuleAttribute}.  Contains
050 * a List of {@link RuleExtensionValue}s.
051 * 
052 * @see RuleBaseValues
053 * @see org.kuali.rice.kew.rule.bo.RuleAttribute
054 * @see RuleExtensionValue
055 *
056 * @author Kuali Rice Team (rice.collab@kuali.org)
057 */
058@Entity
059@Table(name="KREW_RULE_EXT_T")
060//@Sequence(name="KREW_RTE_TMPL_S", property="ruleExtensionId")
061public class RuleExtensionBo implements RuleExtensionContract, Serializable {
062
063        private static final long serialVersionUID = 8178135296413950516L;
064
065        @Id
066        @GeneratedValue(generator="KREW_RTE_TMPL_S")
067        @GenericGenerator(name="KREW_RTE_TMPL_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
068                        @Parameter(name="sequence_name",value="KREW_RTE_TMPL_S"),
069                        @Parameter(name="value_column",value="id")
070        })
071        @Column(name="RULE_EXT_ID")
072        private String ruleExtensionId;
073
074        @Column(name="RULE_TMPL_ATTR_ID", insertable=false, updatable=false)
075        private String ruleTemplateAttributeId;
076
077        @Column(name="RULE_ID", insertable=false, updatable=false)
078        private String ruleBaseValuesId;
079
080        @Version
081        @Column(name="VER_NBR")
082        private Long versionNumber;
083        
084        @ManyToOne(fetch=FetchType.EAGER)
085        @JoinColumn(name="RULE_ID")
086        private RuleBaseValues ruleBaseValues;
087
088        @ManyToOne(fetch=FetchType.EAGER)
089        @JoinColumn(name="RULE_TMPL_ATTR_ID")
090        private RuleTemplateAttributeBo ruleTemplateAttribute;
091
092        @OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, mappedBy="extension")
093        @Fetch(value = FetchMode.SELECT)
094        private List<RuleExtensionValue> extensionValues;
095
096        public RuleExtensionBo() {
097                extensionValues = new ArrayList<RuleExtensionValue>();
098        }
099
100        //@PrePersist
101    public void beforeInsert(){
102        OrmUtils.populateAutoIncValue(this, KEWServiceLocator.getEntityManagerFactory().createEntityManager());
103    }
104        
105        public List<RuleExtensionValue> getExtensionValues() {
106                return extensionValues;
107        }
108
109        public void setExtensionValues(List<RuleExtensionValue> extensionValues) {
110                this.extensionValues = extensionValues;
111        }
112
113    @Override
114        public RuleTemplateAttributeBo getRuleTemplateAttribute() {
115                return ruleTemplateAttribute;
116        }
117
118    @Override
119    public Map<String, String> getExtensionValuesMap() {
120        Map<String, String> extensions = new HashMap<String, String>();
121        for (RuleExtensionValue value : getExtensionValues()) {
122            extensions.put(value.getKey(), value.getValue());
123        }
124        return extensions;
125    }
126
127    public void setRuleTemplateAttribute(RuleTemplateAttributeBo ruleTemplateAttribute) {
128                this.ruleTemplateAttribute = ruleTemplateAttribute;
129        }
130
131        public RuleExtensionValue getRuleExtensionValue(int index) {
132                while (getExtensionValues().size() <= index) {
133                        getExtensionValues().add(new RuleExtensionValue());
134                }
135                return (RuleExtensionValue) getExtensionValues().get(index);
136        }
137
138        public RuleBaseValues getRuleBaseValues() {
139                return ruleBaseValues;
140        }
141
142        public void setRuleBaseValues(RuleBaseValues ruleBaseValues) {
143                this.ruleBaseValues = ruleBaseValues;
144        }
145
146        public Long getVersionNumber() {
147                return versionNumber;
148        }
149
150        public void setVersionNumber(Long versionNumber) {
151                this.versionNumber = versionNumber;
152        }
153
154        public String getRuleBaseValuesId() {
155                return ruleBaseValuesId;
156        }
157
158        public void setRuleBaseValuesId(String ruleBaseValuesId) {
159                this.ruleBaseValuesId = ruleBaseValuesId;
160        }
161
162        public String getRuleExtensionId() {
163                return ruleExtensionId;
164        }
165
166        public void setRuleExtensionId(String ruleExtensionId) {
167                this.ruleExtensionId = ruleExtensionId;
168        }
169
170        public String getRuleTemplateAttributeId() {
171                return ruleTemplateAttributeId;
172        }
173
174        public void setRuleTemplateAttributeId(String ruleTemplateAttributeId) {
175                this.ruleTemplateAttributeId = ruleTemplateAttributeId;
176        }
177
178    public boolean equals(Object o) {
179        if (o == null) return false;
180        if (!(o instanceof RuleExtensionBo)) return false;
181        RuleExtensionBo pred = (RuleExtensionBo) o;
182        return ObjectUtils.equals(ruleBaseValues.getRuleTemplate(), pred.getRuleBaseValues().getRuleTemplate()) &&
183               ObjectUtils.equals(ruleTemplateAttribute, pred.getRuleTemplateAttribute()) &&
184               CollectionUtils.collectionsEquivalent(extensionValues, pred.getExtensionValues());
185    }
186
187    public String toString() {
188        return "[RuleExtension:"
189               +  " ruleExtensionId=" + ruleExtensionId
190               + ", ruleTemplateAttributeId=" + ruleTemplateAttributeId
191               + ", ruleBaseValuesId=" + ruleBaseValuesId
192               + ", ruleBaseValues=" + ruleBaseValues
193               + ", ruleTemplateAttribute=" + ruleTemplateAttribute
194               + ", extensionValues=" + extensionValues
195               + ", versionNumber=" + versionNumber
196               + "]";
197    }
198
199    /**
200     * Converts a mutable bo to its immutable counterpart
201     * @param bo the mutable business object
202     * @return the immutable object
203     */
204    public static RuleExtension to(RuleExtensionBo bo) {
205        if (bo == null) {
206            return null;
207        }
208        return RuleExtension.Builder.create(bo).build();
209    }
210
211}