This project has retired. For details please refer to its Attic page.
ObjectService 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  package org.apache.chemistry.opencmis.server.impl.browser;
20  
21  import static org.apache.chemistry.opencmis.commons.impl.Constants.MEDIATYPE_OCTETSTREAM;
22  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_ACL;
23  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_ALLOWABLE_ACTIONS;
24  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_FILTER;
25  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_POLICY_IDS;
26  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_RELATIONSHIPS;
27  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_RENDITION_FILTER;
28  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_RETURN_VERSION;
29  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_SOURCE_FOLDER_ID;
30  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_SOURCE_ID;
31  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_STREAM_ID;
32  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_TARGET_FOLDER_ID;
33  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_TRANSACTION;
34  import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_VERSIONIG_STATE;
35  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.RESOURCE_CONTENT;
36  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileBaseUrl;
37  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileUrl;
38  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_ID;
39  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_TYPE_ID;
40  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createAddAcl;
41  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createContentStream;
42  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createCookieValue;
43  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createPolicies;
44  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createProperties;
45  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createRemoveAcl;
46  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.getSimpleObject;
47  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.setCookie;
48  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.setStatus;
49  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.writeEmpty;
50  import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.writeJSON;
51  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBigIntegerParameter;
52  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
53  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getEnumParameter;
54  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
55  
56  import java.io.BufferedInputStream;
57  import java.io.BufferedOutputStream;
58  import java.io.InputStream;
59  import java.io.OutputStream;
60  import java.math.BigInteger;
61  import java.util.List;
62  
63  import javax.servlet.http.HttpServletRequest;
64  import javax.servlet.http.HttpServletResponse;
65  
66  import org.apache.chemistry.opencmis.commons.PropertyIds;
67  import org.apache.chemistry.opencmis.commons.data.AllowableActions;
68  import org.apache.chemistry.opencmis.commons.data.ContentStream;
69  import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData;
70  import org.apache.chemistry.opencmis.commons.data.ObjectData;
71  import org.apache.chemistry.opencmis.commons.data.Properties;
72  import org.apache.chemistry.opencmis.commons.data.PropertyData;
73  import org.apache.chemistry.opencmis.commons.data.RenditionData;
74  import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
75  import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
76  import org.apache.chemistry.opencmis.commons.enums.VersioningState;
77  import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
78  import org.apache.chemistry.opencmis.commons.impl.Constants;
79  import org.apache.chemistry.opencmis.commons.impl.JSONConverter;
80  import org.apache.chemistry.opencmis.commons.impl.MimeHelper;
81  import org.apache.chemistry.opencmis.commons.impl.ReturnVersion;
82  import org.apache.chemistry.opencmis.commons.impl.TypeCache;
83  import org.apache.chemistry.opencmis.commons.impl.json.JSONArray;
84  import org.apache.chemistry.opencmis.commons.impl.json.JSONObject;
85  import org.apache.chemistry.opencmis.commons.impl.server.TypeCacheImpl;
86  import org.apache.chemistry.opencmis.commons.server.CallContext;
87  import org.apache.chemistry.opencmis.commons.server.CmisService;
88  import org.apache.chemistry.opencmis.commons.spi.Holder;
89  
90  /**
91   * Object Service operations.
92   */
93  public final class ObjectService {
94  
95      private static final int BUFFER_SIZE = 64 * 1024;
96  
97      private ObjectService() {
98      }
99  
100     /**
101      * Create document.
102      */
103     public static void createDocument(CallContext context, CmisService service, String repositoryId,
104             HttpServletRequest request, HttpServletResponse response) throws Exception {
105         // get parameters
106         String folderId = (String) context.get(CONTEXT_OBJECT_ID);
107         VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
108         String transaction = getStringParameter(request, PARAM_TRANSACTION);
109 
110         // execute
111         ControlParser cp = new ControlParser(request);
112         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
113 
114         String newObjectId = service.createDocument(repositoryId, createProperties(cp, null, typeCache), folderId,
115                 createContentStream(request), versioningState, createPolicies(cp), createAddAcl(cp),
116                 createRemoveAcl(cp), null);
117 
118         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
119         if (object == null) {
120             throw new CmisRuntimeException("New document is null!");
121         }
122 
123         // return object
124         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
125 
126         setStatus(request, response, HttpServletResponse.SC_CREATED);
127         setCookie(request, response, repositoryId, transaction,
128                 createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
129 
130         writeJSON(jsonObject, request, response);
131     }
132 
133     /**
134      * Create document from source.
135      */
136     public static void createDocumentFromSource(CallContext context, CmisService service, String repositoryId,
137             HttpServletRequest request, HttpServletResponse response) throws Exception {
138         // get parameters
139         String folderId = (String) context.get(CONTEXT_OBJECT_ID);
140         String sourceId = getStringParameter(request, PARAM_SOURCE_ID);
141         VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
142         String transaction = getStringParameter(request, PARAM_TRANSACTION);
143 
144         // execute
145         ControlParser cp = new ControlParser(request);
146         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
147 
148         ObjectData sourceDoc = getSimpleObject(service, repositoryId, sourceId);
149         PropertyData<?> sourceTypeId = sourceDoc.getProperties().getProperties().get(PropertyIds.OBJECT_TYPE_ID);
150         if (sourceTypeId == null || sourceTypeId.getFirstValue() == null) {
151             throw new CmisRuntimeException("Source object has no type!?!");
152         }
153 
154         String newObjectId = service.createDocumentFromSource(repositoryId, sourceId,
155                 createProperties(cp, sourceTypeId.getFirstValue().toString(), typeCache), folderId, versioningState,
156                 createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
157 
158         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
159         if (object == null) {
160             throw new CmisRuntimeException("New document is null!");
161         }
162 
163         // return object
164         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
165 
166         setStatus(request, response, HttpServletResponse.SC_CREATED);
167         setCookie(request, response, repositoryId, transaction,
168                 createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
169 
170         writeJSON(jsonObject, request, response);
171     }
172 
173     /**
174      * Create folder.
175      */
176     public static void createFolder(CallContext context, CmisService service, String repositoryId,
177             HttpServletRequest request, HttpServletResponse response) throws Exception {
178         // get parameters
179         String folderId = (String) context.get(CONTEXT_OBJECT_ID);
180         String transaction = getStringParameter(request, PARAM_TRANSACTION);
181 
182         // execute
183         ControlParser cp = new ControlParser(request);
184         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
185 
186         String newObjectId = service.createFolder(repositoryId, createProperties(cp, null, typeCache), folderId,
187                 createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
188 
189         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
190         if (object == null) {
191             throw new CmisRuntimeException("New folder is null!");
192         }
193 
194         // return object
195         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
196 
197         setStatus(request, response, HttpServletResponse.SC_CREATED);
198         setCookie(request, response, repositoryId, transaction,
199                 createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
200 
201         writeJSON(jsonObject, request, response);
202     }
203 
204     /**
205      * Create policy.
206      */
207     public static void createPolicy(CallContext context, CmisService service, String repositoryId,
208             HttpServletRequest request, HttpServletResponse response) throws Exception {
209         // get parameters
210         String folderId = (String) context.get(CONTEXT_OBJECT_ID);
211         String transaction = getStringParameter(request, PARAM_TRANSACTION);
212 
213         // execute
214         ControlParser cp = new ControlParser(request);
215         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
216 
217         String newObjectId = service.createPolicy(repositoryId, createProperties(cp, null, typeCache), folderId,
218                 createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
219 
220         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
221         if (object == null) {
222             throw new CmisRuntimeException("New policy is null!");
223         }
224 
225         // return object
226         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
227 
228         setStatus(request, response, HttpServletResponse.SC_CREATED);
229         setCookie(request, response, repositoryId, transaction,
230                 createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
231 
232         writeJSON(jsonObject, request, response);
233     }
234 
235     /**
236      * Create relationship.
237      */
238     public static void createRelationship(CallContext context, CmisService service, String repositoryId,
239             HttpServletRequest request, HttpServletResponse response) throws Exception {
240         // get parameters
241         String transaction = getStringParameter(request, PARAM_TRANSACTION);
242 
243         // execute
244         ControlParser cp = new ControlParser(request);
245         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
246 
247         String newObjectId = service.createRelationship(repositoryId, createProperties(cp, null, typeCache),
248                 createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
249 
250         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
251         if (object == null) {
252             throw new CmisRuntimeException("New relationship is null!");
253         }
254 
255         // return object
256         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
257 
258         setStatus(request, response, HttpServletResponse.SC_CREATED);
259         setCookie(request, response, repositoryId, transaction,
260                 createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
261 
262         writeJSON(jsonObject, request, response);
263     }
264 
265     /**
266      * updateProperties.
267      */
268     public static void updateProperties(CallContext context, CmisService service, String repositoryId,
269             HttpServletRequest request, HttpServletResponse response) throws Exception {
270         // get parameters
271         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
272         String typeId = (String) context.get(CONTEXT_OBJECT_TYPE_ID);
273         String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
274         String transaction = getStringParameter(request, PARAM_TRANSACTION);
275 
276         // execute
277         ControlParser cp = new ControlParser(request);
278         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
279         Holder<String> objectIdHolder = new Holder<String>(objectId);
280         Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
281 
282         service.updateProperties(repositoryId, objectIdHolder, changeTokenHolder,
283                 createProperties(cp, typeId, typeCache), null);
284 
285         String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
286 
287         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
288         if (object == null) {
289             throw new CmisRuntimeException("Object is null!");
290         }
291 
292         // return object
293         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
294 
295         int status = HttpServletResponse.SC_OK;
296         if (!objectId.equals(newObjectId)) {
297             status = HttpServletResponse.SC_CREATED;
298         }
299 
300         setStatus(request, response, status);
301         setCookie(request, response, repositoryId, transaction, createCookieValue(status, object.getId(), null, null));
302 
303         writeJSON(jsonObject, request, response);
304     }
305 
306     /**
307      * getProperties.
308      */
309     public static void getProperties(CallContext context, CmisService service, String repositoryId,
310             HttpServletRequest request, HttpServletResponse response) throws Exception {
311         // get parameters
312         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
313         ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
314         String filter = getStringParameter(request, PARAM_FILTER);
315 
316         // execute
317         Properties properties;
318 
319         if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
320             properties = service.getPropertiesOfLatestVersion(repositoryId, objectId, null,
321                     returnVersion == ReturnVersion.LASTESTMAJOR, filter, null);
322         } else {
323             properties = service.getProperties(repositoryId, objectId, filter, null);
324         }
325 
326         if (properties == null) {
327             throw new CmisRuntimeException("Properties are null!");
328         }
329 
330         // return object
331         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
332         JSONObject jsonObject = JSONConverter.convert(properties, objectId, typeCache, false);
333 
334         response.setStatus(HttpServletResponse.SC_OK);
335         writeJSON(jsonObject, request, response);
336     }
337 
338     /**
339      * getObject.
340      */
341     public static void getObject(CallContext context, CmisService service, String repositoryId,
342             HttpServletRequest request, HttpServletResponse response) throws Exception {
343         // get parameters
344         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
345         ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
346         String filter = getStringParameter(request, PARAM_FILTER);
347         Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
348         IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
349                 IncludeRelationships.class);
350         String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
351         Boolean includePolicyIds = getBooleanParameter(request, PARAM_POLICY_IDS);
352         Boolean includeAcl = getBooleanParameter(request, PARAM_ACL);
353 
354         // execute
355         ObjectData object;
356 
357         if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
358             object = service.getObjectOfLatestVersion(repositoryId, objectId, null,
359                     returnVersion == ReturnVersion.LASTESTMAJOR, filter, includeAllowableActions, includeRelationships,
360                     renditionFilter, includePolicyIds, includeAcl, null);
361         } else {
362             object = service.getObject(repositoryId, objectId, filter, includeAllowableActions, includeRelationships,
363                     renditionFilter, includePolicyIds, includeAcl, null);
364         }
365 
366         if (object == null) {
367             throw new CmisRuntimeException("Object is null!");
368         }
369 
370         // return object
371         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
372         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
373 
374         response.setStatus(HttpServletResponse.SC_OK);
375         writeJSON(jsonObject, request, response);
376     }
377 
378     /**
379      * getAllowableActions.
380      */
381     public static void getAllowableActions(CallContext context, CmisService service, String repositoryId,
382             HttpServletRequest request, HttpServletResponse response) throws Exception {
383         // get parameters
384         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
385 
386         AllowableActions allowableActions = service.getAllowableActions(repositoryId, objectId, null);
387 
388         JSONObject jsonAllowableActions = JSONConverter.convert(allowableActions);
389 
390         response.setStatus(HttpServletResponse.SC_OK);
391         writeJSON(jsonAllowableActions, request, response);
392     }
393 
394     /**
395      * getRenditions.
396      */
397     public static void getRenditions(CallContext context, CmisService service, String repositoryId,
398             HttpServletRequest request, HttpServletResponse response) throws Exception {
399         // get parameters
400         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
401         String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
402         BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
403         BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
404 
405         // execute
406         List<RenditionData> renditions = service.getRenditions(repositoryId, objectId, renditionFilter, maxItems,
407                 skipCount, null);
408 
409         JSONArray jsonRenditions = new JSONArray();
410         if (renditions != null) {
411             for (RenditionData rendition : renditions) {
412                 jsonRenditions.add(JSONConverter.convert(rendition));
413             }
414         }
415 
416         response.setStatus(HttpServletResponse.SC_OK);
417         writeJSON(jsonRenditions, request, response);
418     }
419 
420     /**
421      * getContentStream.
422      */
423     public static void getContentStream(CallContext context, CmisService service, String repositoryId,
424             HttpServletRequest request, HttpServletResponse response) throws Exception {
425         // get parameters
426         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
427         String streamId = getStringParameter(request, PARAM_STREAM_ID);
428 
429         BigInteger offset = context.getOffset();
430         BigInteger length = context.getLength();
431 
432         // execute
433         ContentStream content = service.getContentStream(repositoryId, objectId, streamId, offset, length, null);
434 
435         if (content == null || content.getStream() == null) {
436             throw new CmisRuntimeException("Content stream is null!");
437         }
438 
439         String contentType = content.getMimeType();
440         if (contentType == null) {
441             contentType = MEDIATYPE_OCTETSTREAM;
442         }
443 
444         // set headers
445         if (offset == null && length == null) {
446             response.setStatus(HttpServletResponse.SC_OK);
447         } else {
448             setStatus(request, response, HttpServletResponse.SC_PARTIAL_CONTENT);
449         }
450         response.setContentType(contentType);
451         if (content.getFileName() != null) {
452             response.setHeader(MimeHelper.CONTENT_DISPOSITION,
453                     MimeHelper.encodeContentDisposition(MimeHelper.DISPOSITION_INLINE, content.getFileName()));
454         }
455 
456         // send content
457         InputStream in = new BufferedInputStream(content.getStream(), BUFFER_SIZE);
458         OutputStream out = new BufferedOutputStream(response.getOutputStream());
459 
460         byte[] buffer = new byte[BUFFER_SIZE];
461         int b;
462         while ((b = in.read(buffer)) > -1) {
463             out.write(buffer, 0, b);
464         }
465 
466         in.close();
467         out.flush();
468     }
469 
470     /**
471      * deleteObject.
472      */
473     public static void deleteObject(CallContext context, CmisService service, String repositoryId,
474             HttpServletRequest request, HttpServletResponse response) throws Exception {
475         // get parameters
476         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
477         Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
478 
479         service.deleteObject(repositoryId, objectId, allVersions, null);
480 
481         response.setStatus(HttpServletResponse.SC_OK);
482         writeEmpty(request, response);
483     }
484 
485     /**
486      * deleteTree.
487      */
488     public static void deleteTree(CallContext context, CmisService service, String repositoryId,
489             HttpServletRequest request, HttpServletResponse response) throws Exception {
490         // get parameters
491         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
492         Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
493         UnfileObject unfileObjects = getEnumParameter(request, Constants.PARAM_UNFILE_OBJECTS, UnfileObject.class);
494         Boolean continueOnFailure = getBooleanParameter(request, Constants.PARAM_CONTINUE_ON_FAILURE);
495 
496         // execute
497         FailedToDeleteData ftd = service.deleteTree(repositoryId, objectId, allVersions, unfileObjects,
498                 continueOnFailure, null);
499 
500         response.setStatus(HttpServletResponse.SC_OK);
501 
502         if ((ftd != null) && (ftd.getIds() != null) && (ftd.getIds().size() > 0)) {
503             JSONObject jsonObject = JSONConverter.convert(ftd);
504             writeJSON(jsonObject, request, response);
505             return;
506         }
507 
508         writeEmpty(request, response);
509     }
510 
511     /**
512      * Delete content stream.
513      */
514     public static void deleteContentStream(CallContext context, CmisService service, String repositoryId,
515             HttpServletRequest request, HttpServletResponse response) throws Exception {
516         // get parameters
517         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
518         String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
519 
520         // execute
521         Holder<String> objectIdHolder = new Holder<String>(objectId);
522         Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
523         service.deleteContentStream(repositoryId, objectIdHolder, changeTokenHolder, null);
524 
525         String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
526 
527         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
528         if (object == null) {
529             throw new CmisRuntimeException("Object is null!");
530         }
531 
532         response.setStatus(HttpServletResponse.SC_OK);
533 
534         // return object
535         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
536         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
537 
538         writeJSON(jsonObject, request, response);
539     }
540 
541     /**
542      * Set content stream.
543      */
544     public static void setContentStream(CallContext context, CmisService service, String repositoryId,
545             HttpServletRequest request, HttpServletResponse response) throws Exception {
546         // get parameters
547         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
548         String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
549         Boolean overwriteFlag = getBooleanParameter(request, Constants.PARAM_OVERWRITE_FLAG);
550 
551         // execute
552         Holder<String> objectIdHolder = new Holder<String>(objectId);
553         Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
554         service.setContentStream(repositoryId, objectIdHolder, overwriteFlag, changeTokenHolder,
555                 createContentStream(request), null);
556 
557         String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
558 
559         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
560         if (object == null) {
561             throw new CmisRuntimeException("Object is null!");
562         }
563 
564         // set headers
565         String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
566 
567         setStatus(request, response, HttpServletResponse.SC_CREATED);
568         response.setHeader("Location", location);
569 
570         // return object
571         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
572         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
573 
574         writeJSON(jsonObject, request, response);
575     }
576 
577     /**
578      * moveObject.
579      */
580     public static void moveObject(CallContext context, CmisService service, String repositoryId,
581             HttpServletRequest request, HttpServletResponse response) throws Exception {
582         // get parameters
583         String objectId = (String) context.get(CONTEXT_OBJECT_ID);
584         String targetFolderId = getStringParameter(request, PARAM_TARGET_FOLDER_ID);
585         String sourceFolderId = getStringParameter(request, PARAM_SOURCE_FOLDER_ID);
586 
587         // execute
588         Holder<String> objectIdHolder = new Holder<String>(objectId);
589         service.moveObject(repositoryId, objectIdHolder, targetFolderId, sourceFolderId, null);
590 
591         String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
592 
593         ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
594         if (object == null) {
595             throw new CmisRuntimeException("Object is null!");
596         }
597 
598         // set headers
599         String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
600 
601         setStatus(request, response, HttpServletResponse.SC_CREATED);
602         response.setHeader("Location", location);
603 
604         // return object
605         TypeCache typeCache = new TypeCacheImpl(repositoryId, service);
606         JSONObject jsonObject = JSONConverter.convert(object, typeCache, false);
607 
608         writeJSON(jsonObject, request, response);
609     }
610 }