001: /*
002: * Copyright 2004 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.clientimpl.acl;
017:
018: import org.outerj.daisy.repository.commonimpl.acl.AclStrategy;
019: import org.outerj.daisy.repository.commonimpl.acl.AclImpl;
020: import org.outerj.daisy.repository.commonimpl.acl.AclResultInfoImpl;
021: import org.outerj.daisy.repository.commonimpl.AuthenticatedUser;
022: import org.outerj.daisy.repository.commonimpl.DocId;
023: import org.outerj.daisy.repository.Document;
024: import org.outerj.daisy.repository.RepositoryException;
025: import org.outerj.daisy.repository.VariantKey;
026: import org.outerj.daisy.repository.VariantKeys;
027: import org.outerj.daisy.repository.clientimpl.infrastructure.AbstractRemoteStrategy;
028: import org.outerj.daisy.repository.clientimpl.infrastructure.DaisyHttpClient;
029: import org.outerj.daisy.repository.clientimpl.RemoteRepositoryManager;
030: import org.outerj.daisy.repository.acl.*;
031: import org.outerj.daisy.repository.acl.AclPermission;
032: import org.outerj.daisy.util.ListUtil;
033: import org.apache.commons.httpclient.HttpMethod;
034: import org.apache.commons.httpclient.NameValuePair;
035: import org.apache.commons.httpclient.methods.GetMethod;
036: import org.apache.commons.httpclient.methods.PostMethod;
037: import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
038: import org.outerx.daisy.x10.*;
039:
040: import java.util.ArrayList;
041: import java.util.List;
042:
043: public class RemoteAclStrategy extends AbstractRemoteStrategy implements
044: AclStrategy {
045: public RemoteAclStrategy(RemoteRepositoryManager.Context context) {
046: super (context);
047: }
048:
049: public AclImpl loadAcl(long id, AuthenticatedUser user)
050: throws RepositoryException {
051: DaisyHttpClient httpClient = getClient(user);
052:
053: aclIdCheck(id);
054: HttpMethod method = new GetMethod("/repository/acl/"
055: + getAclName(id));
056:
057: AclDocument aclDocument = (AclDocument) httpClient
058: .executeMethod(method, AclDocument.class, true);
059: AclDocument.Acl aclXml = aclDocument.getAcl();
060: AclImpl document = new AclImpl(this , aclXml.getLastModified()
061: .getTime(), aclXml.getLastModifier(), aclXml.getId(),
062: user, aclXml.getUpdateCount());
063: document.setFromXml(aclXml);
064: return document;
065: }
066:
067: private void aclIdCheck(long id) throws RepositoryException {
068: if (id != 1 && id != 2)
069: throw new RepositoryException("Invalid ACL ID: " + id);
070: }
071:
072: private String getAclName(long id) {
073: if (id == 1)
074: return "live";
075: else if (id == 2)
076: return "staging";
077: else
078: throw new RuntimeException("Unsupported ACL ID: " + id);
079: }
080:
081: public void storeAcl(AclImpl acl) throws RepositoryException {
082: AclImpl.IntimateAccess aclInt = acl.getIntimateAccess(this );
083: DaisyHttpClient httpClient = getClient(aclInt
084: .getCurrentModifier());
085: PostMethod method = new PostMethod("/repository/acl/"
086: + getAclName(aclInt.getId()));
087:
088: AclDocument aclDocument = acl.getXml();
089: method.setRequestEntity(new InputStreamRequestEntity(
090: aclDocument.newInputStream()));
091:
092: aclDocument = (AclDocument) httpClient.executeMethod(method,
093: AclDocument.class, true);
094: AclDocument.Acl aclXml = aclDocument.getAcl();
095: aclInt.setLastModified(aclXml.getLastModified().getTime());
096: aclInt.setLastModifier(aclXml.getLastModifier());
097: aclInt.setUpdateCount(aclXml.getUpdateCount());
098: }
099:
100: public void copyStagingToLive(AuthenticatedUser user)
101: throws RepositoryException {
102: DaisyHttpClient httpClient = getClient(user);
103:
104: HttpMethod method = new GetMethod(
105: "/repository/acl/staging?action=putLive");
106: httpClient.executeMethod(method, null, true);
107: }
108:
109: public void copyLiveToStaging(AuthenticatedUser user)
110: throws RepositoryException {
111: DaisyHttpClient httpClient = getClient(user);
112:
113: HttpMethod method = new GetMethod(
114: "/repository/acl/staging?action=revertChanges");
115: httpClient.executeMethod(method, null, true);
116: }
117:
118: public AclResultInfo getAclInfo(AuthenticatedUser user, long id,
119: long userId, long[] roleIds, Document document)
120: throws RepositoryException {
121: throw new RuntimeException(
122: "This operation is not supported in the remote API implementation.");
123: }
124:
125: public AclResultInfo getAclInfo(AuthenticatedUser user, long id,
126: long userId, long[] roleIds, DocId docId, long branchId,
127: long languageId) throws RepositoryException {
128: DaisyHttpClient httpClient = getClient(user);
129:
130: aclIdCheck(id);
131: HttpMethod method = new GetMethod("/repository/acl/"
132: + getAclName(id));
133: List<NameValuePair> parameters = new ArrayList<NameValuePair>();
134: parameters.add(new NameValuePair("action", "evaluate"));
135: parameters
136: .add(new NameValuePair("documentId", docId.toString()));
137: parameters.add(new NameValuePair("branch", String
138: .valueOf(branchId)));
139: parameters.add(new NameValuePair("language", String
140: .valueOf(languageId)));
141: parameters
142: .add(new NameValuePair("user", String.valueOf(userId)));
143: for (long roleId : roleIds)
144: parameters.add(new NameValuePair("role", String
145: .valueOf(roleId)));
146: method.setQueryString(parameters
147: .toArray(new NameValuePair[parameters.size()]));
148:
149: AclResultDocument aclResultDocument = (AclResultDocument) httpClient
150: .executeMethod(method, AclResultDocument.class, true);
151: AclResultDocument.AclResult aclResultXml = aclResultDocument
152: .getAclResult();
153: AclResultInfo aclResultInfo = new AclResultInfoImpl(
154: aclResultXml.getUser().getId(), ListUtil
155: .toArray(aclResultXml.getUser().getRoles()
156: .getRoleIdList()), aclResultXml
157: .getDocumentId(), aclResultXml.getBranchId(),
158: aclResultXml.getLanguageId());
159: aclResultInfo.setFromXml(aclResultXml);
160: return aclResultInfo;
161: }
162:
163: public long[] filterDocumentTypes(AuthenticatedUser user,
164: long[] documentTypeIds, long collectionId)
165: throws RepositoryException {
166: DaisyHttpClient httpClient = getClient(user);
167: PostMethod method = new PostMethod(
168: "/repository/filterDocumentTypes");
169:
170: NameValuePair[] parameters = new NameValuePair[1];
171: parameters[0] = new NameValuePair("collectionId", String
172: .valueOf(collectionId));
173: method.setQueryString(parameters);
174:
175: IdsDocument idsDocument = IdsDocument.Factory.newInstance();
176: idsDocument.addNewIds().setIdArray(documentTypeIds);
177: method.setRequestEntity(new InputStreamRequestEntity(
178: idsDocument.newInputStream()));
179:
180: idsDocument = (IdsDocument) httpClient.executeMethod(method,
181: IdsDocument.class, true);
182: return ListUtil.toArray(idsDocument.getIds().getIdList());
183: }
184:
185: public VariantKey[] filterDocuments(AuthenticatedUser user,
186: VariantKey[] variantKeys, AclPermission permission,
187: boolean nonLive) throws RepositoryException {
188: DaisyHttpClient httpClient = getClient(user);
189: PostMethod method = new PostMethod(
190: "/repository/filterDocuments");
191: method
192: .setQueryString(new NameValuePair[] {
193: new NameValuePair("permission", permission
194: .toString()),
195: new NameValuePair("nonLive", String
196: .valueOf(nonLive)) });
197: method
198: .setRequestEntity(new InputStreamRequestEntity(
199: new VariantKeys(variantKeys).getXml()
200: .newInputStream()));
201: VariantKeysDocument variantKeysDocument = (VariantKeysDocument) httpClient
202: .executeMethod(method, VariantKeysDocument.class, true);
203: return VariantKeys.fromXml(variantKeysDocument).getArray();
204: }
205: }
|