chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dcaru...@apache.org
Subject svn commit: r936938 [3/29] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-server: chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/ chemistry-opencmis-server-bindings/src/main/java/org/apache/chemi...
Date Thu, 22 Apr 2010 16:28:00 GMT
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CmisAtomPubServlet.java Thu Apr 22 16:27:57 2010
@@ -57,264 +57,264 @@ import org.apache.commons.logging.LogFac
  */
 public class CmisAtomPubServlet extends HttpServlet {
 
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-	private static final String PARAM_CALL_CONTEXT_HANDLER = "callContextHandler";
+    private static final String PARAM_CALL_CONTEXT_HANDLER = "callContextHandler";
 
-	private static final String METHOD_GET = "GET";
-	private static final String METHOD_POST = "POST";
-	private static final String METHOD_PUT = "PUT";
-	private static final String METHOD_DELETE = "DELETE";
-
-	private static final Log LOG = LogFactory.getLog(CmisAtomPubServlet.class.getName());
-
-	private Dispatcher fDispatcher;
-	private CallContextHandler fCallContextHandler;
-
-	@Override
-	public void init(ServletConfig config) throws ServletException {
-		super.init(config);
-
-		// initialize the call context handler
-		fCallContextHandler = null;
-		String callContextHandlerClass = config.getInitParameter(PARAM_CALL_CONTEXT_HANDLER);
-		if (callContextHandlerClass != null) {
-			try {
-				fCallContextHandler = (CallContextHandler) Class.forName(callContextHandlerClass).newInstance();
-			} catch (Exception e) {
-				throw new ServletException("Could not load call context handler: " + e, e);
-			}
-		}
-
-		// initialize the dispatcher
-		fDispatcher = new Dispatcher();
-
-		try {
-			fDispatcher
-					.addResource(AtomPubUtils.RESOURCE_TYPES, METHOD_GET, RepositoryService.class, "getTypeChildren");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_TYPESDESC, METHOD_GET, RepositoryService.class,
-					"getTypeDescendants");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_TYPE, METHOD_GET, RepositoryService.class,
-					"getTypeDefinition");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CHILDREN, METHOD_GET, NavigationService.class, "getChildren");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_DESCENDANTS, METHOD_GET, NavigationService.class,
-					"getDescendants");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_FOLDERTREE, METHOD_GET, NavigationService.class,
-					"getFolderTree");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_PARENTS, METHOD_GET, NavigationService.class,
-					"getObjectParents");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CHECKEDOUT, METHOD_GET, NavigationService.class,
-					"getCheckedOutDocs");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_GET, ObjectService.class, "getObject");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_OBJECTBYID, METHOD_GET, ObjectService.class, "getObject");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_OBJECTBYPATH, METHOD_GET, ObjectService.class,
-					"getObjectByPath");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ALLOWABLEACIONS, METHOD_GET, ObjectService.class,
-					"getAllowableActions");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_GET, ObjectService.class, "getContentStream");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_PUT, ObjectService.class, "setContentStream");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_DELETE, ObjectService.class,
-					"deleteContentStream");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CHILDREN, METHOD_POST, ObjectService.class, "create");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_RELATIONSHIPS, METHOD_POST, ObjectService.class,
-					"createRelationship");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_PUT, ObjectService.class, "updateProperties");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_DELETE, ObjectService.class, "deleteObject");
-			fDispatcher
-					.addResource(AtomPubUtils.RESOURCE_DESCENDANTS, METHOD_DELETE, ObjectService.class, "deleteTree");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CHECKEDOUT, METHOD_POST, VersioningService.class, "checkOut");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_VERSIONS, METHOD_GET, VersioningService.class,
-					"getAllVersions");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_VERSIONS, METHOD_DELETE, VersioningService.class,
-					"deleteAllVersions");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_QUERY, METHOD_GET, DiscoveryService.class, "query");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_QUERY, METHOD_POST, DiscoveryService.class, "query");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_CHANGES, METHOD_GET, DiscoveryService.class,
-					"getContentChanges");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_RELATIONSHIPS, METHOD_GET, RelationshipService.class,
-					"getObjectRelationships");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_UNFILED, METHOD_POST, MultiFilingService.class,
-					"removeObjectFromFolder");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ACL, METHOD_GET, AclService.class, "getAcl");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_ACL, METHOD_PUT, AclService.class, "applyAcl");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_GET, PolicyService.class,
-					"getAppliedPolicies");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_POST, PolicyService.class, "applyPolicy");
-			fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_DELETE, PolicyService.class, "removePolicy");
-		} catch (NoSuchMethodException e) {
-			LOG.error("Cannot initialize dispatcher!", e);
-		}
-	}
-
-	@Override
-	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
-			IOException {
-
-		// create a context object, dispatch and handle exceptions
-		CallContext context = null;
-		try {
-			context = createContext(request);
-			dispatch(context, request, response);
-		} catch (Exception e) {
-			if (e instanceof CmisPermissionDeniedException) {
-				if ((context == null) || (context.getUsername() == null)) {
-					response.setHeader("WWW-Authenticate", "Basic realm=\"CMIS\"");
-					response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization Required");
-				} else {
-					response.sendError(getErrorCode((CmisPermissionDeniedException) e), e.getMessage());
-				}
-			} else if (e instanceof CmisRuntimeException) {
-				LOG.error(e.getMessage(), e);
-				response.sendError(getErrorCode((CmisRuntimeException) e), e.getMessage());
-			} else if (e instanceof CmisBaseException) {
-				response.sendError(getErrorCode((CmisBaseException) e), e.getMessage());
-			} else {
-				LOG.error(e.getMessage(), e);
-				response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
-			}
-		}
-
-		// we are done.
-		response.flushBuffer();
-	}
-
-	/**
-	 * Dispatches to feed, entry or whatever.
-	 */
-	private void dispatch(CallContext context, HttpServletRequest request, HttpServletResponse response)
-			throws Exception {
-
-		// get services factory
-		AbstractServicesFactory servicesFactory = (AbstractServicesFactory) getServletContext().getAttribute(
-				CmisRepositoryContextListener.SERVICES_FACTORY);
-
-		// analyze the path
-		String[] pathFragments = splitPath(request);
-
-		if (pathFragments.length < 2) {
-			// root -> service document
-			RepositoryService.getRepositories(context, servicesFactory, request, response);
-			return;
-		}
-
-		String method = request.getMethod();
-		String repositoryId = pathFragments[0];
-		String resource = pathFragments[1];
-
-		// dispatch
-		boolean methodFound = fDispatcher.dispatch(resource, method, context, servicesFactory, repositoryId, request,
-				response);
-
-		// if the dispatcher couldn't find a matching method, return an error
-		// message
-		if (!methodFound) {
-			response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Unknown operation");
-		}
-	}
-
-	/**
-	 * Decodes basic auth and creates a {@link CallContext} object.
-	 */
-	protected CallContext createContext(HttpServletRequest request) {
-		String[] pathFragments = splitPath(request);
-
-		String repositoryId = null;
-		if (pathFragments.length > 0) {
-			repositoryId = pathFragments[0];
-		}
-
-		CallContextImpl context = new CallContextImpl(CallContext.BINDING_ATOMPUB, repositoryId, true);
-
-		// call call text handler
-		if (fCallContextHandler != null) {
-			Map<String, String> callContextMap = fCallContextHandler.getCallContextMap(request);
-			if (callContextMap != null) {
-				for (Map.Entry<String, String> e : callContextMap.entrySet()) {
-					context.put(e.getKey(), e.getValue());
-				}
-			}
-		}
-
-		// decode range
-		String rangeHeader = request.getHeader("Range");
-		if (rangeHeader != null) {
-			rangeHeader = rangeHeader.trim();
-			BigInteger offset = null;
-			BigInteger length = null;
-
-			int eq = rangeHeader.indexOf('=');
-			int ds = rangeHeader.indexOf('-');
-			if ((eq > 0) && (ds > eq)) {
-				String offsetStr = rangeHeader.substring(eq + 1, ds).trim();
-				if (offsetStr.length() > 0) {
-					offset = new BigInteger(offsetStr);
-				}
-
-				if (ds < rangeHeader.length()) {
-					String lengthStr = rangeHeader.substring(ds + 1).trim();
-					if (lengthStr.length() > 0) {
-						if (offset == null) {
-							length = new BigInteger(lengthStr);
-						} else {
-							length = (new BigInteger(lengthStr)).subtract(offset);
-						}
-					}
-
-					if (offset != null) {
-						context.put(CallContext.OFFSET, offset.toString());
-					}
-					if (length != null) {
-						context.put(CallContext.LENGTH, length.toString());
-					}
-				}
-			}
-		}
-
-		return context;
-	}
-
-	/**
-	 * Splits the path into its fragments.
-	 */
-	private String[] splitPath(HttpServletRequest request) {
-		String p = request.getPathInfo();
-		if (p == null) {
-			return new String[0];
-		}
-
-		return p.substring(1).split("/");
-	}
-
-	/**
-	 * Translates an exception in an appropriate HTTP error code.
-	 */
-	private 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;
-		}
+    private static final String METHOD_GET = "GET";
+    private static final String METHOD_POST = "POST";
+    private static final String METHOD_PUT = "PUT";
+    private static final String METHOD_DELETE = "DELETE";
+
+    private static final Log LOG = LogFactory.getLog(CmisAtomPubServlet.class.getName());
+
+    private Dispatcher fDispatcher;
+    private CallContextHandler fCallContextHandler;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+
+        // initialize the call context handler
+        fCallContextHandler = null;
+        String callContextHandlerClass = config.getInitParameter(PARAM_CALL_CONTEXT_HANDLER);
+        if (callContextHandlerClass != null) {
+            try {
+                fCallContextHandler = (CallContextHandler) Class.forName(callContextHandlerClass).newInstance();
+            } catch (Exception e) {
+                throw new ServletException("Could not load call context handler: " + e, e);
+            }
+        }
+
+        // initialize the dispatcher
+        fDispatcher = new Dispatcher();
+
+        try {
+            fDispatcher
+                    .addResource(AtomPubUtils.RESOURCE_TYPES, METHOD_GET, RepositoryService.class, "getTypeChildren");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_TYPESDESC, METHOD_GET, RepositoryService.class,
+                    "getTypeDescendants");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_TYPE, METHOD_GET, RepositoryService.class,
+                    "getTypeDefinition");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CHILDREN, METHOD_GET, NavigationService.class, "getChildren");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_DESCENDANTS, METHOD_GET, NavigationService.class,
+                    "getDescendants");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_FOLDERTREE, METHOD_GET, NavigationService.class,
+                    "getFolderTree");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_PARENTS, METHOD_GET, NavigationService.class,
+                    "getObjectParents");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CHECKEDOUT, METHOD_GET, NavigationService.class,
+                    "getCheckedOutDocs");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_GET, ObjectService.class, "getObject");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_OBJECTBYID, METHOD_GET, ObjectService.class, "getObject");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_OBJECTBYPATH, METHOD_GET, ObjectService.class,
+                    "getObjectByPath");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ALLOWABLEACIONS, METHOD_GET, ObjectService.class,
+                    "getAllowableActions");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_GET, ObjectService.class, "getContentStream");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_PUT, ObjectService.class, "setContentStream");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CONTENT, METHOD_DELETE, ObjectService.class,
+                    "deleteContentStream");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CHILDREN, METHOD_POST, ObjectService.class, "create");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_RELATIONSHIPS, METHOD_POST, ObjectService.class,
+                    "createRelationship");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_PUT, ObjectService.class, "updateProperties");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ENTRY, METHOD_DELETE, ObjectService.class, "deleteObject");
+            fDispatcher
+                    .addResource(AtomPubUtils.RESOURCE_DESCENDANTS, METHOD_DELETE, ObjectService.class, "deleteTree");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CHECKEDOUT, METHOD_POST, VersioningService.class, "checkOut");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_VERSIONS, METHOD_GET, VersioningService.class,
+                    "getAllVersions");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_VERSIONS, METHOD_DELETE, VersioningService.class,
+                    "deleteAllVersions");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_QUERY, METHOD_GET, DiscoveryService.class, "query");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_QUERY, METHOD_POST, DiscoveryService.class, "query");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_CHANGES, METHOD_GET, DiscoveryService.class,
+                    "getContentChanges");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_RELATIONSHIPS, METHOD_GET, RelationshipService.class,
+                    "getObjectRelationships");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_UNFILED, METHOD_POST, MultiFilingService.class,
+                    "removeObjectFromFolder");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ACL, METHOD_GET, AclService.class, "getAcl");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_ACL, METHOD_PUT, AclService.class, "applyAcl");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_GET, PolicyService.class,
+                    "getAppliedPolicies");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_POST, PolicyService.class, "applyPolicy");
+            fDispatcher.addResource(AtomPubUtils.RESOURCE_POLICIES, METHOD_DELETE, PolicyService.class, "removePolicy");
+        } catch (NoSuchMethodException e) {
+            LOG.error("Cannot initialize dispatcher!", e);
+        }
+    }
+
+    @Override
+    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+            IOException {
+
+        // create a context object, dispatch and handle exceptions
+        CallContext context = null;
+        try {
+            context = createContext(request);
+            dispatch(context, request, response);
+        } catch (Exception e) {
+            if (e instanceof CmisPermissionDeniedException) {
+                if ((context == null) || (context.getUsername() == null)) {
+                    response.setHeader("WWW-Authenticate", "Basic realm=\"CMIS\"");
+                    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization Required");
+                } else {
+                    response.sendError(getErrorCode((CmisPermissionDeniedException) e), e.getMessage());
+                }
+            } else if (e instanceof CmisRuntimeException) {
+                LOG.error(e.getMessage(), e);
+                response.sendError(getErrorCode((CmisRuntimeException) e), e.getMessage());
+            } else if (e instanceof CmisBaseException) {
+                response.sendError(getErrorCode((CmisBaseException) e), e.getMessage());
+            } else {
+                LOG.error(e.getMessage(), e);
+                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+            }
+        }
+
+        // we are done.
+        response.flushBuffer();
+    }
+
+    /**
+     * Dispatches to feed, entry or whatever.
+     */
+    private void dispatch(CallContext context, HttpServletRequest request, HttpServletResponse response)
+            throws Exception {
+
+        // get services factory
+        AbstractServicesFactory servicesFactory = (AbstractServicesFactory) getServletContext().getAttribute(
+                CmisRepositoryContextListener.SERVICES_FACTORY);
+
+        // analyze the path
+        String[] pathFragments = splitPath(request);
+
+        if (pathFragments.length < 2) {
+            // root -> service document
+            RepositoryService.getRepositories(context, servicesFactory, request, response);
+            return;
+        }
+
+        String method = request.getMethod();
+        String repositoryId = pathFragments[0];
+        String resource = pathFragments[1];
+
+        // dispatch
+        boolean methodFound = fDispatcher.dispatch(resource, method, context, servicesFactory, repositoryId, request,
+                response);
+
+        // if the dispatcher couldn't find a matching method, return an error
+        // message
+        if (!methodFound) {
+            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Unknown operation");
+        }
+    }
+
+    /**
+     * Decodes basic auth and creates a {@link CallContext} object.
+     */
+    protected CallContext createContext(HttpServletRequest request) {
+        String[] pathFragments = splitPath(request);
+
+        String repositoryId = null;
+        if (pathFragments.length > 0) {
+            repositoryId = pathFragments[0];
+        }
+
+        CallContextImpl context = new CallContextImpl(CallContext.BINDING_ATOMPUB, repositoryId, true);
+
+        // call call text handler
+        if (fCallContextHandler != null) {
+            Map<String, String> callContextMap = fCallContextHandler.getCallContextMap(request);
+            if (callContextMap != null) {
+                for (Map.Entry<String, String> e : callContextMap.entrySet()) {
+                    context.put(e.getKey(), e.getValue());
+                }
+            }
+        }
+
+        // decode range
+        String rangeHeader = request.getHeader("Range");
+        if (rangeHeader != null) {
+            rangeHeader = rangeHeader.trim();
+            BigInteger offset = null;
+            BigInteger length = null;
+
+            int eq = rangeHeader.indexOf('=');
+            int ds = rangeHeader.indexOf('-');
+            if ((eq > 0) && (ds > eq)) {
+                String offsetStr = rangeHeader.substring(eq + 1, ds).trim();
+                if (offsetStr.length() > 0) {
+                    offset = new BigInteger(offsetStr);
+                }
+
+                if (ds < rangeHeader.length()) {
+                    String lengthStr = rangeHeader.substring(ds + 1).trim();
+                    if (lengthStr.length() > 0) {
+                        if (offset == null) {
+                            length = new BigInteger(lengthStr);
+                        } else {
+                            length = (new BigInteger(lengthStr)).subtract(offset);
+                        }
+                    }
+
+                    if (offset != null) {
+                        context.put(CallContext.OFFSET, offset.toString());
+                    }
+                    if (length != null) {
+                        context.put(CallContext.LENGTH, length.toString());
+                    }
+                }
+            }
+        }
+
+        return context;
+    }
+
+    /**
+     * Splits the path into its fragments.
+     */
+    private String[] splitPath(HttpServletRequest request) {
+        String p = request.getPathInfo();
+        if (p == null) {
+            return new String[0];
+        }
+
+        return p.substring(1).split("/");
+    }
+
+    /**
+     * Translates an exception in an appropriate HTTP error code.
+     */
+    private 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;
-	}
+        return 500;
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/DiscoveryService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/DiscoveryService.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/DiscoveryService.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/DiscoveryService.java Thu Apr 22 16:27:57 2010
@@ -62,220 +62,220 @@ import org.apache.chemistry.opencmis.ser
  */
 public class DiscoveryService {
 
-	private static final String METHOD_GET = "GET";
-	private static final String METHOD_POST = "POST";
+    private static final String METHOD_GET = "GET";
+    private static final String METHOD_POST = "POST";
 
-	/**
-	 * Query.
-	 */
-	public static void query(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisDiscoveryService service = factory.getDiscoveryService();
-
-		// get parameters
-		String statement = null;
-		Boolean searchAllVersions = null;
-		Boolean includeAllowableActions = null;
-		IncludeRelationships includeRelationships = null;
-		String renditionFilter = null;
-		BigInteger maxItems = null;
-		BigInteger skipCount = null;
-
-		int statusCode = 0;
-
-		if (METHOD_POST.equals(request.getMethod())) {
-			// POST -> read from stream
-			Object queryRequest = null;
-			try {
-				Unmarshaller u = JaxBHelper.createUnmarshaller();
-				queryRequest = u.unmarshal(request.getInputStream());
-			} catch (Exception e) {
-				throw new CmisInvalidArgumentException("Invalid query request: " + e, e);
-			}
-
-			if (!(queryRequest instanceof JAXBElement<?>)) {
-				throw new CmisInvalidArgumentException("Not a query document!");
-			}
-
-			if (!(((JAXBElement<?>) queryRequest).getValue() instanceof CmisQueryType)) {
-				throw new CmisInvalidArgumentException("Not a query document!");
-			}
-
-			CmisQueryType queryType = (CmisQueryType) ((JAXBElement<?>) queryRequest).getValue();
-
-			statement = queryType.getStatement();
-			searchAllVersions = queryType.isSearchAllVersions();
-			includeAllowableActions = queryType.isIncludeAllowableActions();
-			includeRelationships = convert(IncludeRelationships.class, queryType.getIncludeRelationships());
-			renditionFilter = queryType.getRenditionFilter();
-			maxItems = queryType.getMaxItems();
-			skipCount = queryType.getSkipCount();
-
-			statusCode = HttpServletResponse.SC_CREATED;
-		} else if (METHOD_GET.equals(request.getMethod())) {
-			// GET -> parameters
-			statement = getStringParameter(request, Constants.PARAM_Q);
-			searchAllVersions = getBooleanParameter(request, Constants.PARAM_SEARCH_ALL_VERSIONS);
-			includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-			includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS, IncludeRelationships.class);
-			renditionFilter = null;
-			maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-			skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
-
-			statusCode = HttpServletResponse.SC_OK;
-		} else {
-			throw new CmisRuntimeException("Invalid HTTP method!");
-		}
-
-		// execute
-		ObjectList results = service.query(context, repositoryId, statement, searchAllVersions,
-				includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null);
-
-		if (results == null) {
-			throw new CmisRuntimeException("Results are null!");
-		}
-
-		// set headers
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		UrlBuilder pagingUrl = compileUrlBuilder(baseUrl, RESOURCE_QUERY, null);
-		pagingUrl.addParameter(Constants.PARAM_Q, statement);
-		pagingUrl.addParameter(Constants.PARAM_SEARCH_ALL_VERSIONS, searchAllVersions);
-		pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
-		pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
-
-		UrlBuilder location = new UrlBuilder(pagingUrl);
-		location.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-		location.addParameter(Constants.PARAM_SKIP_COUNT, skipCount);
-
-		response.setStatus(statusCode);
-		response.setContentType(Constants.MEDIATYPE_FEED);
-		response.setHeader("Content-Location", location.toString());
-		response.setHeader("Location", location.toString());
-
-		// write XML
-		AtomFeed feed = new AtomFeed();
-		feed.startDocument(response.getOutputStream());
-		feed.startFeed(true);
-
-		// write basic Atom feed elements
-		GregorianCalendar now = new GregorianCalendar();
-		feed.writeFeedElements("query", "", "Query", now, null, results.getNumItems());
-
-		// write links
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writePagingLinks(pagingUrl, maxItems, skipCount, results.getNumItems(), results.hasMoreItems(),
-				AtomPubUtils.PAGE_SIZE);
-
-		if (results.getObjects() != null) {
-			AtomEntry entry = new AtomEntry(feed.getWriter());
-			int idCounter = 0;
-			for (ObjectData result : results.getObjects()) {
-				if (result == null) {
-					continue;
-				}
-				idCounter++;
-				writeQueryResultEntry(entry, result, "id-" + idCounter, now);
-			}
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
-
-	private static void writeQueryResultEntry(AtomEntry entry, ObjectData result, String id, GregorianCalendar now)
-			throws Exception {
-		CmisObjectType resultJaxb = convert(result);
-		if (resultJaxb == null) {
-			return;
-		}
-
-		// start
-		entry.startEntry(false);
-
-		// write Atom base tags
-		entry.writeAuthor("");
-		entry.writeId(entry.generateAtomId(id));
-		entry.writePublished(now);
-		entry.writeTitle("Query Result " + id);
-		entry.writeUpdated(now);
-
-		// write query result object
-		JaxBHelper.marshal(JaxBHelper.CMIS_EXTRA_OBJECT_FACTORY.createObject(resultJaxb), entry.getWriter(), true);
-
-		// we are done
-		entry.endEntry();
-	}
-
-	/**
-	 * Get content changes.
-	 */
-	public static void getContentChanges(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisDiscoveryService service = factory.getDiscoveryService();
-
-		// get parameters
-		String changeLogToken = getStringParameter(request, Constants.PARAM_CHANGE_LOG_TOKEN);
-		Boolean includeProperties = getBooleanParameter(request, Constants.PARAM_PROPERTIES);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
-		Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
-		BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		Holder<String> changeLogTokenHolder = new Holder<String>(changeLogToken);
-		ObjectList changes = service.getContentChanges(context, repositoryId, changeLogTokenHolder, includeProperties,
-				filter, includePolicyIds, includeAcl, maxItems, null, objectInfoHolder);
-
-		if (changes == null) {
-			throw new CmisRuntimeException("Changes are null!");
-		}
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_OK);
-		response.setContentType(Constants.MEDIATYPE_FEED);
-
-		// write XML
-		AtomFeed feed = new AtomFeed();
-		feed.startDocument(response.getOutputStream());
-		feed.startFeed(true);
-
-		// write basic Atom feed elements
-		GregorianCalendar now = new GregorianCalendar();
-		feed.writeFeedElements("contentChanges", "", "Content Change", now, null, changes.getNumItems());
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		if (changeLogTokenHolder.getValue() != null) {
-			UrlBuilder nextLink = compileUrlBuilder(baseUrl, RESOURCE_CHANGES, null);
-			nextLink.addParameter(Constants.PARAM_CHANGE_LOG_TOKEN, changeLogTokenHolder.getValue());
-			nextLink.addParameter(Constants.PARAM_PROPERTIES, includeProperties);
-			nextLink.addParameter(Constants.PARAM_FILTER, filter);
-			nextLink.addParameter(Constants.PARAM_POLICY_IDS, includePolicyIds);
-			nextLink.addParameter(Constants.PARAM_ACL, includeAcl);
-			nextLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-			feed.writeNextLink(nextLink.toString());
-		}
-
-		// write entries
-		if (changes.getObjects() != null) {
-			AtomEntry entry = new AtomEntry(feed.getWriter());
-			for (ObjectData object : changes.getObjects()) {
-				if (object == null) {
-					continue;
-				}
-				writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, false);
-			}
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
+    /**
+     * Query.
+     */
+    public static void query(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisDiscoveryService service = factory.getDiscoveryService();
+
+        // get parameters
+        String statement = null;
+        Boolean searchAllVersions = null;
+        Boolean includeAllowableActions = null;
+        IncludeRelationships includeRelationships = null;
+        String renditionFilter = null;
+        BigInteger maxItems = null;
+        BigInteger skipCount = null;
+
+        int statusCode = 0;
+
+        if (METHOD_POST.equals(request.getMethod())) {
+            // POST -> read from stream
+            Object queryRequest = null;
+            try {
+                Unmarshaller u = JaxBHelper.createUnmarshaller();
+                queryRequest = u.unmarshal(request.getInputStream());
+            } catch (Exception e) {
+                throw new CmisInvalidArgumentException("Invalid query request: " + e, e);
+            }
+
+            if (!(queryRequest instanceof JAXBElement<?>)) {
+                throw new CmisInvalidArgumentException("Not a query document!");
+            }
+
+            if (!(((JAXBElement<?>) queryRequest).getValue() instanceof CmisQueryType)) {
+                throw new CmisInvalidArgumentException("Not a query document!");
+            }
+
+            CmisQueryType queryType = (CmisQueryType) ((JAXBElement<?>) queryRequest).getValue();
+
+            statement = queryType.getStatement();
+            searchAllVersions = queryType.isSearchAllVersions();
+            includeAllowableActions = queryType.isIncludeAllowableActions();
+            includeRelationships = convert(IncludeRelationships.class, queryType.getIncludeRelationships());
+            renditionFilter = queryType.getRenditionFilter();
+            maxItems = queryType.getMaxItems();
+            skipCount = queryType.getSkipCount();
+
+            statusCode = HttpServletResponse.SC_CREATED;
+        } else if (METHOD_GET.equals(request.getMethod())) {
+            // GET -> parameters
+            statement = getStringParameter(request, Constants.PARAM_Q);
+            searchAllVersions = getBooleanParameter(request, Constants.PARAM_SEARCH_ALL_VERSIONS);
+            includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+            includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS, IncludeRelationships.class);
+            renditionFilter = null;
+            maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+            skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+
+            statusCode = HttpServletResponse.SC_OK;
+        } else {
+            throw new CmisRuntimeException("Invalid HTTP method!");
+        }
+
+        // execute
+        ObjectList results = service.query(context, repositoryId, statement, searchAllVersions,
+                includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null);
+
+        if (results == null) {
+            throw new CmisRuntimeException("Results are null!");
+        }
+
+        // set headers
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        UrlBuilder pagingUrl = compileUrlBuilder(baseUrl, RESOURCE_QUERY, null);
+        pagingUrl.addParameter(Constants.PARAM_Q, statement);
+        pagingUrl.addParameter(Constants.PARAM_SEARCH_ALL_VERSIONS, searchAllVersions);
+        pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
+        pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
+
+        UrlBuilder location = new UrlBuilder(pagingUrl);
+        location.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+        location.addParameter(Constants.PARAM_SKIP_COUNT, skipCount);
+
+        response.setStatus(statusCode);
+        response.setContentType(Constants.MEDIATYPE_FEED);
+        response.setHeader("Content-Location", location.toString());
+        response.setHeader("Location", location.toString());
+
+        // write XML
+        AtomFeed feed = new AtomFeed();
+        feed.startDocument(response.getOutputStream());
+        feed.startFeed(true);
+
+        // write basic Atom feed elements
+        GregorianCalendar now = new GregorianCalendar();
+        feed.writeFeedElements("query", "", "Query", now, null, results.getNumItems());
+
+        // write links
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writePagingLinks(pagingUrl, maxItems, skipCount, results.getNumItems(), results.hasMoreItems(),
+                AtomPubUtils.PAGE_SIZE);
+
+        if (results.getObjects() != null) {
+            AtomEntry entry = new AtomEntry(feed.getWriter());
+            int idCounter = 0;
+            for (ObjectData result : results.getObjects()) {
+                if (result == null) {
+                    continue;
+                }
+                idCounter++;
+                writeQueryResultEntry(entry, result, "id-" + idCounter, now);
+            }
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
+
+    private static void writeQueryResultEntry(AtomEntry entry, ObjectData result, String id, GregorianCalendar now)
+            throws Exception {
+        CmisObjectType resultJaxb = convert(result);
+        if (resultJaxb == null) {
+            return;
+        }
+
+        // start
+        entry.startEntry(false);
+
+        // write Atom base tags
+        entry.writeAuthor("");
+        entry.writeId(entry.generateAtomId(id));
+        entry.writePublished(now);
+        entry.writeTitle("Query Result " + id);
+        entry.writeUpdated(now);
+
+        // write query result object
+        JaxBHelper.marshal(JaxBHelper.CMIS_EXTRA_OBJECT_FACTORY.createObject(resultJaxb), entry.getWriter(), true);
+
+        // we are done
+        entry.endEntry();
+    }
+
+    /**
+     * Get content changes.
+     */
+    public static void getContentChanges(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisDiscoveryService service = factory.getDiscoveryService();
+
+        // get parameters
+        String changeLogToken = getStringParameter(request, Constants.PARAM_CHANGE_LOG_TOKEN);
+        Boolean includeProperties = getBooleanParameter(request, Constants.PARAM_PROPERTIES);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
+        Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
+        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        Holder<String> changeLogTokenHolder = new Holder<String>(changeLogToken);
+        ObjectList changes = service.getContentChanges(context, repositoryId, changeLogTokenHolder, includeProperties,
+                filter, includePolicyIds, includeAcl, maxItems, null, objectInfoHolder);
+
+        if (changes == null) {
+            throw new CmisRuntimeException("Changes are null!");
+        }
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType(Constants.MEDIATYPE_FEED);
+
+        // write XML
+        AtomFeed feed = new AtomFeed();
+        feed.startDocument(response.getOutputStream());
+        feed.startFeed(true);
+
+        // write basic Atom feed elements
+        GregorianCalendar now = new GregorianCalendar();
+        feed.writeFeedElements("contentChanges", "", "Content Change", now, null, changes.getNumItems());
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        if (changeLogTokenHolder.getValue() != null) {
+            UrlBuilder nextLink = compileUrlBuilder(baseUrl, RESOURCE_CHANGES, null);
+            nextLink.addParameter(Constants.PARAM_CHANGE_LOG_TOKEN, changeLogTokenHolder.getValue());
+            nextLink.addParameter(Constants.PARAM_PROPERTIES, includeProperties);
+            nextLink.addParameter(Constants.PARAM_FILTER, filter);
+            nextLink.addParameter(Constants.PARAM_POLICY_IDS, includePolicyIds);
+            nextLink.addParameter(Constants.PARAM_ACL, includeAcl);
+            nextLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+            feed.writeNextLink(nextLink.toString());
+        }
+
+        // write entries
+        if (changes.getObjects() != null) {
+            AtomEntry entry = new AtomEntry(feed.getWriter());
+            for (ObjectData object : changes.getObjects()) {
+                if (object == null) {
+                    continue;
+                }
+                writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, false);
+            }
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/Dispatcher.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/Dispatcher.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/Dispatcher.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/Dispatcher.java Thu Apr 22 16:27:57 2010
@@ -41,64 +41,64 @@ import org.apache.commons.logging.LogFac
  */
 public class Dispatcher {
 
-	private static final Log LOG = LogFactory.getLog(Dispatcher.class.getName());
+    private static final Log LOG = LogFactory.getLog(Dispatcher.class.getName());
 
-	private Map<String, Method> fMethodMap = new HashMap<String, Method>();
+    private Map<String, Method> fMethodMap = new HashMap<String, Method>();
 
-	public Dispatcher() {
-	}
+    public Dispatcher() {
+    }
 
-	/**
-	 * Connects a resource and HTTP method with a class and a class method.
-	 */
-	public synchronized void addResource(String resource, String httpMethod, Class<?> clazz, String classmethod)
-			throws NoSuchMethodException {
-
-		Method m = clazz.getMethod(classmethod, CallContext.class, AbstractServicesFactory.class, String.class,
-				HttpServletRequest.class, HttpServletResponse.class);
-
-		fMethodMap.put(getKey(resource, httpMethod), m);
-	}
-
-	/**
-	 * Find the appropriate method an call it.
-	 * 
-	 * @return <code>true</code> if the method was found, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean dispatch(String resource, String httpMethod, CallContext context, AbstractServicesFactory factory,
-			String repositoryId, HttpServletRequest request, HttpServletResponse response) {
-
-		Method m = fMethodMap.get(getKey(resource, httpMethod));
-		if (m == null) {
-			return false;
-		}
-
-		if (LOG.isDebugEnabled()) {
-			LOG.debug(repositoryId + " / " + resource + ", " + httpMethod + " -> " + m.getName());
-		}
-
-		try {
-			m.invoke(null, context, factory, repositoryId, request, response);
-		} catch (IllegalArgumentException e) {
-			throw e;
-		} catch (IllegalAccessException e) {
-			throw new CmisRuntimeException("Internal error!", e);
-		} catch (InvocationTargetException e) {
-			if (e.getCause() instanceof CmisBaseException) {
-				throw (CmisBaseException) e.getCause();
-			} else {
-				throw new CmisRuntimeException(e.getMessage(), e);
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Generates a map key from a resource and an HTTP method.
-	 */
-	private String getKey(String resource, String httpMethod) {
-		return resource + "/" + httpMethod;
-	}
+    /**
+     * Connects a resource and HTTP method with a class and a class method.
+     */
+    public synchronized void addResource(String resource, String httpMethod, Class<?> clazz, String classmethod)
+            throws NoSuchMethodException {
+
+        Method m = clazz.getMethod(classmethod, CallContext.class, AbstractServicesFactory.class, String.class,
+                HttpServletRequest.class, HttpServletResponse.class);
+
+        fMethodMap.put(getKey(resource, httpMethod), m);
+    }
+
+    /**
+     * Find the appropriate method an call it.
+     * 
+     * @return <code>true</code> if the method was found, <code>false</code>
+     *         otherwise.
+     */
+    public boolean dispatch(String resource, String httpMethod, CallContext context, AbstractServicesFactory factory,
+            String repositoryId, HttpServletRequest request, HttpServletResponse response) {
+
+        Method m = fMethodMap.get(getKey(resource, httpMethod));
+        if (m == null) {
+            return false;
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(repositoryId + " / " + resource + ", " + httpMethod + " -> " + m.getName());
+        }
+
+        try {
+            m.invoke(null, context, factory, repositoryId, request, response);
+        } catch (IllegalArgumentException e) {
+            throw e;
+        } catch (IllegalAccessException e) {
+            throw new CmisRuntimeException("Internal error!", e);
+        } catch (InvocationTargetException e) {
+            if (e.getCause() instanceof CmisBaseException) {
+                throw (CmisBaseException) e.getCause();
+            } else {
+                throw new CmisRuntimeException(e.getMessage(), e);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Generates a map key from a resource and an HTTP method.
+     */
+    private String getKey(String resource, String httpMethod) {
+        return resource + "/" + httpMethod;
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java?rev=936938&r1=936937&r2=936938&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/MultiFilingService.java Thu Apr 22 16:27:57 2010
@@ -45,43 +45,43 @@ import org.apache.chemistry.opencmis.ser
  */
 public class MultiFilingService {
 
-	/**
-	 * Remove object from folder.
-	 */
-	public static void removeObjectFromFolder(CallContext context, AbstractServicesFactory factory,
-			String repositoryId, HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisMultiFilingService service = factory.getMultiFilingService();
-
-		// get parameters
-		String removeFrom = getStringParameter(request, Constants.PARAM_REMOVE_FROM);
-
-		AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
-		String objectId = parser.getId();
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = service.removeObjectFromFolder(context, repositoryId, objectId, removeFrom, null,
-				objectInfoHolder);
-
-		if (object == null) {
-			throw new CmisRuntimeException("Object is null!");
-		}
-
-		if (object.getId() == null) {
-			throw new CmisRuntimeException("Object Id is null!");
-		}
-
-		// set headers
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		response.setStatus(HttpServletResponse.SC_CREATED);
-		response.setContentType(Constants.MEDIATYPE_ENTRY);
-		response.setHeader("Location", compileUrl(baseUrl, RESOURCE_ENTRY, object.getId()));
-
-		// write XML
-		AtomEntry entry = new AtomEntry();
-		entry.startDocument(response.getOutputStream());
-		writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
-		entry.endDocument();
-	}
+    /**
+     * Remove object from folder.
+     */
+    public static void removeObjectFromFolder(CallContext context, AbstractServicesFactory factory,
+            String repositoryId, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisMultiFilingService service = factory.getMultiFilingService();
+
+        // get parameters
+        String removeFrom = getStringParameter(request, Constants.PARAM_REMOVE_FROM);
+
+        AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
+        String objectId = parser.getId();
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = service.removeObjectFromFolder(context, repositoryId, objectId, removeFrom, null,
+                objectInfoHolder);
+
+        if (object == null) {
+            throw new CmisRuntimeException("Object is null!");
+        }
+
+        if (object.getId() == null) {
+            throw new CmisRuntimeException("Object Id is null!");
+        }
+
+        // set headers
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        response.setStatus(HttpServletResponse.SC_CREATED);
+        response.setContentType(Constants.MEDIATYPE_ENTRY);
+        response.setHeader("Location", compileUrl(baseUrl, RESOURCE_ENTRY, object.getId()));
+
+        // write XML
+        AtomEntry entry = new AtomEntry();
+        entry.startDocument(response.getOutputStream());
+        writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
+        entry.endDocument();
+    }
 }



Mime
View raw message