]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
0252948731e27e22c993ef8414d99f40360ecabc
[tmp/jakarta-migration.git] /
1 /**
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:
5
6  *  http://www.collectionspace.org
7  *  http://wiki.collectionspace.org
8
9  *  Copyright 2009 University of California at Berkeley
10
11  *  Licensed under the Educational Community License (ECL), Version 2.0.
12  *  You may not use this file except in compliance with this License.
13
14  *  You may obtain a copy of the ECL 2.0 License at
15
16  *  https://source.collectionspace.org/collection-space/LICENSE.txt
17
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 permissions and
22  *  limitations under the License.
23  */
24 package org.collectionspace.services.authorization.storage;
25
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.UUID;
29
30 import org.collectionspace.services.authorization.Permission;
31 import org.collectionspace.services.authorization.PermissionAction;
32 import org.collectionspace.services.authorization.PermissionsList;
33
34 import org.collectionspace.services.common.document.AbstractDocumentHandlerImpl;
35 import org.collectionspace.services.common.document.BadRequestException;
36 import org.collectionspace.services.common.document.DocumentFilter;
37 import org.collectionspace.services.common.document.DocumentWrapper;
38 import org.collectionspace.services.common.document.JaxbUtils;
39 import org.collectionspace.services.common.security.SecurityUtils;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 /**
44  * Document handler for Permission
45  * @author 
46  */
47 public class PermissionDocumentHandler
48         extends AbstractDocumentHandlerImpl<Permission, PermissionsList, Permission, List> {
49
50     private final Logger logger = LoggerFactory.getLogger(PermissionDocumentHandler.class);
51     private Permission permission;
52     private PermissionsList permissionsList;
53
54     @Override
55     public void handleCreate(DocumentWrapper<Permission> wrapDoc) throws Exception {
56         String id = UUID.randomUUID().toString();
57         Permission permission = wrapDoc.getWrappedObject();
58         permission.setCsid(id);
59         setTenant(permission);
60     }
61
62     @Override
63     public void completeCreate(DocumentWrapper<Permission> wrapDoc) throws Exception {
64     }
65
66     @Override
67     public void handleUpdate(DocumentWrapper<Permission> wrapDoc) throws Exception {
68         Permission permissionFound = wrapDoc.getWrappedObject();
69         Permission permissionReceived = getCommonPart();
70         merge(permissionReceived, permissionFound);
71     }
72
73     /**
74      * merge manually merges the from from to the to permission
75      * -this method is created due to inefficiency of JPA EM merge
76      * @param from
77      * @param to
78      * @return merged permission
79      */
80     private Permission merge(Permission from, Permission to) throws Exception {
81         if (!(from.getResourceName().equalsIgnoreCase(to.getResourceName()))) {
82             String msg = "Resource name cannot be changed " + to.getResourceName();
83             logger.error(msg);
84             throw new BadRequestException(msg);
85         }
86         //resource name, attribute  cannot be changed
87
88         if (from.getDescription() != null) {
89             to.setDescription(from.getDescription());
90         }
91         if (from.getEffect() != null) {
92             to.setEffect(from.getEffect());
93         }
94         List<PermissionAction> fromActions = from.getActions();
95         if (!fromActions.isEmpty()) {
96             //override the whole list, no reconcilliation by design
97             to.setActions(fromActions);
98         }
99
100         if (logger.isDebugEnabled()) {
101             logger.debug("merged permission=" + JaxbUtils.toString(to, Permission.class));
102         }
103
104         return to;
105     }
106
107     @Override
108     public void completeUpdate(DocumentWrapper<Permission> wrapDoc) throws Exception {
109         Permission upAcc = wrapDoc.getWrappedObject();
110         getServiceContext().setOutput(permission);
111         sanitize(upAcc);
112         //FIXME update lower-layer authorization (acls)
113         //will require deleting old permissions for this resource and adding
114         //new based on new actions and effect
115     }
116
117     @Override
118     public void handleGet(DocumentWrapper<Permission> wrapDoc) throws Exception {
119         setCommonPart(extractCommonPart(wrapDoc));
120         sanitize(getCommonPart());
121         getServiceContext().setOutput(permission);
122     }
123
124     @Override
125     public void handleGetAll(DocumentWrapper<List> wrapDoc) throws Exception {
126         PermissionsList permissionsList = extractCommonPartList(wrapDoc);
127         setCommonPartList(permissionsList);
128         getServiceContext().setOutput(getCommonPartList());
129     }
130
131     @Override
132     public void completeDelete(DocumentWrapper<Permission> wrapDoc) throws Exception {
133     }
134
135     @Override
136     public Permission extractCommonPart(
137             DocumentWrapper<Permission> wrapDoc)
138             throws Exception {
139         return wrapDoc.getWrappedObject();
140     }
141
142     @Override
143     public void fillCommonPart(Permission obj, DocumentWrapper<Permission> wrapDoc)
144             throws Exception {
145         throw new UnsupportedOperationException("operation not relevant for AccountDocumentHandler");
146     }
147
148     @Override
149     public PermissionsList extractCommonPartList(
150             DocumentWrapper<List> wrapDoc)
151             throws Exception {
152
153         PermissionsList permissionsList = new PermissionsList();
154         List<Permission> list = new ArrayList<Permission>();
155         permissionsList.setPermissions(list);
156         for (Object obj : wrapDoc.getWrappedObject()) {
157             Permission permission = (Permission) obj;
158             sanitize(permission);
159             list.add(permission);
160         }
161         return permissionsList;
162     }
163
164     @Override
165     public Permission getCommonPart() {
166         return permission;
167     }
168
169     @Override
170     public void setCommonPart(Permission permission) {
171         this.permission = permission;
172     }
173
174     @Override
175     public PermissionsList getCommonPartList() {
176         return permissionsList;
177     }
178
179     @Override
180     public void setCommonPartList(PermissionsList permissionsList) {
181         this.permissionsList = permissionsList;
182     }
183
184     @Override
185     public String getQProperty(
186             String prop) {
187         return null;
188     }
189
190     @Override
191     public DocumentFilter createDocumentFilter() {
192         DocumentFilter filter = new PermissionJpaFilter(this.getServiceContext());
193         return filter;
194     }
195
196     /**
197      * sanitize removes data not needed to be sent to the consumer
198      * @param permission
199      */
200     private void sanitize(Permission permission) {
201         if (!SecurityUtils.isCSpaceAdmin()) {
202             permission.setTenantId(null);
203         }
204     }
205
206     private void setTenant(Permission permission) {
207         //set tenant only if not available from input
208         if (permission.getTenantId() == null || permission.getTenantId().isEmpty()) {
209             permission.setTenantId(getServiceContext().getTenantId());
210         }
211     }
212 }