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}