You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2013/05/11 23:19:48 UTC

svn commit: r1481420 [6/7] - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src: main/java/org/apache/chemistry/opencmis/server/impl/ main/java/org/apache/chemistry/opencmis/server/impl/atompub/ main/java/org/...

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java?rev=1481420&r1=1481419&r2=1481420&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java Sat May 11 21:19:48 2013
@@ -33,28 +33,6 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_TARGET_FOLDER_ID;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_TOKEN;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_VERSIONIG_STATE;
-import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.RESOURCE_CONTENT;
-import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileBaseUrl;
-import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileUrl;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_TYPE_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.closeContentStream;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createAddAcl;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createContentStream;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createCookieValue;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createNewProperties;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createPolicies;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createRemoveAcl;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createUpdateProperties;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.getSimpleObject;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.setCookie;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.setStatus;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.writeEmpty;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.writeJSON;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBigIntegerParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getEnumParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -93,694 +71,735 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.spi.Holder;
-import org.apache.chemistry.opencmis.server.shared.HttpUtils;
 
 /**
  * Object Service operations.
  */
-public final class ObjectService {
+public class ObjectService {
 
     private static final int BUFFER_SIZE = 64 * 1024;
 
-    private ObjectService() {
-    }
-
     /**
      * Create document.
      */
-    public static void createDocument(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+    public static class CreateDocument extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            ContentStream contentStream = createContentStream(request);
+
+            String newObjectId = null;
+            try {
+                newObjectId = service
+                        .createDocument(repositoryId, createNewProperties(cp, typeCache), folderId, contentStream,
+                                versioningState, createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+            } finally {
+                closeContentStream(contentStream);
+            }
 
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New document is null!");
+            }
 
-        ContentStream contentStream = createContentStream(request);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
 
-        String newObjectId = null;
-        try {
-            newObjectId = service.createDocument(repositoryId, createNewProperties(cp, typeCache), folderId,
-                    contentStream, versioningState, createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
-        } finally {
-            closeContentStream(contentStream);
-        }
-
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New document is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * Create document from source.
      */
-    public static void createDocumentFromSource(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String sourceId = getStringParameter(request, PARAM_SOURCE_ID);
-        VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-
-        ObjectData sourceDoc = getSimpleObject(service, repositoryId, sourceId);
-        PropertyData<?> sourceTypeId = sourceDoc.getProperties().getProperties().get(PropertyIds.OBJECT_TYPE_ID);
-        if (sourceTypeId == null || sourceTypeId.getFirstValue() == null) {
-            throw new CmisRuntimeException("Source object has no type!?!");
-        }
-
-        String newObjectId = service.createDocumentFromSource(
-                repositoryId,
-                sourceId,
-                createUpdateProperties(cp, sourceTypeId.getFirstValue().toString(), null,
-                        Collections.singletonList(sourceId), typeCache), folderId, versioningState, createPolicies(cp),
-                createAddAcl(cp), createRemoveAcl(cp), null);
-
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New document is null!");
-        }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
+    public static class CreateDocumentFromSource extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            String sourceId = getStringParameter(request, PARAM_SOURCE_ID);
+            VersioningState versioningState = getEnumParameter(request, PARAM_VERSIONIG_STATE, VersioningState.class);
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            ObjectData sourceDoc = getSimpleObject(service, repositoryId, sourceId);
+            PropertyData<?> sourceTypeId = sourceDoc.getProperties().getProperties().get(PropertyIds.OBJECT_TYPE_ID);
+            if (sourceTypeId == null || sourceTypeId.getFirstValue() == null) {
+                throw new CmisRuntimeException("Source object has no type!?!");
+            }
+
+            String newObjectId = service.createDocumentFromSource(
+                    repositoryId,
+                    sourceId,
+                    createUpdateProperties(cp, sourceTypeId.getFirstValue().toString(), null,
+                            Collections.singletonList(sourceId), typeCache), folderId, versioningState,
+                    createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New document is null!");
+            }
 
-        writeJSON(jsonObject, request, response);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
+
+            writeJSON(jsonObject, request, response);
+        }
     }
 
     /**
      * Create folder.
      */
-    public static void createFolder(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+    public static class CreateFolder extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            String newObjectId = service.createFolder(repositoryId, createNewProperties(cp, typeCache), folderId,
+                    createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New folder is null!");
+            }
 
-        String newObjectId = service.createFolder(repositoryId, createNewProperties(cp, typeCache), folderId,
-                createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New folder is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * Create policy.
      */
-    public static void createPolicy(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+    public static class CreatePolicy extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            String newObjectId = service.createPolicy(repositoryId, createNewProperties(cp, typeCache), folderId,
+                    createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New policy is null!");
+            }
 
-        String newObjectId = service.createPolicy(repositoryId, createNewProperties(cp, typeCache), folderId,
-                createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New policy is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * Create Item.
      */
-    public static void createItem(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+    public static class CreateItem extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            String newObjectId = service.createItem(repositoryId, createNewProperties(cp, typeCache), folderId,
+                    createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New item is null!");
+            }
 
-        String newObjectId = service.createItem(repositoryId, createNewProperties(cp, typeCache), folderId,
-                createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New item is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * Create relationship.
      */
-    public static void createRelationship(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+    public static class CreateRelationship extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            String newObjectId = service.createRelationship(repositoryId, createNewProperties(cp, typeCache),
+                    createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("New relationship is null!");
+            }
 
-        String newObjectId = service.createRelationship(repositoryId, createNewProperties(cp, typeCache),
-                createPolicies(cp), createAddAcl(cp), createRemoveAcl(cp), null);
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            setCookie(request, response, repositoryId, token,
+                    createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("New relationship is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        setCookie(request, response, repositoryId, token,
-                createCookieValue(HttpServletResponse.SC_CREATED, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * updateProperties.
      */
-    public static void updateProperties(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String typeId = (String) context.get(CONTEXT_OBJECT_TYPE_ID);
-        String changeToken = getStringParameter(request, Constants.CONTROL_CHANGE_TOKEN);
-        String token = getStringParameter(request, PARAM_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        ControlParser cp = new ControlParser(request);
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
-
-        service.updateProperties(repositoryId, objectIdHolder, changeTokenHolder,
-                createUpdateProperties(cp, typeId, null, Collections.singletonList(objectId), typeCache), null);
-
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+    public static class UpdateProperties extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String typeId = ((BrowserCallContextImpl) context).getTypeId();
+            String changeToken = getStringParameter(request, Constants.CONTROL_CHANGE_TOKEN);
+            String token = getStringParameter(request, PARAM_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            ControlParser cp = new ControlParser(request);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
+
+            service.updateProperties(repositoryId, objectIdHolder, changeTokenHolder,
+                    createUpdateProperties(cp, typeId, null, Collections.singletonList(objectId), typeCache), null);
+
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
+            // return object
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            int status = HttpServletResponse.SC_OK;
+            if (!objectId.equals(newObjectId)) {
+                status = HttpServletResponse.SC_CREATED;
+            }
 
-        // return object
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
+            setStatus(request, response, status);
+            setCookie(request, response, repositoryId, token, createCookieValue(status, object.getId(), null, null));
 
-        int status = HttpServletResponse.SC_OK;
-        if (!objectId.equals(newObjectId)) {
-            status = HttpServletResponse.SC_CREATED;
+            writeJSON(jsonObject, request, response);
         }
-
-        setStatus(request, response, status);
-        setCookie(request, response, repositoryId, token, createCookieValue(status, object.getId(), null, null));
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * bulkUpdateProperties.
      */
-    public static void bulkUpdateProperties(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        ControlParser cp = new ControlParser(request);
+    public static class BulkUpdateProperties extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            ControlParser cp = new ControlParser(request);
 
-        // get object ids and change tokens
-        List<BulkUpdateObjectIdAndChangeToken> objectIdAndChangeToken = new ArrayList<BulkUpdateObjectIdAndChangeToken>();
+            // get object ids and change tokens
+            List<BulkUpdateObjectIdAndChangeToken> objectIdAndChangeToken = new ArrayList<BulkUpdateObjectIdAndChangeToken>();
 
-        List<String> objectIds = cp.getValues(Constants.CONTROL_OBJECT_ID);
-        List<String> changeTokens = cp.getValues(Constants.CONTROL_CHANGE_TOKEN);
+            List<String> objectIds = cp.getValues(Constants.CONTROL_OBJECT_ID);
+            List<String> changeTokens = cp.getValues(Constants.CONTROL_CHANGE_TOKEN);
 
-        if (objectIds == null || objectIds.size() == 0) {
-            throw new CmisInvalidArgumentException("No object ids provided!");
-        }
-
-        int n = objectIds.size();
-        for (int i = 0; i < n; i++) {
-            String id = objectIds.get(i);
-            String changeToken = (changeTokens != null && changeTokens.size() > i ? changeTokens.get(i) : null);
-            objectIdAndChangeToken.add(new BulkUpdateObjectIdAndChangeTokenImpl(id, changeToken));
-        }
-
-        // get secondary type ids
-        List<String> addSecondaryTypes = cp.getValues(Constants.CONTROL_ADD_SECONDARY_TYPE);
-        List<String> removeSecondaryTypes = cp.getValues(Constants.CONTROL_REMOVE_SECONDARY_TYPE);
-
-        // compile properties
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-
-        Properties properties = createUpdateProperties(cp, null, addSecondaryTypes, objectIds, typeCache);
+            if (objectIds == null || objectIds.size() == 0) {
+                throw new CmisInvalidArgumentException("No object ids provided!");
+            }
 
-        // execute
-        List<BulkUpdateObjectIdAndChangeToken> result = service.bulkUpdateProperties(repositoryId,
-                objectIdAndChangeToken, properties, addSecondaryTypes, removeSecondaryTypes, null);
+            int n = objectIds.size();
+            for (int i = 0; i < n; i++) {
+                String id = objectIds.get(i);
+                String changeToken = (changeTokens != null && changeTokens.size() > i ? changeTokens.get(i) : null);
+                objectIdAndChangeToken.add(new BulkUpdateObjectIdAndChangeTokenImpl(id, changeToken));
+            }
 
-        // return result
-        JSONArray jsonList = new JSONArray();
-        if (result != null) {
-            for (BulkUpdateObjectIdAndChangeToken oc : result) {
-                if (oc != null) {
-                    jsonList.add(JSONConverter.convert(oc));
+            // get secondary type ids
+            List<String> addSecondaryTypes = cp.getValues(Constants.CONTROL_ADD_SECONDARY_TYPE);
+            List<String> removeSecondaryTypes = cp.getValues(Constants.CONTROL_REMOVE_SECONDARY_TYPE);
+
+            // compile properties
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+
+            Properties properties = createUpdateProperties(cp, null, addSecondaryTypes, objectIds, typeCache);
+
+            // execute
+            List<BulkUpdateObjectIdAndChangeToken> result = service.bulkUpdateProperties(repositoryId,
+                    objectIdAndChangeToken, properties, addSecondaryTypes, removeSecondaryTypes, null);
+
+            // return result
+            JSONArray jsonList = new JSONArray();
+            if (result != null) {
+                for (BulkUpdateObjectIdAndChangeToken oc : result) {
+                    if (oc != null) {
+                        jsonList.add(JSONConverter.convert(oc));
+                    }
                 }
             }
-        }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonList, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonList, request, response);
+        }
     }
 
     /**
      * getProperties.
      */
-    public static void getProperties(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        Properties properties;
-
-        if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
-            properties = service.getPropertiesOfLatestVersion(repositoryId, objectId, null,
-                    returnVersion == ReturnVersion.LASTESTMAJOR, filter, null);
-        } else {
-            properties = service.getProperties(repositoryId, objectId, filter, null);
-        }
-
-        if (properties == null) {
-            throw new CmisRuntimeException("Properties are null!");
-        }
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(properties, objectId, typeCache,
-                JSONConverter.PropertyMode.OBJECT, succinct);
+    public static class GetProperties extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
+            String filter = getStringParameter(request, PARAM_FILTER);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            Properties properties;
+
+            if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
+                properties = service.getPropertiesOfLatestVersion(repositoryId, objectId, null,
+                        returnVersion == ReturnVersion.LASTESTMAJOR, filter, null);
+            } else {
+                properties = service.getProperties(repositoryId, objectId, filter, null);
+            }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonObject, request, response);
+            if (properties == null) {
+                throw new CmisRuntimeException("Properties are null!");
+            }
+
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(properties, objectId, typeCache,
+                    JSONConverter.PropertyMode.OBJECT, succinct);
+
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonObject, request, response);
+        }
     }
 
     /**
      * getObject.
      */
-    public static void getObject(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
-        IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
-                IncludeRelationships.class);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        Boolean includePolicyIds = getBooleanParameter(request, PARAM_POLICY_IDS);
-        Boolean includeAcl = getBooleanParameter(request, PARAM_ACL);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        ObjectData object;
-
-        if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
-            object = service.getObjectOfLatestVersion(repositoryId, objectId, null,
-                    returnVersion == ReturnVersion.LASTESTMAJOR, filter, includeAllowableActions, includeRelationships,
-                    renditionFilter, includePolicyIds, includeAcl, null);
-        } else {
-            object = service.getObject(repositoryId, objectId, filter, includeAllowableActions, includeRelationships,
-                    renditionFilter, includePolicyIds, includeAcl, null);
-        }
-
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
+    public static class GetObject extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            ReturnVersion returnVersion = getEnumParameter(request, PARAM_RETURN_VERSION, ReturnVersion.class);
+            String filter = getStringParameter(request, PARAM_FILTER);
+            Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
+            IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
+                    IncludeRelationships.class);
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            Boolean includePolicyIds = getBooleanParameter(request, PARAM_POLICY_IDS);
+            Boolean includeAcl = getBooleanParameter(request, PARAM_ACL);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            ObjectData object;
+
+            if (returnVersion == ReturnVersion.LATEST || returnVersion == ReturnVersion.LASTESTMAJOR) {
+                object = service.getObjectOfLatestVersion(repositoryId, objectId, null,
+                        returnVersion == ReturnVersion.LASTESTMAJOR, filter, includeAllowableActions,
+                        includeRelationships, renditionFilter, includePolicyIds, includeAcl, null);
+            } else {
+                object = service.getObject(repositoryId, objectId, filter, includeAllowableActions,
+                        includeRelationships, renditionFilter, includePolicyIds, includeAcl, null);
+            }
+
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonObject, request, response);
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
+
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonObject, request, response);
+        }
     }
 
     /**
      * getAllowableActions.
      */
-    public static void getAllowableActions(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
+    public static class GetAllowableActions extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
 
-        AllowableActions allowableActions = service.getAllowableActions(repositoryId, objectId, null);
+            AllowableActions allowableActions = service.getAllowableActions(repositoryId, objectId, null);
 
-        JSONObject jsonAllowableActions = JSONConverter.convert(allowableActions);
+            JSONObject jsonAllowableActions = JSONConverter.convert(allowableActions);
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonAllowableActions, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonAllowableActions, request, response);
+        }
     }
 
     /**
      * getRenditions.
      */
-    public static void getRenditions(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-        BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
-
-        // execute
-        List<RenditionData> renditions = service.getRenditions(repositoryId, objectId, renditionFilter, maxItems,
-                skipCount, null);
-
-        JSONArray jsonRenditions = new JSONArray();
-        if (renditions != null) {
-            for (RenditionData rendition : renditions) {
-                jsonRenditions.add(JSONConverter.convert(rendition));
+    public static class GetRenditions extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+            BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+
+            // execute
+            List<RenditionData> renditions = service.getRenditions(repositoryId, objectId, renditionFilter, maxItems,
+                    skipCount, null);
+
+            JSONArray jsonRenditions = new JSONArray();
+            if (renditions != null) {
+                for (RenditionData rendition : renditions) {
+                    jsonRenditions.add(JSONConverter.convert(rendition));
+                }
             }
-        }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonRenditions, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonRenditions, request, response);
+        }
     }
 
     /**
      * getContentStream.
      */
-    public static void getContentStream(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String streamId = getStringParameter(request, PARAM_STREAM_ID);
-        boolean download = "attachment".equalsIgnoreCase(getStringParameter(request, PARAM_DOWNLOAD));
+    public static class GetContentStream extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String streamId = getStringParameter(request, PARAM_STREAM_ID);
+            boolean download = "attachment".equalsIgnoreCase(getStringParameter(request, PARAM_DOWNLOAD));
 
-        BigInteger offset = context.getOffset();
-        BigInteger length = context.getLength();
+            BigInteger offset = context.getOffset();
+            BigInteger length = context.getLength();
 
-        // execute
-        ContentStream content = service.getContentStream(repositoryId, objectId, streamId, offset, length, null);
+            // execute
+            ContentStream content = service.getContentStream(repositoryId, objectId, streamId, offset, length, null);
 
-        if (content == null || content.getStream() == null) {
-            throw new CmisRuntimeException("Content stream is null!");
-        }
+            if (content == null || content.getStream() == null) {
+                throw new CmisRuntimeException("Content stream is null!");
+            }
 
-        // set HTTP headers, if requested by the server implementation
-        if (HttpUtils.setContentStreamHeaders(content, request, response)) {
-            return;
-        }
+            // set HTTP headers, if requested by the server implementation
+            if (sendContentStreamHeaders(content, request, response)) {
+                return;
+            }
 
-        String contentType = content.getMimeType();
-        if (contentType == null) {
-            contentType = MEDIATYPE_OCTETSTREAM;
-        }
+            String contentType = content.getMimeType();
+            if (contentType == null) {
+                contentType = MEDIATYPE_OCTETSTREAM;
+            }
 
-        // set headers
-        if (offset == null && length == null) {
-            response.setStatus(HttpServletResponse.SC_OK);
-        } else {
-            setStatus(request, response, HttpServletResponse.SC_PARTIAL_CONTENT);
-        }
-        response.setContentType(contentType);
+            // set headers
+            if (offset == null && length == null) {
+                response.setStatus(HttpServletResponse.SC_OK);
+            } else {
+                setStatus(request, response, HttpServletResponse.SC_PARTIAL_CONTENT);
+            }
+            response.setContentType(contentType);
 
-        String contentFilename = content.getFileName();
-        if (contentFilename == null) {
-            contentFilename = "content";
-        }
+            String contentFilename = content.getFileName();
+            if (contentFilename == null) {
+                contentFilename = "content";
+            }
 
-        if (download) {
-            response.setHeader(MimeHelper.CONTENT_DISPOSITION,
-                    MimeHelper.encodeContentDisposition(MimeHelper.DISPOSITION_ATTACHMENT, contentFilename));
-        } else {
-            response.setHeader(MimeHelper.CONTENT_DISPOSITION,
-                    MimeHelper.encodeContentDisposition(MimeHelper.DISPOSITION_INLINE, contentFilename));
-        }
+            if (download) {
+                response.setHeader(MimeHelper.CONTENT_DISPOSITION,
+                        MimeHelper.encodeContentDisposition(MimeHelper.DISPOSITION_ATTACHMENT, contentFilename));
+            } else {
+                response.setHeader(MimeHelper.CONTENT_DISPOSITION,
+                        MimeHelper.encodeContentDisposition(MimeHelper.DISPOSITION_INLINE, contentFilename));
+            }
 
-        // send content
-        InputStream in = new BufferedInputStream(content.getStream(), BUFFER_SIZE);
-        OutputStream out = new BufferedOutputStream(response.getOutputStream());
+            // send content
+            InputStream in = new BufferedInputStream(content.getStream(), BUFFER_SIZE);
+            OutputStream out = new BufferedOutputStream(response.getOutputStream());
+
+            byte[] buffer = new byte[BUFFER_SIZE];
+            int b;
+            while ((b = in.read(buffer)) > -1) {
+                out.write(buffer, 0, b);
+            }
 
-        byte[] buffer = new byte[BUFFER_SIZE];
-        int b;
-        while ((b = in.read(buffer)) > -1) {
-            out.write(buffer, 0, b);
+            in.close();
+            out.flush();
         }
-
-        in.close();
-        out.flush();
     }
 
     /**
      * deleteObject.
      */
-    public static void deleteObject(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
+    public static class DeleteObject extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
 
-        service.deleteObject(repositoryId, objectId, allVersions, null);
+            service.deleteObject(repositoryId, objectId, allVersions, null);
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeEmpty(request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeEmpty(request, response);
+        }
     }
 
     /**
      * deleteTree.
      */
-    public static void deleteTree(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
-        UnfileObject unfileObjects = getEnumParameter(request, Constants.PARAM_UNFILE_OBJECTS, UnfileObject.class);
-        Boolean continueOnFailure = getBooleanParameter(request, Constants.PARAM_CONTINUE_ON_FAILURE);
+    public static class DeleteTree extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
+            UnfileObject unfileObjects = getEnumParameter(request, Constants.PARAM_UNFILE_OBJECTS, UnfileObject.class);
+            Boolean continueOnFailure = getBooleanParameter(request, Constants.PARAM_CONTINUE_ON_FAILURE);
+
+            // execute
+            FailedToDeleteData ftd = service.deleteTree(repositoryId, objectId, allVersions, unfileObjects,
+                    continueOnFailure, null);
 
-        // execute
-        FailedToDeleteData ftd = service.deleteTree(repositoryId, objectId, allVersions, unfileObjects,
-                continueOnFailure, null);
+            response.setStatus(HttpServletResponse.SC_OK);
 
-        response.setStatus(HttpServletResponse.SC_OK);
+            if ((ftd != null) && (ftd.getIds() != null) && (ftd.getIds().size() > 0)) {
+                JSONObject jsonObject = JSONConverter.convert(ftd);
+                writeJSON(jsonObject, request, response);
+                return;
+            }
 
-        if ((ftd != null) && (ftd.getIds() != null) && (ftd.getIds().size() > 0)) {
-            JSONObject jsonObject = JSONConverter.convert(ftd);
-            writeJSON(jsonObject, request, response);
-            return;
+            writeEmpty(request, response);
         }
-
-        writeEmpty(request, response);
     }
 
     /**
      * Delete content stream.
      */
-    public static void deleteContentStream(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+    public static class DeleteContentStream extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
+            service.deleteContentStream(repositoryId, objectIdHolder, changeTokenHolder, null);
+
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
-        service.deleteContentStream(repositoryId, objectIdHolder, changeTokenHolder, null);
+            response.setStatus(HttpServletResponse.SC_OK);
 
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        response.setStatus(HttpServletResponse.SC_OK);
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * setContentStream.
      */
-    public static void setContentStream(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-        Boolean overwriteFlag = getBooleanParameter(request, Constants.PARAM_OVERWRITE_FLAG);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+    public static class SetContentStream extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+            Boolean overwriteFlag = getBooleanParameter(request, Constants.PARAM_OVERWRITE_FLAG);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
+            ContentStream contentStream = createContentStream(request);
+
+            try {
+                service.setContentStream(repositoryId, objectIdHolder, overwriteFlag, changeTokenHolder, contentStream,
+                        null);
+            } finally {
+                closeContentStream(contentStream);
+            }
 
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
-        ContentStream contentStream = createContentStream(request);
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
 
-        try {
-            service.setContentStream(repositoryId, objectIdHolder, overwriteFlag, changeTokenHolder, contentStream,
-                    null);
-        } finally {
-            closeContentStream(contentStream);
-        }
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+            // set headers
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            response.setHeader("Location", compileObjectLocationUrl(request, repositoryId, newObjectId));
+
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // set headers
-        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        response.setHeader("Location", location);
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * appendContentStream.
      */
-    public static void appendContentStream(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        boolean isLastChunk = getBooleanParameter(request, Constants.CONTROL_IS_LAST_CHUNK, false);
-        String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+    public static class AppendContentStream extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            boolean isLastChunk = getBooleanParameter(request, Constants.CONTROL_IS_LAST_CHUNK, false);
+            String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
+            ContentStream contentStream = createContentStream(request);
+
+            try {
+                service.appendContentStream(repositoryId, objectIdHolder, changeTokenHolder, contentStream,
+                        isLastChunk, null);
+            } finally {
+                closeContentStream(contentStream);
+            }
 
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        Holder<String> changeTokenHolder = (changeToken == null ? null : new Holder<String>(changeToken));
-        ContentStream contentStream = createContentStream(request);
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
 
-        try {
-            service.appendContentStream(repositoryId, objectIdHolder, changeTokenHolder, contentStream, isLastChunk,
-                    null);
-        } finally {
-            closeContentStream(contentStream);
-        }
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+            // set headers
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            response.setHeader("Location", compileObjectLocationUrl(request, repositoryId, newObjectId));
+
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // set headers
-        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        response.setHeader("Location", location);
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        writeJSON(jsonObject, request, response);
     }
 
     /**
      * moveObject.
      */
-    public static void moveObject(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String targetFolderId = getStringParameter(request, PARAM_TARGET_FOLDER_ID);
-        String sourceFolderId = getStringParameter(request, PARAM_SOURCE_FOLDER_ID);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        service.moveObject(repositoryId, objectIdHolder, targetFolderId, sourceFolderId, null);
+    public static class MoveObject extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String targetFolderId = getStringParameter(request, PARAM_TARGET_FOLDER_ID);
+            String sourceFolderId = getStringParameter(request, PARAM_SOURCE_FOLDER_ID);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            service.moveObject(repositoryId, objectIdHolder, targetFolderId, sourceFolderId, null);
+
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+            // set headers
+            setStatus(request, response, HttpServletResponse.SC_CREATED);
+            response.setHeader("Location", compileObjectLocationUrl(request, repositoryId, newObjectId));
+
+            // return object
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
+            writeJSON(jsonObject, request, response);
         }
-
-        // set headers
-        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        response.setHeader("Location", location);
-
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        writeJSON(jsonObject, request, response);
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/PolicyService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/PolicyService.java?rev=1481420&r1=1481419&r2=1481420&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/PolicyService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/PolicyService.java Sat May 11 21:19:48 2013
@@ -20,11 +20,6 @@ package org.apache.chemistry.opencmis.se
 
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_FILTER;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_POLICY_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.getSimpleObject;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.writeJSON;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
 
 import java.util.List;
 
@@ -49,79 +44,88 @@ public class PolicyService {
     /**
      * getAppliedPolicies.
      */
-    public static void getAppliedPolicies(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        List<ObjectData> policies = service.getAppliedPolicies(repositoryId, objectId, filter, null);
-
-        JSONArray jsonPolicies = new JSONArray();
-        if (policies != null) {
-            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-            for (ObjectData policy : policies) {
-                jsonPolicies.add(JSONConverter.convert(policy, typeCache, JSONConverter.PropertyMode.OBJECT, succinct));
+    public static class GetAppliedPolicies extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String filter = getStringParameter(request, PARAM_FILTER);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            List<ObjectData> policies = service.getAppliedPolicies(repositoryId, objectId, filter, null);
+
+            JSONArray jsonPolicies = new JSONArray();
+            if (policies != null) {
+                TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+                for (ObjectData policy : policies) {
+                    jsonPolicies.add(JSONConverter.convert(policy, typeCache, JSONConverter.PropertyMode.OBJECT,
+                            succinct));
+                }
             }
-        }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        writeJSON(jsonPolicies, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonPolicies, request, response);
+        }
     }
 
     /**
      * applyPolicy.
      */
-    public static void applyPolicy(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String policyId = getStringParameter(request, PARAM_POLICY_ID);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        service.applyPolicy(repositoryId, policyId, objectId, null);
-
-        ObjectData object = getSimpleObject(service, repositoryId, objectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
+    public static class ApplyPolicy extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String policyId = getStringParameter(request, PARAM_POLICY_ID);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            service.applyPolicy(repositoryId, policyId, objectId, null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, objectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        // return object
-        response.setStatus(HttpServletResponse.SC_OK);
+            // return object
+            response.setStatus(HttpServletResponse.SC_OK);
 
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        writeJSON(jsonObject, request, response);
+            writeJSON(jsonObject, request, response);
+        }
     }
 
     /**
      * removePolicy.
      */
-    public static void removePolicy(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String policyId = getStringParameter(request, PARAM_POLICY_ID);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        service.removePolicy(repositoryId, policyId, objectId, null);
-
-        ObjectData object = getSimpleObject(service, repositoryId, objectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
+    public static class RemovePolicy extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            String policyId = getStringParameter(request, PARAM_POLICY_ID);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            service.removePolicy(repositoryId, policyId, objectId, null);
+
+            ObjectData object = getSimpleObject(service, repositoryId, objectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
 
-        // return object
-        response.setStatus(HttpServletResponse.SC_OK);
+            // return object
+            response.setStatus(HttpServletResponse.SC_OK);
 
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        writeJSON(jsonObject, request, response);
+            writeJSON(jsonObject, request, response);
+        }
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RelationshipService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RelationshipService.java?rev=1481420&r1=1481419&r2=1481420&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RelationshipService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RelationshipService.java Sat May 11 21:19:48 2013
@@ -25,11 +25,6 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_SKIP_COUNT;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_SUB_RELATIONSHIP_TYPES;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_TYPE_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_OBJECT_ID;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBigIntegerParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getEnumParameter;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
 
 import java.math.BigInteger;
 
@@ -51,32 +46,36 @@ public class RelationshipService {
     /**
      * getObjectRelationships.
      */
-    public static void getObjectRelationships(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        Boolean includeSubRelationshipTypes = getBooleanParameter(request, PARAM_SUB_RELATIONSHIP_TYPES);
-        RelationshipDirection relationshipDirection = getEnumParameter(request, PARAM_RELATIONSHIP_DIRECTION,
-                RelationshipDirection.class);
-        String typeId = getStringParameter(request, PARAM_TYPE_ID);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
-        BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
-        BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        ObjectList relationships = service.getObjectRelationships(repositoryId, objectId, includeSubRelationshipTypes,
-                relationshipDirection, typeId, renditionFilter, includeAllowableActions, maxItems, skipCount, null);
+    public static class GetObjectRelationships extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String objectId = ((BrowserCallContextImpl) context).getObjectId();
+            Boolean includeSubRelationshipTypes = getBooleanParameter(request, PARAM_SUB_RELATIONSHIP_TYPES);
+            RelationshipDirection relationshipDirection = getEnumParameter(request, PARAM_RELATIONSHIP_DIRECTION,
+                    RelationshipDirection.class);
+            String typeId = getStringParameter(request, PARAM_TYPE_ID);
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
+            BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
+            BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            ObjectList relationships = service.getObjectRelationships(repositoryId, objectId,
+                    includeSubRelationshipTypes, relationshipDirection, typeId, renditionFilter,
+                    includeAllowableActions, maxItems, skipCount, null);
+
+            if (relationships == null) {
+                throw new CmisRuntimeException("Relationships are null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonChildren = JSONConverter.convert(relationships, typeCache,
+                    JSONConverter.PropertyMode.OBJECT, succinct);
 
-        if (relationships == null) {
-            throw new CmisRuntimeException("Relationships are null!");
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonChildren, request, response);
         }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonChildren = JSONConverter.convert(relationships, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonChildren, request, response);
     }
 }