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.kim.impl.responsibility;
017
018import java.util.Iterator;
019import java.util.List;
020import java.util.Map;
021
022import javax.persistence.CascadeType;
023import javax.persistence.Column;
024import javax.persistence.Convert;
025import javax.persistence.Entity;
026import javax.persistence.GeneratedValue;
027import javax.persistence.Id;
028import javax.persistence.Inheritance;
029import javax.persistence.InheritanceType;
030import javax.persistence.JoinColumn;
031import javax.persistence.ManyToOne;
032import javax.persistence.NamedQueries;
033import javax.persistence.NamedQuery;
034import javax.persistence.OneToMany;
035import javax.persistence.Table;
036import javax.persistence.Transient;
037
038import org.eclipse.persistence.annotations.JoinFetch;
039import org.eclipse.persistence.annotations.JoinFetchType;
040import org.kuali.rice.kew.api.KewApiConstants;
041import org.kuali.rice.kim.api.KimConstants;
042import org.kuali.rice.kim.api.responsibility.Responsibility;
043import org.kuali.rice.kim.api.responsibility.ResponsibilityContract;
044import org.kuali.rice.kim.api.services.KimApiServiceLocator;
045import org.kuali.rice.kim.api.type.KimType;
046import org.kuali.rice.kim.api.type.KimTypeAttribute;
047import org.kuali.rice.kim.api.type.KimTypeInfoService;
048import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
049import org.kuali.rice.kim.impl.role.RoleResponsibilityBo;
050import org.kuali.rice.krad.bo.DataObjectBase;
051import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator;
052import org.kuali.rice.krad.data.jpa.converters.BooleanYNConverter;
053import org.kuali.rice.krad.service.DataDictionaryService;
054import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
055import org.kuali.rice.krad.util.KRADConstants;
056import org.springframework.util.AutoPopulatingList;
057
058@Entity
059@Table(name = "KRIM_RSP_T")
060@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
061@NamedQueries({
062        @NamedQuery(name = "Responsibility.workflowResponsibilities",
063                query = "SELECT r.id FROM ResponsibilityBo r JOIN r.attributeDetails a WHERE " +
064                        "a.kimAttribute.attributeName = 'documentTypeName' AND a.attributeValue = :documentTypeName AND " +
065                        "r.template.namespaceCode = '" + KRADConstants.KUALI_RICE_WORKFLOW_NAMESPACE + "' AND " +
066                        "r.template.name = '" + KewApiConstants.DEFAULT_RESPONSIBILITY_TEMPLATE_NAME + "' AND r.active = true"),
067        @NamedQuery(name = "Responsibility.workflowExceptionResponsibilities",
068                query = "SELECT r.id FROM ResponsibilityBo r JOIN r.attributeDetails a WHERE " +
069                        "a.kimAttribute.attributeName = 'documentTypeName' AND a.attributeValue = :documentTypeName AND " +
070                        "r.template.namespaceCode = '" + KRADConstants.KUALI_RICE_WORKFLOW_NAMESPACE + "' AND " +
071                        "r.template.name = '" + KewApiConstants.EXCEPTION_ROUTING_RESPONSIBILITY_TEMPLATE_NAME + "' AND r.active = true")
072})
073public class ResponsibilityBo extends DataObjectBase implements ResponsibilityContract {
074
075    private static final long serialVersionUID = 1L;
076
077    @PortableSequenceGenerator(name = "KRIM_RSP_ID_S")
078    @GeneratedValue(generator = "KRIM_RSP_ID_S")
079    @Id
080    @Column(name = "RSP_ID")
081    String id;
082
083    @Column(name = "NMSPC_CD")
084    String namespaceCode;
085
086    @Column(name = "NM")
087    String name;
088
089    @Column(name = "DESC_TXT")
090    String description;
091
092    @Column(name = "RSP_TMPL_ID")
093    String templateId;
094
095    @Column(name = "ACTV_IND")
096    @Convert(converter = BooleanYNConverter.class)
097    boolean active;
098
099    @JoinFetch(value= JoinFetchType.OUTER)
100    @ManyToOne(targetEntity = ResponsibilityTemplateBo.class, cascade = { CascadeType.REFRESH })
101    @JoinColumn(name = "RSP_TMPL_ID", referencedColumnName = "RSP_TMPL_ID", insertable = false, updatable = false)
102    ResponsibilityTemplateBo template = new ResponsibilityTemplateBo();
103
104    @JoinFetch(value= JoinFetchType.OUTER)
105    @OneToMany(targetEntity = ResponsibilityAttributeBo.class, orphanRemoval = true, cascade = { CascadeType.ALL })
106    @JoinColumn(name = "RSP_ID", referencedColumnName = "RSP_ID")
107    List<ResponsibilityAttributeBo> attributeDetails = new AutoPopulatingList<ResponsibilityAttributeBo>(ResponsibilityAttributeBo.class);
108
109    @JoinFetch(value= JoinFetchType.OUTER)
110    @OneToMany(mappedBy = "kimResponsibility")
111    @JoinColumn(name = "RSP_ID", referencedColumnName = "RSP_ID", insertable = false, updatable = false)
112    List<RoleResponsibilityBo> roleResponsibilities = new AutoPopulatingList<RoleResponsibilityBo>(RoleResponsibilityBo.class);
113
114    @Transient
115    Map<String, String> attributes;
116
117    @Override
118    public Map<String, String> getAttributes() {
119        return attributeDetails != null ? KimAttributeDataBo.toAttributes(attributeDetails) : attributes;
120    }
121
122    /**
123     * Converts a mutable bo to its immutable counterpart
124     *
125     * @param bo the mutable business object
126     * @return the immutable object
127     */
128    public static Responsibility to(ResponsibilityContract bo) {
129        if (bo == null) {
130            return null;
131        }
132        return Responsibility.Builder.create(bo).build();
133    }
134
135    /**
136     * Converts a immutable object to its mutable counterpart
137     *
138     * @param im immutable object
139     * @return the mutable bo
140     */
141    public static ResponsibilityBo from(Responsibility im) {
142        if (im == null) {
143            return null;
144        }
145        ResponsibilityBo bo = new ResponsibilityBo();
146        bo.id = im.getId();
147        bo.namespaceCode = im.getNamespaceCode();
148        bo.name = im.getName();
149        bo.description = im.getDescription();
150        bo.active = im.isActive();
151        bo.templateId = im.getTemplate() != null ? im.getTemplate().getId() : null;
152        bo.template = ResponsibilityTemplateBo.from(im.getTemplate());
153        bo.attributes = im.getAttributes();
154        bo.setVersionNumber(im.getVersionNumber());
155        bo.setObjectId(im.getObjectId());
156        return bo;
157    }
158
159    @Override
160    public ResponsibilityTemplateBo getTemplate() {
161        return template;
162    }
163
164    public String getDetailObjectsValues() {
165        StringBuffer detailObjectsToDisplayBuffer = new StringBuffer();
166        Iterator<ResponsibilityAttributeBo> respIter = attributeDetails.iterator();
167        while (respIter.hasNext()) {
168            ResponsibilityAttributeBo respAttributeData = respIter.next();
169            detailObjectsToDisplayBuffer.append(respAttributeData.getAttributeValue());
170            if (respIter.hasNext()) {
171                detailObjectsToDisplayBuffer.append(KimConstants.KimUIConstants.COMMA_SEPARATOR);
172            }
173        }
174        return detailObjectsToDisplayBuffer.toString();
175    }
176
177    public String getDetailObjectsToDisplay() {
178        final KimType kimType = getTypeInfoService().getKimType(getTemplate().getKimTypeId());
179        StringBuffer detailObjects = new StringBuffer();
180        Iterator<ResponsibilityAttributeBo> respIter = attributeDetails.iterator();
181        while (respIter.hasNext()) {
182            ResponsibilityAttributeBo bo = respIter.next();
183            detailObjects.append(getKimAttributeLabelFromDD(kimType.getAttributeDefinitionById(bo.getKimAttributeId()))).append(":").append(bo.getAttributeValue());
184            if (respIter.hasNext()) {
185                detailObjects.append(KimConstants.KimUIConstants.COMMA_SEPARATOR);
186            }
187        }
188        return detailObjects.toString();
189    }
190
191    private String getKimAttributeLabelFromDD(KimTypeAttribute attribute) {
192        return getDataDictionaryService().getAttributeLabel(attribute.getKimAttribute().getComponentName(), attribute.getKimAttribute().getAttributeName());
193    }
194
195    private DataDictionaryService getDataDictionaryService() {
196        return KRADServiceLocatorWeb.getDataDictionaryService();
197    }
198
199    private KimTypeInfoService getTypeInfoService() {
200        return KimApiServiceLocator.getKimTypeInfoService();
201    }
202
203    @Override
204    public String getId() {
205        return id;
206    }
207
208    public void setId(String id) {
209        this.id = id;
210    }
211
212    @Override
213    public String getNamespaceCode() {
214        return namespaceCode;
215    }
216
217    public void setNamespaceCode(String namespaceCode) {
218        this.namespaceCode = namespaceCode;
219    }
220
221    @Override
222    public String getName() {
223        return name;
224    }
225
226    public void setName(String name) {
227        this.name = name;
228    }
229
230    @Override
231    public String getDescription() {
232        return description;
233    }
234
235    public void setDescription(String description) {
236        this.description = description;
237    }
238
239    public String getTemplateId() {
240        return templateId;
241    }
242
243    public void setTemplateId(String templateId) {
244        this.templateId = templateId;
245    }
246
247    public boolean getActive() {
248        return active;
249    }
250
251    @Override
252    public boolean isActive() {
253        return active;
254    }
255
256    public void setActive(boolean active) {
257        this.active = active;
258    }
259
260    public void setTemplate(ResponsibilityTemplateBo template) {
261        this.template = template;
262    }
263
264    public List<ResponsibilityAttributeBo> getAttributeDetails() {
265        return attributeDetails;
266    }
267
268    public void setAttributeDetails(List<ResponsibilityAttributeBo> attributeDetails) {
269        this.attributeDetails = attributeDetails;
270    }
271
272    public List<RoleResponsibilityBo> getRoleResponsibilities() {
273        return roleResponsibilities;
274    }
275
276    public void setRoleResponsibilities(List<RoleResponsibilityBo> roleResponsibilities) {
277        this.roleResponsibilities = roleResponsibilities;
278    }
279
280    public void setAttributes(Map<String, String> attributes) {
281        this.attributes = attributes;
282    }
283}