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