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.OneToMany; 033import javax.persistence.Table; 034import javax.persistence.Transient; 035 036import org.kuali.rice.kim.api.KimConstants; 037import org.kuali.rice.kim.api.responsibility.Responsibility; 038import org.kuali.rice.kim.api.responsibility.ResponsibilityContract; 039import org.kuali.rice.kim.api.services.KimApiServiceLocator; 040import org.kuali.rice.kim.api.type.KimType; 041import org.kuali.rice.kim.api.type.KimTypeAttribute; 042import org.kuali.rice.kim.api.type.KimTypeInfoService; 043import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo; 044import org.kuali.rice.kim.impl.role.RoleResponsibilityBo; 045import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; 046import org.kuali.rice.krad.data.jpa.RemoveMapping; 047import org.kuali.rice.krad.data.jpa.RemoveMappings; 048import org.kuali.rice.krad.data.jpa.converters.BooleanYNConverter; 049import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator; 050import org.kuali.rice.krad.service.DataDictionaryService; 051import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 052import org.springframework.util.AutoPopulatingList; 053 054@Entity 055@Table(name = "KRIM_RSP_T") 056@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 057@RemoveMappings( value = { 058 @RemoveMapping(name = "documentTypeName"), 059 @RemoveMapping(name = "routeNodeName"), 060 @RemoveMapping(name = "actionDetailsAtRoleMemberLevel"), 061 @RemoveMapping(name = "required"), 062 @RemoveMapping(name = "qualifierResolverProvidedIdentifier")}) 063public class ReviewResponsibilityBo extends PersistableBusinessObjectBase implements ResponsibilityContract { 064 065 private static final long serialVersionUID = 1L; 066 067 public static final String ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL_FIELD_NAME = "actionDetailsAtRoleMemberLevel"; 068 069 @PortableSequenceGenerator(name = "KRIM_RSP_ID_S") 070 @GeneratedValue(generator = "KRIM_RSP_ID_S") 071 @Id 072 @Column(name = "RSP_ID") 073 private String id; 074 075 @Column(name = "NMSPC_CD") 076 private String namespaceCode; 077 078 @Column(name = "NM") 079 private String name; 080 081 @Column(name = "DESC_TXT") 082 private String description; 083 084 @Column(name = "RSP_TMPL_ID") 085 private String templateId; 086 087 @Column(name = "ACTV_IND") 088 @Convert(converter = BooleanYNConverter.class) 089 private boolean active; 090 091 private String documentTypeName; 092 093 private String routeNodeName; 094 095 private boolean actionDetailsAtRoleMemberLevel; 096 097 private boolean required; 098 099 private String qualifierResolverProvidedIdentifier; 100 101 @ManyToOne(targetEntity = ResponsibilityTemplateBo.class, cascade = { CascadeType.REFRESH }) 102 @JoinColumn(name = "RSP_TMPL_ID", referencedColumnName = "RSP_TMPL_ID", insertable = false, updatable = false) 103 private ResponsibilityTemplateBo template = new ResponsibilityTemplateBo(); 104 105 @OneToMany(targetEntity = ResponsibilityAttributeBo.class, orphanRemoval = true, cascade = { CascadeType.ALL }) 106 @JoinColumn(name = "RSP_ID", referencedColumnName = "RSP_ID") 107 private List<ResponsibilityAttributeBo> attributeDetails = new AutoPopulatingList<ResponsibilityAttributeBo>(ResponsibilityAttributeBo.class); 108 109 @OneToMany(mappedBy = "kimResponsibility") 110 @JoinColumn(name = "RSP_ID", referencedColumnName = "RSP_ID", insertable = false, updatable = false,nullable = false) 111 private List<RoleResponsibilityBo> roleResponsibilities = new AutoPopulatingList<RoleResponsibilityBo>(RoleResponsibilityBo.class); 112 113 @Transient 114 private Map<String, String> attributes; 115 116 @Override 117 public Map<String, String> getAttributes() { 118 return attributeDetails != null ? KimAttributeDataBo.toAttributes(attributeDetails) : attributes; 119 } 120 121 /** 122 * Converts a mutable bo to its immutable counterpart 123 * 124 * @param bo the mutable business object 125 * @return the immutable object 126 */ 127 public static Responsibility to(ResponsibilityContract bo) { 128 if (bo == null) { 129 return null; 130 } 131 return Responsibility.Builder.create(bo).build(); 132 } 133 134 /** 135 * Converts a immutable object to its mutable counterpart 136 * 137 * @param im immutable object 138 * @return the mutable bo 139 */ 140 public static ResponsibilityBo from(Responsibility im) { 141 if (im == null) { 142 return null; 143 } 144 ResponsibilityBo bo = new ResponsibilityBo(); 145 bo.id = im.getId(); 146 bo.namespaceCode = im.getNamespaceCode(); 147 bo.name = im.getName(); 148 bo.description = im.getDescription(); 149 bo.active = im.isActive(); 150 bo.templateId = im.getTemplate() != null ? im.getTemplate().getId() : null; 151 bo.template = ResponsibilityTemplateBo.from(im.getTemplate()); 152 bo.attributes = im.getAttributes(); 153 bo.setVersionNumber(im.getVersionNumber()); 154 bo.setObjectId(im.getObjectId()); 155 return bo; 156 } 157 158 public ResponsibilityTemplateBo getTemplate() { 159 return template; 160 } 161 162 public String getDetailObjectsValues() { 163 StringBuffer detailObjectsToDisplayBuffer = new StringBuffer(); 164 Iterator<ResponsibilityAttributeBo> respIter = attributeDetails.iterator(); 165 while (respIter.hasNext()) { 166 ResponsibilityAttributeBo respAttributeData = respIter.next(); 167 detailObjectsToDisplayBuffer.append(respAttributeData.getAttributeValue()); 168 if (respIter.hasNext()) { 169 detailObjectsToDisplayBuffer.append(KimConstants.KimUIConstants.COMMA_SEPARATOR); 170 } 171 } 172 return detailObjectsToDisplayBuffer.toString(); 173 } 174 175 public String getDetailObjectsToDisplay() { 176 final KimType kimType = getTypeInfoService().getKimType(getTemplate().getKimTypeId()); 177 StringBuffer detailObjects = new StringBuffer(); 178 Iterator<ResponsibilityAttributeBo> respIter = attributeDetails.iterator(); 179 while (respIter.hasNext()) { 180 ResponsibilityAttributeBo bo = respIter.next(); 181 detailObjects.append(getKimAttributeLabelFromDD(kimType.getAttributeDefinitionById(bo.getKimAttributeId()))).append(":").append(bo.getAttributeValue()); 182 if (respIter.hasNext()) { 183 detailObjects.append(KimConstants.KimUIConstants.COMMA_SEPARATOR); 184 } 185 } 186 return detailObjects.toString(); 187 } 188 189 private String getKimAttributeLabelFromDD(KimTypeAttribute attribute) { 190 return getDataDictionaryService().getAttributeLabel(attribute.getKimAttribute().getComponentName(), attribute.getKimAttribute().getAttributeName()); 191 } 192 193 private DataDictionaryService getDataDictionaryService() { 194 return KRADServiceLocatorWeb.getDataDictionaryService(); 195 } 196 197 private KimTypeInfoService getTypeInfoService() { 198 return KimApiServiceLocator.getKimTypeInfoService(); 199 } 200 201 @Override 202 public String getId() { 203 return id; 204 } 205 206 public void setId(String id) { 207 this.id = id; 208 } 209 210 @Override 211 public String getNamespaceCode() { 212 return namespaceCode; 213 } 214 215 public void setNamespaceCode(String namespaceCode) { 216 this.namespaceCode = namespaceCode; 217 } 218 219 @Override 220 public String getName() { 221 return name; 222 } 223 224 public void setName(String name) { 225 this.name = name; 226 } 227 228 @Override 229 public String getDescription() { 230 return description; 231 } 232 233 public void setDescription(String description) { 234 this.description = description; 235 } 236 237 public String getTemplateId() { 238 return templateId; 239 } 240 241 public void setTemplateId(String templateId) { 242 this.templateId = templateId; 243 } 244 245 public boolean getActive() { 246 return active; 247 } 248 249 @Override 250 public boolean isActive() { 251 return active; 252 } 253 254 public void setActive(boolean active) { 255 this.active = active; 256 } 257 258 public void setTemplate(ResponsibilityTemplateBo template) { 259 this.template = template; 260 } 261 262 public List<ResponsibilityAttributeBo> getAttributeDetails() { 263 return attributeDetails; 264 } 265 266 public void setAttributeDetails(List<ResponsibilityAttributeBo> attributeDetails) { 267 this.attributeDetails = attributeDetails; 268 } 269 270 public List<RoleResponsibilityBo> getRoleResponsibilities() { 271 return roleResponsibilities; 272 } 273 274 public void setRoleResponsibilities(List<RoleResponsibilityBo> roleResponsibilities) { 275 this.roleResponsibilities = roleResponsibilities; 276 } 277 278 public void setAttributes(Map<String, String> attributes) { 279 this.attributes = attributes; 280 } 281 282 283 284 public ReviewResponsibilityBo() { 285 } 286 287 public ReviewResponsibilityBo(ResponsibilityContract resp) { 288 loadFromKimResponsibility(resp); 289 } 290 291 public void loadFromKimResponsibility(final ResponsibilityContract resp) { 292 setId(resp.getId()); 293 setNamespaceCode(resp.getNamespaceCode()); 294 setName(resp.getName()); 295 setDescription(resp.getDescription()); 296 setActive(resp.isActive()); 297 setTemplateId(resp.getTemplate() != null ? resp.getTemplate().getId() : null); 298 setTemplate( ResponsibilityTemplateBo.from(resp.getTemplate()) ); 299 setAttributes(resp.getAttributes()); 300 setVersionNumber(resp.getVersionNumber()); 301 setObjectId(resp.getObjectId()); 302 Map<String, String> respDetails = resp.getAttributes(); 303 documentTypeName = respDetails.get(KimConstants.AttributeConstants.DOCUMENT_TYPE_NAME); 304 routeNodeName = respDetails.get(KimConstants.AttributeConstants.ROUTE_NODE_NAME); 305 actionDetailsAtRoleMemberLevel = Boolean.valueOf(respDetails.get(KimConstants.AttributeConstants.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL)); 306 required = Boolean.valueOf(respDetails.get(KimConstants.AttributeConstants.REQUIRED)); 307 qualifierResolverProvidedIdentifier = respDetails.get(KimConstants.AttributeConstants.QUALIFIER_RESOLVER_PROVIDED_IDENTIFIER); 308 } 309 310 public String getDocumentTypeName() { 311 return documentTypeName; 312 } 313 314 public void setDocumentTypeName(String documentTypeName) { 315 this.documentTypeName = documentTypeName; 316 } 317 318 public String getRouteNodeName() { 319 return routeNodeName; 320 } 321 322 public void setRouteNodeName(String routeNodeName) { 323 this.routeNodeName = routeNodeName; 324 } 325 326 public boolean getActionDetailsAtRoleMemberLevel() { 327 return actionDetailsAtRoleMemberLevel; 328 } 329 330 public boolean isActionDetailsAtRoleMemberLevel() { 331 return actionDetailsAtRoleMemberLevel; 332 } 333 334 public void setActionDetailsAtRoleMemberLevel(boolean actionDetailsAtRoleMemberLevel) { 335 this.actionDetailsAtRoleMemberLevel = actionDetailsAtRoleMemberLevel; 336 } 337 338 public boolean getRequired() { 339 return required; 340 } 341 342 public boolean isRequired() { 343 return required; 344 } 345 346 public void setRequired(boolean required) { 347 this.required = required; 348 } 349 350 public String getQualifierResolverProvidedIdentifier() { 351 return qualifierResolverProvidedIdentifier; 352 } 353 354 public void setQualifierResolverProvidedIdentifier(String qualifierResolverProvidedIdentifier) { 355 this.qualifierResolverProvidedIdentifier = qualifierResolverProvidedIdentifier; 356 } 357}