This project has retired. For details please refer to its Attic page.
JcrService xref

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   *
19   */
20  package org.apache.chemistry.opencmis.jcr;
21  
22  import org.apache.chemistry.opencmis.commons.data.Acl;
23  import org.apache.chemistry.opencmis.commons.data.AllowableActions;
24  import org.apache.chemistry.opencmis.commons.data.ContentStream;
25  import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
26  import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
27  import org.apache.chemistry.opencmis.commons.data.ObjectData;
28  import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
29  import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
30  import org.apache.chemistry.opencmis.commons.data.ObjectList;
31  import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
32  import org.apache.chemistry.opencmis.commons.data.Properties;
33  import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
34  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
35  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
36  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
37  import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
38  import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
39  import org.apache.chemistry.opencmis.commons.enums.VersioningState;
40  import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
41  import org.apache.chemistry.opencmis.commons.impl.server.AbstractCmisService;
42  import org.apache.chemistry.opencmis.commons.server.CallContext;
43  import org.apache.chemistry.opencmis.commons.spi.Holder;
44  
45  import javax.jcr.Credentials;
46  import javax.jcr.Session;
47  import javax.jcr.SimpleCredentials;
48  import java.math.BigInteger;
49  import java.util.HashMap;
50  import java.util.List;
51  import java.util.Map;
52  
53  /**
54   * JCR service implementation.
55   */
56  public class JcrService extends AbstractCmisService {
57      private final JcrRepository jcrRepository;
58      private final Map<String, Session> sessions = new HashMap<String, Session>();
59  
60      private CallContext context;
61  
62      public JcrService(JcrRepository jcrRepository) {
63          this.jcrRepository = jcrRepository;
64      }
65  
66      @Override
67      public void close() {
68          for (Session session : sessions.values()) {
69              session.logout();
70          }
71          
72          super.close();
73      }
74  
75      public void setCallContext(CallContext context) {
76          this.context = context;
77      }
78  
79      public CallContext getCallContext() {
80          return context;
81      }
82  
83      //------------------------------------------< repository service >---
84  
85      @Override
86      public RepositoryInfo getRepositoryInfo(String repositoryId, ExtensionsData extension) {
87          return jcrRepository.getRepositoryInfo(login(repositoryId));
88      }
89  
90      @Override
91      public List<RepositoryInfo> getRepositoryInfos(ExtensionsData extension) {
92          return jcrRepository.getRepositoryInfos(login(null));
93      }
94  
95      @Override
96      public TypeDefinitionList getTypeChildren(String repositoryId, String typeId, Boolean includePropertyDefinitions,
97              BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
98          
99          return jcrRepository.getTypeChildren(login(repositoryId), typeId, includePropertyDefinitions, maxItems, skipCount);
100     }
101 
102     @Override
103     public TypeDefinition getTypeDefinition(String repositoryId, String typeId, ExtensionsData extension) {
104         return jcrRepository.getTypeDefinition(login(repositoryId), typeId);
105     }
106 
107     @Override
108     public List<TypeDefinitionContainer> getTypeDescendants(String repositoryId, String typeId, BigInteger depth,
109             Boolean includePropertyDefinitions, ExtensionsData extension) {
110         
111         return jcrRepository.getTypesDescendants(login(repositoryId), typeId, depth, includePropertyDefinitions);
112     }
113 
114     //------------------------------------------< navigation service >---
115 
116     @Override
117     public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy,
118             Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
119             Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
120 
121         return jcrRepository.getChildren(login(repositoryId), folderId, filter, includeAllowableActions,
122                 includePathSegment, maxItems, skipCount, this, context.isObjectInfoRequired());
123     }
124 
125     @Override
126     public List<ObjectInFolderContainer> getDescendants(String repositoryId, String folderId, BigInteger depth,
127             String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
128             String renditionFilter, Boolean includePathSegment, ExtensionsData extension) {
129 
130         return jcrRepository.getDescendants(login(repositoryId), folderId, depth, filter, includeAllowableActions,
131                 includePathSegment, this, context.isObjectInfoRequired(), false);
132     }
133 
134     @Override
135     public ObjectData getFolderParent(String repositoryId, String folderId, String filter, ExtensionsData extension) {
136         return jcrRepository.getFolderParent(login(repositoryId), folderId, filter, this, context.isObjectInfoRequired());
137     }
138 
139     @Override
140     public List<ObjectInFolderContainer> getFolderTree(String repositoryId, String folderId, BigInteger depth,
141             String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
142             String renditionFilter, Boolean includePathSegment, ExtensionsData extension) {
143 
144         return jcrRepository.getDescendants(login(repositoryId), folderId, depth, filter, includeAllowableActions,
145                 includePathSegment, this, context.isObjectInfoRequired(), true);
146     }
147 
148     @Override
149     public List<ObjectParentData> getObjectParents(String repositoryId, String objectId, String filter,
150             Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
151             Boolean includeRelativePathSegment, ExtensionsData extension) {
152 
153         return jcrRepository.getObjectParents(login(repositoryId), objectId, filter, includeAllowableActions,
154                 includeRelativePathSegment, this, context.isObjectInfoRequired());
155     }
156 
157     @Override
158     public ObjectList getCheckedOutDocs(String repositoryId, String folderId, String filter, String orderBy,
159             Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
160             BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
161 
162         return jcrRepository.getCheckedOutDocs(login(repositoryId), folderId, filter, orderBy, includeAllowableActions,
163                 maxItems, skipCount);
164     }
165     
166     //------------------------------------------< object service >---
167 
168     @Override
169     public String createDocument(String repositoryId, Properties properties, String folderId,
170             ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addAces,
171             Acl removeAces, ExtensionsData extension) {
172         
173         return jcrRepository.createDocument(login(repositoryId), properties, folderId, contentStream, versioningState);
174     }
175 
176     @Override
177     public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
178             String folderId, VersioningState versioningState, List<String> policies, Acl addAces, Acl removeAces,
179             ExtensionsData extension) {
180 
181         return jcrRepository.createDocumentFromSource(login(repositoryId), sourceId, properties, folderId, versioningState);
182     }
183 
184     @Override
185     public void setContentStream(String repositoryId, Holder<String> objectId, Boolean overwriteFlag,
186             Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
187 
188         jcrRepository.setContentStream(login(repositoryId), objectId, overwriteFlag, contentStream);
189     }
190 
191     @Override
192     public void deleteContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
193             ExtensionsData extension) {
194         
195         jcrRepository.setContentStream(login(repositoryId), objectId, true, null);
196     }
197 
198     @Override
199     public String createFolder(String repositoryId, Properties properties, String folderId, List<String> policies,
200             Acl addAces, Acl removeAces, ExtensionsData extension) {
201 
202         return jcrRepository.createFolder(login(repositoryId), properties, folderId);
203     }
204 
205     @Override
206     public void deleteObjectOrCancelCheckOut(String repositoryId, String objectId, Boolean allVersions,
207             ExtensionsData extension) {
208         
209         jcrRepository.deleteObject(login(repositoryId), objectId, allVersions);
210     }
211 
212     @Override
213     public FailedToDeleteData deleteTree(String repositoryId, String folderId, Boolean allVersions,
214             UnfileObject unfileObjects, Boolean continueOnFailure, ExtensionsData extension) {
215 
216         return jcrRepository.deleteTree(login(repositoryId), folderId);
217     }
218 
219     @Override
220     public AllowableActions getAllowableActions(String repositoryId, String objectId, ExtensionsData extension) {
221         return jcrRepository.getAllowableActions(login(repositoryId), objectId);
222     }
223 
224     @Override
225     public ContentStream getContentStream(String repositoryId, String objectId, String streamId, BigInteger offset,
226             BigInteger length, ExtensionsData extension) {
227         
228         return jcrRepository.getContentStream(login(repositoryId), objectId, offset, length);
229     }
230 
231     @Override
232     public ObjectData getObject(String repositoryId, String objectId, String filter, Boolean includeAllowableActions,
233             IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
234             Boolean includeAcl, ExtensionsData extension) {
235 
236         return jcrRepository.getObject(login(repositoryId), objectId, filter, includeAllowableActions, this,
237                 context.isObjectInfoRequired());
238     }
239 
240     @Override
241     public ObjectData getObjectByPath(String repositoryId, String path, String filter, Boolean includeAllowableActions,
242             IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
243             Boolean includeAcl, ExtensionsData extension) {
244         
245         return jcrRepository.getObjectByPath(login(repositoryId), path, filter, includeAllowableActions, includeAcl,
246                 this, context.isObjectInfoRequired());
247     }
248 
249     @Override
250     public Properties getProperties(String repositoryId, String objectId, String filter, ExtensionsData extension) {
251         return jcrRepository.getProperties(login(repositoryId), objectId, filter, false, this,
252                 context.isObjectInfoRequired());
253     }
254 
255     @Override
256     public void moveObject(String repositoryId, Holder<String> objectId, String targetFolderId, String sourceFolderId,
257             ExtensionsData extension) {
258 
259         jcrRepository.moveObject(login(repositoryId), objectId, targetFolderId, this, context.isObjectInfoRequired());
260     }
261 
262     @Override
263     public void updateProperties(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
264             Properties properties, ExtensionsData extension) {
265 
266         jcrRepository.updateProperties(login(repositoryId), objectId, properties, this, context.isObjectInfoRequired());
267     }
268 
269     //------------------------------------------< versioning service >---
270 
271     @Override
272     public void checkOut(String repositoryId, Holder<String> objectId, ExtensionsData extension,
273             Holder<Boolean> contentCopied) {
274 
275         jcrRepository.checkOut(login(repositoryId), objectId, contentCopied);
276     }
277 
278     @Override
279     public void cancelCheckOut(String repositoryId, String objectId, ExtensionsData extension) {
280         jcrRepository.cancelCheckout(login(repositoryId), objectId);
281     }
282 
283     @Override
284     public void checkIn(String repositoryId, Holder<String> objectId, Boolean major, Properties properties,
285             ContentStream contentStream, String checkinComment, List<String> policies, Acl addAces, Acl removeAces,
286             ExtensionsData extension) {
287         
288         jcrRepository.checkIn(login(repositoryId), objectId, major, properties, contentStream, checkinComment);
289     }
290 
291     @Override
292     public List<ObjectData> getAllVersions(String repositoryId, String objectId, String versionSeriesId, String filter,
293             Boolean includeAllowableActions, ExtensionsData extension) {
294 
295         return jcrRepository.getAllVersions(login(repositoryId), versionSeriesId == null ? objectId : versionSeriesId, 
296                 filter, includeAllowableActions, this, context.isObjectInfoRequired());
297     }
298 
299     @Override
300     public ObjectData getObjectOfLatestVersion(String repositoryId, String objectId, String versionSeriesId,
301             Boolean major, String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships,
302             String renditionFilter, Boolean includePolicyIds, Boolean includeAcl, ExtensionsData extension) {
303 
304         return jcrRepository.getObject(login(repositoryId), versionSeriesId == null ? objectId : versionSeriesId,
305                 filter, includeAllowableActions, this, context.isObjectInfoRequired());
306     }
307 
308     @Override
309     public Properties getPropertiesOfLatestVersion(String repositoryId, String objectId, String versionSeriesId,
310             Boolean major, String filter, ExtensionsData extension) {
311 
312         ObjectData object = getObjectOfLatestVersion(repositoryId, objectId, versionSeriesId, major, filter, false,
313                 null, null, false, false, extension);
314         
315         return object.getProperties();
316     }
317 
318     // --- discovery service ---
319 
320     @Override
321     public ObjectList query(String repositoryId, String statement, Boolean searchAllVersions,
322             Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
323             BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
324 
325         return jcrRepository.query(login(repositoryId), statement, searchAllVersions, includeAllowableActions,
326                 maxItems, skipCount);
327     }
328     
329     //------------------------------------------< protected >---
330 
331     protected Session login(String workspaceName) {
332         if (context == null) {
333             throw new CmisRuntimeException("No user context!");
334         }
335 
336         Session session = sessions.get(workspaceName);
337         if (session == null) {
338             String userName = context.getUsername();
339             String password = context.getPassword();
340             Credentials credentials = userName == null
341                 ? null
342                 : new SimpleCredentials(userName, password == null ? "".toCharArray() : password.toCharArray());
343 
344             session = jcrRepository.login(credentials, workspaceName);
345             sessions.put(workspaceName, session);
346         }
347         return session;
348     }
349 
350 }