You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by dc...@apache.org on 2010/04/22 18:28:00 UTC

svn commit: r936938 [4/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...

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/NavigationService.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/NavigationService.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/NavigationService.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/NavigationService.java Thu Apr 22 16:27:57 2010
@@ -73,446 +73,446 @@ import org.apache.chemistry.opencmis.ser
  */
 public final class NavigationService {
 
-	/**
-	 * Children Collection GET.
-	 */
-	public static void getChildren(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisNavigationService service = factory.getNavigationService();
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		String orderBy = getStringParameter(request, Constants.PARAM_ORDER_BY);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
-		BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-		BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectInFolderList children = service.getChildren(context, repositoryId, folderId, filter, orderBy,
-				includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, maxItems,
-				skipCount, null, objectInfoHolder);
-
-		if (children == null) {
-			throw new CmisRuntimeException("Children are null!");
-		}
-
-		ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
-		if (folderInfo == null) {
-			throw new CmisRuntimeException("Folder Object Info is missing!");
-		}
-
-		// 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
-		feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
-				.getLastModificationDate(), null, children.getNumItems());
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), null);
-
-		feed.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, folderInfo.getTypeId()));
-
-		feed.writeAllowableActionsLink(compileUrl(baseUrl, RESOURCE_ALLOWABLEACIONS, folderInfo.getId()));
-
-		feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-
-		if (folderInfo.supportsDescendants()) {
-			feed.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()),
-					Constants.MEDIATYPE_DESCENDANTS);
-		}
-
-		if (folderInfo.supportsFolderTree()) {
-			feed.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()));
-		}
-
-		if (folderInfo.hasParent()) {
-			feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-		}
-
-		if (folderInfo.getRenditionInfos() != null) {
-			for (RenditionInfo ri : folderInfo.getRenditionInfos()) {
-				feed.writeAlternateLink(compileUrl(baseUrl, RESOURCE_CONTENT, ri.getId()), ri.getContenType(), ri
-						.getKind(), ri.getTitle(), ri.getLength());
-			}
-		}
-
-		if (folderInfo.hasAcl()) {
-			feed.writeAclLink(compileUrl(baseUrl, RESOURCE_ACL, folderInfo.getId()));
-		}
-
-		if (folderInfo.supportsPolicies()) {
-			feed.writeAclLink(compileUrl(baseUrl, RESOURCE_POLICIES, folderInfo.getId()));
-		}
-
-		if (folderInfo.supportsRelationships()) {
-			feed.writeRelationshipsLink(compileUrl(baseUrl, RESOURCE_RELATIONSHIPS, folderInfo.getId()));
-		}
-
-		UrlBuilder pagingUrl = new UrlBuilder(compileUrlBuilder(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()));
-		pagingUrl.addParameter(Constants.PARAM_FILTER, filter);
-		pagingUrl.addParameter(Constants.PARAM_ORDER_BY, orderBy);
-		pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
-		pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
-		pagingUrl.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter);
-		pagingUrl.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment);
-		feed.writePagingLinks(pagingUrl, maxItems, skipCount, children.getNumItems(), children.hasMoreItems(),
-				AtomPubUtils.PAGE_SIZE);
-
-		// write collection
-		feed.writeCollection(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), null, "Folder collection",
-				Constants.MEDIATYPE_CMISATOM);
-
-		// write entries
-		if (children.getObjects() != null) {
-			AtomEntry entry = new AtomEntry(feed.getWriter());
-			for (ObjectInFolderData object : children.getObjects()) {
-				if ((object == null) || (object.getObject() == null)) {
-					continue;
-				}
-				writeObjectEntry(entry, object.getObject(), objectInfoHolder, null, repositoryId, object
-						.getPathSegment(), null, baseUrl, false);
-			}
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
-
-	/**
-	 * Descendants feed GET.
-	 */
-	public static void getDescendants(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisNavigationService service = factory.getNavigationService();
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		BigInteger depth = getBigIntegerParameter(request, Constants.PARAM_DEPTH);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		List<ObjectInFolderContainer> descendants = service.getDescendants(context, repositoryId, folderId, depth,
-				filter, includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null,
-				objectInfoHolder);
-
-		if (descendants == null) {
-			throw new CmisRuntimeException("Descendants are null!");
-		}
-
-		ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
-		if (folderInfo == null) {
-			throw new CmisRuntimeException("Folder Object Info is missing!");
-		}
-
-		// 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
-		feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
-				.getLastModificationDate(), null, null);
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
-
-		feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
-
-		feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-
-		if (folderInfo.supportsFolderTree()) {
-			feed.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()));
-		}
-
-		if (folderInfo.hasParent()) {
-			feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-		}
-
-		// write entries
-		AtomEntry entry = new AtomEntry(feed.getWriter());
-		for (ObjectInFolderContainer container : descendants) {
-			if ((container == null) || (container.getObject() == null) || (container.getObject().getObject() == null)) {
-				continue;
-			}
-			writeObjectEntry(entry, container.getObject().getObject(), objectInfoHolder, container.getChildren(),
-					repositoryId, container.getObject().getPathSegment(), null, baseUrl, false);
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
-
-	/**
-	 * Folder tree feed GET.
-	 */
-	public static void getFolderTree(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisNavigationService service = factory.getNavigationService();
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		BigInteger depth = getBigIntegerParameter(request, Constants.PARAM_DEPTH);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		List<ObjectInFolderContainer> folderTree = service.getFolderTree(context, repositoryId, folderId, depth,
-				filter, includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null,
-				objectInfoHolder);
-
-		if (folderTree == null) {
-			throw new CmisRuntimeException("Folder tree is null!");
-		}
-
-		ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
-		if (folderInfo == null) {
-			throw new CmisRuntimeException("Folder Object Info is missing!");
-		}
-
-		// 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
-		feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
-				.getLastModificationDate(), null, null);
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
-
-		feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
-
-		feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-
-		if (folderInfo.supportsDescendants()) {
-			feed.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()),
-					Constants.MEDIATYPE_DESCENDANTS);
-		}
-
-		if (folderInfo.hasParent()) {
-			feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
-		}
-
-		// write entries
-		AtomEntry entry = new AtomEntry(feed.getWriter());
-		for (ObjectInFolderContainer container : folderTree) {
-			if ((container == null) || (container.getObject() == null) || (container.getObject().getObject() == null)) {
-				continue;
-			}
-			writeObjectEntry(entry, container.getObject().getObject(), objectInfoHolder, container.getChildren(),
-					repositoryId, container.getObject().getPathSegment(), null, baseUrl, false);
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
-
-	/**
-	 * Object parents feed GET.
-	 */
-	public static void getObjectParents(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisNavigationService service = factory.getNavigationService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includeRelativePathSegment = getBooleanParameter(request, Constants.PARAM_RELATIVE_PATH_SEGMENT);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		List<ObjectParentData> parents = service.getObjectParents(context, repositoryId, objectId, filter,
-				includeAllowableActions, includeRelationships, renditionFilter, includeRelativePathSegment, null,
-				objectInfoHolder);
-
-		if (parents == null) {
-			throw new CmisRuntimeException("Parents are null!");
-		}
-
-		ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(objectId);
-		if (objectInfo == null) {
-			throw new CmisRuntimeException("Object Info is missing!");
-		}
-
-		// 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
-		feed.writeFeedElements(objectInfo.getId(), objectInfo.getCreatedBy(), objectInfo.getName(), objectInfo
-				.getLastModificationDate(), null, null);
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_PARENTS, objectInfo.getId()), null);
-
-		// write entries
-		if (parents != null) {
-			AtomEntry entry = new AtomEntry(feed.getWriter());
-			for (ObjectParentData object : parents) {
-				if ((object == null) || (object.getObject() == null)) {
-					continue;
-				}
-				writeObjectEntry(entry, object.getObject(), objectInfoHolder, null, repositoryId, null, object
-						.getRelativePathSegment(), baseUrl, false);
-			}
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
-
-	/**
-	 * Checked Out Collection GET.
-	 */
-	public static void getCheckedOutDocs(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisNavigationService service = factory.getNavigationService();
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		String orderBy = getStringParameter(request, Constants.PARAM_ORDER_BY);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
-		BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectList checkedOut = service.getCheckedOutDocs(context, repositoryId, folderId, filter, orderBy,
-				includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null,
-				objectInfoHolder);
-
-		if (checkedOut == null) {
-			throw new CmisRuntimeException("Checked Out list is null!");
-		}
-
-		ObjectInfo folderInfo = null;
-		if (folderId != null) {
-			folderInfo = objectInfoHolder.getObjectInfo(folderId);
-			if (folderInfo == null) {
-				throw new CmisRuntimeException("Folder Object Info is missing!");
-			}
-		} else {
-			folderInfo = new ObjectInfoImpl();
-			GregorianCalendar now = new GregorianCalendar();
-
-			((ObjectInfoImpl) folderInfo).setId("uri:x-checkedout");
-			((ObjectInfoImpl) folderInfo).setName("Checked Out");
-			((ObjectInfoImpl) folderInfo).setCreatedBy("");
-			((ObjectInfoImpl) folderInfo).setCreationDate(now);
-			((ObjectInfoImpl) folderInfo).setLastModificationDate(now);
-			((ObjectInfoImpl) folderInfo).setHasParent(false);
-			((ObjectInfoImpl) folderInfo).setSupportsDescendants(false);
-			((ObjectInfoImpl) folderInfo).setSupportsFolderTree(false);
-		}
-
-		// 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
-		feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
-				.getLastModificationDate(), null, checkedOut.getNumItems());
-
-		// write links
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_CHECKEDOUT, folderInfo.getId()), null);
-
-		UrlBuilder pagingUrl = new UrlBuilder(compileUrlBuilder(baseUrl, RESOURCE_CHECKEDOUT, folderInfo.getId()));
-		pagingUrl.addParameter(Constants.PARAM_FILTER, filter);
-		pagingUrl.addParameter(Constants.PARAM_ORDER_BY, orderBy);
-		pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
-		pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
-		pagingUrl.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter);
-		feed.writePagingLinks(pagingUrl, maxItems, skipCount, checkedOut.getNumItems(), checkedOut.hasMoreItems(),
-				AtomPubUtils.PAGE_SIZE);
-
-		// write entries
-		if (checkedOut.getObjects() != null) {
-			AtomEntry entry = new AtomEntry(feed.getWriter());
-			for (ObjectData object : checkedOut.getObjects()) {
-				if (object == null) {
-					continue;
-				}
-				writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, false);
-			}
-		}
-
-		// we are done
-		feed.endFeed();
-		feed.endDocument();
-	}
+    /**
+     * Children Collection GET.
+     */
+    public static void getChildren(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisNavigationService service = factory.getNavigationService();
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        String orderBy = getStringParameter(request, Constants.PARAM_ORDER_BY);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
+        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+        BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectInFolderList children = service.getChildren(context, repositoryId, folderId, filter, orderBy,
+                includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, maxItems,
+                skipCount, null, objectInfoHolder);
+
+        if (children == null) {
+            throw new CmisRuntimeException("Children are null!");
+        }
+
+        ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
+        if (folderInfo == null) {
+            throw new CmisRuntimeException("Folder Object Info is missing!");
+        }
+
+        // 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
+        feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
+                .getLastModificationDate(), null, children.getNumItems());
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), null);
+
+        feed.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, folderInfo.getTypeId()));
+
+        feed.writeAllowableActionsLink(compileUrl(baseUrl, RESOURCE_ALLOWABLEACIONS, folderInfo.getId()));
+
+        feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+
+        if (folderInfo.supportsDescendants()) {
+            feed.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()),
+                    Constants.MEDIATYPE_DESCENDANTS);
+        }
+
+        if (folderInfo.supportsFolderTree()) {
+            feed.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()));
+        }
+
+        if (folderInfo.hasParent()) {
+            feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+        }
+
+        if (folderInfo.getRenditionInfos() != null) {
+            for (RenditionInfo ri : folderInfo.getRenditionInfos()) {
+                feed.writeAlternateLink(compileUrl(baseUrl, RESOURCE_CONTENT, ri.getId()), ri.getContenType(), ri
+                        .getKind(), ri.getTitle(), ri.getLength());
+            }
+        }
+
+        if (folderInfo.hasAcl()) {
+            feed.writeAclLink(compileUrl(baseUrl, RESOURCE_ACL, folderInfo.getId()));
+        }
+
+        if (folderInfo.supportsPolicies()) {
+            feed.writeAclLink(compileUrl(baseUrl, RESOURCE_POLICIES, folderInfo.getId()));
+        }
+
+        if (folderInfo.supportsRelationships()) {
+            feed.writeRelationshipsLink(compileUrl(baseUrl, RESOURCE_RELATIONSHIPS, folderInfo.getId()));
+        }
+
+        UrlBuilder pagingUrl = new UrlBuilder(compileUrlBuilder(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()));
+        pagingUrl.addParameter(Constants.PARAM_FILTER, filter);
+        pagingUrl.addParameter(Constants.PARAM_ORDER_BY, orderBy);
+        pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
+        pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
+        pagingUrl.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter);
+        pagingUrl.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment);
+        feed.writePagingLinks(pagingUrl, maxItems, skipCount, children.getNumItems(), children.hasMoreItems(),
+                AtomPubUtils.PAGE_SIZE);
+
+        // write collection
+        feed.writeCollection(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), null, "Folder collection",
+                Constants.MEDIATYPE_CMISATOM);
+
+        // write entries
+        if (children.getObjects() != null) {
+            AtomEntry entry = new AtomEntry(feed.getWriter());
+            for (ObjectInFolderData object : children.getObjects()) {
+                if ((object == null) || (object.getObject() == null)) {
+                    continue;
+                }
+                writeObjectEntry(entry, object.getObject(), objectInfoHolder, null, repositoryId, object
+                        .getPathSegment(), null, baseUrl, false);
+            }
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
+
+    /**
+     * Descendants feed GET.
+     */
+    public static void getDescendants(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisNavigationService service = factory.getNavigationService();
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        BigInteger depth = getBigIntegerParameter(request, Constants.PARAM_DEPTH);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        List<ObjectInFolderContainer> descendants = service.getDescendants(context, repositoryId, folderId, depth,
+                filter, includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null,
+                objectInfoHolder);
+
+        if (descendants == null) {
+            throw new CmisRuntimeException("Descendants are null!");
+        }
+
+        ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
+        if (folderInfo == null) {
+            throw new CmisRuntimeException("Folder Object Info is missing!");
+        }
+
+        // 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
+        feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
+                .getLastModificationDate(), null, null);
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
+
+        feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
+
+        feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+
+        if (folderInfo.supportsFolderTree()) {
+            feed.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()));
+        }
+
+        if (folderInfo.hasParent()) {
+            feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+        }
+
+        // write entries
+        AtomEntry entry = new AtomEntry(feed.getWriter());
+        for (ObjectInFolderContainer container : descendants) {
+            if ((container == null) || (container.getObject() == null) || (container.getObject().getObject() == null)) {
+                continue;
+            }
+            writeObjectEntry(entry, container.getObject().getObject(), objectInfoHolder, container.getChildren(),
+                    repositoryId, container.getObject().getPathSegment(), null, baseUrl, false);
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
+
+    /**
+     * Folder tree feed GET.
+     */
+    public static void getFolderTree(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisNavigationService service = factory.getNavigationService();
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        BigInteger depth = getBigIntegerParameter(request, Constants.PARAM_DEPTH);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includePathSegment = getBooleanParameter(request, Constants.PARAM_PATH_SEGMENT);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        List<ObjectInFolderContainer> folderTree = service.getFolderTree(context, repositoryId, folderId, depth,
+                filter, includeAllowableActions, includeRelationships, renditionFilter, includePathSegment, null,
+                objectInfoHolder);
+
+        if (folderTree == null) {
+            throw new CmisRuntimeException("Folder tree is null!");
+        }
+
+        ObjectInfo folderInfo = objectInfoHolder.getObjectInfo(folderId);
+        if (folderInfo == null) {
+            throw new CmisRuntimeException("Folder Object Info is missing!");
+        }
+
+        // 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
+        feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
+                .getLastModificationDate(), null, null);
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
+
+        feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
+
+        feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+
+        if (folderInfo.supportsDescendants()) {
+            feed.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()),
+                    Constants.MEDIATYPE_DESCENDANTS);
+        }
+
+        if (folderInfo.hasParent()) {
+            feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+        }
+
+        // write entries
+        AtomEntry entry = new AtomEntry(feed.getWriter());
+        for (ObjectInFolderContainer container : folderTree) {
+            if ((container == null) || (container.getObject() == null) || (container.getObject().getObject() == null)) {
+                continue;
+            }
+            writeObjectEntry(entry, container.getObject().getObject(), objectInfoHolder, container.getChildren(),
+                    repositoryId, container.getObject().getPathSegment(), null, baseUrl, false);
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
+
+    /**
+     * Object parents feed GET.
+     */
+    public static void getObjectParents(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisNavigationService service = factory.getNavigationService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includeRelativePathSegment = getBooleanParameter(request, Constants.PARAM_RELATIVE_PATH_SEGMENT);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        List<ObjectParentData> parents = service.getObjectParents(context, repositoryId, objectId, filter,
+                includeAllowableActions, includeRelationships, renditionFilter, includeRelativePathSegment, null,
+                objectInfoHolder);
+
+        if (parents == null) {
+            throw new CmisRuntimeException("Parents are null!");
+        }
+
+        ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(objectId);
+        if (objectInfo == null) {
+            throw new CmisRuntimeException("Object Info is missing!");
+        }
+
+        // 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
+        feed.writeFeedElements(objectInfo.getId(), objectInfo.getCreatedBy(), objectInfo.getName(), objectInfo
+                .getLastModificationDate(), null, null);
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_PARENTS, objectInfo.getId()), null);
+
+        // write entries
+        if (parents != null) {
+            AtomEntry entry = new AtomEntry(feed.getWriter());
+            for (ObjectParentData object : parents) {
+                if ((object == null) || (object.getObject() == null)) {
+                    continue;
+                }
+                writeObjectEntry(entry, object.getObject(), objectInfoHolder, null, repositoryId, null, object
+                        .getRelativePathSegment(), baseUrl, false);
+            }
+        }
+
+        // we are done
+        feed.endFeed();
+        feed.endDocument();
+    }
+
+    /**
+     * Checked Out Collection GET.
+     */
+    public static void getCheckedOutDocs(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisNavigationService service = factory.getNavigationService();
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        String orderBy = getStringParameter(request, Constants.PARAM_ORDER_BY);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+        BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectList checkedOut = service.getCheckedOutDocs(context, repositoryId, folderId, filter, orderBy,
+                includeAllowableActions, includeRelationships, renditionFilter, maxItems, skipCount, null,
+                objectInfoHolder);
+
+        if (checkedOut == null) {
+            throw new CmisRuntimeException("Checked Out list is null!");
+        }
+
+        ObjectInfo folderInfo = null;
+        if (folderId != null) {
+            folderInfo = objectInfoHolder.getObjectInfo(folderId);
+            if (folderInfo == null) {
+                throw new CmisRuntimeException("Folder Object Info is missing!");
+            }
+        } else {
+            folderInfo = new ObjectInfoImpl();
+            GregorianCalendar now = new GregorianCalendar();
+
+            ((ObjectInfoImpl) folderInfo).setId("uri:x-checkedout");
+            ((ObjectInfoImpl) folderInfo).setName("Checked Out");
+            ((ObjectInfoImpl) folderInfo).setCreatedBy("");
+            ((ObjectInfoImpl) folderInfo).setCreationDate(now);
+            ((ObjectInfoImpl) folderInfo).setLastModificationDate(now);
+            ((ObjectInfoImpl) folderInfo).setHasParent(false);
+            ((ObjectInfoImpl) folderInfo).setSupportsDescendants(false);
+            ((ObjectInfoImpl) folderInfo).setSupportsFolderTree(false);
+        }
+
+        // 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
+        feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
+                .getLastModificationDate(), null, checkedOut.getNumItems());
+
+        // write links
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+        feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_CHECKEDOUT, folderInfo.getId()), null);
+
+        UrlBuilder pagingUrl = new UrlBuilder(compileUrlBuilder(baseUrl, RESOURCE_CHECKEDOUT, folderInfo.getId()));
+        pagingUrl.addParameter(Constants.PARAM_FILTER, filter);
+        pagingUrl.addParameter(Constants.PARAM_ORDER_BY, orderBy);
+        pagingUrl.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
+        pagingUrl.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships);
+        pagingUrl.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter);
+        feed.writePagingLinks(pagingUrl, maxItems, skipCount, checkedOut.getNumItems(), checkedOut.hasMoreItems(),
+                AtomPubUtils.PAGE_SIZE);
+
+        // write entries
+        if (checkedOut.getObjects() != null) {
+            AtomEntry entry = new AtomEntry(feed.getWriter());
+            for (ObjectData object : checkedOut.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/ObjectService.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/ObjectService.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/ObjectService.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ObjectService.java Thu Apr 22 16:27:57 2010
@@ -72,465 +72,465 @@ import org.apache.chemistry.opencmis.ser
  */
 public final class ObjectService {
 
-	private static final int BUFFER_SIZE = 64 * 1024;
+    private static final int BUFFER_SIZE = 64 * 1024;
 
-	/**
-	 * Create*.
-	 */
-	public static void create(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		String sourceFolderId = getStringParameter(request, Constants.PARAM_SOURCE_FOLDER_ID);
-		VersioningState versioningState = getEnumParameter(request, Constants.PARAM_VERSIONIG_STATE,
-				VersioningState.class);
-
-		AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
-		String objectId = parser.getId();
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = null;
-
-		if (objectId == null) {
-			// create
-			CmisObjectService service = factory.getObjectService();
-			object = service.create(context, repositoryId, parser.getProperties(), folderId, parser.getContentStream(),
-					versioningState, parser.getPolicyIds(), null, objectInfoHolder);
-		} else {
-			if ((sourceFolderId == null) || (sourceFolderId.trim().length() == 0)) {
-				// addObjectToFolder
-				CmisMultiFilingService service = factory.getMultiFilingService();
-				object = service.addObjectToFolder(context, repositoryId, objectId, sourceFolderId, null, null,
-						objectInfoHolder);
-			} else {
-				// move
-				CmisObjectService service = factory.getObjectService();
-				object = service.moveObject(context, repositoryId, new Holder<String>(objectId), folderId,
-						sourceFolderId, 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();
-	}
-
-	/**
-	 * Create relationship.
-	 */
-	public static void createRelationship(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = service.create(context, repositoryId, parser.getProperties(), null, null, null, parser
-				.getPolicyIds(), null, objectInfoHolder);
-
-		// 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();
-	}
-
-	/**
-	 * Delete object.
-	 */
-	public static void deleteObject(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
-
-		// execute
-		service.deleteObjectOrCancelCheckOut(context, repositoryId, objectId, allVersions, null);
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_NO_CONTENT);
-	}
-
-	/**
-	 * Delete content stream.
-	 */
-	public static void deleteContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-
-		// execute
-		service.deleteContentStream(context, repositoryId, new Holder<String>(objectId), changeToken == null ? null
-				: new Holder<String>(changeToken), null);
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_NO_CONTENT);
-	}
-
-	/**
-	 * Set content stream.
-	 */
-	public static void setContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
-		Boolean overwriteFlag = getBooleanParameter(request, Constants.PARAM_OVERWRITE_FLAG);
-
-		ContentStreamImpl contentStream = new ContentStreamImpl();
-		contentStream.setStream(request.getInputStream());
-		contentStream.setMimeType(request.getHeader("Content-Type"));
-		String lengthStr = request.getHeader("Content-Length");
-		if (lengthStr != null) {
-			try {
-				contentStream.setLength(new BigInteger(lengthStr));
-			} catch (NumberFormatException e) {
-			}
-		}
-
-		// execute
-		Holder<String> objectIdHolder = new Holder<String>(objectId);
-		service.setContentStream(context, repositoryId, objectIdHolder, overwriteFlag, changeToken == null ? null
-				: new Holder<String>(changeToken), contentStream, null);
-
-		// set headers
-		String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
-		String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
-
-		response.setStatus(HttpServletResponse.SC_CREATED);
-		response.setHeader("Content-Location", location);
-		response.setHeader("Location", location);
-	}
-
-	/**
-	 * Delete tree.
-	 */
-	public static void deleteTree(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String folderId = getStringParameter(request, Constants.PARAM_ID);
-		Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
-		UnfileObject unfileObjects = getEnumParameter(request, Constants.PARAM_UNFILE_OBJECTS, UnfileObject.class);
-		Boolean continueOnFailure = getBooleanParameter(request, Constants.PARAM_CONTINUE_ON_FAILURE);
-
-		// execute
-		FailedToDeleteData ftd = service.deleteTree(context, repositoryId, folderId, allVersions, unfileObjects,
-				continueOnFailure, null);
-
-		if ((ftd != null) && (ftd.getIds() != null) && (ftd.getIds().size() > 0)) {
-			// print ids that could not be deleted
-			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-			response.setContentType("text/plain");
-
-			PrintWriter pw = response.getWriter();
-
-			pw.println("Failed to delete the following objects:");
-			for (String id : ftd.getIds()) {
-				pw.println(id);
-			}
-
-			pw.flush();
-
-			return;
-		}
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_NO_CONTENT);
-	}
-
-	/**
-	 * getObject.
-	 */
-	public static void getObject(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		ReturnVersion returnVersion = getEnumParameter(request, Constants.PARAM_RETURN_VERSION, ReturnVersion.class);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
-		Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = null;
-
-		if ((returnVersion == ReturnVersion.LATEST) || (returnVersion == ReturnVersion.LASTESTMAJOR)) {
-			CmisVersioningService service = factory.getVersioningService();
-			object = service.getObjectOfLatestVersion(context, repositoryId, objectId,
-					returnVersion == ReturnVersion.LASTESTMAJOR, filter, includeAllowableActions, includeRelationships,
-					renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
-		} else {
-			CmisObjectService service = factory.getObjectService();
-			object = service.getObject(context, repositoryId, objectId, filter, includeAllowableActions,
-					includeRelationships, renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
-		}
-
-		if (object == null) {
-			throw new CmisRuntimeException("Object is null!");
-		}
-
-		ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(object.getId());
-		if (objectInfo == null) {
-			throw new CmisRuntimeException("Object Info is missing!");
-		}
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_OK);
-		response.setContentType(Constants.MEDIATYPE_ENTRY);
-
-		// write XML
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		AtomEntry entry = new AtomEntry();
-		entry.startDocument(response.getOutputStream());
-		writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
-		entry.endDocument();
-	}
-
-	/**
-	 * objectByPath URI template.
-	 */
-	public static void getObjectByPath(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String path = getStringParameter(request, Constants.PARAM_PATH);
-		String filter = getStringParameter(request, Constants.PARAM_FILTER);
-		Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
-		IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
-				IncludeRelationships.class);
-		String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
-		Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
-		Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = service.getObjectByPath(context, repositoryId, path, filter, includeAllowableActions,
-				includeRelationships, renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
-
-		if (object == null) {
-			throw new CmisRuntimeException("Object is null!");
-		}
-
-		ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(object.getId());
-		if (objectInfo == null) {
-			throw new CmisRuntimeException("Object Info is missing!");
-		}
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_OK);
-		response.setContentType(Constants.MEDIATYPE_ENTRY);
-
-		// write XML
-		UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
-
-		AtomEntry entry = new AtomEntry();
-		entry.startDocument(response.getOutputStream());
-		writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
-		entry.endDocument();
-	}
-
-	/**
-	 * Allowable Actions.
-	 */
-	public static void getAllowableActions(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-
-		// execute
-		AllowableActions allowableActions = service.getAllowableActions(context, repositoryId, objectId, null);
-
-		if (allowableActions == null) {
-			throw new CmisRuntimeException("Allowable Actions is null!");
-		}
-
-		// set headers
-		response.setStatus(HttpServletResponse.SC_OK);
-		response.setContentType(Constants.MEDIATYPE_ALLOWABLEACTION);
-
-		// write XML
-		AllowableActionsDocument allowableActionsDocument = new AllowableActionsDocument();
-		allowableActionsDocument.writeAllowableActions(allowableActions, response.getOutputStream());
-	}
-
-	/**
-	 * getContentStream.
-	 */
-	public static void getContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-		CmisObjectService service = factory.getObjectService();
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		String streamId = getStringParameter(request, Constants.PARAM_STREAM_ID);
-
-		BigInteger offset = null;
-		String offsetStr = context.get(CallContext.OFFSET);
-		if (offsetStr != null) {
-			offset = new BigInteger(offsetStr);
-		}
-
-		BigInteger length = null;
-		String lengthStr = context.get(CallContext.LENGTH);
-		if (lengthStr != null) {
-			length = new BigInteger(offsetStr);
-		}
-
-		// execute
-		ContentStream content = service.getContentStream(context, repositoryId, objectId, streamId, offset, length,
-				null);
-
-		if ((content == null) || (content.getStream() == null)) {
-			throw new CmisRuntimeException("Content stream is null!");
-		}
-
-		String contentType = content.getMimeType();
-		if (contentType == null) {
-			contentType = Constants.MEDIATYPE_OCTETSTREAM;
-		}
-
-		// set headers
-		if ((offset == null) && (length == null)) {
-			response.setStatus(HttpServletResponse.SC_OK);
-		} else {
-			response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
-		}
-		response.setContentType(contentType);
-
-		// send content
-		InputStream in = new BufferedInputStream(content.getStream(), BUFFER_SIZE);
-		OutputStream out = new BufferedOutputStream(response.getOutputStream());
-
-		byte[] buffer = new byte[BUFFER_SIZE];
-		int b;
-		while ((b = in.read(buffer)) > -1) {
-			out.write(buffer, 0, b);
-		}
-
-		in.close();
-		out.flush();
-	}
-
-	/**
-	 * UpdateProperties.
-	 */
-	public static void updateProperties(CallContext context, AbstractServicesFactory factory, String repositoryId,
-			HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-		// get parameters
-		String objectId = getStringParameter(request, Constants.PARAM_ID);
-		Boolean checkin = getBooleanParameter(request, Constants.PARAM_CHECK_IN);
-		String checkinComment = getStringParameter(request, Constants.PARAM_CHECKIN_COMMENT);
-		Boolean major = getBooleanParameter(request, Constants.PARAM_MAJOR);
-
-		AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
-
-		// execute
-		ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
-		ObjectData object = null;
-
-		if ((checkin != null) && (checkin.booleanValue())) {
-			CmisVersioningService service = factory.getVersioningService();
-			object = service.checkIn(context, repositoryId, new Holder<String>(objectId), major,
-					parser.getProperties(), parser.getContentStream(), checkinComment, parser.getPolicyIds(), null,
-					null, null, objectInfoHolder);
-		} else {
-			String changeToken = extractChangeToken(parser.getProperties());
-
-			CmisObjectService service = factory.getObjectService();
-			object = service.updateProperties(context, repositoryId, new Holder<String>(objectId),
-					changeToken == null ? null : new Holder<String>(changeToken), parser.getProperties(), parser
-							.getAcl(), 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);
-		String location = compileUrl(baseUrl, RESOURCE_ENTRY, object.getId());
-
-		response.setStatus(HttpServletResponse.SC_CREATED);
-		response.setContentType(Constants.MEDIATYPE_ENTRY);
-		response.setHeader("Content-Location", location);
-		response.setHeader("Location", location);
-
-		// write XML
-		AtomEntry entry = new AtomEntry();
-		entry.startDocument(response.getOutputStream());
-		writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
-		entry.endDocument();
-	}
-
-	/**
-	 * Gets the change token from a property set.
-	 */
-	private static String extractChangeToken(Properties properties) {
-		if (properties == null) {
-			return null;
-		}
-
-		Map<String, PropertyData<?>> propertiesMap = properties.getProperties();
-		if (propertiesMap == null) {
-			return null;
-		}
-
-		PropertyData<?> changeLogProperty = propertiesMap.get(PropertyIds.CHANGE_TOKEN);
-		if (!(changeLogProperty instanceof PropertyString)) {
-			return null;
-		}
+    /**
+     * Create*.
+     */
+    public static void create(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        String sourceFolderId = getStringParameter(request, Constants.PARAM_SOURCE_FOLDER_ID);
+        VersioningState versioningState = getEnumParameter(request, Constants.PARAM_VERSIONIG_STATE,
+                VersioningState.class);
+
+        AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
+        String objectId = parser.getId();
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = null;
+
+        if (objectId == null) {
+            // create
+            CmisObjectService service = factory.getObjectService();
+            object = service.create(context, repositoryId, parser.getProperties(), folderId, parser.getContentStream(),
+                    versioningState, parser.getPolicyIds(), null, objectInfoHolder);
+        } else {
+            if ((sourceFolderId == null) || (sourceFolderId.trim().length() == 0)) {
+                // addObjectToFolder
+                CmisMultiFilingService service = factory.getMultiFilingService();
+                object = service.addObjectToFolder(context, repositoryId, objectId, sourceFolderId, null, null,
+                        objectInfoHolder);
+            } else {
+                // move
+                CmisObjectService service = factory.getObjectService();
+                object = service.moveObject(context, repositoryId, new Holder<String>(objectId), folderId,
+                        sourceFolderId, 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();
+    }
+
+    /**
+     * Create relationship.
+     */
+    public static void createRelationship(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = service.create(context, repositoryId, parser.getProperties(), null, null, null, parser
+                .getPolicyIds(), null, objectInfoHolder);
+
+        // 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();
+    }
+
+    /**
+     * Delete object.
+     */
+    public static void deleteObject(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
+
+        // execute
+        service.deleteObjectOrCancelCheckOut(context, repositoryId, objectId, allVersions, null);
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+    }
+
+    /**
+     * Delete content stream.
+     */
+    public static void deleteContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+
+        // execute
+        service.deleteContentStream(context, repositoryId, new Holder<String>(objectId), changeToken == null ? null
+                : new Holder<String>(changeToken), null);
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+    }
+
+    /**
+     * Set content stream.
+     */
+    public static void setContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        String changeToken = getStringParameter(request, Constants.PARAM_CHANGE_TOKEN);
+        Boolean overwriteFlag = getBooleanParameter(request, Constants.PARAM_OVERWRITE_FLAG);
+
+        ContentStreamImpl contentStream = new ContentStreamImpl();
+        contentStream.setStream(request.getInputStream());
+        contentStream.setMimeType(request.getHeader("Content-Type"));
+        String lengthStr = request.getHeader("Content-Length");
+        if (lengthStr != null) {
+            try {
+                contentStream.setLength(new BigInteger(lengthStr));
+            } catch (NumberFormatException e) {
+            }
+        }
+
+        // execute
+        Holder<String> objectIdHolder = new Holder<String>(objectId);
+        service.setContentStream(context, repositoryId, objectIdHolder, overwriteFlag, changeToken == null ? null
+                : new Holder<String>(changeToken), contentStream, null);
+
+        // set headers
+        String newObjectId = (objectIdHolder.getValue() == null ? objectId : objectIdHolder.getValue());
+        String location = compileUrl(compileBaseUrl(request, repositoryId), RESOURCE_CONTENT, newObjectId);
+
+        response.setStatus(HttpServletResponse.SC_CREATED);
+        response.setHeader("Content-Location", location);
+        response.setHeader("Location", location);
+    }
+
+    /**
+     * Delete tree.
+     */
+    public static void deleteTree(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String folderId = getStringParameter(request, Constants.PARAM_ID);
+        Boolean allVersions = getBooleanParameter(request, Constants.PARAM_ALL_VERSIONS);
+        UnfileObject unfileObjects = getEnumParameter(request, Constants.PARAM_UNFILE_OBJECTS, UnfileObject.class);
+        Boolean continueOnFailure = getBooleanParameter(request, Constants.PARAM_CONTINUE_ON_FAILURE);
+
+        // execute
+        FailedToDeleteData ftd = service.deleteTree(context, repositoryId, folderId, allVersions, unfileObjects,
+                continueOnFailure, null);
+
+        if ((ftd != null) && (ftd.getIds() != null) && (ftd.getIds().size() > 0)) {
+            // print ids that could not be deleted
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            response.setContentType("text/plain");
+
+            PrintWriter pw = response.getWriter();
+
+            pw.println("Failed to delete the following objects:");
+            for (String id : ftd.getIds()) {
+                pw.println(id);
+            }
+
+            pw.flush();
+
+            return;
+        }
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+    }
+
+    /**
+     * getObject.
+     */
+    public static void getObject(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        ReturnVersion returnVersion = getEnumParameter(request, Constants.PARAM_RETURN_VERSION, ReturnVersion.class);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
+        Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = null;
+
+        if ((returnVersion == ReturnVersion.LATEST) || (returnVersion == ReturnVersion.LASTESTMAJOR)) {
+            CmisVersioningService service = factory.getVersioningService();
+            object = service.getObjectOfLatestVersion(context, repositoryId, objectId,
+                    returnVersion == ReturnVersion.LASTESTMAJOR, filter, includeAllowableActions, includeRelationships,
+                    renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
+        } else {
+            CmisObjectService service = factory.getObjectService();
+            object = service.getObject(context, repositoryId, objectId, filter, includeAllowableActions,
+                    includeRelationships, renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
+        }
+
+        if (object == null) {
+            throw new CmisRuntimeException("Object is null!");
+        }
+
+        ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(object.getId());
+        if (objectInfo == null) {
+            throw new CmisRuntimeException("Object Info is missing!");
+        }
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType(Constants.MEDIATYPE_ENTRY);
+
+        // write XML
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        AtomEntry entry = new AtomEntry();
+        entry.startDocument(response.getOutputStream());
+        writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
+        entry.endDocument();
+    }
+
+    /**
+     * objectByPath URI template.
+     */
+    public static void getObjectByPath(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String path = getStringParameter(request, Constants.PARAM_PATH);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+        IncludeRelationships includeRelationships = getEnumParameter(request, Constants.PARAM_RELATIONSHIPS,
+                IncludeRelationships.class);
+        String renditionFilter = getStringParameter(request, Constants.PARAM_RENDITION_FILTER);
+        Boolean includePolicyIds = getBooleanParameter(request, Constants.PARAM_POLICY_IDS);
+        Boolean includeAcl = getBooleanParameter(request, Constants.PARAM_ACL);
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = service.getObjectByPath(context, repositoryId, path, filter, includeAllowableActions,
+                includeRelationships, renditionFilter, includePolicyIds, includeAcl, null, objectInfoHolder);
+
+        if (object == null) {
+            throw new CmisRuntimeException("Object is null!");
+        }
+
+        ObjectInfo objectInfo = objectInfoHolder.getObjectInfo(object.getId());
+        if (objectInfo == null) {
+            throw new CmisRuntimeException("Object Info is missing!");
+        }
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType(Constants.MEDIATYPE_ENTRY);
+
+        // write XML
+        UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
+
+        AtomEntry entry = new AtomEntry();
+        entry.startDocument(response.getOutputStream());
+        writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
+        entry.endDocument();
+    }
+
+    /**
+     * Allowable Actions.
+     */
+    public static void getAllowableActions(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+
+        // execute
+        AllowableActions allowableActions = service.getAllowableActions(context, repositoryId, objectId, null);
+
+        if (allowableActions == null) {
+            throw new CmisRuntimeException("Allowable Actions is null!");
+        }
+
+        // set headers
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.setContentType(Constants.MEDIATYPE_ALLOWABLEACTION);
+
+        // write XML
+        AllowableActionsDocument allowableActionsDocument = new AllowableActionsDocument();
+        allowableActionsDocument.writeAllowableActions(allowableActions, response.getOutputStream());
+    }
+
+    /**
+     * getContentStream.
+     */
+    public static void getContentStream(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        CmisObjectService service = factory.getObjectService();
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        String streamId = getStringParameter(request, Constants.PARAM_STREAM_ID);
+
+        BigInteger offset = null;
+        String offsetStr = context.get(CallContext.OFFSET);
+        if (offsetStr != null) {
+            offset = new BigInteger(offsetStr);
+        }
+
+        BigInteger length = null;
+        String lengthStr = context.get(CallContext.LENGTH);
+        if (lengthStr != null) {
+            length = new BigInteger(offsetStr);
+        }
+
+        // execute
+        ContentStream content = service.getContentStream(context, repositoryId, objectId, streamId, offset, length,
+                null);
+
+        if ((content == null) || (content.getStream() == null)) {
+            throw new CmisRuntimeException("Content stream is null!");
+        }
+
+        String contentType = content.getMimeType();
+        if (contentType == null) {
+            contentType = Constants.MEDIATYPE_OCTETSTREAM;
+        }
+
+        // set headers
+        if ((offset == null) && (length == null)) {
+            response.setStatus(HttpServletResponse.SC_OK);
+        } else {
+            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+        }
+        response.setContentType(contentType);
+
+        // send content
+        InputStream in = new BufferedInputStream(content.getStream(), BUFFER_SIZE);
+        OutputStream out = new BufferedOutputStream(response.getOutputStream());
+
+        byte[] buffer = new byte[BUFFER_SIZE];
+        int b;
+        while ((b = in.read(buffer)) > -1) {
+            out.write(buffer, 0, b);
+        }
+
+        in.close();
+        out.flush();
+    }
+
+    /**
+     * UpdateProperties.
+     */
+    public static void updateProperties(CallContext context, AbstractServicesFactory factory, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        // get parameters
+        String objectId = getStringParameter(request, Constants.PARAM_ID);
+        Boolean checkin = getBooleanParameter(request, Constants.PARAM_CHECK_IN);
+        String checkinComment = getStringParameter(request, Constants.PARAM_CHECKIN_COMMENT);
+        Boolean major = getBooleanParameter(request, Constants.PARAM_MAJOR);
+
+        AtomEntryParser parser = new AtomEntryParser(request.getInputStream());
+
+        // execute
+        ObjectInfoHolder objectInfoHolder = new ObjectInfoHolderImpl();
+        ObjectData object = null;
+
+        if ((checkin != null) && (checkin.booleanValue())) {
+            CmisVersioningService service = factory.getVersioningService();
+            object = service.checkIn(context, repositoryId, new Holder<String>(objectId), major,
+                    parser.getProperties(), parser.getContentStream(), checkinComment, parser.getPolicyIds(), null,
+                    null, null, objectInfoHolder);
+        } else {
+            String changeToken = extractChangeToken(parser.getProperties());
+
+            CmisObjectService service = factory.getObjectService();
+            object = service.updateProperties(context, repositoryId, new Holder<String>(objectId),
+                    changeToken == null ? null : new Holder<String>(changeToken), parser.getProperties(), parser
+                            .getAcl(), 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);
+        String location = compileUrl(baseUrl, RESOURCE_ENTRY, object.getId());
+
+        response.setStatus(HttpServletResponse.SC_CREATED);
+        response.setContentType(Constants.MEDIATYPE_ENTRY);
+        response.setHeader("Content-Location", location);
+        response.setHeader("Location", location);
+
+        // write XML
+        AtomEntry entry = new AtomEntry();
+        entry.startDocument(response.getOutputStream());
+        writeObjectEntry(entry, object, objectInfoHolder, null, repositoryId, null, null, baseUrl, true);
+        entry.endDocument();
+    }
+
+    /**
+     * Gets the change token from a property set.
+     */
+    private static String extractChangeToken(Properties properties) {
+        if (properties == null) {
+            return null;
+        }
+
+        Map<String, PropertyData<?>> propertiesMap = properties.getProperties();
+        if (propertiesMap == null) {
+            return null;
+        }
+
+        PropertyData<?> changeLogProperty = propertiesMap.get(PropertyIds.CHANGE_TOKEN);
+        if (!(changeLogProperty instanceof PropertyString)) {
+            return null;
+        }
 
-		return ((PropertyString) changeLogProperty).getFirstValue();
-	}
+        return ((PropertyString) changeLogProperty).getFirstValue();
+    }
 }