View Javadoc

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  package org.apache.chemistry.opencmis.client.bindings.spi.webservices;
20  
21  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convert;
22  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convertExtensionHolder;
23  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convertHolder;
24  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.setExtensionValues;
25  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.setHolderValue;
26  
27  import java.math.BigInteger;
28  import java.util.ArrayList;
29  import java.util.List;
30  
31  import org.apache.chemistry.opencmis.client.bindings.spi.BindingSession;
32  import org.apache.chemistry.opencmis.commons.SessionParameter;
33  import org.apache.chemistry.opencmis.commons.data.Acl;
34  import org.apache.chemistry.opencmis.commons.data.AllowableActions;
35  import org.apache.chemistry.opencmis.commons.data.BulkUpdateObjectIdAndChangeToken;
36  import org.apache.chemistry.opencmis.commons.data.ContentStream;
37  import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
38  import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
39  import org.apache.chemistry.opencmis.commons.data.ObjectData;
40  import org.apache.chemistry.opencmis.commons.data.Properties;
41  import org.apache.chemistry.opencmis.commons.data.RenditionData;
42  import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
43  import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
44  import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
45  import org.apache.chemistry.opencmis.commons.enums.VersioningState;
46  import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
47  import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
48  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisException;
49  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisExtensionType;
50  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisObjectIdAndChangeTokenType;
51  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisRenditionType;
52  import org.apache.chemistry.opencmis.commons.impl.jaxb.EnumIncludeRelationships;
53  import org.apache.chemistry.opencmis.commons.impl.jaxb.EnumUnfileObject;
54  import org.apache.chemistry.opencmis.commons.impl.jaxb.EnumVersioningState;
55  import org.apache.chemistry.opencmis.commons.impl.jaxb.ObjectServicePort;
56  import org.apache.chemistry.opencmis.commons.spi.Holder;
57  import org.apache.chemistry.opencmis.commons.spi.ObjectService;
58  
59  /**
60   * Object Service Web Services client.
61   */
62  public class ObjectServiceImpl extends AbstractWebServicesService implements ObjectService {
63  
64      private final AbstractPortProvider portProvider;
65  
66      /**
67       * Constructor.
68       */
69      public ObjectServiceImpl(BindingSession session, AbstractPortProvider portProvider) {
70          setSession(session);
71          this.portProvider = portProvider;
72      }
73  
74      @Override
75      public String createDocument(String repositoryId, Properties properties, String folderId,
76              ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addACEs,
77              Acl removeACEs, ExtensionsData extension) {
78          ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "createDocument");
79  
80          try {
81              javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
82              javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
83  
84              port.createDocument(repositoryId, convert(properties), folderId, convert(contentStream, false),
85                      convert(EnumVersioningState.class, versioningState), policies, convert(addACEs),
86                      convert(removeACEs), portExtension, objectId);
87  
88              setExtensionValues(portExtension, extension);
89  
90              return objectId.value;
91          } catch (CmisException e) {
92              throw convertException(e);
93          } catch (Exception e) {
94              throw new CmisRuntimeException("Error: " + e.getMessage(), e);
95          } finally {
96              portProvider.endCall(port);
97          }
98      }
99  
100     @Override
101     public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
102             String folderId, VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs,
103             ExtensionsData extension) {
104         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId),
105                 "createDocumentFromSource");
106 
107         try {
108             javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
109             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
110 
111             port.createDocumentFromSource(repositoryId, sourceId, convert(properties), folderId,
112                     convert(EnumVersioningState.class, versioningState), policies, convert(addACEs),
113                     convert(removeACEs), portExtension, objectId);
114 
115             setExtensionValues(portExtension, extension);
116 
117             return objectId.value;
118         } catch (CmisException e) {
119             throw convertException(e);
120         } catch (Exception e) {
121             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
122         } finally {
123             portProvider.endCall(port);
124         }
125     }
126 
127     @Override
128     public String createFolder(String repositoryId, Properties properties, String folderId, List<String> policies,
129             Acl addACEs, Acl removeACEs, ExtensionsData extension) {
130         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "createFolder");
131 
132         try {
133             javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
134             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
135 
136             port.createFolder(repositoryId, convert(properties), folderId, policies, convert(addACEs),
137                     convert(removeACEs), portExtension, objectId);
138 
139             setExtensionValues(portExtension, extension);
140 
141             return objectId.value;
142         } catch (CmisException e) {
143             throw convertException(e);
144         } catch (Exception e) {
145             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
146         } finally {
147             portProvider.endCall(port);
148         }
149     }
150 
151     @Override
152     public String createPolicy(String repositoryId, Properties properties, String folderId, List<String> policies,
153             Acl addACEs, Acl removeACEs, ExtensionsData extension) {
154         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "createPolicy");
155 
156         try {
157             javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
158             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
159 
160             port.createPolicy(repositoryId, convert(properties), folderId, policies, convert(addACEs),
161                     convert(removeACEs), portExtension, objectId);
162 
163             setExtensionValues(portExtension, extension);
164 
165             return objectId.value;
166         } catch (CmisException e) {
167             throw convertException(e);
168         } catch (Exception e) {
169             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
170         } finally {
171             portProvider.endCall(port);
172         }
173     }
174 
175     @Override
176     public String createItem(String repositoryId, Properties properties, String folderId, List<String> policies,
177             Acl addACEs, Acl removeACEs, ExtensionsData extension) {
178         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
179             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
180         }
181 
182         ObjectServicePort port = portProvider.getObjectServicePort(CmisVersion.CMIS_1_1, "");
183 
184         try {
185             javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
186             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
187 
188             port.createItem(repositoryId, convert(properties), folderId, convert(addACEs), convert(removeACEs),
189                     portExtension, objectId);
190 
191             setExtensionValues(portExtension, extension);
192 
193             return objectId.value;
194         } catch (CmisException e) {
195             throw convertException(e);
196         } catch (Exception e) {
197             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
198         } finally {
199             portProvider.endCall(port);
200         }
201     }
202 
203     @Override
204     public String createRelationship(String repositoryId, Properties properties, List<String> policies, Acl addACEs,
205             Acl removeACEs, ExtensionsData extension) {
206         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "createRelationship");
207 
208         try {
209             javax.xml.ws.Holder<String> objectId = new javax.xml.ws.Holder<String>();
210             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
211 
212             port.createRelationship(repositoryId, convert(properties), policies, convert(addACEs), convert(removeACEs),
213                     portExtension, objectId);
214 
215             setExtensionValues(portExtension, extension);
216 
217             return objectId.value;
218         } catch (CmisException e) {
219             throw convertException(e);
220         } catch (Exception e) {
221             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
222         } finally {
223             portProvider.endCall(port);
224         }
225     }
226 
227     @Override
228     public void updateProperties(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
229             Properties properties, ExtensionsData extension) {
230         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "updateProperties");
231 
232         try {
233             javax.xml.ws.Holder<String> portObjectId = convertHolder(objectId);
234             javax.xml.ws.Holder<String> portChangeToken = getSession().get(SessionParameter.OMIT_CHANGE_TOKENS, false) ? null
235                     : convertHolder(changeToken);
236             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
237 
238             port.updateProperties(repositoryId, portObjectId, portChangeToken, convert(properties), portExtension);
239 
240             setHolderValue(portObjectId, objectId);
241             setHolderValue(portChangeToken, changeToken);
242             setExtensionValues(portExtension, extension);
243         } catch (CmisException e) {
244             throw convertException(e);
245         } catch (Exception e) {
246             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
247         } finally {
248             portProvider.endCall(port);
249         }
250     }
251 
252     @Override
253     public List<BulkUpdateObjectIdAndChangeToken> bulkUpdateProperties(String repositoryId,
254             List<BulkUpdateObjectIdAndChangeToken> objectIdAndChangeToken, Properties properties,
255             List<String> addSecondaryTypeIds, List<String> removeSecondaryTypeIds, ExtensionsData extension) {
256         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
257             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
258         }
259 
260         ObjectServicePort port = portProvider.getObjectServicePort(CmisVersion.CMIS_1_1, "bulkUpdateProperties");
261 
262         try {
263             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
264             javax.xml.ws.Holder<CmisObjectIdAndChangeTokenType> bulkUpdateResponse = new javax.xml.ws.Holder<CmisObjectIdAndChangeTokenType>();
265 
266             port.bulkUpdateProperties(repositoryId,
267                     convert(objectIdAndChangeToken, properties, addSecondaryTypeIds, removeSecondaryTypeIds),
268                     portExtension, bulkUpdateResponse);
269 
270             setExtensionValues(portExtension, extension);
271 
272             List<BulkUpdateObjectIdAndChangeToken> result = null;
273             if (bulkUpdateResponse.value != null) {
274                 // TODO: fix
275             }
276 
277             return result;
278         } catch (CmisException e) {
279             throw convertException(e);
280         } catch (Exception e) {
281             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
282         } finally {
283             portProvider.endCall(port);
284         }
285     }
286 
287     @Override
288     public void deleteObject(String repositoryId, String objectId, Boolean allVersions, ExtensionsData extension) {
289         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "deleteObject");
290 
291         try {
292             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
293 
294             port.deleteObject(repositoryId, objectId, allVersions, portExtension);
295 
296             setExtensionValues(portExtension, extension);
297         } catch (CmisException e) {
298             throw convertException(e);
299         } catch (Exception e) {
300             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
301         } finally {
302             portProvider.endCall(port);
303         }
304     }
305 
306     @Override
307     public FailedToDeleteData deleteTree(String repositoryId, String folderId, Boolean allVersions,
308             UnfileObject unfileObjects, Boolean continueOnFailure, ExtensionsData extension) {
309         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "deleteTree");
310 
311         try {
312             return convert(port.deleteTree(repositoryId, folderId, allVersions,
313                     convert(EnumUnfileObject.class, unfileObjects), continueOnFailure, convert(extension)));
314         } catch (CmisException e) {
315             throw convertException(e);
316         } catch (Exception e) {
317             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
318         } finally {
319             portProvider.endCall(port);
320         }
321     }
322 
323     @Override
324     public AllowableActions getAllowableActions(String repositoryId, String objectId, ExtensionsData extension) {
325         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getAllowableActions");
326 
327         try {
328             return convert(port.getAllowableActions(repositoryId, objectId, convert(extension)));
329         } catch (CmisException e) {
330             throw convertException(e);
331         } catch (Exception e) {
332             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
333         } finally {
334             portProvider.endCall(port);
335         }
336     }
337 
338     @Override
339     public ContentStream getContentStream(String repositoryId, String objectId, String streamId, BigInteger offset,
340             BigInteger length, ExtensionsData extension) {
341         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getContentStream");
342 
343         try {
344             boolean isPartial = false;
345             if ((offset != null && offset.signum() == 1) || length != null) {
346                 isPartial = true;
347             }
348 
349             return convert(port.getContentStream(repositoryId, objectId, streamId, offset, length, convert(extension)),
350                     isPartial);
351         } catch (CmisException e) {
352             throw convertException(e);
353         } catch (Exception e) {
354             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
355         } finally {
356             portProvider.endCall(port);
357         }
358     }
359 
360     @Override
361     public ObjectData getObject(String repositoryId, String objectId, String filter, Boolean includeAllowableActions,
362             IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
363             Boolean includeACL, ExtensionsData extension) {
364         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getObject");
365 
366         try {
367             return convert(port.getObject(repositoryId, objectId, filter, includeAllowableActions,
368                     convert(EnumIncludeRelationships.class, includeRelationships), renditionFilter, includePolicyIds,
369                     includeACL, convert(extension)));
370         } catch (CmisException e) {
371             throw convertException(e);
372         } catch (Exception e) {
373             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
374         } finally {
375             portProvider.endCall(port);
376         }
377     }
378 
379     @Override
380     public ObjectData getObjectByPath(String repositoryId, String path, String filter, Boolean includeAllowableActions,
381             IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
382             Boolean includeACL, ExtensionsData extension) {
383         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getObjectByPath");
384 
385         try {
386             return convert(port.getObjectByPath(repositoryId, path, filter, includeAllowableActions,
387                     convert(EnumIncludeRelationships.class, includeRelationships), renditionFilter, includePolicyIds,
388                     includeACL, convert(extension)));
389         } catch (CmisException e) {
390             throw convertException(e);
391         } catch (Exception e) {
392             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
393         } finally {
394             portProvider.endCall(port);
395         }
396     }
397 
398     @Override
399     public Properties getProperties(String repositoryId, String objectId, String filter, ExtensionsData extension) {
400         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getProperties");
401 
402         try {
403             return convert(port.getProperties(repositoryId, objectId, filter, convert(extension)));
404         } catch (CmisException e) {
405             throw convertException(e);
406         } catch (Exception e) {
407             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
408         } finally {
409             portProvider.endCall(port);
410         }
411     }
412 
413     @Override
414     public List<RenditionData> getRenditions(String repositoryId, String objectId, String renditionFilter,
415             BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
416         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "getRenditions");
417 
418         try {
419             List<CmisRenditionType> renditionList = port.getRenditions(repositoryId, objectId, renditionFilter,
420                     maxItems, skipCount, convert(extension));
421 
422             // no list?
423             if (renditionList == null) {
424                 return null;
425             }
426 
427             // convert list
428             List<RenditionData> result = new ArrayList<RenditionData>();
429             for (CmisRenditionType rendition : renditionList) {
430                 result.add(convert(rendition));
431             }
432 
433             return result;
434         } catch (CmisException e) {
435             throw convertException(e);
436         } catch (Exception e) {
437             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
438         } finally {
439             portProvider.endCall(port);
440         }
441     }
442 
443     @Override
444     public void moveObject(String repositoryId, Holder<String> objectId, String targetFolderId, String sourceFolderId,
445             ExtensionsData extension) {
446         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "moveObject");
447 
448         try {
449             javax.xml.ws.Holder<String> portObjectId = convertHolder(objectId);
450             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
451 
452             port.moveObject(repositoryId, portObjectId, targetFolderId, sourceFolderId, portExtension);
453 
454             setHolderValue(portObjectId, objectId);
455             setExtensionValues(portExtension, extension);
456         } catch (CmisException e) {
457             throw convertException(e);
458         } catch (Exception e) {
459             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
460         } finally {
461             portProvider.endCall(port);
462         }
463     }
464 
465     @Override
466     public void setContentStream(String repositoryId, Holder<String> objectId, Boolean overwriteFlag,
467             Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
468         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "setContentStream");
469 
470         try {
471             javax.xml.ws.Holder<String> portObjectId = convertHolder(objectId);
472             javax.xml.ws.Holder<String> portChangeToken = getSession().get(SessionParameter.OMIT_CHANGE_TOKENS, false) ? null
473                     : convertHolder(changeToken);
474             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
475 
476             port.setContentStream(repositoryId, portObjectId, overwriteFlag, portChangeToken,
477                     convert(contentStream, false), portExtension);
478 
479             setHolderValue(portObjectId, objectId);
480             setHolderValue(portChangeToken, changeToken);
481             setExtensionValues(portExtension, extension);
482         } catch (CmisException e) {
483             throw convertException(e);
484         } catch (Exception e) {
485             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
486         } finally {
487             portProvider.endCall(port);
488         }
489     }
490 
491     @Override
492     public void deleteContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
493             ExtensionsData extension) {
494         ObjectServicePort port = portProvider.getObjectServicePort(getCmisVersion(repositoryId), "deleteContentStream");
495 
496         try {
497             javax.xml.ws.Holder<String> portObjectId = convertHolder(objectId);
498             javax.xml.ws.Holder<String> portChangeToken = getSession().get(SessionParameter.OMIT_CHANGE_TOKENS, false) ? null
499                     : convertHolder(changeToken);
500             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
501 
502             port.deleteContentStream(repositoryId, portObjectId, portChangeToken, portExtension);
503 
504             setHolderValue(portObjectId, objectId);
505             setHolderValue(portChangeToken, changeToken);
506             setExtensionValues(portExtension, extension);
507         } catch (CmisException e) {
508             throw convertException(e);
509         } catch (Exception e) {
510             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
511         } finally {
512             portProvider.endCall(port);
513         }
514     }
515 
516     @Override
517     public void appendContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
518             ContentStream contentStream, boolean isLastChunk, ExtensionsData extension) {
519         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
520             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
521         }
522 
523         ObjectServicePort port = portProvider.getObjectServicePort(CmisVersion.CMIS_1_1, "appendContentStream");
524 
525         try {
526             javax.xml.ws.Holder<String> portObjectId = convertHolder(objectId);
527             javax.xml.ws.Holder<String> portChangeToken = getSession().get(SessionParameter.OMIT_CHANGE_TOKENS, false) ? null
528                     : convertHolder(changeToken);
529             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
530 
531             port.appendContentStream(repositoryId, portObjectId, isLastChunk, portChangeToken,
532                     convert(contentStream, false), portExtension);
533 
534             setHolderValue(portObjectId, objectId);
535             setHolderValue(portChangeToken, changeToken);
536             setExtensionValues(portExtension, extension);
537         } catch (CmisException e) {
538             throw convertException(e);
539         } catch (Exception e) {
540             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
541         } finally {
542             portProvider.endCall(port);
543         }
544     }
545 }