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 [5/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/CmisBrowserBindingServlet.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/CmisBrowserBindingServlet.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/CmisBrowserBindingServlet.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java Sat May 11 21:19:48 2013
@@ -70,24 +70,13 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.commons.impl.JSONConstants.ERROR_EXCEPTION;
 import static org.apache.chemistry.opencmis.commons.impl.JSONConstants.ERROR_MESSAGE;
 import static org.apache.chemistry.opencmis.commons.impl.JSONConstants.ERROR_STACKTRACE;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_BASETYPE_ID;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CONTEXT_TOKEN;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.HTML_MIME_TYPE;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.JSON_MIME_TYPE;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.createCookieValue;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.prepareContext;
-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.writeJSON;
 import static org.apache.chemistry.opencmis.server.shared.Dispatcher.METHOD_GET;
 import static org.apache.chemistry.opencmis.server.shared.Dispatcher.METHOD_POST;
-import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
 
 import java.io.IOException;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -107,154 +96,107 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisVersioningException;
-import org.apache.chemistry.opencmis.commons.impl.ClassLoaderUtil;
 import org.apache.chemistry.opencmis.commons.impl.Constants;
 import org.apache.chemistry.opencmis.commons.impl.json.JSONObject;
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
-import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
-import org.apache.chemistry.opencmis.server.impl.CmisRepositoryContextListener;
 import org.apache.chemistry.opencmis.server.impl.ServerVersion;
-import org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.CallUrl;
 import org.apache.chemistry.opencmis.server.impl.browser.token.TokenHandler;
-import org.apache.chemistry.opencmis.server.shared.CallContextHandler;
+import org.apache.chemistry.opencmis.server.shared.AbstractCmisHttpServlet;
 import org.apache.chemistry.opencmis.server.shared.Dispatcher;
 import org.apache.chemistry.opencmis.server.shared.ExceptionHelper;
 import org.apache.chemistry.opencmis.server.shared.HttpUtils;
 import org.apache.chemistry.opencmis.server.shared.QueryStringHttpServletRequestWrapper;
-import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStreamFactory;
+import org.apache.chemistry.opencmis.server.shared.ServiceCall;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CmisBrowserBindingServlet extends HttpServlet {
+public class CmisBrowserBindingServlet extends AbstractCmisHttpServlet {
 
     private static final long serialVersionUID = 1L;
 
-    public static final String PARAM_CALL_CONTEXT_HANDLER = "callContextHandler";
-
     private static final Logger LOG = LoggerFactory.getLogger(CmisBrowserBindingServlet.class.getName());
 
-    private ThresholdOutputStreamFactory streamFactory;
-    private Dispatcher repositoryDispatcher;
-    private Dispatcher rootDispatcher;
-    private CallContextHandler callContextHandler;
+    private final Dispatcher repositoryDispatcher = new Dispatcher(false);
+    private final Dispatcher rootDispatcher = new Dispatcher(false);
+    private final static ErrorServiceCall ERROR_SERTVICE_CALL = new ErrorServiceCall();
+
+    public enum CallUrl {
+        SERVICE, REPOSITORY, ROOT
+    }
 
     @Override
     public void init(ServletConfig config) throws ServletException {
         super.init(config);
 
-        // initialize the call context handler
-        callContextHandler = null;
-        String callContextHandlerClass = config.getInitParameter(PARAM_CALL_CONTEXT_HANDLER);
-        if (callContextHandlerClass != null) {
-            try {
-                callContextHandler = (CallContextHandler) ClassLoaderUtil.loadClass(callContextHandlerClass)
-                        .newInstance();
-            } catch (Exception e) {
-                throw new ServletException("Could not load call context handler: " + e, e);
-            }
-        }
-
-        // get memory threshold and temp directory
-        CmisServiceFactory factory = (CmisServiceFactory) config.getServletContext().getAttribute(
-                CmisRepositoryContextListener.SERVICES_FACTORY);
+        // set the binding
+        setBinding(CallContext.BINDING_BROWSER);
 
-        if (factory == null) {
-            throw new CmisRuntimeException("Service factory not available! Configuration problem?");
-        }
+        // set CMIS version -> can only be 1.1
+        setCmisVersion(CmisVersion.CMIS_1_1);
 
-        // set up stream factory
-        streamFactory = ThresholdOutputStreamFactory.newInstance(factory.getTempDirectory(),
-                factory.getMemoryThreshold(), factory.getMaxContentSize(), factory.encryptTempFiles());
-
-        // initialize the dispatchers
-        repositoryDispatcher = new Dispatcher(false);
-        rootDispatcher = new Dispatcher(false);
-
-        try {
-            repositoryDispatcher.addResource(SELECTOR_REPOSITORY_INFO, METHOD_GET, RepositoryService.class,
-                    "getRepositoryInfo");
-            repositoryDispatcher
-                    .addResource(SELECTOR_LAST_RESULT, METHOD_GET, RepositoryService.class, "getLastResult");
-            repositoryDispatcher.addResource(SELECTOR_TYPE_CHILDREN, METHOD_GET, RepositoryService.class,
-                    "getTypeChildren");
-            repositoryDispatcher.addResource(SELECTOR_TYPE_DESCENDANTS, METHOD_GET, RepositoryService.class,
-                    "getTypeDescendants");
-            repositoryDispatcher.addResource(SELECTOR_TYPE_DEFINITION, METHOD_GET, RepositoryService.class,
-                    "getTypeDefinition");
-            repositoryDispatcher
-                    .addResource(CMISACTION_CREATE_TYPE, METHOD_POST, RepositoryService.class, "createType");
-            repositoryDispatcher
-                    .addResource(CMISACTION_UPDATE_TYPE, METHOD_POST, RepositoryService.class, "updateType");
-            repositoryDispatcher
-                    .addResource(CMISACTION_DELETE_TYPE, METHOD_POST, RepositoryService.class, "deleteType");
-            repositoryDispatcher.addResource(SELECTOR_QUERY, METHOD_GET, DiscoveryService.class, "query");
-            repositoryDispatcher.addResource(SELECTOR_CHECKEDOUT, METHOD_GET, NavigationService.class,
-                    "getCheckedOutDocs");
-            repositoryDispatcher.addResource(SELECTOR_CONTENT_CHANGES, METHOD_GET, DiscoveryService.class,
-                    "getContentChanges");
-            repositoryDispatcher.addResource(CMISACTION_QUERY, METHOD_POST, DiscoveryService.class, "query");
-            repositoryDispatcher.addResource(CMISACTION_CREATE_DOCUMENT, METHOD_POST, ObjectService.class,
-                    "createDocument");
-            repositoryDispatcher.addResource(CMISACTION_CREATE_DOCUMENT_FROM_SOURCE, METHOD_POST, ObjectService.class,
-                    "createDocumentFromSource");
-            repositoryDispatcher
-                    .addResource(CMISACTION_CREATE_POLICY, METHOD_POST, ObjectService.class, "createPolicy");
-            repositoryDispatcher.addResource(CMISACTION_CREATE_ITEM, METHOD_POST, ObjectService.class, "createItem");
-            repositoryDispatcher.addResource(CMISACTION_CREATE_RELATIONSHIP, METHOD_POST, ObjectService.class,
-                    "createRelationship");
-            repositoryDispatcher.addResource(CMISACTION_BULK_UPDATE, METHOD_POST, ObjectService.class,
-                    "bulkUpdateProperties");
-
-            rootDispatcher.addResource(SELECTOR_OBJECT, METHOD_GET, ObjectService.class, "getObject");
-            rootDispatcher.addResource(SELECTOR_PROPERTIES, METHOD_GET, ObjectService.class, "getProperties");
-            rootDispatcher.addResource(SELECTOR_ALLOWABLEACTIONS, METHOD_GET, ObjectService.class,
-                    "getAllowableActions");
-            rootDispatcher.addResource(SELECTOR_RENDITIONS, METHOD_GET, ObjectService.class, "getRenditions");
-            rootDispatcher.addResource(SELECTOR_CONTENT, METHOD_GET, ObjectService.class, "getContentStream");
-            rootDispatcher.addResource(SELECTOR_CHILDREN, METHOD_GET, NavigationService.class, "getChildren");
-            rootDispatcher.addResource(SELECTOR_DESCENDANTS, METHOD_GET, NavigationService.class, "getDescendants");
-            rootDispatcher.addResource(SELECTOR_FOLDER_TREE, METHOD_GET, NavigationService.class, "getFolderTree");
-            rootDispatcher.addResource(SELECTOR_PARENT, METHOD_GET, NavigationService.class, "getFolderParent");
-            rootDispatcher.addResource(SELECTOR_PARENTS, METHOD_GET, NavigationService.class, "getObjectParents");
-            rootDispatcher.addResource(SELECTOR_VERSIONS, METHOD_GET, VersioningService.class, "getAllVersions");
-            rootDispatcher.addResource(SELECTOR_RELATIONSHIPS, METHOD_GET, RelationshipService.class,
-                    "getObjectRelationships");
-            rootDispatcher.addResource(SELECTOR_CHECKEDOUT, METHOD_GET, NavigationService.class, "getCheckedOutDocs");
-            rootDispatcher.addResource(SELECTOR_POLICIES, METHOD_GET, PolicyService.class, "getAppliedPolicies");
-            rootDispatcher.addResource(SELECTOR_ACL, METHOD_GET, AclService.class, "getACL");
-
-            rootDispatcher.addResource(CMISACTION_CREATE_DOCUMENT, METHOD_POST, ObjectService.class, "createDocument");
-            rootDispatcher.addResource(CMISACTION_CREATE_DOCUMENT_FROM_SOURCE, METHOD_POST, ObjectService.class,
-                    "createDocumentFromSource");
-            rootDispatcher.addResource(CMISACTION_CREATE_FOLDER, METHOD_POST, ObjectService.class, "createFolder");
-            rootDispatcher.addResource(CMISACTION_CREATE_POLICY, METHOD_POST, ObjectService.class, "createPolicy");
-            rootDispatcher.addResource(CMISACTION_CREATE_ITEM, METHOD_POST, ObjectService.class, "createItem");
-            rootDispatcher.addResource(CMISACTION_UPDATE_PROPERTIES, METHOD_POST, ObjectService.class,
-                    "updateProperties");
-            rootDispatcher.addResource(CMISACTION_SET_CONTENT, METHOD_POST, ObjectService.class, "setContentStream");
-            rootDispatcher.addResource(CMISACTION_APPEND_CONTENT, METHOD_POST, ObjectService.class,
-                    "appendContentStream");
-            rootDispatcher.addResource(CMISACTION_DELETE_CONTENT, METHOD_POST, ObjectService.class,
-                    "deleteContentStream");
-            rootDispatcher.addResource(CMISACTION_DELETE, METHOD_POST, ObjectService.class, "deleteObject");
-            rootDispatcher.addResource(CMISACTION_DELETE_TREE, METHOD_POST, ObjectService.class, "deleteTree");
-            rootDispatcher.addResource(CMISACTION_MOVE, METHOD_POST, ObjectService.class, "moveObject");
-            rootDispatcher.addResource(CMISACTION_ADD_OBJECT_TO_FOLDER, METHOD_POST, MultiFilingService.class,
-                    "addObjectToFolder");
-            rootDispatcher.addResource(CMISACTION_REMOVE_OBJECT_FROM_FOLDER, METHOD_POST, MultiFilingService.class,
-                    "removeObjectFromFolder");
-            rootDispatcher.addResource(CMISACTION_CHECK_OUT, METHOD_POST, VersioningService.class, "checkOut");
-            rootDispatcher.addResource(CMISACTION_CANCEL_CHECK_OUT, METHOD_POST, VersioningService.class,
-                    "cancelCheckOut");
-            rootDispatcher.addResource(CMISACTION_CHECK_IN, METHOD_POST, VersioningService.class, "checkIn");
-            rootDispatcher.addResource(CMISACTION_APPLY_POLICY, METHOD_POST, PolicyService.class, "applyPolicy");
-            rootDispatcher.addResource(CMISACTION_REMOVE_POLICY, METHOD_POST, PolicyService.class, "removePolicy");
-            rootDispatcher.addResource(CMISACTION_APPLY_ACL, METHOD_POST, AclService.class, "applyACL");
-
-        } catch (NoSuchMethodException e) {
-            LOG.error("Cannot initialize dispatcher!", e);
-        }
+        // initialize repository resources
+        addRepositoryResource("", METHOD_GET, new RepositoryService.GetRepositories());
+        addRepositoryResource(SELECTOR_REPOSITORY_INFO, METHOD_GET, new RepositoryService.GetRepositoryInfo());
+        addRepositoryResource(SELECTOR_LAST_RESULT, METHOD_GET, new RepositoryService.GetLastResult());
+        addRepositoryResource(SELECTOR_TYPE_CHILDREN, METHOD_GET, new RepositoryService.GetTypeChildren());
+        addRepositoryResource(SELECTOR_TYPE_DESCENDANTS, METHOD_GET, new RepositoryService.GetTypeDescendants());
+        addRepositoryResource(SELECTOR_TYPE_DEFINITION, METHOD_GET, new RepositoryService.GetTypeDefinition());
+        addRepositoryResource(CMISACTION_CREATE_TYPE, METHOD_POST, new RepositoryService.CreateType());
+        addRepositoryResource(CMISACTION_UPDATE_TYPE, METHOD_POST, new RepositoryService.UpdateType());
+        addRepositoryResource(CMISACTION_DELETE_TYPE, METHOD_POST, new RepositoryService.DeleteType());
+        addRepositoryResource(SELECTOR_QUERY, METHOD_GET, new DiscoveryService.Query());
+        addRepositoryResource(SELECTOR_CHECKEDOUT, METHOD_GET, new NavigationService.GetCheckedOutDocs());
+        addRepositoryResource(SELECTOR_CONTENT_CHANGES, METHOD_GET, new DiscoveryService.GetContentChanges());
+
+        addRepositoryResource(CMISACTION_QUERY, METHOD_POST, new DiscoveryService.Query());
+        addRepositoryResource(CMISACTION_CREATE_DOCUMENT, METHOD_POST, new ObjectService.CreateDocument());
+        addRepositoryResource(CMISACTION_CREATE_DOCUMENT_FROM_SOURCE, METHOD_POST,
+                new ObjectService.CreateDocumentFromSource());
+        addRepositoryResource(CMISACTION_CREATE_POLICY, METHOD_POST, new ObjectService.CreatePolicy());
+        addRepositoryResource(CMISACTION_CREATE_ITEM, METHOD_POST, new ObjectService.CreateItem());
+        addRepositoryResource(CMISACTION_CREATE_RELATIONSHIP, METHOD_POST, new ObjectService.CreateRelationship());
+        addRepositoryResource(CMISACTION_BULK_UPDATE, METHOD_POST, new ObjectService.BulkUpdateProperties());
+
+        // initialize root resources
+        addRootResource(SELECTOR_OBJECT, METHOD_GET, new ObjectService.GetObject());
+        addRootResource(SELECTOR_PROPERTIES, METHOD_GET, new ObjectService.GetProperties());
+        addRootResource(SELECTOR_ALLOWABLEACTIONS, METHOD_GET, new ObjectService.GetAllowableActions());
+        addRootResource(SELECTOR_RENDITIONS, METHOD_GET, new ObjectService.GetRenditions());
+        addRootResource(SELECTOR_CONTENT, METHOD_GET, new ObjectService.GetContentStream());
+        addRootResource(SELECTOR_CHILDREN, METHOD_GET, new NavigationService.GetChildren());
+        addRootResource(SELECTOR_DESCENDANTS, METHOD_GET, new NavigationService.GetDescendants());
+        addRootResource(SELECTOR_FOLDER_TREE, METHOD_GET, new NavigationService.GetFolderTree());
+        addRootResource(SELECTOR_PARENT, METHOD_GET, new NavigationService.GetFolderParent());
+        addRootResource(SELECTOR_PARENTS, METHOD_GET, new NavigationService.GetObjectParents());
+        addRootResource(SELECTOR_VERSIONS, METHOD_GET, new VersioningService.GetAllVersions());
+        addRootResource(SELECTOR_RELATIONSHIPS, METHOD_GET, new RelationshipService.GetObjectRelationships());
+        addRootResource(SELECTOR_CHECKEDOUT, METHOD_GET, new NavigationService.GetCheckedOutDocs());
+        addRootResource(SELECTOR_POLICIES, METHOD_GET, new PolicyService.GetAppliedPolicies());
+        addRootResource(SELECTOR_ACL, METHOD_GET, new AclService.GetACL());
+
+        addRootResource(CMISACTION_CREATE_DOCUMENT, METHOD_POST, new ObjectService.CreateDocument());
+        addRootResource(CMISACTION_CREATE_DOCUMENT_FROM_SOURCE, METHOD_POST,
+                new ObjectService.CreateDocumentFromSource());
+        addRootResource(CMISACTION_CREATE_FOLDER, METHOD_POST, new ObjectService.CreateFolder());
+        addRootResource(CMISACTION_CREATE_POLICY, METHOD_POST, new ObjectService.CreatePolicy());
+        addRootResource(CMISACTION_CREATE_ITEM, METHOD_POST, new ObjectService.CreateItem());
+        addRootResource(CMISACTION_UPDATE_PROPERTIES, METHOD_POST, new ObjectService.UpdateProperties());
+        addRootResource(CMISACTION_SET_CONTENT, METHOD_POST, new ObjectService.SetContentStream());
+        addRootResource(CMISACTION_APPEND_CONTENT, METHOD_POST, new ObjectService.AppendContentStream());
+        addRootResource(CMISACTION_DELETE_CONTENT, METHOD_POST, new ObjectService.DeleteContentStream());
+        addRootResource(CMISACTION_DELETE, METHOD_POST, new ObjectService.DeleteObject());
+        addRootResource(CMISACTION_DELETE_TREE, METHOD_POST, new ObjectService.DeleteTree());
+        addRootResource(CMISACTION_MOVE, METHOD_POST, new ObjectService.MoveObject());
+        addRootResource(CMISACTION_ADD_OBJECT_TO_FOLDER, METHOD_POST, new MultiFilingService.AddObjectToFolder());
+        addRootResource(CMISACTION_REMOVE_OBJECT_FROM_FOLDER, METHOD_POST,
+                new MultiFilingService.RemoveObjectFromFolder());
+        addRootResource(CMISACTION_CHECK_OUT, METHOD_POST, new VersioningService.CheckOut());
+        addRootResource(CMISACTION_CANCEL_CHECK_OUT, METHOD_POST, new VersioningService.CancelCheckOut());
+        addRootResource(CMISACTION_CHECK_IN, METHOD_POST, new VersioningService.CheckIn());
+        addRootResource(CMISACTION_APPLY_POLICY, METHOD_POST, new PolicyService.ApplyPolicy());
+        addRootResource(CMISACTION_REMOVE_POLICY, METHOD_POST, new PolicyService.RemovePolicy());
+        addRootResource(CMISACTION_APPLY_ACL, METHOD_POST, new AclService.ApplyACL());
     }
 
     @Override
@@ -273,19 +215,18 @@ public class CmisBrowserBindingServlet e
             if (METHOD_GET.equals(method)) {
                 request = new QueryStringHttpServletRequestWrapper(request);
             } else if (METHOD_POST.equals(method)) {
-                request = new POSTHttpServletRequestWrapper(request, streamFactory);
+                request = new POSTHttpServletRequestWrapper(request, getThresholdOutputStreamFactory());
             } else {
                 throw new CmisNotSupportedException("Unsupported method");
             }
 
             // invoke token handler, if necessary
-            if (request.getParameter("login") != null && callContextHandler instanceof TokenHandler) {
-                ((TokenHandler) callContextHandler).service(getServletContext(), request, response);
+            if (request.getParameter("login") != null && getCallContextHandler() instanceof TokenHandler) {
+                ((TokenHandler) getCallContextHandler()).service(getServletContext(), request, response);
                 return;
             }
 
-            context = HttpUtils.createContext(request, response, getServletContext(), CallContext.BINDING_BROWSER,
-                    CmisVersion.CMIS_1_1, callContextHandler, streamFactory);
+            context = createContext(getServletContext(), request, response);
             dispatch(context, request, response);
         } catch (Exception e) {
             if (e instanceof CmisPermissionDeniedException) {
@@ -293,10 +234,10 @@ public class CmisBrowserBindingServlet e
                     response.setHeader("WWW-Authenticate", "Basic realm=\"CMIS\"");
                     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization Required");
                 } else {
-                    printError(e, request, response, context);
+                    printError(context, e, request, response);
                 }
             } else {
-                printError(e, request, response, context);
+                printError(context, e, request, response);
             }
         }
 
@@ -306,36 +247,42 @@ public class CmisBrowserBindingServlet e
 
     // --------------------------------------------------------
 
+    /**
+     * Registers a new repository resource.
+     */
+    protected void addRepositoryResource(String resource, String httpMethod, ServiceCall serviceCall) {
+        repositoryDispatcher.addResource(resource, httpMethod, serviceCall);
+    }
+
+    /**
+     * Registers a new root resource.
+     */
+    protected void addRootResource(String resource, String httpMethod, ServiceCall serviceCall) {
+        rootDispatcher.addResource(resource, httpMethod, serviceCall);
+    }
+
     private void dispatch(CallContext context, HttpServletRequest request, HttpServletResponse response)
             throws Exception {
+        BrowserCallContextImpl browserContext = (BrowserCallContextImpl) context;
         CmisService service = null;
         try {
-            // get services factory
-            CmisServiceFactory factory = (CmisServiceFactory) getServletContext().getAttribute(
-                    CmisRepositoryContextListener.SERVICES_FACTORY);
-
-            if (factory == null) {
-                throw new CmisRuntimeException("Service factory not available! Configuration problem?");
-            }
-
             // get the service
-            service = factory.getService(context);
+            service = getServiceFactory().getService(context);
 
             // analyze the path
             String[] pathFragments = HttpUtils.splitPath(request);
 
             if (pathFragments.length < 1) {
                 // root -> repository infos
-                RepositoryService.getRepositories(context, service, request, response);
+                repositoryDispatcher.dispatch("", METHOD_GET, context, service, null, request, response);
                 return;
             }
 
             // select dispatcher
-
             CallUrl callUrl = null;
             if (pathFragments.length == 1) {
                 callUrl = CallUrl.REPOSITORY;
-            } else if (BrowserBindingUtils.ROOT_PATH_FRAGMENT.equals(pathFragments[1])) {
+            } else if (AbstractBrowserServiceCall.ROOT_PATH_FRAGMENT.equals(pathFragments[1])) {
                 callUrl = CallUrl.ROOT;
             }
 
@@ -345,14 +292,11 @@ public class CmisBrowserBindingServlet e
 
             String method = request.getMethod();
             String repositoryId = pathFragments[0];
-            boolean methodFound = false;
+            boolean callServiceFound = false;
 
             if (METHOD_GET.equals(method)) {
-                String selector = getStringParameter(request, Constants.PARAM_SELECTOR);
-                String objectId = getStringParameter(request, PARAM_OBJECT_ID);
-
-                // add object id and object base type id to context
-                prepareContext(context, callUrl, service, repositoryId, objectId, null, request);
+                String selector = HttpUtils.getStringParameter(request, Constants.PARAM_SELECTOR);
+                String objectId = HttpUtils.getStringParameter(request, PARAM_OBJECT_ID);
 
                 // dispatch
                 if (callUrl == CallUrl.REPOSITORY) {
@@ -360,13 +304,16 @@ public class CmisBrowserBindingServlet e
                         selector = "";
                     }
 
-                    methodFound = repositoryDispatcher.dispatch(selector, method, context, service, repositoryId,
-                            request, response);
+                    browserContext.setCallDetails(service, objectId, null, null);
+                    callServiceFound = repositoryDispatcher.dispatch(selector, method, browserContext, service,
+                            repositoryId, request, response);
                 } else if (callUrl == CallUrl.ROOT) {
+                    browserContext.setCallDetails(service, objectId, pathFragments, null);
+
                     // set default method if necessary
                     if (selector == null) {
                         try {
-                            BaseTypeId basetype = BaseTypeId.fromValue((String) context.get(CONTEXT_BASETYPE_ID));
+                            BaseTypeId basetype = browserContext.getBaseTypeId();
                             switch (basetype) {
                             case CMIS_DOCUMENT:
                                 selector = SELECTOR_CONTENT;
@@ -383,34 +330,33 @@ public class CmisBrowserBindingServlet e
                         }
                     }
 
-                    methodFound = rootDispatcher.dispatch(selector, method, context, service, repositoryId, request,
-                            response);
+                    callServiceFound = rootDispatcher.dispatch(selector, method, browserContext, service, repositoryId,
+                            request, response);
                 }
             } else if (METHOD_POST.equals(method)) {
-                String cmisaction = getStringParameter(request, Constants.CONTROL_CMISACTION);
-                String objectId = getStringParameter(request, Constants.CONTROL_OBJECT_ID);
-                String token = getStringParameter(request, Constants.CONTROL_TOKEN);
+                String cmisaction = HttpUtils.getStringParameter(request, Constants.CONTROL_CMISACTION);
+                String objectId = HttpUtils.getStringParameter(request, Constants.CONTROL_OBJECT_ID);
+                String token = HttpUtils.getStringParameter(request, Constants.CONTROL_TOKEN);
 
                 if (cmisaction == null || cmisaction.length() == 0) {
                     throw new CmisNotSupportedException("Unknown action");
                 }
 
-                // add object id and object base type id to context
-                prepareContext(context, callUrl, service, repositoryId, objectId, token, request);
-
                 // dispatch
                 if (callUrl == CallUrl.REPOSITORY) {
-                    methodFound = repositoryDispatcher.dispatch(cmisaction, method, context, service, repositoryId,
-                            request, response);
+                    browserContext.setCallDetails(service, objectId, null, token);
+                    callServiceFound = repositoryDispatcher.dispatch(cmisaction, method, browserContext, service,
+                            repositoryId, request, response);
                 } else if (callUrl == CallUrl.ROOT) {
-                    methodFound = rootDispatcher.dispatch(cmisaction, method, context, service, repositoryId, request,
-                            response);
+                    browserContext.setCallDetails(service, objectId, pathFragments, token);
+                    callServiceFound = rootDispatcher.dispatch(cmisaction, method, browserContext, service,
+                            repositoryId, request, response);
                 }
             }
 
-            // if the dispatcher couldn't find a matching method, return an
-            // error message
-            if (!methodFound) {
+            // if the dispatcher couldn't find a matching service call
+            // -> return an error message
+            if (!callServiceFound) {
                 throw new CmisNotSupportedException("Unknown operation");
             }
         } finally {
@@ -423,81 +369,99 @@ public class CmisBrowserBindingServlet e
     /**
      * Translates an exception in an appropriate HTTP error code.
      */
-    private static int getErrorCode(CmisBaseException ex) {
-        if (ex instanceof CmisConstraintException) {
-            return 409;
-        } else if (ex instanceof CmisContentAlreadyExistsException) {
-            return 409;
-        } else if (ex instanceof CmisFilterNotValidException) {
-            return 400;
-        } else if (ex instanceof CmisInvalidArgumentException) {
-            return 400;
-        } else if (ex instanceof CmisNameConstraintViolationException) {
-            return 409;
-        } else if (ex instanceof CmisNotSupportedException) {
-            return 405;
-        } else if (ex instanceof CmisObjectNotFoundException) {
-            return 404;
-        } else if (ex instanceof CmisPermissionDeniedException) {
-            return 403;
-        } else if (ex instanceof CmisStorageException) {
-            return 500;
-        } else if (ex instanceof CmisStreamNotSupportedException) {
-            return 403;
-        } else if (ex instanceof CmisUpdateConflictException) {
-            return 409;
-        } else if (ex instanceof CmisVersioningException) {
-            return 409;
-        }
-
-        return 500;
+    protected int getErrorCode(CmisBaseException ex) {
+        return ERROR_SERTVICE_CALL.getErrorCode(ex);
     }
 
     /**
-     * Prints the error as JSON.
+     * Prints an error as JSON.
      */
-    private static void printError(Exception ex, HttpServletRequest request, HttpServletResponse response,
-            CallContext context) {
-        int statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-        String exceptionName = "runtime";
-
-        if (ex instanceof CmisRuntimeException) {
-            LOG.error(ex.getMessage(), ex);
-        } else if (ex instanceof CmisBaseException) {
-            statusCode = getErrorCode((CmisBaseException) ex);
-            exceptionName = ((CmisBaseException) ex).getExceptionName();
-        } else {
-            LOG.error(ex.getMessage(), ex);
+    protected void printError(CallContext context, Exception ex, HttpServletRequest request,
+            HttpServletResponse response) {
+        ERROR_SERTVICE_CALL.printError(context, ex, request, response);
+    }
+
+    static class ErrorServiceCall extends AbstractBrowserServiceCall {
+
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // no implementation
         }
 
-        String token = (context == null ? null : (String) context.get(CONTEXT_TOKEN));
+        public int getErrorCode(CmisBaseException ex) {
+            if (ex instanceof CmisConstraintException) {
+                return 409;
+            } else if (ex instanceof CmisContentAlreadyExistsException) {
+                return 409;
+            } else if (ex instanceof CmisFilterNotValidException) {
+                return 400;
+            } else if (ex instanceof CmisInvalidArgumentException) {
+                return 400;
+            } else if (ex instanceof CmisNameConstraintViolationException) {
+                return 409;
+            } else if (ex instanceof CmisNotSupportedException) {
+                return 405;
+            } else if (ex instanceof CmisObjectNotFoundException) {
+                return 404;
+            } else if (ex instanceof CmisPermissionDeniedException) {
+                return 403;
+            } else if (ex instanceof CmisStorageException) {
+                return 500;
+            } else if (ex instanceof CmisStreamNotSupportedException) {
+                return 403;
+            } else if (ex instanceof CmisUpdateConflictException) {
+                return 409;
+            } else if (ex instanceof CmisVersioningException) {
+                return 409;
+            }
 
-        if (token == null) {
-            setStatus(request, response, statusCode);
-            response.setContentType(JSON_MIME_TYPE);
-
-            JSONObject jsonResponse = new JSONObject();
-            jsonResponse.put(ERROR_EXCEPTION, exceptionName);
-            jsonResponse.put(ERROR_MESSAGE, ex.getMessage());
-
-            String st = ExceptionHelper.getStacktraceAsString(ex);
-            if (st != null) {
-                jsonResponse.put(ERROR_STACKTRACE, st);
-            }
-
-            try {
-                writeJSON(jsonResponse, request, response);
-            } catch (Exception e) {
-                LOG.error(e.getMessage(), e);
-            }
-        } else {
-            setStatus(request, response, HttpServletResponse.SC_OK);
-            response.setContentType(HTML_MIME_TYPE);
-            response.setContentLength(0);
-
-            if (context != null) {
-                setCookie(request, response, context.getRepositoryId(), token,
-                        createCookieValue(statusCode, null, exceptionName, ex.getMessage()));
+            return 500;
+        }
+
+        public void printError(CallContext context, Exception ex, HttpServletRequest request,
+                HttpServletResponse response) {
+            int statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+            String exceptionName = "runtime";
+
+            if (ex instanceof CmisRuntimeException) {
+                LOG.error(ex.getMessage(), ex);
+            } else if (ex instanceof CmisBaseException) {
+                statusCode = getErrorCode((CmisBaseException) ex);
+                exceptionName = ((CmisBaseException) ex).getExceptionName();
+            } else {
+                LOG.error(ex.getMessage(), ex);
+            }
+
+            String token = (context instanceof BrowserCallContextImpl ? ((BrowserCallContextImpl) context).getToken()
+                    : null);
+
+            if (token == null) {
+                setStatus(request, response, statusCode);
+                response.setContentType(JSON_MIME_TYPE);
+
+                JSONObject jsonResponse = new JSONObject();
+                jsonResponse.put(ERROR_EXCEPTION, exceptionName);
+                jsonResponse.put(ERROR_MESSAGE, ex.getMessage());
+
+                String st = ExceptionHelper.getStacktraceAsString(ex);
+                if (st != null) {
+                    jsonResponse.put(ERROR_STACKTRACE, st);
+                }
+
+                try {
+                    writeJSON(jsonResponse, request, response);
+                } catch (Exception e) {
+                    LOG.error(e.getMessage(), e);
+                }
+            } else {
+                setStatus(request, response, HttpServletResponse.SC_OK);
+                response.setContentType(HTML_MIME_TYPE);
+                response.setContentLength(0);
+
+                if (context != null) {
+                    setCookie(request, response, context.getRepositoryId(), token,
+                            createCookieValue(statusCode, null, exceptionName, ex.getMessage()));
+                }
             }
         }
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/DiscoveryService.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/DiscoveryService.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/DiscoveryService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/DiscoveryService.java Sat May 11 21:19:48 2013
@@ -23,10 +23,6 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_FILTER;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_POLICY_IDS;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_PROPERTIES;
-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;
 
@@ -48,68 +44,71 @@ import org.apache.chemistry.opencmis.com
 /**
  * Discovery Service operations.
  */
-public final class DiscoveryService {
-
-    private DiscoveryService() {
-    }
+public class DiscoveryService {
 
     /**
      * query.
      */
-    public static void query(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
-            HttpServletResponse response) throws Exception {
-        // get parameters
-        String statement = getStringParameter(request, Constants.PARAM_STATEMENT);
-        if (statement == null || statement.length() == 0) {
-            statement = getStringParameter(request, Constants.PARAM_Q);
-        }
-        Boolean searchAllVersions = getBooleanParameter(request, Constants.PARAM_SEARCH_ALL_VERSIONS);
-        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-                IncludeRelationships.class);
-        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-        BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        ObjectList results = service.query(repositoryId, statement, searchAllVersions, includeAllowableActions,
-                includeRelationships, renditionFilter, maxItems, skipCount, null);
+    public static class Query extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String statement = getStringParameter(request, Constants.PARAM_STATEMENT);
+            if (statement == null || statement.length() == 0) {
+                statement = getStringParameter(request, Constants.PARAM_Q);
+            }
+            Boolean searchAllVersions = getBooleanParameter(request, Constants.PARAM_SEARCH_ALL_VERSIONS);
+            Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+            IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                    IncludeRelationships.class);
+            String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+            BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+            BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            ObjectList results = service.query(repositoryId, statement, searchAllVersions, includeAllowableActions,
+                    includeRelationships, renditionFilter, maxItems, skipCount, null);
+
+            if (results == null) {
+                throw new CmisRuntimeException("Results are null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonResults = JSONConverter.convert(results, typeCache, JSONConverter.PropertyMode.QUERY,
+                    succinct);
 
-        if (results == null) {
-            throw new CmisRuntimeException("Results are null!");
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonResults, request, response);
         }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonResults = JSONConverter.convert(results, typeCache, JSONConverter.PropertyMode.QUERY, succinct);
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonResults, request, response);
     }
 
     /**
      * getContentChanges.
      */
-    public static void getContentChanges(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String changeLogToken = getStringParameter(request, PARAM_CHANGE_LOG_TOKEN);
-        Boolean includeProperties = getBooleanParameter(request, PARAM_PROPERTIES);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        Boolean includePolicyIds = getBooleanParameter(request, PARAM_POLICY_IDS);
-        Boolean includeAcl = getBooleanParameter(request, PARAM_ACL);
-        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        Holder<String> changeLogTokenHolder = new Holder<String>(changeLogToken);
-        ObjectList changes = service.getContentChanges(repositoryId, changeLogTokenHolder, includeProperties, filter,
-                includePolicyIds, includeAcl, maxItems, null);
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonChanges = JSONConverter.convert(changes, typeCache, JSONConverter.PropertyMode.CHANGE, succinct);
-        jsonChanges.put(JSONConstants.JSON_OBJECTLIST_CHANGE_LOG_TOKEN, changeLogTokenHolder.getValue());
+    public static class GetContentChanges extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String changeLogToken = getStringParameter(request, PARAM_CHANGE_LOG_TOKEN);
+            Boolean includeProperties = getBooleanParameter(request, PARAM_PROPERTIES);
+            String filter = getStringParameter(request, PARAM_FILTER);
+            Boolean includePolicyIds = getBooleanParameter(request, PARAM_POLICY_IDS);
+            Boolean includeAcl = getBooleanParameter(request, PARAM_ACL);
+            BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            Holder<String> changeLogTokenHolder = new Holder<String>(changeLogToken);
+            ObjectList changes = service.getContentChanges(repositoryId, changeLogTokenHolder, includeProperties,
+                    filter, includePolicyIds, includeAcl, maxItems, null);
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonChanges = JSONConverter.convert(changes, typeCache, JSONConverter.PropertyMode.CHANGE,
+                    succinct);
+            jsonChanges.put(JSONConstants.JSON_OBJECTLIST_CHANGE_LOG_TOKEN, changeLogTokenHolder.getValue());
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonChanges, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonChanges, request, response);
+        }
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultiFilingService.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/MultiFilingService.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/MultiFilingService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/MultiFilingService.java Sat May 11 21:19:48 2013
@@ -19,15 +19,6 @@
 package org.apache.chemistry.opencmis.server.impl.browser;
 
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_FOLDER_ID;
-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.getSimpleObject;
-import static org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils.setStatus;
-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 javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -50,69 +41,71 @@ public class MultiFilingService {
     /*
      * addObjectToFolder.
      */
-    public static void addObjectToFolder(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String folderId = getStringParameter(request, PARAM_FOLDER_ID);
-        Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        service.addObjectToFolder(repositoryId, objectId, folderId, allVersions, null);
-
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
-
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
-
-        // set headers
-        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        response.setHeader("Location", location);
+    public static class AddObjectToFolder 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 folderId = getStringParameter(request, PARAM_FOLDER_ID);
+            Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            service.addObjectToFolder(repositoryId, objectId, folderId, allVersions, null);
+
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
+
+            // 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);
 
-        // return object
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(object, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        writeJSON(jsonObject, request, response);
+            writeJSON(jsonObject, request, response);
+        }
     }
 
     /*
      * removeObjectFromFolder.
      */
-    public static void removeObjectFromFolder(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String objectId = (String) context.get(CONTEXT_OBJECT_ID);
-        String folderId = getStringParameter(request, PARAM_FOLDER_ID);
-        boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
-
-        // execute
-        Holder<String> objectIdHolder = new Holder<String>(objectId);
-        service.removeObjectFromFolder(repositoryId, objectId, folderId, null);
-
-        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
-
-        ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
-        if (object == null) {
-            throw new CmisRuntimeException("Object is null!");
-        }
-
-        // set headers
-        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-        setStatus(request, response, HttpServletResponse.SC_CREATED);
-        response.setHeader("Location", location);
+    public static class RemoveObjectFromFolder 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 folderId = getStringParameter(request, PARAM_FOLDER_ID);
+            boolean succinct = getBooleanParameter(request, Constants.CONTROL_SUCCINCT, false);
+
+            // execute
+            Holder<String> objectIdHolder = new Holder<String>(objectId);
+            service.removeObjectFromFolder(repositoryId, objectId, folderId, null);
+
+            String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+
+            ObjectData object = getSimpleObject(service, repositoryId, newObjectId);
+            if (object == null) {
+                throw new CmisRuntimeException("Object is null!");
+            }
+
+            // 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);
 
-        // return object
-        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/NavigationService.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/NavigationService.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/NavigationService.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/NavigationService.java Sat May 11 21:19:48 2013
@@ -28,11 +28,6 @@ import static org.apache.chemistry.openc
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_RELATIVE_PATH_SEGMENT;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_RENDITION_FILTER;
 import static org.apache.chemistry.opencmis.commons.impl.Constants.PARAM_SKIP_COUNT;
-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;
 import java.util.List;
@@ -58,200 +53,210 @@ import org.apache.chemistry.opencmis.com
 /**
  * Navigation Service operations.
  */
-public final class NavigationService {
-
-    private NavigationService() {
-    }
+public class NavigationService {
 
     /**
      * getChildren.
      */
-    public static void getChildren(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        String orderBy = getStringParameter(request, PARAM_ORDER_BY);
-        Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
-        IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
-                IncludeRelationships.class);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        Boolean includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
-        BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
-        BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        ObjectInFolderList children = service.getChildren(repositoryId, folderId, filter, orderBy,
-                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, maxItems,
-                skipCount, null);
-
-        if (children == null) {
-            throw new CmisRuntimeException("Children are null!");
-        }
+    public static class GetChildren 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 filter = getStringParameter(request, PARAM_FILTER);
+            String orderBy = getStringParameter(request, PARAM_ORDER_BY);
+            Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
+            IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
+                    IncludeRelationships.class);
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            Boolean includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
+            BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
+            BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            ObjectInFolderList children = service.getChildren(repositoryId, folderId, filter, orderBy,
+                    includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, maxItems,
+                    skipCount, null);
+
+            if (children == null) {
+                throw new CmisRuntimeException("Children are null!");
+            }
 
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonChildren = JSONConverter.convert(children, typeCache, succinct);
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonChildren = JSONConverter.convert(children, typeCache, succinct);
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonChildren, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonChildren, request, response);
+        }
     }
 
     /**
      * getDescendants.
      */
-    public static void getDescendants(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        BigInteger depth = getBigIntegerParameter(request, PARAM_DEPTH);
-        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 includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        List<ObjectInFolderContainer> descendants = service.getDescendants(repositoryId, folderId, depth, filter,
-                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null);
-
-        if (descendants == null) {
-            throw new CmisRuntimeException("Descendants are null!");
-        }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONArray jsonDescendants = new JSONArray();
-        for (ObjectInFolderContainer descendant : descendants) {
-            jsonDescendants.add(JSONConverter.convert(descendant, typeCache, succinct));
-        }
+    public static class GetDescendants extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            BigInteger depth = getBigIntegerParameter(request, PARAM_DEPTH);
+            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 includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            List<ObjectInFolderContainer> descendants = service.getDescendants(repositoryId, folderId, depth, filter,
+                    includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null);
+
+            if (descendants == null) {
+                throw new CmisRuntimeException("Descendants are null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONArray jsonDescendants = new JSONArray();
+            for (ObjectInFolderContainer descendant : descendants) {
+                jsonDescendants.add(JSONConverter.convert(descendant, typeCache, succinct));
+            }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonDescendants, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonDescendants, request, response);
+        }
     }
 
     /**
      * getFolderTree.
      */
-    public static void getFolderTree(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        BigInteger depth = getBigIntegerParameter(request, PARAM_DEPTH);
-        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 includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        List<ObjectInFolderContainer> folderTree = service.getFolderTree(repositoryId, folderId, depth, filter,
-                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null);
-
-        if (folderTree == null) {
-            throw new CmisRuntimeException("Folder Tree are null!");
-        }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONArray jsonDescendants = new JSONArray();
-        for (ObjectInFolderContainer descendant : folderTree) {
-            jsonDescendants.add(JSONConverter.convert(descendant, typeCache, succinct));
-        }
+    public static class GetFolderTree extends AbstractBrowserServiceCall {
+        public void serve(CallContext context, CmisService service, String repositoryId, HttpServletRequest request,
+                HttpServletResponse response) throws Exception {
+            // get parameters
+            String folderId = ((BrowserCallContextImpl) context).getObjectId();
+            BigInteger depth = getBigIntegerParameter(request, PARAM_DEPTH);
+            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 includePathSegment = getBooleanParameter(request, PARAM_PATH_SEGMENT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            List<ObjectInFolderContainer> folderTree = service.getFolderTree(repositoryId, folderId, depth, filter,
+                    includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null);
+
+            if (folderTree == null) {
+                throw new CmisRuntimeException("Folder Tree are null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONArray jsonDescendants = new JSONArray();
+            for (ObjectInFolderContainer descendant : folderTree) {
+                jsonDescendants.add(JSONConverter.convert(descendant, typeCache, succinct));
+            }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonDescendants, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonDescendants, request, response);
+        }
     }
 
     /**
      * getFolderParent.
      */
-    public static void getFolderParent(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
-        ObjectData parent = service.getFolderParent(repositoryId, objectId, filter, null);
+    public static class GetFolderParent 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
+            ObjectData parent = service.getFolderParent(repositoryId, objectId, filter, null);
+
+            if (parent == null) {
+                throw new CmisRuntimeException("Parent is null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonObject = JSONConverter.convert(parent, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        if (parent == null) {
-            throw new CmisRuntimeException("Parent is null!");
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonObject, request, response);
         }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonObject = JSONConverter.convert(parent, typeCache, JSONConverter.PropertyMode.OBJECT, succinct);
-
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonObject, request, response);
     }
 
     /**
      * getObjectParents.
      */
-    public static void getObjectParents(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 includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
-        IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
-                IncludeRelationships.class);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        Boolean includeRelativePathSegment = getBooleanParameter(request, PARAM_RELATIVE_PATH_SEGMENT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        List<ObjectParentData> parents = service.getObjectParents(repositoryId, objectId, filter,
-                includeAllowableActions, includeRelationships, renditionFilter, includeRelativePathSegment, null);
-
-        if (parents == null) {
-            throw new CmisRuntimeException("Parents are null!");
-        }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONArray jsonParents = new JSONArray();
-        for (ObjectParentData parent : parents) {
-            jsonParents.add(JSONConverter.convert(parent, typeCache, succinct));
-        }
+    public static class GetObjectParents 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 includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
+            IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
+                    IncludeRelationships.class);
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            Boolean includeRelativePathSegment = getBooleanParameter(request, PARAM_RELATIVE_PATH_SEGMENT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            List<ObjectParentData> parents = service.getObjectParents(repositoryId, objectId, filter,
+                    includeAllowableActions, includeRelationships, renditionFilter, includeRelativePathSegment, null);
+
+            if (parents == null) {
+                throw new CmisRuntimeException("Parents are null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONArray jsonParents = new JSONArray();
+            for (ObjectParentData parent : parents) {
+                jsonParents.add(JSONConverter.convert(parent, typeCache, succinct));
+            }
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonParents, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonParents, request, response);
+        }
     }
 
     /**
      * getCheckedOutDocs.
      */
-    public static void getCheckedOutDocs(CallContext context, CmisService service, String repositoryId,
-            HttpServletRequest request, HttpServletResponse response) throws Exception {
-        // get parameters
-        String folderId = (String) context.get(CONTEXT_OBJECT_ID);
-        String filter = getStringParameter(request, PARAM_FILTER);
-        String orderBy = getStringParameter(request, PARAM_ORDER_BY);
-        Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
-        IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
-                IncludeRelationships.class);
-        String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
-        BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
-        BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
-        boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
-
-        // execute
-        ObjectList checkedout = service.getCheckedOutDocs(repositoryId, folderId, filter, orderBy,
-                includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null);
-
-        if (checkedout == null) {
-            throw new CmisRuntimeException("Checked out list is null!");
-        }
-
-        TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
-        JSONObject jsonCheckedOut = JSONConverter.convert(checkedout, typeCache, JSONConverter.PropertyMode.OBJECT,
-                succinct);
+    public static class GetCheckedOutDocs 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 filter = getStringParameter(request, PARAM_FILTER);
+            String orderBy = getStringParameter(request, PARAM_ORDER_BY);
+            Boolean includeAllowableActions = getBooleanParameter(request, PARAM_ALLOWABLE_ACTIONS);
+            IncludeRelationships includeRelationships = getEnumParameter(request, PARAM_RELATIONSHIPS,
+                    IncludeRelationships.class);
+            String renditionFilter = getStringParameter(request, PARAM_RENDITION_FILTER);
+            BigInteger maxItems = getBigIntegerParameter(request, PARAM_MAX_ITEMS);
+            BigInteger skipCount = getBigIntegerParameter(request, PARAM_SKIP_COUNT);
+            boolean succinct = getBooleanParameter(request, Constants.PARAM_SUCCINCT, false);
+
+            // execute
+            ObjectList checkedout = service.getCheckedOutDocs(repositoryId, folderId, filter, orderBy,
+                    includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null);
+
+            if (checkedout == null) {
+                throw new CmisRuntimeException("Checked out list is null!");
+            }
+
+            TypeCache typeCache = new ServerTypeCacheImpl(repositoryId, service);
+            JSONObject jsonCheckedOut = JSONConverter.convert(checkedout, typeCache, JSONConverter.PropertyMode.OBJECT,
+                    succinct);
 
-        response.setStatus(HttpServletResponse.SC_OK);
-        BrowserBindingUtils.writeJSON(jsonCheckedOut, request, response);
+            response.setStatus(HttpServletResponse.SC_OK);
+            writeJSON(jsonCheckedOut, request, response);
+        }
     }
 }