1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
61
62 public class ObjectServiceImpl extends AbstractWebServicesService implements ObjectService {
63
64 private final AbstractPortProvider portProvider;
65
66
67
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
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
423 if (renditionList == null) {
424 return null;
425 }
426
427
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 }