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