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;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.hibernate.annotations.GenericGenerator;
020 import org.hibernate.annotations.Parameter;
021 import org.kuali.rice.core.api.delegation.DelegationType;
022 import org.kuali.rice.kew.api.rule.RuleDelegationContract;
023 import org.kuali.rice.kew.doctype.bo.DocumentType;
024 import org.kuali.rice.kew.service.KEWServiceLocator;
025 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026 import org.kuali.rice.kim.impl.group.GroupBo;
027 import org.kuali.rice.kim.impl.identity.PersonImpl;
028 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
029
030 import javax.persistence.CascadeType;
031 import javax.persistence.Column;
032 import javax.persistence.Entity;
033 import javax.persistence.FetchType;
034 import javax.persistence.GeneratedValue;
035 import javax.persistence.Id;
036 import javax.persistence.JoinColumn;
037 import javax.persistence.OneToOne;
038 import javax.persistence.Table;
039 import javax.persistence.Transient;
040
041
042 /**
043 * A model bean representing the delegation of a rule from a responsibility to
044 * another rule. Specifies the delegation type which can be either
045 * {@link {@link DelegationType#PRIMARY} or {@link DelegationType#SECONDARY}.
046 *
047 * @author Kuali Rice Team (rice.collab@kuali.org)
048 */
049 @Entity
050 @Table(name="KREW_DLGN_RSP_T")
051 //@Sequence(name="KREW_RTE_TMPL_S", property="ruleDelegationId")
052 public class RuleDelegationBo extends PersistableBusinessObjectBase implements RuleDelegationContract {
053
054 private static final long serialVersionUID = 7989203310473741293L;
055 @Id
056 @GeneratedValue(generator="KREW_RTE_TMPL_S")
057 @GenericGenerator(name="KREW_RTE_TMPL_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
058 @Parameter(name="sequence_name",value="KREW_RTE_TMPL_S"),
059 @Parameter(name="value_column",value="id")
060 })
061 @Column(name="DLGN_RULE_ID")
062 private String ruleDelegationId;
063 @Column(name="RSP_ID")
064 private String responsibilityId;
065 @Column(name="DLGN_RULE_BASE_VAL_ID", insertable=false, updatable=false)
066 private String delegateRuleId;
067 @Column(name="DLGN_TYP")
068 private String delegationTypeCode = DelegationType.PRIMARY.getCode();
069
070 @OneToOne(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST})
071 @JoinColumn(name="DLGN_RULE_BASE_VAL_ID")
072 private RuleBaseValues delegationRule;
073 // @ManyToOne(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST})
074 // @JoinColumn(name="RULE_RSP_ID")
075 // private RuleResponsibility ruleResponsibility;
076
077 @Transient
078 private String groupReviewerName;
079 @Transient
080 private String groupReviewerNamespace;
081 @Transient
082 private String personReviewer;
083 @Transient
084 private String personReviewerType;
085
086 public RuleDelegationBo() {
087 }
088
089 public Object copy(boolean preserveKeys) {
090 RuleDelegationBo clone = new RuleDelegationBo();
091 if (ruleDelegationId != null && preserveKeys) {
092 clone.setRuleDelegationId(ruleDelegationId);
093 }
094 clone.setDelegationRule(delegationRule);
095 clone.setDelegateRuleId(delegationRule.getId());
096 if (delegationTypeCode != null) {
097 clone.setDelegationType(DelegationType.fromCode(delegationTypeCode));
098 }
099 return clone;
100 }
101
102 public String getDelegateRuleId() {
103 return delegateRuleId;
104 }
105 public void setDelegateRuleId(String delegateRuleId) {
106 this.delegateRuleId = delegateRuleId;
107 }
108
109 @Override
110 public RuleBaseValues getDelegationRule() {
111 return delegationRule;
112 }
113
114 public RuleBaseValues getDelegationRuleBaseValues() {
115 return delegationRule;
116 }
117
118 public void setDelegationRuleBaseValues(RuleBaseValues delegationRuleBaseValues) {
119 this.delegationRule = delegationRuleBaseValues;
120 }
121
122 public void setDelegationRule(RuleBaseValues delegationRule) {
123 this.delegationRule = delegationRule;
124 }
125
126 /**
127 * Setter for type code preserved for DD
128 * @param delegationTypeCode the DelegationType code
129 */
130 public void setDelegationTypeCode(String delegationTypeCode) {
131 DelegationType.fromCode(delegationTypeCode);
132 this.delegationTypeCode = delegationTypeCode;
133 }
134
135 /**
136 * Getter for type code preserved for DD
137 * @return the DelegationType code
138 */
139 public String getDelegationTypeCode() {
140 return delegationTypeCode;
141 }
142
143 @Override
144 public DelegationType getDelegationType() {
145 return DelegationType.fromCode(delegationTypeCode);
146 }
147 public void setDelegationType(DelegationType delegationType) {
148 this.delegationTypeCode = delegationType.getCode();
149 }
150 public String getRuleDelegationId() {
151 return ruleDelegationId;
152 }
153 public void setRuleDelegationId(String ruleDelegationId) {
154 this.ruleDelegationId = ruleDelegationId;
155 }
156
157 /**
158 * Returns the most recent RuleResponsibility for the responsibility
159 * id on this RuleDelegation.
160 */
161 public RuleResponsibilityBo getRuleResponsibility() {
162 if ( getResponsibilityId() == null ) {
163 return null;
164 }
165 return KEWServiceLocator.getRuleService().findRuleResponsibility(getResponsibilityId());
166 }
167
168 public DocumentType getDocumentType() {
169 return this.getDelegationRule().getDocumentType();
170 }
171
172 public String getResponsibilityId() {
173 return responsibilityId;
174 }
175 public void setResponsibilityId(String ruleResponsibilityId) {
176 this.responsibilityId = ruleResponsibilityId;
177 }
178
179 public String getGroupReviewerName() {
180 return this.groupReviewerName;
181 }
182
183 public String getGroupReviewerNamespace() {
184 return this.groupReviewerNamespace;
185 }
186
187 public String getPersonReviewer() {
188 return this.personReviewer;
189 }
190
191 public void setGroupReviewerName(String groupReviewerName) {
192 this.groupReviewerName = groupReviewerName;
193 }
194
195 public void setGroupReviewerNamespace(String groupReviewerNamespace) {
196 this.groupReviewerNamespace = groupReviewerNamespace;
197 }
198
199 public void setPersonReviewer(String personReviewer) {
200 this.personReviewer = personReviewer;
201 }
202
203 public String getPersonReviewerType() {
204 return this.personReviewerType;
205 }
206
207 public void setPersonReviewerType(String personReviewerType) {
208 this.personReviewerType = personReviewerType;
209 }
210
211 public GroupBo getGroupBo() {
212 GroupBo groupBo = null;
213 if (StringUtils.isNotBlank(getGroupReviewerName())) {
214 if ( groupBo == null ) {
215 groupBo = GroupBo.from(KimApiServiceLocator.getGroupService().getGroupByNamespaceCodeAndName(
216 getGroupReviewerNamespace(), getGroupReviewerName()));
217 }
218 }
219 return groupBo;
220 }
221
222 public PersonImpl getPersonImpl() {
223 return new PersonImpl();
224 }
225
226 /**
227 * An override of the refresh() method that properly preserves the RuleBaseValues instance. If the delegationRuleBaseValues property
228 * becomes null as a result of the refresh() method on the PersistableBusinessObjectBase superclass, an attempt is made to retrieve
229 * it by calling refreshReferenceObject() for the property. If that also fails, then the RuleBaseValues instance that was in-place
230 * prior to the refresh() superclass call will be used as the delegationRuleBaseValues property's value. This override is necessary
231 * in order to prevent certain exceptions during the cancellation of a rule delegation maintenance document.
232 *
233 * @see org.kuali.rice.krad.bo.PersistableBusinessObjectBase#refresh()
234 * @see org.kuali.rice.krad.bo.PersistableBusinessObjectBase#refreshReferenceObject(java.lang.String)
235 */
236 @Override
237 public void refresh() {
238 RuleBaseValues oldRuleBaseValues = this.getDelegationRule();
239 super.refresh();
240 if (this.getDelegationRule() == null) {
241 this.refreshReferenceObject("delegationRuleBaseValues");
242 if (this.getDelegationRule() == null) {
243 this.setDelegationRule(oldRuleBaseValues);
244 }
245 }
246 }
247
248 public static org.kuali.rice.kew.api.rule.RuleDelegation to(RuleDelegationBo bo) {
249 if (bo == null) {
250 return null;
251 }
252 return org.kuali.rice.kew.api.rule.RuleDelegation.Builder.create(bo).build();
253 /*org.kuali.rice.kew.api.rule.RuleDelegation.Builder builder = org.kuali.rice.kew.api.rule.RuleDelegation.Builder.create();
254 builder.setDelegationType(bo.getDelegationType());
255 builder.setDelegationRule(org.kuali.rice.kew.api.rule.Rule.Builder.create(RuleBaseValues.to(
256 bo.getDelegationRule())));
257 return builder.build();*/
258 }
259 }
260