001: /*
002: * Copyright 2008 Outerthought bvba and Schaubroeck nv
003: *
004: * Licensed under the Apache 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.apache.org/licenses/LICENSE-2.0
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.outerj.daisy.repository.commonimpl.acl;
017:
018: import org.outerj.daisy.repository.acl.AclPermission;
019: import org.outerj.daisy.repository.acl.AclActionType;
020: import static org.outerj.daisy.repository.acl.AclActionType.*;
021: import org.outerj.daisy.repository.acl.AccessDetails;
022: import static org.outerj.daisy.repository.acl.AclDetailPermission.*;
023: import org.outerj.daisy.repository.acl.AclResultInfo;
024: import org.outerx.daisy.x10.AclResultDocument;
025: import org.outerx.daisy.x10.AclAction;
026: import org.outerx.daisy.x10.PermissionsDocument;
027:
028: import java.util.EnumMap;
029: import java.util.Map;
030:
031: public class AclResultInfoImpl implements AclResultInfo {
032: private EnumMap<AclPermission, Info> infos = new EnumMap<AclPermission, Info>(
033: AclPermission.class);
034: private long userId;
035: private long[] roleIds;
036: private String documentId;
037: private long branchId;
038: private long languageId;
039:
040: public AclResultInfoImpl(long userId, long[] roleIds,
041: String documentId, long branchId, long languageId) {
042: for (AclPermission permission : AclPermission.values()) {
043: infos.put(permission, new Info());
044: }
045: this .userId = userId;
046: this .roleIds = roleIds;
047: this .documentId = documentId;
048: this .branchId = branchId;
049: this .languageId = languageId;
050: }
051:
052: private AclResultInfoImpl() {
053: // used by clone method
054: }
055:
056: public void set(AclPermission permission, AclActionType action,
057: String objectExpr, String subjectReason) {
058: Info info = infos.get(permission);
059: info.action = action;
060: info.objectExpr = objectExpr;
061: info.details = null;
062: info.subjectReason = subjectReason;
063: }
064:
065: public void set(AclPermission permission, AclActionType action,
066: AccessDetails details, String objectExpr,
067: String subjectReason) {
068: Info info = infos.get(permission);
069: info.action = action;
070: info.objectExpr = objectExpr;
071: info.details = details;
072: info.subjectReason = subjectReason;
073: }
074:
075: public AclActionType getActionType(AclPermission permission) {
076: return infos.get(permission).action;
077: }
078:
079: public AccessDetails getAccessDetails(AclPermission permission) {
080: return infos.get(permission).details;
081: }
082:
083: public boolean isAllowed(AclPermission permission) {
084: return infos.get(permission).action == GRANT;
085: }
086:
087: public boolean isFullyAllowed(AclPermission permission) {
088: Info info = infos.get(permission);
089: return (info.details == null || info.details.isFullAccess())
090: && info.action == GRANT;
091: }
092:
093: public boolean isNonLiveAllowed(AclPermission permission) {
094: Info info = infos.get(permission);
095: return (info.details == null || info.details
096: .isGranted(NON_LIVE))
097: && info.action == GRANT;
098: }
099:
100: public String getObjectExpr(AclPermission permission) {
101: return infos.get(permission).objectExpr;
102: }
103:
104: public String getSubjectReason(AclPermission permission) {
105: return infos.get(permission).subjectReason;
106: }
107:
108: public long getUserId() {
109: return userId;
110: }
111:
112: public long[] getRoleIds() {
113: return roleIds;
114: }
115:
116: public String getDocumentId() {
117: return documentId;
118: }
119:
120: public long getBranchId() {
121: return branchId;
122: }
123:
124: public long getLanguageId() {
125: return languageId;
126: }
127:
128: private class Info {
129: public AclActionType action;
130: public AccessDetails details;
131: public String objectExpr;
132: public String subjectReason;
133:
134: public Object clone() throws CloneNotSupportedException {
135: Info clone = new Info();
136: clone.action = action;
137: clone.details = details; // assumes details are not mutable
138: clone.objectExpr = objectExpr;
139: clone.subjectReason = subjectReason;
140: return clone;
141: }
142: }
143:
144: public void dump() {
145: for (AclPermission permission : AclPermission.values()) {
146: System.out.println("Permission: " + permission);
147: System.out.println("Action: "
148: + infos.get(permission).action);
149: System.out.println("Matching object expression: "
150: + infos.get(permission).objectExpr);
151: System.out.println("Matching subject: "
152: + infos.get(permission).subjectReason);
153: System.out
154: .println("---------------------------------------------------------------------");
155: }
156: }
157:
158: public AclResultDocument getXml() {
159: AclResultDocument aclResultDocument = AclResultDocument.Factory
160: .newInstance();
161: AclResultDocument.AclResult aclResultXml = aclResultDocument
162: .addNewAclResult();
163:
164: AclResultDocument.AclResult.User userXml = aclResultXml
165: .addNewUser();
166: userXml.setId(userId);
167: userXml.addNewRoles().setRoleIdArray(roleIds);
168: aclResultXml.setDocumentId(documentId);
169: aclResultXml.setBranchId(branchId);
170: aclResultXml.setLanguageId(languageId);
171:
172: PermissionsDocument.Permissions permissionsXml = aclResultXml
173: .addNewPermissions();
174: for (AclPermission permission : AclPermission.values()) {
175: if (infos.get(permission).action != null) {
176: Info info = infos.get(permission);
177: PermissionsDocument.Permissions.Permission permissionXml = permissionsXml
178: .addNewPermission();
179: permissionXml
180: .setType(org.outerx.daisy.x10.AclPermission.Enum
181: .forString(permission.toString()));
182: permissionXml.setAction(AclAction.Enum
183: .forString(info.action.toString()));
184: permissionXml.setObjectReason(info.objectExpr);
185: permissionXml.setSubjectReason(info.subjectReason);
186: if (info.details != null) {
187: permissionXml.setAccessDetails(info.details
188: .getXml().getAccessDetails());
189: }
190: }
191: }
192:
193: return aclResultDocument;
194: }
195:
196: public void setFromXml(AclResultDocument.AclResult aclResultXml) {
197: // first reset everything
198: for (AclPermission permission : AclPermission.values()) {
199: Info info = infos.get(permission);
200: info.objectExpr = null;
201: info.subjectReason = null;
202: info.action = null;
203: }
204:
205: for (PermissionsDocument.Permissions.Permission permissionXml : aclResultXml
206: .getPermissions().getPermissionList()) {
207: AclPermission permission = AclPermission
208: .fromString(permissionXml.getType().toString());
209: Info info = infos.get(permission);
210: info.action = AclActionType.fromString(permissionXml
211: .getAction().toString());
212: info.objectExpr = permissionXml.getObjectReason();
213: info.subjectReason = permissionXml.getSubjectReason();
214:
215: if (permissionXml.isSetAccessDetails()) {
216: AccessDetails details = new AccessDetailsImpl(null);
217: details.setFromXml(permissionXml.getAccessDetails());
218: info.details = details;
219: }
220: }
221: }
222:
223: public AclResultInfo clone() throws CloneNotSupportedException {
224: AclResultInfoImpl clone = new AclResultInfoImpl();
225: clone.userId = userId;
226: clone.roleIds = roleIds.clone();
227: clone.documentId = documentId;
228: clone.branchId = branchId;
229: clone.languageId = languageId;
230:
231: for (AclPermission permission : AclPermission.values()) {
232: clone.infos.put(permission, (Info) infos.get(permission)
233: .clone());
234: }
235:
236: return clone;
237: }
238:
239: public String getCompactString() {
240: StringBuilder result = new StringBuilder();
241:
242: for (Map.Entry<AclPermission, Info> info : infos.entrySet()) {
243: if (info.getValue().action == GRANT) {
244: if (result.length() > 0)
245: result.append(",");
246: switch (info.getKey()) {
247: case READ:
248: result.append("read");
249: AccessDetails details = info.getValue().details;
250: if (details != null && !details.isFullAccess()) {
251: if (details.liveOnly())
252: result.append(",liveOnly");
253: if (!details.isFullLiveAccess())
254: result.append(",restrictedRead"); // means: restrictions besides live-only
255: } else {
256: result.append(",fullRead");
257: }
258: break;
259: case WRITE:
260: result.append("write");
261: break;
262: case DELETE:
263: result.append("delete");
264: break;
265: case PUBLISH:
266: result.append("publish");
267: break;
268: }
269: }
270: }
271:
272: return result.toString();
273: }
274: }
|