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:04:22 UTC

svn commit: r936922 [7/18] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-client: chemistry-opencmis-client-api/src/main/java/org/apache/chemistry/opencmis/client/ chemistry-opencmis-client-api/src/main/java/org/apache/chemistry/opencmis/c...

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/ObjectServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/ObjectServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/ObjectServiceImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/ObjectServiceImpl.java Thu Apr 22 16:04:19 2010
@@ -68,715 +68,715 @@ import org.apache.chemistry.opencmis.com
  */
 public class ObjectServiceImpl extends AbstractAtomPubService implements ObjectService {
 
-	/**
-	 * Constructor.
-	 */
-	public ObjectServiceImpl(Session session) {
-		setSession(session);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#createDocument(java
-	 * .lang.String, org.apache.opencmis.client.provider.PropertiesData,
-	 * java.lang.String, org.apache.opencmis.client.provider.ContentStreamData,
-	 * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public String createDocument(String repositoryId, Properties properties, String folderId,
-			ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addAces,
-			Acl removeAces, ExtensionsData extension) {
-		checkCreateProperties(properties);
-
-		// find the link
-		String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-
-		if (link == null) {
-			throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_VERSIONIG_STATE, versioningState);
-
-		// set up object and writer
-		CmisObjectType object = new CmisObjectType();
-		object.setProperties(convert(properties));
-		object.setPolicyIds(convertPolicyIds(policies));
-
-		String mediaType = null;
-		InputStream stream = null;
-
-		if (contentStream != null) {
-			mediaType = contentStream.getMimeType();
-			stream = contentStream.getStream();
-		}
-
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(object, mediaType, stream);
-
-		// post the new folder object
-		HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse the response
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		// handle ACL modifications
-		handleAclModifications(repositoryId, entry, addAces, removeAces);
-
-		return entry.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#createDocumentFromSource
-	 * (java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.PropertiesData, java.lang.String,
-	 * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
-			String folderId, VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs,
-			ExtensionsData extension) {
-		throw new CmisNotSupportedException("createDocumentFromSource is not supported by the AtomPub binding!");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#createFolder(java.lang
-	 * .String, org.apache.opencmis.client.provider.PropertiesData,
-	 * java.lang.String, java.util.List,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public String createFolder(String repositoryId, Properties properties, String folderId, List<String> policies,
-			Acl addAces, Acl removeAces, ExtensionsData extension) {
-		checkCreateProperties(properties);
-
-		// find the link
-		String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-
-		if (link == null) {
-			throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-
-		// set up object and writer
-		CmisObjectType object = new CmisObjectType();
-		object.setProperties(convert(properties));
-		object.setPolicyIds(convertPolicyIds(policies));
-
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
-
-		// post the new folder object
-		HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse the response
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		// handle ACL modifications
-		handleAclModifications(repositoryId, entry, addAces, removeAces);
-
-		return entry.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#createPolicy(java.lang
-	 * .String, org.apache.opencmis.client.provider.PropertiesData,
-	 * java.lang.String, java.util.List,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public String createPolicy(String repositoryId, Properties properties, String folderId, List<String> policies,
-			Acl addAces, Acl removeAces, ExtensionsData extension) {
-		checkCreateProperties(properties);
-
-		// find the link
-		String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-
-		if (link == null) {
-			throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-
-		// set up object and writer
-		CmisObjectType object = new CmisObjectType();
-		object.setProperties(convert(properties));
-		object.setPolicyIds(convertPolicyIds(policies));
-
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
-
-		// post the new folder object
-		HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse the response
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		// handle ACL modifications
-		handleAclModifications(repositoryId, entry, addAces, removeAces);
-
-		return entry.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#createRelationship(
-	 * java.lang.String, org.apache.opencmis.client.provider.PropertiesData,
-	 * java.util.List, org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.AccessControlList,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public String createRelationship(String repositoryId, Properties properties, List<String> policies, Acl addAces,
-			Acl removeAces, ExtensionsData extension) {
-		checkCreateProperties(properties);
-
-		// find source id
-		PropertyData<?> sourceIdProperty = properties.getProperties().get(PropertyIds.SOURCE_ID);
-		if (!(sourceIdProperty instanceof PropertyId)) {
-			throw new CmisInvalidArgumentException("Source Id is not set!");
-		}
-
-		String sourceId = ((PropertyId) sourceIdProperty).getFirstValue();
-		if (sourceId == null) {
-			throw new CmisInvalidArgumentException("Source Id is not set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, sourceId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
-
-		if (link == null) {
-			throwLinkException(repositoryId, sourceId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-
-		// set up object and writer
-		CmisObjectType object = new CmisObjectType();
-		object.setProperties(convert(properties));
-		object.setPolicyIds(convertPolicyIds(policies));
-
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
-
-		// post the new folder object
-		HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse the response
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		// handle ACL modifications
-		handleAclModifications(repositoryId, entry, addAces, removeAces);
-
-		return entry.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#updateProperties(java
-	 * .lang.String, org.apache.opencmis.client.provider.Holder,
-	 * org.apache.opencmis.client.provider.Holder,
-	 * org.apache.opencmis.client.provider.PropertiesData,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void updateProperties(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-			Properties properties, ExtensionsData extension) {
-		// we need an object id
-		if ((objectId == null) || (objectId.getValue() == null) || (objectId.getValue().length() == 0)) {
-			throw new CmisInvalidArgumentException("Object id must be set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId.getValue(), Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		if (changeToken != null) {
-			url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
-		}
-
-		// set up object and writer
-		CmisObjectType object = new CmisObjectType();
-		object.setProperties(convert(properties));
-
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
-
-		// update
-		HttpUtils.Response resp = put(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse new entry
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		// we expect a CMIS entry
-		if (entry.getId() == null) {
-			throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
-		}
-
-		// set object id
-		objectId.setValue(entry.getId());
-
-		if (changeToken != null) {
-			changeToken.setValue(null); // just in case
-		}
-
-		lockLinks();
-		try {
-			// clean up cache
-			removeLinks(repositoryId, entry.getId());
-
-			// walk through the entry
-			for (AtomElement element : entry.getElements()) {
-				if (element.getObject() instanceof AtomLink) {
-					addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-				} else if (element.getObject() instanceof CmisObjectType) {
-					// extract new change token
-					if (changeToken != null) {
-						object = (CmisObjectType) element.getObject();
-
-						if (object.getProperties() != null) {
-							for (CmisProperty property : object.getProperties().getProperty()) {
-								if (PropertyIds.CHANGE_TOKEN.equals(property.getPropertyDefinitionId())
-										&& (property instanceof CmisPropertyString)) {
-
-									CmisPropertyString changeTokenProperty = (CmisPropertyString) property;
-									if (!changeTokenProperty.getValue().isEmpty()) {
-										changeToken.setValue(changeTokenProperty.getValue().get(0));
-									}
-
-									break;
-								}
-							}
-						}
-					}
-				}
-			}
-		} finally {
-			unlockLinks();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#deleteObject(java.lang
-	 * .String, java.lang.String, java.lang.Boolean,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void deleteObject(String repositoryId, String objectId, Boolean allVersions, ExtensionsData extension) {
-
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions);
-
-		delete(url);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#deleteTree(java.lang
-	 * .String, java.lang.String, java.lang.Boolean,
-	 * org.apache.opencmis.commons.enums.UnfileObject, java.lang.Boolean,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public FailedToDeleteData deleteTree(String repositoryId, String folderId, Boolean allVersions,
-			UnfileObject unfileObjects, Boolean continueOnFailure, ExtensionsData extension) {
-
-		// find the link
-		String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS);
-
-		if (link == null) {
-			throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions);
-		url.addParameter(Constants.PARAM_UNFILE_OBJECTS, unfileObjects);
-		url.addParameter(Constants.PARAM_CONTINUE_ON_FAILURE, continueOnFailure);
-
-		// make the call
-		HttpUtils.Response resp = HttpUtils.invokeDELETE(url, getSession());
-
-		// check response code
-		if ((resp.getResponseCode() == 200) || (resp.getResponseCode() == 202) || (resp.getResponseCode() == 204)) {
-			return new FailedToDeleteDataImpl();
-		}
-
-		throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getAllowableActions
-	 * (java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public AllowableActions getAllowableActions(String repositoryId, String objectId, ExtensionsData extension) {
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_ALLOWABLEACTIONS,
-				Constants.MEDIATYPE_ALLOWABLEACTION);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_ALLOWABLEACTIONS,
-					Constants.MEDIATYPE_ALLOWABLEACTION);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-
-		// read and parse
-		HttpUtils.Response resp = read(url);
-		AtomAllowableActions allowableActions = parse(resp.getStream(), AtomAllowableActions.class);
-
-		return convert(allowableActions.getAllowableActions());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getContentStream(java
-	 * .lang.String, java.lang.String, java.lang.String, java.math.BigInteger,
-	 * java.math.BigInteger, org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public ContentStream getContentStream(String repositoryId, String objectId, String streamId, BigInteger offset,
-			BigInteger length, ExtensionsData extension) {
-		ContentStreamImpl result = new ContentStreamImpl();
-
-		// find the link
-		String link = loadLink(repositoryId, objectId, AtomPubParser.LINK_REL_CONTENT, null);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, AtomPubParser.LINK_REL_CONTENT, null);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_STREAM_ID, streamId);
-
-		// get the content
-		HttpUtils.Response resp = HttpUtils.invokeGET(url, getSession(), offset, length);
-
-		// check response code
-		if ((resp.getResponseCode() != 200) && (resp.getResponseCode() != 206)) {
-			throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
-		}
-
-		result.setFileName(null);
-		result.setLength(resp.getContentLength());
-		result.setMimeType(resp.getContentTypeHeader());
-		result.setStream(resp.getStream());
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getObject(java.lang
-	 * .String, java.lang.String, java.lang.String, java.lang.Boolean,
-	 * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
-	 * java.lang.Boolean, java.lang.Boolean,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public ObjectData getObject(String repositoryId, String objectId, String filter, Boolean includeAllowableActions,
-			IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
-			Boolean includeACL, ExtensionsData extension) {
-
-		return getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS, filter,
-				includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeACL, extension);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getObjectByPath(java
-	 * .lang.String, java.lang.String, java.lang.String, java.lang.Boolean,
-	 * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
-	 * java.lang.Boolean, java.lang.Boolean,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public ObjectData getObjectByPath(String repositoryId, String path, String filter, Boolean includeAllowableActions,
-			IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
-			Boolean includeACL, ExtensionsData extension) {
-
-		return getObjectInternal(repositoryId, IdentifierType.PATH, path, ReturnVersion.THIS, filter,
-				includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeACL, extension);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getProperties(java.
-	 * lang.String, java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public Properties getProperties(String repositoryId, String objectId, String filter, ExtensionsData extension) {
-		ObjectData object = getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS, filter,
-				Boolean.FALSE, IncludeRelationships.NONE, "cmis:none", Boolean.FALSE, Boolean.FALSE, extension);
-
-		return object.getProperties();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#getRenditions(java.
-	 * lang.String, java.lang.String, java.lang.String, java.math.BigInteger,
-	 * java.math.BigInteger, org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public List<RenditionData> getRenditions(String repositoryId, String objectId, String renditionFilter,
-			BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-		ObjectData object = getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS,
-				PropertyIds.OBJECT_ID, Boolean.FALSE, IncludeRelationships.NONE, renditionFilter, Boolean.FALSE,
-				Boolean.FALSE, extension);
-
-		List<RenditionData> result = object.getRenditions();
-		if (result == null) {
-			result = Collections.emptyList();
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#moveObject(java.lang
-	 * .String, org.apache.opencmis.client.provider.Holder, java.lang.String,
-	 * java.lang.String, org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void moveObject(String repositoryId, Holder<String> objectId, String targetFolderId, String sourceFolderId,
-			ExtensionsData extension) {
-		if ((objectId == null) || (objectId.getValue() == null) || (objectId.getValue().length() == 0)) {
-			throw new CmisInvalidArgumentException("Object id must be set!");
-		}
-
-		if ((targetFolderId == null) || (targetFolderId.length() == 0) || (sourceFolderId == null)
-				|| (sourceFolderId.length() == 0)) {
-			throw new CmisInvalidArgumentException("Source and target folder must be set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, targetFolderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-
-		if (link == null) {
-			throwLinkException(repositoryId, targetFolderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_SOURCE_FOLDER_ID, sourceFolderId);
-
-		// set up object and writer
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId.getValue()));
-
-		// post move request
-		HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-
-		// parse the response
-		AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
-
-		objectId.setValue(entry.getId());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#setContentStream(java
-	 * .lang.String, org.apache.opencmis.client.provider.Holder,
-	 * java.lang.Boolean, org.apache.opencmis.client.provider.Holder,
-	 * org.apache.opencmis.client.provider.ContentStreamData,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void setContentStream(String repositoryId, Holder<String> objectId, Boolean overwriteFlag,
-			Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
-		// we need an object id
-		if ((objectId == null) || (objectId.getValue() == null)) {
-			throw new CmisInvalidArgumentException("Object ID must be set!");
-		}
-
-		// we need content
-		if ((contentStream == null) || (contentStream.getStream() == null) || (contentStream.getMimeType() == null)) {
-			throw new CmisInvalidArgumentException("Content must be set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		if (changeToken != null) {
-			url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
-		}
-		url.addParameter(Constants.PARAM_OVERWRITE_FLAG, overwriteFlag);
-
-		final InputStream stream = contentStream.getStream();
-
-		// send content
-		HttpUtils.Response resp = HttpUtils.invokePUT(url, contentStream.getMimeType(), new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				int b;
-				byte[] buffer = new byte[4096];
-
-				while ((b = stream.read(buffer)) > -1) {
-					out.write(buffer, 0, b);
-				}
-
-				stream.close();
-			}
-		}, getSession());
-
-		// check response code
-		if ((resp.getResponseCode() != 200) && (resp.getResponseCode() != 201) && (resp.getResponseCode() != 204)) {
-			throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
-		}
-
-		objectId.setValue(null);
-		if (changeToken != null) {
-			changeToken.setValue(null);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.ObjectService#deleteContentStream
-	 * (java.lang.String, org.apache.opencmis.client.provider.Holder,
-	 * org.apache.opencmis.client.provider.Holder,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void deleteContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
-			ExtensionsData extension) {
-		// we need an object id
-		if ((objectId == null) || (objectId.getValue() == null)) {
-			throw new CmisInvalidArgumentException("Object ID must be set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		if (changeToken != null) {
-			url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
-		}
-
-		delete(url);
-
-		objectId.setValue(null);
-		if (changeToken != null) {
-			changeToken.setValue(null);
-		}
-	}
-
-	// ---- internal ----
-
-	private void checkCreateProperties(Properties properties) {
-		if ((properties == null) || (properties.getProperties() == null)) {
-			throw new CmisInvalidArgumentException("Properties must be set!");
-		}
-
-		if (!properties.getProperties().containsKey(PropertyIds.OBJECT_TYPE_ID)) {
-			throw new CmisInvalidArgumentException("Property " + PropertyIds.OBJECT_TYPE_ID + " must be set!");
-		}
-
-		if (properties.getProperties().containsKey(PropertyIds.OBJECT_ID)) {
-			throw new CmisInvalidArgumentException("Property " + PropertyIds.OBJECT_ID + " must not be set!");
-		}
-	}
-
-	/**
-	 * Handles ACL modifications of newly created objects.
-	 */
-	private void handleAclModifications(String repositoryId, AtomEntry entry, Acl addAces, Acl removeAces) {
-		if (!isAclMergeRequired(addAces, removeAces)) {
-			return;
-		}
-
-		Acl originalAces = null;
-
-		// walk through the entry and find the current ACL
-		for (AtomElement element : entry.getElements()) {
-			if (element.getObject() instanceof CmisObjectType) {
-				// extract current ACL
-				CmisObjectType object = (CmisObjectType) element.getObject();
-				originalAces = convert(object.getAcl(), object.isExactACL());
-
-				break;
-			}
-		}
-
-		if (originalAces != null) {
-			// merge and update ACL
-			Acl newACL = mergeAcls(originalAces, addAces, removeAces);
-			if (newACL != null) {
-				updateAcl(repositoryId, entry.getId(), newACL, null);
-			}
-		}
-	}
+    /**
+     * Constructor.
+     */
+    public ObjectServiceImpl(Session session) {
+        setSession(session);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#createDocument(java
+     * .lang.String, org.apache.opencmis.client.provider.PropertiesData,
+     * java.lang.String, org.apache.opencmis.client.provider.ContentStreamData,
+     * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public String createDocument(String repositoryId, Properties properties, String folderId,
+            ContentStream contentStream, VersioningState versioningState, List<String> policies, Acl addAces,
+            Acl removeAces, ExtensionsData extension) {
+        checkCreateProperties(properties);
+
+        // find the link
+        String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+
+        if (link == null) {
+            throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_VERSIONIG_STATE, versioningState);
+
+        // set up object and writer
+        CmisObjectType object = new CmisObjectType();
+        object.setProperties(convert(properties));
+        object.setPolicyIds(convertPolicyIds(policies));
+
+        String mediaType = null;
+        InputStream stream = null;
+
+        if (contentStream != null) {
+            mediaType = contentStream.getMimeType();
+            stream = contentStream.getStream();
+        }
+
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(object, mediaType, stream);
+
+        // post the new folder object
+        HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse the response
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        // handle ACL modifications
+        handleAclModifications(repositoryId, entry, addAces, removeAces);
+
+        return entry.getId();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#createDocumentFromSource
+     * (java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.PropertiesData, java.lang.String,
+     * org.apache.opencmis.commons.enums.VersioningState, java.util.List,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
+            String folderId, VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs,
+            ExtensionsData extension) {
+        throw new CmisNotSupportedException("createDocumentFromSource is not supported by the AtomPub binding!");
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#createFolder(java.lang
+     * .String, org.apache.opencmis.client.provider.PropertiesData,
+     * java.lang.String, java.util.List,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public String createFolder(String repositoryId, Properties properties, String folderId, List<String> policies,
+            Acl addAces, Acl removeAces, ExtensionsData extension) {
+        checkCreateProperties(properties);
+
+        // find the link
+        String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+
+        if (link == null) {
+            throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+
+        // set up object and writer
+        CmisObjectType object = new CmisObjectType();
+        object.setProperties(convert(properties));
+        object.setPolicyIds(convertPolicyIds(policies));
+
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
+
+        // post the new folder object
+        HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse the response
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        // handle ACL modifications
+        handleAclModifications(repositoryId, entry, addAces, removeAces);
+
+        return entry.getId();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#createPolicy(java.lang
+     * .String, org.apache.opencmis.client.provider.PropertiesData,
+     * java.lang.String, java.util.List,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public String createPolicy(String repositoryId, Properties properties, String folderId, List<String> policies,
+            Acl addAces, Acl removeAces, ExtensionsData extension) {
+        checkCreateProperties(properties);
+
+        // find the link
+        String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+
+        if (link == null) {
+            throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+
+        // set up object and writer
+        CmisObjectType object = new CmisObjectType();
+        object.setProperties(convert(properties));
+        object.setPolicyIds(convertPolicyIds(policies));
+
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
+
+        // post the new folder object
+        HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse the response
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        // handle ACL modifications
+        handleAclModifications(repositoryId, entry, addAces, removeAces);
+
+        return entry.getId();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#createRelationship(
+     * java.lang.String, org.apache.opencmis.client.provider.PropertiesData,
+     * java.util.List, org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.AccessControlList,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public String createRelationship(String repositoryId, Properties properties, List<String> policies, Acl addAces,
+            Acl removeAces, ExtensionsData extension) {
+        checkCreateProperties(properties);
+
+        // find source id
+        PropertyData<?> sourceIdProperty = properties.getProperties().get(PropertyIds.SOURCE_ID);
+        if (!(sourceIdProperty instanceof PropertyId)) {
+            throw new CmisInvalidArgumentException("Source Id is not set!");
+        }
+
+        String sourceId = ((PropertyId) sourceIdProperty).getFirstValue();
+        if (sourceId == null) {
+            throw new CmisInvalidArgumentException("Source Id is not set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, sourceId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
+
+        if (link == null) {
+            throwLinkException(repositoryId, sourceId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+
+        // set up object and writer
+        CmisObjectType object = new CmisObjectType();
+        object.setProperties(convert(properties));
+        object.setPolicyIds(convertPolicyIds(policies));
+
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
+
+        // post the new folder object
+        HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse the response
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        // handle ACL modifications
+        handleAclModifications(repositoryId, entry, addAces, removeAces);
+
+        return entry.getId();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#updateProperties(java
+     * .lang.String, org.apache.opencmis.client.provider.Holder,
+     * org.apache.opencmis.client.provider.Holder,
+     * org.apache.opencmis.client.provider.PropertiesData,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void updateProperties(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
+            Properties properties, ExtensionsData extension) {
+        // we need an object id
+        if ((objectId == null) || (objectId.getValue() == null) || (objectId.getValue().length() == 0)) {
+            throw new CmisInvalidArgumentException("Object id must be set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId.getValue(), Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        if (changeToken != null) {
+            url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
+        }
+
+        // set up object and writer
+        CmisObjectType object = new CmisObjectType();
+        object.setProperties(convert(properties));
+
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(object);
+
+        // update
+        HttpUtils.Response resp = put(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse new entry
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        // we expect a CMIS entry
+        if (entry.getId() == null) {
+            throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
+        }
+
+        // set object id
+        objectId.setValue(entry.getId());
+
+        if (changeToken != null) {
+            changeToken.setValue(null); // just in case
+        }
+
+        lockLinks();
+        try {
+            // clean up cache
+            removeLinks(repositoryId, entry.getId());
+
+            // walk through the entry
+            for (AtomElement element : entry.getElements()) {
+                if (element.getObject() instanceof AtomLink) {
+                    addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+                } else if (element.getObject() instanceof CmisObjectType) {
+                    // extract new change token
+                    if (changeToken != null) {
+                        object = (CmisObjectType) element.getObject();
+
+                        if (object.getProperties() != null) {
+                            for (CmisProperty property : object.getProperties().getProperty()) {
+                                if (PropertyIds.CHANGE_TOKEN.equals(property.getPropertyDefinitionId())
+                                        && (property instanceof CmisPropertyString)) {
+
+                                    CmisPropertyString changeTokenProperty = (CmisPropertyString) property;
+                                    if (!changeTokenProperty.getValue().isEmpty()) {
+                                        changeToken.setValue(changeTokenProperty.getValue().get(0));
+                                    }
+
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } finally {
+            unlockLinks();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#deleteObject(java.lang
+     * .String, java.lang.String, java.lang.Boolean,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void deleteObject(String repositoryId, String objectId, Boolean allVersions, ExtensionsData extension) {
+
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_SELF, Constants.MEDIATYPE_ENTRY);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions);
+
+        delete(url);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#deleteTree(java.lang
+     * .String, java.lang.String, java.lang.Boolean,
+     * org.apache.opencmis.commons.enums.UnfileObject, java.lang.Boolean,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public FailedToDeleteData deleteTree(String repositoryId, String folderId, Boolean allVersions,
+            UnfileObject unfileObjects, Boolean continueOnFailure, ExtensionsData extension) {
+
+        // find the link
+        String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS);
+
+        if (link == null) {
+            throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions);
+        url.addParameter(Constants.PARAM_UNFILE_OBJECTS, unfileObjects);
+        url.addParameter(Constants.PARAM_CONTINUE_ON_FAILURE, continueOnFailure);
+
+        // make the call
+        HttpUtils.Response resp = HttpUtils.invokeDELETE(url, getSession());
+
+        // check response code
+        if ((resp.getResponseCode() == 200) || (resp.getResponseCode() == 202) || (resp.getResponseCode() == 204)) {
+            return new FailedToDeleteDataImpl();
+        }
+
+        throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getAllowableActions
+     * (java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public AllowableActions getAllowableActions(String repositoryId, String objectId, ExtensionsData extension) {
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_ALLOWABLEACTIONS,
+                Constants.MEDIATYPE_ALLOWABLEACTION);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_ALLOWABLEACTIONS,
+                    Constants.MEDIATYPE_ALLOWABLEACTION);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+
+        // read and parse
+        HttpUtils.Response resp = read(url);
+        AtomAllowableActions allowableActions = parse(resp.getStream(), AtomAllowableActions.class);
+
+        return convert(allowableActions.getAllowableActions());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getContentStream(java
+     * .lang.String, java.lang.String, java.lang.String, java.math.BigInteger,
+     * java.math.BigInteger, org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public ContentStream getContentStream(String repositoryId, String objectId, String streamId, BigInteger offset,
+            BigInteger length, ExtensionsData extension) {
+        ContentStreamImpl result = new ContentStreamImpl();
+
+        // find the link
+        String link = loadLink(repositoryId, objectId, AtomPubParser.LINK_REL_CONTENT, null);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, AtomPubParser.LINK_REL_CONTENT, null);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_STREAM_ID, streamId);
+
+        // get the content
+        HttpUtils.Response resp = HttpUtils.invokeGET(url, getSession(), offset, length);
+
+        // check response code
+        if ((resp.getResponseCode() != 200) && (resp.getResponseCode() != 206)) {
+            throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
+        }
+
+        result.setFileName(null);
+        result.setLength(resp.getContentLength());
+        result.setMimeType(resp.getContentTypeHeader());
+        result.setStream(resp.getStream());
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getObject(java.lang
+     * .String, java.lang.String, java.lang.String, java.lang.Boolean,
+     * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
+     * java.lang.Boolean, java.lang.Boolean,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public ObjectData getObject(String repositoryId, String objectId, String filter, Boolean includeAllowableActions,
+            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
+            Boolean includeACL, ExtensionsData extension) {
+
+        return getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS, filter,
+                includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeACL, extension);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getObjectByPath(java
+     * .lang.String, java.lang.String, java.lang.String, java.lang.Boolean,
+     * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
+     * java.lang.Boolean, java.lang.Boolean,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public ObjectData getObjectByPath(String repositoryId, String path, String filter, Boolean includeAllowableActions,
+            IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
+            Boolean includeACL, ExtensionsData extension) {
+
+        return getObjectInternal(repositoryId, IdentifierType.PATH, path, ReturnVersion.THIS, filter,
+                includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeACL, extension);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getProperties(java.
+     * lang.String, java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public Properties getProperties(String repositoryId, String objectId, String filter, ExtensionsData extension) {
+        ObjectData object = getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS, filter,
+                Boolean.FALSE, IncludeRelationships.NONE, "cmis:none", Boolean.FALSE, Boolean.FALSE, extension);
+
+        return object.getProperties();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#getRenditions(java.
+     * lang.String, java.lang.String, java.lang.String, java.math.BigInteger,
+     * java.math.BigInteger, org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public List<RenditionData> getRenditions(String repositoryId, String objectId, String renditionFilter,
+            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
+        ObjectData object = getObjectInternal(repositoryId, IdentifierType.ID, objectId, ReturnVersion.THIS,
+                PropertyIds.OBJECT_ID, Boolean.FALSE, IncludeRelationships.NONE, renditionFilter, Boolean.FALSE,
+                Boolean.FALSE, extension);
+
+        List<RenditionData> result = object.getRenditions();
+        if (result == null) {
+            result = Collections.emptyList();
+        }
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#moveObject(java.lang
+     * .String, org.apache.opencmis.client.provider.Holder, java.lang.String,
+     * java.lang.String, org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void moveObject(String repositoryId, Holder<String> objectId, String targetFolderId, String sourceFolderId,
+            ExtensionsData extension) {
+        if ((objectId == null) || (objectId.getValue() == null) || (objectId.getValue().length() == 0)) {
+            throw new CmisInvalidArgumentException("Object id must be set!");
+        }
+
+        if ((targetFolderId == null) || (targetFolderId.length() == 0) || (sourceFolderId == null)
+                || (sourceFolderId.length() == 0)) {
+            throw new CmisInvalidArgumentException("Source and target folder must be set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, targetFolderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+
+        if (link == null) {
+            throwLinkException(repositoryId, targetFolderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_SOURCE_FOLDER_ID, sourceFolderId);
+
+        // set up object and writer
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId.getValue()));
+
+        // post move request
+        HttpUtils.Response resp = post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+
+        // parse the response
+        AtomEntry entry = parse(resp.getStream(), AtomEntry.class);
+
+        objectId.setValue(entry.getId());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#setContentStream(java
+     * .lang.String, org.apache.opencmis.client.provider.Holder,
+     * java.lang.Boolean, org.apache.opencmis.client.provider.Holder,
+     * org.apache.opencmis.client.provider.ContentStreamData,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void setContentStream(String repositoryId, Holder<String> objectId, Boolean overwriteFlag,
+            Holder<String> changeToken, ContentStream contentStream, ExtensionsData extension) {
+        // we need an object id
+        if ((objectId == null) || (objectId.getValue() == null)) {
+            throw new CmisInvalidArgumentException("Object ID must be set!");
+        }
+
+        // we need content
+        if ((contentStream == null) || (contentStream.getStream() == null) || (contentStream.getMimeType() == null)) {
+            throw new CmisInvalidArgumentException("Content must be set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        if (changeToken != null) {
+            url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
+        }
+        url.addParameter(Constants.PARAM_OVERWRITE_FLAG, overwriteFlag);
+
+        final InputStream stream = contentStream.getStream();
+
+        // send content
+        HttpUtils.Response resp = HttpUtils.invokePUT(url, contentStream.getMimeType(), new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                int b;
+                byte[] buffer = new byte[4096];
+
+                while ((b = stream.read(buffer)) > -1) {
+                    out.write(buffer, 0, b);
+                }
+
+                stream.close();
+            }
+        }, getSession());
+
+        // check response code
+        if ((resp.getResponseCode() != 200) && (resp.getResponseCode() != 201) && (resp.getResponseCode() != 204)) {
+            throw convertStatusCode(resp.getResponseCode(), resp.getResponseMessage(), resp.getErrorContent(), null);
+        }
+
+        objectId.setValue(null);
+        if (changeToken != null) {
+            changeToken.setValue(null);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.ObjectService#deleteContentStream
+     * (java.lang.String, org.apache.opencmis.client.provider.Holder,
+     * org.apache.opencmis.client.provider.Holder,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void deleteContentStream(String repositoryId, Holder<String> objectId, Holder<String> changeToken,
+            ExtensionsData extension) {
+        // we need an object id
+        if ((objectId == null) || (objectId.getValue() == null)) {
+            throw new CmisInvalidArgumentException("Object ID must be set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId.getValue(), Constants.REL_EDITMEDIA, null);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        if (changeToken != null) {
+            url.addParameter(Constants.PARAM_CHANGE_TOKEN, changeToken.getValue());
+        }
+
+        delete(url);
+
+        objectId.setValue(null);
+        if (changeToken != null) {
+            changeToken.setValue(null);
+        }
+    }
+
+    // ---- internal ----
+
+    private void checkCreateProperties(Properties properties) {
+        if ((properties == null) || (properties.getProperties() == null)) {
+            throw new CmisInvalidArgumentException("Properties must be set!");
+        }
+
+        if (!properties.getProperties().containsKey(PropertyIds.OBJECT_TYPE_ID)) {
+            throw new CmisInvalidArgumentException("Property " + PropertyIds.OBJECT_TYPE_ID + " must be set!");
+        }
+
+        if (properties.getProperties().containsKey(PropertyIds.OBJECT_ID)) {
+            throw new CmisInvalidArgumentException("Property " + PropertyIds.OBJECT_ID + " must not be set!");
+        }
+    }
+
+    /**
+     * Handles ACL modifications of newly created objects.
+     */
+    private void handleAclModifications(String repositoryId, AtomEntry entry, Acl addAces, Acl removeAces) {
+        if (!isAclMergeRequired(addAces, removeAces)) {
+            return;
+        }
+
+        Acl originalAces = null;
+
+        // walk through the entry and find the current ACL
+        for (AtomElement element : entry.getElements()) {
+            if (element.getObject() instanceof CmisObjectType) {
+                // extract current ACL
+                CmisObjectType object = (CmisObjectType) element.getObject();
+                originalAces = convert(object.getAcl(), object.isExactACL());
+
+                break;
+            }
+        }
+
+        if (originalAces != null) {
+            // merge and update ACL
+            Acl newACL = mergeAcls(originalAces, addAces, removeAces);
+            if (newACL != null) {
+                updateAcl(repositoryId, entry.getId(), newACL, null);
+            }
+        }
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/PolicyServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/PolicyServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/PolicyServiceImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/PolicyServiceImpl.java Thu Apr 22 16:04:19 2010
@@ -48,168 +48,168 @@ import org.apache.chemistry.opencmis.com
  */
 public class PolicyServiceImpl extends AbstractAtomPubService implements PolicyService {
 
-	/**
-	 * Constructor.
-	 */
-	public PolicyServiceImpl(Session session) {
-		setSession(session);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.PolicyService#applyPolicy(java.lang
-	 * .String, java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void applyPolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-
-		// set up object and writer
-		final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId));
-
-		// post applyPolicy request
-		post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
-			public void write(OutputStream out) throws Exception {
-				entryWriter.write(out);
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.PolicyService#getAppliedPolicies(
-	 * java.lang.String, java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public List<ObjectData> getAppliedPolicies(String repositoryId, String objectId, String filter,
-			ExtensionsData extension) {
-		List<ObjectData> result = new ArrayList<ObjectData>();
-
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_FILTER, filter);
-
-		// read and parse
-		HttpUtils.Response resp = read(url);
-		AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
-
-		// get the policies
-		if (!feed.getEntries().isEmpty()) {
-			for (AtomEntry entry : feed.getEntries()) {
-				ObjectData policy = null;
-
-				// walk through the entry
-				for (AtomElement element : entry.getElements()) {
-					if (element.getObject() instanceof CmisObjectType) {
-						policy = convert((CmisObjectType) element.getObject());
-					}
-				}
-
-				if (policy != null) {
-					result.add(policy);
-				}
-			}
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.apache.opencmis.client.provider.PolicyService#removePolicy(java.lang
-	 * .String, java.lang.String, java.lang.String,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public void removePolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
-		// we need a policy id
-		if (policyId == null) {
-			throw new CmisInvalidArgumentException("Policy id must be set!");
-		}
-
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_FILTER, PropertyIds.OBJECT_ID);
-
-		// read and parse
-		HttpUtils.Response resp = read(url);
-		AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
-
-		// find the policy
-		String policyLink = null;
-		boolean found = false;
-
-		if (!feed.getEntries().isEmpty()) {
-			for (AtomEntry entry : feed.getEntries()) {
-				// walk through the entry
-				for (AtomElement element : entry.getElements()) {
-					if (element.getObject() instanceof AtomLink) {
-						AtomLink atomLink = (AtomLink) element.getObject();
-						if (Constants.REL_SELF.equals(atomLink.getRel())) {
-							policyLink = atomLink.getHref();
-						}
-					} else if (element.getObject() instanceof CmisObjectType) {
-						String id = findIdProperty((CmisObjectType) element.getObject());
-						if (policyId.equals(id)) {
-							found = true;
-						}
-					}
-				}
-
-				if (found) {
-					break;
-				}
-			}
-		}
-
-		// if found, delete it
-		if (found && (policyLink != null)) {
-			delete(new UrlBuilder(policyLink));
-		}
-	}
-
-	/**
-	 * Finds the id property within a CMIS object.
-	 */
-	private String findIdProperty(CmisObjectType object) {
-		if ((object == null) || (object.getProperties() == null)) {
-			return null;
-		}
-
-		for (CmisProperty property : object.getProperties().getProperty()) {
-			if (PropertyIds.OBJECT_ID.equals(property.getPropertyDefinitionId())
-					&& (property instanceof CmisPropertyId)) {
-				List<String> values = ((CmisPropertyId) property).getValue();
-				if (values.size() == 1) {
-					return values.get(0);
-				}
-			}
-		}
+    /**
+     * Constructor.
+     */
+    public PolicyServiceImpl(Session session) {
+        setSession(session);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.PolicyService#applyPolicy(java.lang
+     * .String, java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void applyPolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+
+        // set up object and writer
+        final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId));
+
+        // post applyPolicy request
+        post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() {
+            public void write(OutputStream out) throws Exception {
+                entryWriter.write(out);
+            }
+        });
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.PolicyService#getAppliedPolicies(
+     * java.lang.String, java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public List<ObjectData> getAppliedPolicies(String repositoryId, String objectId, String filter,
+            ExtensionsData extension) {
+        List<ObjectData> result = new ArrayList<ObjectData>();
+
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_FILTER, filter);
+
+        // read and parse
+        HttpUtils.Response resp = read(url);
+        AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
+
+        // get the policies
+        if (!feed.getEntries().isEmpty()) {
+            for (AtomEntry entry : feed.getEntries()) {
+                ObjectData policy = null;
+
+                // walk through the entry
+                for (AtomElement element : entry.getElements()) {
+                    if (element.getObject() instanceof CmisObjectType) {
+                        policy = convert((CmisObjectType) element.getObject());
+                    }
+                }
+
+                if (policy != null) {
+                    result.add(policy);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * org.apache.opencmis.client.provider.PolicyService#removePolicy(java.lang
+     * .String, java.lang.String, java.lang.String,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public void removePolicy(String repositoryId, String policyId, String objectId, ExtensionsData extension) {
+        // we need a policy id
+        if (policyId == null) {
+            throw new CmisInvalidArgumentException("Policy id must be set!");
+        }
+
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_POLICIES, Constants.MEDIATYPE_FEED);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_FILTER, PropertyIds.OBJECT_ID);
+
+        // read and parse
+        HttpUtils.Response resp = read(url);
+        AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
+
+        // find the policy
+        String policyLink = null;
+        boolean found = false;
+
+        if (!feed.getEntries().isEmpty()) {
+            for (AtomEntry entry : feed.getEntries()) {
+                // walk through the entry
+                for (AtomElement element : entry.getElements()) {
+                    if (element.getObject() instanceof AtomLink) {
+                        AtomLink atomLink = (AtomLink) element.getObject();
+                        if (Constants.REL_SELF.equals(atomLink.getRel())) {
+                            policyLink = atomLink.getHref();
+                        }
+                    } else if (element.getObject() instanceof CmisObjectType) {
+                        String id = findIdProperty((CmisObjectType) element.getObject());
+                        if (policyId.equals(id)) {
+                            found = true;
+                        }
+                    }
+                }
+
+                if (found) {
+                    break;
+                }
+            }
+        }
+
+        // if found, delete it
+        if (found && (policyLink != null)) {
+            delete(new UrlBuilder(policyLink));
+        }
+    }
+
+    /**
+     * Finds the id property within a CMIS object.
+     */
+    private String findIdProperty(CmisObjectType object) {
+        if ((object == null) || (object.getProperties() == null)) {
+            return null;
+        }
+
+        for (CmisProperty property : object.getProperties().getProperty()) {
+            if (PropertyIds.OBJECT_ID.equals(property.getPropertyDefinitionId())
+                    && (property instanceof CmisPropertyId)) {
+                List<String> values = ((CmisPropertyId) property).getValue();
+                if (values.size() == 1) {
+                    return values.get(0);
+                }
+            }
+        }
 
-		return null;
-	}
+        return null;
+    }
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RelationshipServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RelationshipServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RelationshipServiceImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RelationshipServiceImpl.java Thu Apr 22 16:04:19 2010
@@ -46,91 +46,91 @@ import org.apache.chemistry.opencmis.com
  */
 public class RelationshipServiceImpl extends AbstractAtomPubService implements RelationshipService {
 
-	/**
-	 * Constructor.
-	 */
-	public RelationshipServiceImpl(Session session) {
-		setSession(session);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.apache.opencmis.client.provider.RelationshipService#
-	 * getObjectRelationships(java.lang.String , java.lang.String,
-	 * java.lang.Boolean,
-	 * org.apache.opencmis.commons.enums.RelationshipDirection,
-	 * java.lang.String, java.lang.String, java.lang.Boolean,
-	 * java.math.BigInteger, java.math.BigInteger,
-	 * org.apache.opencmis.client.provider.ExtensionsData)
-	 */
-	public ObjectList getObjectRelationships(String repositoryId, String objectId, Boolean includeSubRelationshipTypes,
-			RelationshipDirection relationshipDirection, String typeId, String filter, Boolean includeAllowableActions,
-			BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
-		ObjectListImpl result = new ObjectListImpl();
-
-		// find the link
-		String link = loadLink(repositoryId, objectId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
-
-		if (link == null) {
-			throwLinkException(repositoryId, objectId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
-		}
-
-		UrlBuilder url = new UrlBuilder(link);
-		url.addParameter(Constants.PARAM_SUB_RELATIONSHIP_TYPES, includeSubRelationshipTypes);
-		url.addParameter(Constants.PARAM_RELATIONSHIP_DIRECTION, relationshipDirection);
-		url.addParameter(Constants.PARAM_TYPE_ID, typeId);
-		url.addParameter(Constants.PARAM_FILTER, filter);
-		url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
-		url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-		url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount);
-
-		// read and parse
-		HttpUtils.Response resp = read(url);
-		AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
-
-		// handle top level
-		for (AtomElement element : feed.getElements()) {
-			if (element.getObject() instanceof AtomLink) {
-				if (isNextLink(element)) {
-					result.setHasMoreItems(Boolean.TRUE);
-				}
-			} else if (isInt(NAME_NUM_ITEMS, element)) {
-				result.setNumItems((BigInteger) element.getObject());
-			}
-		}
-
-		// get the children
-		if (!feed.getEntries().isEmpty()) {
-			result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
-
-			for (AtomEntry entry : feed.getEntries()) {
-				ObjectData relationship = null;
-
-				lockLinks();
-				try {
-					// clean up cache
-					removeLinks(repositoryId, entry.getId());
-
-					// walk through the entry
-					for (AtomElement element : entry.getElements()) {
-						if (element.getObject() instanceof AtomLink) {
-							addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
-						} else if (element.getObject() instanceof CmisObjectType) {
-							relationship = convert((CmisObjectType) element.getObject());
-						}
-					}
-				} finally {
-					unlockLinks();
-				}
-
-				if (relationship != null) {
-					result.getObjects().add(relationship);
-				}
-			}
+    /**
+     * Constructor.
+     */
+    public RelationshipServiceImpl(Session session) {
+        setSession(session);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @seeorg.apache.opencmis.client.provider.RelationshipService#
+     * getObjectRelationships(java.lang.String , java.lang.String,
+     * java.lang.Boolean,
+     * org.apache.opencmis.commons.enums.RelationshipDirection,
+     * java.lang.String, java.lang.String, java.lang.Boolean,
+     * java.math.BigInteger, java.math.BigInteger,
+     * org.apache.opencmis.client.provider.ExtensionsData)
+     */
+    public ObjectList getObjectRelationships(String repositoryId, String objectId, Boolean includeSubRelationshipTypes,
+            RelationshipDirection relationshipDirection, String typeId, String filter, Boolean includeAllowableActions,
+            BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
+        ObjectListImpl result = new ObjectListImpl();
+
+        // find the link
+        String link = loadLink(repositoryId, objectId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
+
+        if (link == null) {
+            throwLinkException(repositoryId, objectId, Constants.REL_RELATIONSHIPS, Constants.MEDIATYPE_FEED);
+        }
+
+        UrlBuilder url = new UrlBuilder(link);
+        url.addParameter(Constants.PARAM_SUB_RELATIONSHIP_TYPES, includeSubRelationshipTypes);
+        url.addParameter(Constants.PARAM_RELATIONSHIP_DIRECTION, relationshipDirection);
+        url.addParameter(Constants.PARAM_TYPE_ID, typeId);
+        url.addParameter(Constants.PARAM_FILTER, filter);
+        url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions);
+        url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+        url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount);
+
+        // read and parse
+        HttpUtils.Response resp = read(url);
+        AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
+
+        // handle top level
+        for (AtomElement element : feed.getElements()) {
+            if (element.getObject() instanceof AtomLink) {
+                if (isNextLink(element)) {
+                    result.setHasMoreItems(Boolean.TRUE);
+                }
+            } else if (isInt(NAME_NUM_ITEMS, element)) {
+                result.setNumItems((BigInteger) element.getObject());
+            }
+        }
+
+        // get the children
+        if (!feed.getEntries().isEmpty()) {
+            result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
+
+            for (AtomEntry entry : feed.getEntries()) {
+                ObjectData relationship = null;
+
+                lockLinks();
+                try {
+                    // clean up cache
+                    removeLinks(repositoryId, entry.getId());
+
+                    // walk through the entry
+                    for (AtomElement element : entry.getElements()) {
+                        if (element.getObject() instanceof AtomLink) {
+                            addLink(repositoryId, entry.getId(), (AtomLink) element.getObject());
+                        } else if (element.getObject() instanceof CmisObjectType) {
+                            relationship = convert((CmisObjectType) element.getObject());
+                        }
+                    }
+                } finally {
+                    unlockLinks();
+                }
+
+                if (relationship != null) {
+                    result.getObjects().add(relationship);
+                }
+            }
 
-		}
+        }
 
-		return result;
-	}
+        return result;
+    }
 }