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(); + } }
