001 /**
002 * Copyright 2005-2012 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.kim.impl.permission;
017
018 import javax.persistence.CascadeType;
019 import javax.persistence.Column;
020 import javax.persistence.Entity;
021 import javax.persistence.FetchType;
022 import javax.persistence.Id;
023 import javax.persistence.JoinColumn;
024 import javax.persistence.OneToMany;
025 import javax.persistence.OneToOne;
026 import javax.persistence.Table;
027 import javax.persistence.Transient;
028 import org.hibernate.annotations.Fetch;
029 import org.hibernate.annotations.FetchMode;
030 import org.hibernate.annotations.Type;
031 import org.kuali.rice.kim.api.KimConstants;
032 import org.kuali.rice.kim.api.permission.Permission;
033 import org.kuali.rice.kim.api.permission.PermissionContract;
034 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
035 import org.kuali.rice.kim.api.type.KimType;
036 import org.kuali.rice.kim.api.type.KimTypeAttribute;
037 import org.kuali.rice.kim.api.type.KimTypeInfoService;
038 import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
039 import org.kuali.rice.kim.impl.role.RolePermissionBo;
040 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
041 import org.kuali.rice.krad.service.DataDictionaryService;
042 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
043 import org.springframework.util.AutoPopulatingList;
044
045 import java.util.Iterator;
046 import java.util.List;
047 import java.util.Map;
048
049 @Entity
050 @Table(name = "KRIM_PERM_T")
051 public class PermissionBo extends PersistableBusinessObjectBase implements PermissionContract {
052 private static final long serialVersionUID = 1L;
053
054 @Id
055 @Column(name = "PERM_ID")
056 private String id;
057
058 @Column(name = "NMSPC_CD")
059 private String namespaceCode;
060
061 @Column(name = "NM")
062 private String name;
063
064 @Column(name = "DESC_TXT", length = 400)
065 private String description;
066
067 @Column(name = "PERM_TMPL_ID")
068 private String templateId;
069
070 @Column(name = "ACTV_IND")
071 @Type(type = "yes_no")
072 private boolean active;
073
074 @OneToOne(targetEntity = PermissionTemplateBo.class, cascade = {}, fetch = FetchType.EAGER)
075 @JoinColumn(name = "PERM_TMPL_ID", insertable = false, updatable = false)
076 private PermissionTemplateBo template = new PermissionTemplateBo();
077
078 @OneToMany(targetEntity = PermissionAttributeBo.class, cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, mappedBy = "id")
079 @Fetch(value = FetchMode.SELECT)
080 private List<PermissionAttributeBo> attributeDetails;
081
082 @Transient
083 private Map<String,String> attributes;
084
085 @OneToMany(targetEntity = RolePermissionBo.class, cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, mappedBy = "id")
086 @Fetch(value = FetchMode.SELECT)
087 private List<RolePermissionBo> rolePermissions = new AutoPopulatingList(RolePermissionBo.class);
088
089 @Transient
090 private KimTypeInfoService kimTypeInfoService;
091 @Transient
092 private DataDictionaryService dataDictionaryService;
093
094
095 public Map<String,String> getAttributes() {
096 return attributeDetails != null ? KimAttributeDataBo.toAttributes(attributeDetails) : attributes;
097 }
098
099 //TODO: rename/fix later - only including this method and attributeDetails field for Role conversion
100 public Map<String,String> getDetails() {
101 return attributeDetails != null ? KimAttributeDataBo.toAttributes(attributeDetails) : attributes;
102 }
103
104 @Override
105 public String getId() {
106 return id;
107 }
108
109 public void setId(String id) {
110 this.id = id;
111 }
112
113 @Override
114 public String getNamespaceCode() {
115 return namespaceCode;
116 }
117
118 public void setNamespaceCode(String namespaceCode) {
119 this.namespaceCode = namespaceCode;
120 }
121
122 @Override
123 public String getName() {
124 return name;
125 }
126
127 public void setName(String name) {
128 this.name = name;
129 }
130
131 @Override
132 public String getDescription() {
133 return description;
134 }
135
136 public void setDescription(String description) {
137 this.description = description;
138 }
139
140 public String getTemplateId() {
141 return templateId;
142 }
143
144 public void setTemplateId(String templateId) {
145 this.templateId = templateId;
146 }
147
148 @Override
149 public boolean isActive() {
150 return active;
151 }
152
153 public void setActive(boolean active) {
154 this.active = active;
155 }
156
157 public List<PermissionAttributeBo> getAttributeDetails() {
158 return attributeDetails;
159 }
160
161 public void setAttributeDetails(List<PermissionAttributeBo> attributeDetails) {
162 this.attributeDetails = attributeDetails;
163 }
164
165 public List<RolePermissionBo> getRolePermissions() {
166 return rolePermissions;
167 }
168
169 public void setRolePermissions(List<RolePermissionBo> rolePermissions) {
170 this.rolePermissions = rolePermissions;
171 }
172
173 public KimTypeInfoService getKimTypeInfoService() {
174 return kimTypeInfoService;
175 }
176
177 public void setKimTypeInfoService(KimTypeInfoService kimTypeInfoService) {
178 this.kimTypeInfoService = kimTypeInfoService;
179 }
180
181 public void setAttributes(Map<String, String> attributes) {
182 this.attributes = attributes;
183 }
184
185 /**
186 * Converts a mutable bo to its immutable counterpart
187 * @param bo the mutable business object
188 * @return the immutable object
189 */
190 public static Permission to(PermissionBo bo) {
191 if (bo == null) {
192 return null;
193 }
194
195 return Permission.Builder.create(bo).build();
196 }
197
198 /**
199 * Converts a immutable object to its mutable counterpart
200 * @param im immutable object
201 * @return the mutable bo
202 */
203 public static PermissionBo from(Permission im) {
204 if (im == null) {
205 return null;
206 }
207
208 PermissionBo bo = new PermissionBo();
209 bo.setId(im.getId());
210 bo.setNamespaceCode(im.getNamespaceCode());
211 bo.setName(im.getName());
212 bo.setDescription(im.getDescription());
213 bo.setActive(im.isActive());
214 bo.setTemplateId(im.getTemplate() != null ? im.getTemplate().getId() : null);
215 bo.setTemplate(PermissionTemplateBo.from(im.getTemplate()));
216 bo.setAttributes(im.getAttributes());
217 bo.setVersionNumber(im.getVersionNumber());
218 bo.setObjectId(im.getObjectId());
219
220 return bo;
221 }
222
223 @Override
224 public PermissionTemplateBo getTemplate() {
225 return template;
226 }
227
228 public void setTemplate(PermissionTemplateBo template) {
229 this.template = template;
230 }
231
232 public String getDetailObjectsValues() {
233 StringBuffer detailObjectsToDisplayBuffer = new StringBuffer();
234 Iterator<PermissionAttributeBo> permIter = attributeDetails.iterator();
235 while (permIter.hasNext()) {
236 PermissionAttributeBo permissionAttributeData = permIter.next();
237 detailObjectsToDisplayBuffer.append(permissionAttributeData.getAttributeValue());
238 if (permIter.hasNext()) {
239 detailObjectsToDisplayBuffer.append(KimConstants.KimUIConstants.COMMA_SEPARATOR);
240 }
241 }
242 return detailObjectsToDisplayBuffer.toString();
243 }
244
245 public String getDetailObjectsToDisplay() {
246 final KimType kimType = getTypeInfoService().getKimType( getTemplate().getKimTypeId() );
247
248
249 StringBuffer detailObjects = new StringBuffer();
250 Iterator<PermissionAttributeBo> permIter = attributeDetails.iterator();
251 while (permIter.hasNext()) {
252 PermissionAttributeBo bo = permIter.next();
253 detailObjects.append(getKimAttributeLabelFromDD(kimType.getAttributeDefinitionById(bo.getKimAttributeId())))
254 .append(":")
255 .append(bo.getAttributeValue());
256 if (permIter.hasNext()) {
257 detailObjects.append(",");
258 }
259 }
260 /*return attributeDetails.collect {
261 getKimAttributeLabelFromDD(kimType.getAttributeDefinitionById(it.kimAttributeId)) + ":" + it.attributeValue
262 }.join(",")*/
263 return detailObjects.toString();
264 }
265
266 private String getKimAttributeLabelFromDD( KimTypeAttribute attribute ){
267 return getDataDictionaryService().getAttributeLabel(attribute.getKimAttribute().getComponentName(), attribute.getKimAttribute().getAttributeName() );
268 }
269
270
271 private DataDictionaryService getDataDictionaryService() {
272 if(dataDictionaryService == null){
273 dataDictionaryService = KRADServiceLocatorWeb.getDataDictionaryService();
274 }
275 return dataDictionaryService;
276 }
277
278
279 private KimTypeInfoService getTypeInfoService() {
280 if(kimTypeInfoService == null){
281 kimTypeInfoService = KimApiServiceLocator.getKimTypeInfoService();
282 }
283 return kimTypeInfoService;
284 }
285 }