]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
fd80d8cd67658209b39ae9e760a6255305e363d7
[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.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 /**
43  * Document handler for Permission
44  * @author 
45  */
46 public class PermissionDocumentHandler
47         extends AbstractDocumentHandlerImpl<Permission, PermissionsList, Permission, List> {
48
49     private final Logger logger = LoggerFactory.getLogger(PermissionDocumentHandler.class);
50     private Permission permission;
51     private PermissionsList permissionsList;
52
53     @Override
54     public void handleCreate(DocumentWrapper<Permission> wrapDoc) throws Exception {
55         String id = UUID.randomUUID().toString();
56         Permission permission = wrapDoc.getWrappedObject();
57         permission.setCsid(id);
58         //FIXME: if admin updating the permission is a CS admin rather than
59         //the tenant admin, tenant id should be retrieved from the request
60         permission.setTenantId(getServiceContext().getTenantId());
61     }
62
63     @Override
64     public void completeCreate(DocumentWrapper<Permission> wrapDoc) throws Exception {
65     }
66
67     @Override
68     public void handleUpdate(DocumentWrapper<Permission> wrapDoc) throws Exception {
69         Permission permissionFound = wrapDoc.getWrappedObject();
70         Permission permissionReceived = getCommonPart();
71         merge(permissionReceived, permissionFound);
72     }
73
74     /**
75      * merge manually merges the from from to the to permission
76      * -this method is created due to inefficiency of JPA EM merge
77      * @param from
78      * @param to
79      * @return merged permission
80      */
81     private Permission merge(Permission from, Permission to) throws Exception {
82         if (!(from.getResourceName().equalsIgnoreCase(to.getResourceName()))) {
83             String msg = "Resource name cannot be changed " + to.getResourceName();
84             logger.error(msg);
85             throw new BadRequestException(msg);
86         }
87         //resource name, attribute  cannot be changed
88
89         if (from.getDescription() != null) {
90             to.setDescription(from.getDescription());
91         }
92         if (from.getEffect() != null) {
93             to.setEffect(from.getEffect());
94         }
95         List<PermissionAction> fromActions = from.getActions();
96         if (!fromActions.isEmpty()) {
97             //override the whole list, no reconcilliation by design
98             to.setActions(fromActions);
99         }
100
101         if (logger.isDebugEnabled()) {
102             logger.debug("merged permission=" + JaxbUtils.toString(to, Permission.class));
103         }
104
105         return to;
106     }
107
108     @Override
109     public void completeUpdate(DocumentWrapper<Permission> wrapDoc) throws Exception {
110         Permission upAcc = wrapDoc.getWrappedObject();
111         getServiceContext().setOutput(permission);
112         sanitize(upAcc);
113         //FIXME update lower-layer authorization (acls)
114         //will require deleting old permissions for this resource and adding
115         //new based on new actions and effect
116     }
117
118     @Override
119     public void handleGet(DocumentWrapper<Permission> wrapDoc) throws Exception {
120         setCommonPart(extractCommonPart(wrapDoc));
121         sanitize(getCommonPart());
122         getServiceContext().setOutput(permission);
123     }
124
125     @Override
126     public void handleGetAll(DocumentWrapper<List> wrapDoc) throws Exception {
127         PermissionsList permissionsList = extractCommonPartList(wrapDoc);
128         setCommonPartList(permissionsList);
129         getServiceContext().setOutput(getCommonPartList());
130     }
131
132     @Override
133     public void completeDelete(DocumentWrapper<Permission> wrapDoc) throws Exception {
134     }
135
136     @Override
137     public Permission extractCommonPart(
138             DocumentWrapper<Permission> wrapDoc)
139             throws Exception {
140         return wrapDoc.getWrappedObject();
141     }
142
143     @Override
144     public void fillCommonPart(Permission obj, DocumentWrapper<Permission> wrapDoc)
145             throws Exception {
146         throw new UnsupportedOperationException("operation not relevant for AccountDocumentHandler");
147     }
148
149     @Override
150     public PermissionsList extractCommonPartList(
151             DocumentWrapper<List> wrapDoc)
152             throws Exception {
153
154         PermissionsList permissionsList = new PermissionsList();
155         List<Permission> list = new ArrayList<Permission>();
156         permissionsList.setPermissions(list);
157         for (Object obj : wrapDoc.getWrappedObject()) {
158             Permission permission = (Permission) obj;
159             sanitize(permission);
160             list.add(permission);
161         }
162         return permissionsList;
163     }
164
165     @Override
166     public Permission getCommonPart() {
167         return permission;
168     }
169
170     @Override
171     public void setCommonPart(Permission permission) {
172         this.permission = permission;
173     }
174
175     @Override
176     public PermissionsList getCommonPartList() {
177         return permissionsList;
178     }
179
180     @Override
181     public void setCommonPartList(PermissionsList permissionsList) {
182         this.permissionsList = permissionsList;
183     }
184
185     @Override
186     public String getQProperty(
187             String prop) {
188         return null;
189     }
190
191     @Override
192     public DocumentFilter createDocumentFilter() {
193         DocumentFilter filter = new PermissionJpaFilter(this.getServiceContext());
194         return filter;
195     }
196
197     /**
198      * sanitize removes data not needed to be sent to the consumer
199      * @param permission
200      */
201     private void sanitize(Permission permission) {
202         permission.setTenantId(null);
203     }
204 }