2 * This document is a part of the source code and related artifacts
3 * for CollectionSpace, an open source collections management system
4 * for museums and related institutions:
6 * http://www.collectionspace.org
7 * http://wiki.collectionspace.org
9 * Copyright 2009 University of California at Berkeley
11 * Licensed under the Educational Community License (ECL), Version 2.0.
12 * You may not use this file except in compliance with this License.
14 * You may obtain a copy of the ECL 2.0 License at
16 * https://source.collectionspace.org/collection-space/LICENSE.txt
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissionRoles and
22 * limitations under the License.
24 package org.collectionspace.services.authorization.storage;
26 import java.util.ArrayList;
27 import java.util.List;
29 import javax.persistence.EntityManager;
30 import javax.persistence.EntityManagerFactory;
31 import javax.persistence.NoResultException;
33 import org.collectionspace.services.authorization.PermissionRole;
34 import org.collectionspace.services.authorization.PermissionRoleRel;
35 import org.collectionspace.services.authorization.PermissionValue;
36 import org.collectionspace.services.authorization.PermissionsRolesList;
37 import org.collectionspace.services.authorization.RoleValue;
38 import org.collectionspace.services.authorization.SubjectType;
39 import org.collectionspace.services.authorization.perms.Permission;
40 import org.collectionspace.services.common.authorization_mgt.AuthorizationRoleRel;
41 import org.collectionspace.services.common.authorization_mgt.PermissionRoleUtil;
42 import org.collectionspace.services.common.document.DocumentFilter;
43 import org.collectionspace.services.common.document.DocumentWrapper;
44 import org.collectionspace.services.common.storage.jpa.JpaDocumentFilter;
45 import org.collectionspace.services.common.storage.jpa.JpaDocumentHandler;
46 import org.collectionspace.services.common.storage.jpa.JpaStorageUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
50 // TODO: Auto-generated Javadoc
52 * Document handler for PermissionRole association.
56 public class PermissionRoleDocumentHandler
57 extends JpaDocumentHandler<PermissionRole, PermissionsRolesList, List<PermissionRoleRel>, List<PermissionRoleRel>> {
60 private final Logger logger = LoggerFactory.getLogger(PermissionRoleDocumentHandler.class);
62 /** The permission role. */
63 private PermissionRole permissionRole;
65 /** The permission roles list. */
66 private PermissionsRolesList permissionRolesList;
69 /** The permission role csid. */
70 private String permissionRoleCsid = null;
73 * Sets the permission role csid.
75 * @param thePermissionRoleCsid the new permission role csid
77 public void setPermissionRoleCsid(String thePermissionRoleCsid) {
78 this.permissionRoleCsid = thePermissionRoleCsid;
82 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#handleCreate(org.collectionspace.services.common.document.DocumentWrapper)
85 public void handleCreate(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
86 fillCommonPart(getCommonPart(), wrapDoc);
87 filterOutExisting(wrapDoc);
90 private boolean permRoleRelExists(EntityManager em, PermissionRoleRel permRoleRel) {
91 boolean result = false;
93 PermissionRoleRel queryResult = null;
95 queryResult = (PermissionRoleRel) JpaStorageUtils.getEntityByDualKeys(em,
96 PermissionRoleRel.class.getName(),
97 PermissionStorageConstants.PERMREL_ROLE_ID, permRoleRel.getRoleId(),
98 PermissionStorageConstants.PERMREL_PERM_ID, permRoleRel.getPermissionId());
99 } catch (NoResultException e) {
100 // Ignore exception. Just means the permission hasn't been stored/persisted yet.
103 if (queryResult != null) {
111 * Find the existing (already persisted)
115 private void filterOutExisting(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
116 List<PermissionRoleRel> permRoleRelList = wrapDoc.getWrappedObject();
118 EntityManagerFactory emf = null;
119 EntityManager em = null;
121 emf = JpaStorageUtils.getEntityManagerFactory(JpaStorageUtils.CS_PERSISTENCE_UNIT);
122 em = emf.createEntityManager();
123 em.getTransaction().begin();
125 for (PermissionRoleRel permRoleRel : permRoleRelList) {
126 if (permRoleRelExists(em, permRoleRel) == true) {
128 // Remove the item from the list since it already exists
130 permRoleRelList.remove(permRoleRel);
134 em.getTransaction().commit();
136 } catch (Exception e) {
137 if (em != null && em.getTransaction().isActive()) {
138 em.getTransaction().rollback();
140 if (logger.isDebugEnabled()) {
141 logger.debug("Caught exception ", e);
146 JpaStorageUtils.releaseEntityManagerFactory(emf);
153 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#completeCreate(org.collectionspace.services.common.document.DocumentWrapper)
156 public void completeCreate(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
157 PermissionRole pr = getCommonPart();
158 AuthorizationDelegate.addPermissions(getServiceContext(), pr);
162 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#handleUpdate(org.collectionspace.services.common.document.DocumentWrapper)
165 public void handleUpdate(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
166 throw new UnsupportedOperationException("operation not relevant for PermissionRoleDocumentHandler");
170 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#completeUpdate(org.collectionspace.services.common.document.DocumentWrapper)
173 public void completeUpdate(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
174 throw new UnsupportedOperationException("operation not relevant for PermissionRoleDocumentHandler");
178 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#handleGet(org.collectionspace.services.common.document.DocumentWrapper)
181 public void handleGet(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
182 setCommonPart(extractCommonPart(wrapDoc));
183 getServiceContext().setOutput(permissionRole);
187 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#handleGetAll(org.collectionspace.services.common.document.DocumentWrapper)
190 public void handleGetAll(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
191 throw new UnsupportedOperationException("operation not relevant for PermissionRoleDocumentHandler");
195 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#handleDelete(org.collectionspace.services.common.document.DocumentWrapper)
198 public boolean handleDelete(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
199 fillCommonPart(getCommonPart(), wrapDoc, true);
204 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#completeDelete(org.collectionspace.services.common.document.DocumentWrapper)
207 public void completeDelete(DocumentWrapper<List<PermissionRoleRel>> wrapDoc) throws Exception {
208 PermissionRole pr = getCommonPart();
209 AuthorizationDelegate.deletePermissions(getServiceContext(), pr);
213 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#extractCommonPart(org.collectionspace.services.common.document.DocumentWrapper)
216 public PermissionRole extractCommonPart(
217 DocumentWrapper<List<PermissionRoleRel>> wrapDoc)
219 List<PermissionRoleRel> prrl = wrapDoc.getWrappedObject();
220 PermissionRole pr = new PermissionRole();
221 SubjectType subject = PermissionRoleUtil.getRelationSubject(getServiceContext());
222 if (prrl.size() == 0) {
225 PermissionRoleRel prr0 = prrl.get(0);
226 if (SubjectType.ROLE.equals(subject)) {
228 List<PermissionValue> pvs = new ArrayList<PermissionValue>();
229 pr.setPermission(pvs);
230 PermissionValue pv = AuthorizationRoleRel.buildPermissionValue(prr0);
234 List<RoleValue> rvs = new ArrayList<RoleValue>();
236 for (PermissionRoleRel prr : prrl) {
237 RoleValue rv = AuthorizationRoleRel.buildRoleValue(prr);
240 } else if (SubjectType.PERMISSION.equals(subject)) {
242 List<RoleValue> rvs = new ArrayList<RoleValue>();
244 RoleValue rv = AuthorizationRoleRel.buildRoleValue(prr0);
248 List<PermissionValue> pvs = new ArrayList<PermissionValue>();
249 pr.setPermission(pvs);
250 for (PermissionRoleRel prr : prrl) {
251 PermissionValue pv = AuthorizationRoleRel.buildPermissionValue(prr);
262 * @param wrapDoc the wrap doc
263 * @param handleDelete the handle delete
264 * @throws Exception the exception
266 public void fillCommonPart(PermissionRole pr,
267 DocumentWrapper<List<PermissionRoleRel>> wrapDoc,
268 boolean handleDelete)
270 List<PermissionRoleRel> prrl = wrapDoc.getWrappedObject();
271 SubjectType subject = pr.getSubject();
272 if (subject == null) {
273 //it is not required to give subject as URI determines the subject
274 subject = PermissionRoleUtil.getRelationSubject(getServiceContext());
276 //subject mismatch should have been checked during validation
279 String tenantId = this.getServiceContext().getTenantId();
280 PermissionRoleUtil.buildPermissionRoleRel(pr, subject, prrl, handleDelete, tenantId);
284 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#fillCommonPart(java.lang.Object, org.collectionspace.services.common.document.DocumentWrapper)
287 public void fillCommonPart(PermissionRole ar,
288 DocumentWrapper<List<PermissionRoleRel>> wrapDoc)
290 fillCommonPart(ar, wrapDoc, false);
294 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#extractCommonPartList(org.collectionspace.services.common.document.DocumentWrapper)
297 public PermissionsRolesList extractCommonPartList(
298 DocumentWrapper<List<PermissionRoleRel>> wrapDoc)
301 throw new UnsupportedOperationException("operation not relevant for PermissionRoleDocumentHandler");
305 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#getCommonPart()
308 public PermissionRole getCommonPart() {
309 return permissionRole;
313 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#setCommonPart(java.lang.Object)
316 public void setCommonPart(PermissionRole permissionRole) {
317 this.permissionRole = permissionRole;
321 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#getCommonPartList()
324 public PermissionsRolesList getCommonPartList() {
325 return permissionRolesList;
329 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#setCommonPartList(java.lang.Object)
332 public void setCommonPartList(PermissionsRolesList permissionRolesList) {
333 this.permissionRolesList = permissionRolesList;
337 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#getQProperty(java.lang.String)
340 public String getQProperty(
346 * @see org.collectionspace.services.common.document.AbstractDocumentHandlerImpl#createDocumentFilter()
349 public DocumentFilter createDocumentFilter() {
350 return new JpaDocumentFilter(this.getServiceContext());