Return-Path: Delivered-To: apmail-incubator-chemistry-commits-archive@minotaur.apache.org Received: (qmail 55347 invoked from network); 16 Apr 2010 14:03:47 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 16 Apr 2010 14:03:47 -0000 Received: (qmail 40433 invoked by uid 500); 16 Apr 2010 14:03:47 -0000 Delivered-To: apmail-incubator-chemistry-commits-archive@incubator.apache.org Received: (qmail 40378 invoked by uid 500); 16 Apr 2010 14:03:47 -0000 Mailing-List: contact chemistry-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: chemistry-dev@incubator.apache.org Delivered-To: mailing list chemistry-commits@incubator.apache.org Received: (qmail 40370 invoked by uid 99); 16 Apr 2010 14:03:47 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Apr 2010 14:03:47 +0000 X-ASF-Spam-Status: No, hits=-1583.9 required=10.0 tests=ALL_TRUSTED,AWL X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Apr 2010 14:03:42 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D0B032388BB6; Fri, 16 Apr 2010 14:02:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r934881 [6/12] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src: main/java/org/apache/chemistry/opencmis/client/bindings/cache/ main/java/org/apache/chemistry/opencmis/client/bindings... Date: Fri, 16 Apr 2010 14:02:40 -0000 To: chemistry-commits@incubator.apache.org From: dcaruana@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100416140257.D0B032388BB6@eris.apache.org> 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=934881&r1=934880&r2=934881&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 Fri Apr 16 14:02:38 2010 @@ -62,725 +62,721 @@ import org.apache.chemistry.opencmis.com /** * Object Service AtomPub client. - * + * * @author Florian Müller - * + * */ 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 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 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 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 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 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 objectId, - Holder 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 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 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 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 objectId, Boolean overwriteFlag, - Holder 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 objectId, - Holder 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 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 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 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 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 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 objectId, Holder 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 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 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 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 objectId, Boolean overwriteFlag, + Holder 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 objectId, Holder 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=934881&r1=934880&r2=934881&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 Fri Apr 16 14:02:38 2010 @@ -48,165 +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 getAppliedPolicies(String repositoryId, String objectId, String filter, - ExtensionsData extension) { - List result = new ArrayList(); - - // 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 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 getAppliedPolicies(String repositoryId, String objectId, String filter, + ExtensionsData extension) { + List result = new ArrayList(); + + // 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 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=934881&r1=934880&r2=934881&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 Fri Apr 16 14:02:38 2010 @@ -46,95 +46,91 @@ import org.apache.chemistry.opencmis.com */ public class RelationshipServiceImpl extends AbstractAtomPubService implements RelationshipService { - /** - * Constructor. - */ - public RelationshipServiceImpl(Session session) { - setSession(session); - } - - /* - * (non-Javadoc) - * - * @see - * org.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(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(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; + } } Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RepositoryServiceImpl.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/RepositoryServiceImpl.java?rev=934881&r1=934880&r2=934881&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RepositoryServiceImpl.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/RepositoryServiceImpl.java Fri Apr 16 14:02:38 2010 @@ -50,215 +50,209 @@ import org.apache.chemistry.opencmis.com */ public class RepositoryServiceImpl extends AbstractAtomPubService implements RepositoryService { - /** - * Constructor. - */ - public RepositoryServiceImpl(Session session) { - setSession(session); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.RepositoryService#getRepositoryInfos(org.apache.opencmis - * .client.provider .ExtensionsData) - */ - public List getRepositoryInfos(ExtensionsData extension) { - return getRepositoriesInternal(null); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.provider.RepositoryService#getRepositoryInfo(java.lang.String, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public RepositoryInfo getRepositoryInfo(String repositoryId, ExtensionsData extension) { - List repositoryInfos = getRepositoriesInternal(repositoryId); - - // find the repository - for (RepositoryInfo info : repositoryInfos) { - if (info.getId() == null) { - continue; - } - - if (info.getId().equals(repositoryId)) { - return info; - } - } - - throw new CmisObjectNotFoundException("Repository not found!"); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.provider.RepositoryService#getTypeDefinition(java.lang.String, - * java.lang.String, org.apache.opencmis.client.provider.ExtensionsData) - */ - public TypeDefinition getTypeDefinition(String repositoryId, String typeId, - ExtensionsData extension) { - return getTypeDefinitionInternal(repositoryId, typeId); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.provider.RepositoryService#getTypeChildren(java.lang.String, - * java.lang.String, java.lang.Boolean, java.math.BigInteger, java.math.BigInteger, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public TypeDefinitionList getTypeChildren(String repositoryId, String typeId, - Boolean includePropertyDefinitions, BigInteger maxItems, BigInteger skipCount, - ExtensionsData extension) { - TypeDefinitionListImpl result = new TypeDefinitionListImpl(); - - // find the link - String link = null; - if (typeId == null) { - link = loadCollection(repositoryId, Constants.COLLECTION_TYPES); - } - else { - link = loadTypeLink(repositoryId, typeId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); - } - - if (link == null) { - throw new CmisObjectNotFoundException("Unknown repository or type!"); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_TYPE_ID, typeId); - url.addParameter(Constants.PARAM_PROPERTY_DEFINITIONS, includePropertyDefinitions); - 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()); - } - } - - result.setList(new ArrayList(feed.getEntries().size())); - - // get the children - if (!feed.getEntries().isEmpty()) { - for (AtomEntry entry : feed.getEntries()) { - TypeDefinition child = null; - - lockTypeLinks(); - try { - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } - else if (element.getObject() instanceof CmisTypeDefinitionType) { - child = convert((CmisTypeDefinitionType) element.getObject()); - } - } - } - finally { - unlockTypeLinks(); - } - - if (child != null) { - result.getList().add(child); - } - } - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.provider.RepositoryService#getTypeDescendants(java.lang.String, - * java.lang.String, java.math.BigInteger, java.lang.Boolean, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public List getTypeDescendants(String repositoryId, String typeId, - BigInteger depth, Boolean includePropertyDefinitions, ExtensionsData extension) { - List result = new ArrayList(); - - // find the link - String link = null; - if (typeId == null) { - link = loadRepositoryLink(repositoryId, Constants.REP_REL_TYPEDESC); - } - else { - link = loadTypeLink(repositoryId, typeId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); - } - - if (link == null) { - throw new CmisObjectNotFoundException("Unknown repository or type!"); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_TYPE_ID, typeId); - url.addParameter(Constants.PARAM_DEPTH, depth); - url.addParameter(Constants.PARAM_PROPERTY_DEFINITIONS, includePropertyDefinitions); - - // read and parse - HttpUtils.Response resp = read(url); - AtomFeed feed = parse(resp.getStream(), AtomFeed.class); - - // process tree - addTypeDescendantsLevel(repositoryId, feed, result); - - return result; - } - - /** - * Adds type descendants level recursively. - */ - private void addTypeDescendantsLevel(String repositoryId, AtomFeed feed, - List containerList) { - if ((feed == null) || (feed.getEntries().isEmpty())) { - return; - } - - // walk through the feed - for (AtomEntry entry : feed.getEntries()) { - TypeDefinitionContainerImpl childContainer = null; - List childContainerList = new ArrayList(); - - // walk through the entry - lockTypeLinks(); - try { - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } - else if (element.getObject() instanceof CmisTypeDefinitionType) { - childContainer = new TypeDefinitionContainerImpl( - convert((CmisTypeDefinitionType) element.getObject())); - } - else if (element.getObject() instanceof AtomFeed) { - addTypeDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), - childContainerList); - } - } - } - finally { - unlockTypeLinks(); - } - - if (childContainer != null) { - childContainer.setChildren(childContainerList); - containerList.add(childContainer); - } - } - } + /** + * Constructor. + */ + public RepositoryServiceImpl(Session session) { + setSession(session); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.RepositoryService#getRepositoryInfos + * (org.apache.opencmis .client.provider .ExtensionsData) + */ + public List getRepositoryInfos(ExtensionsData extension) { + return getRepositoriesInternal(null); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.RepositoryService#getRepositoryInfo + * (java.lang.String, org.apache.opencmis.client.provider.ExtensionsData) + */ + public RepositoryInfo getRepositoryInfo(String repositoryId, ExtensionsData extension) { + List repositoryInfos = getRepositoriesInternal(repositoryId); + + // find the repository + for (RepositoryInfo info : repositoryInfos) { + if (info.getId() == null) { + continue; + } + + if (info.getId().equals(repositoryId)) { + return info; + } + } + + throw new CmisObjectNotFoundException("Repository not found!"); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.RepositoryService#getTypeDefinition + * (java.lang.String, java.lang.String, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public TypeDefinition getTypeDefinition(String repositoryId, String typeId, ExtensionsData extension) { + return getTypeDefinitionInternal(repositoryId, typeId); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.RepositoryService#getTypeChildren + * (java.lang.String, java.lang.String, java.lang.Boolean, + * java.math.BigInteger, java.math.BigInteger, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public TypeDefinitionList getTypeChildren(String repositoryId, String typeId, Boolean includePropertyDefinitions, + BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { + TypeDefinitionListImpl result = new TypeDefinitionListImpl(); + + // find the link + String link = null; + if (typeId == null) { + link = loadCollection(repositoryId, Constants.COLLECTION_TYPES); + } else { + link = loadTypeLink(repositoryId, typeId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); + } + + if (link == null) { + throw new CmisObjectNotFoundException("Unknown repository or type!"); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_TYPE_ID, typeId); + url.addParameter(Constants.PARAM_PROPERTY_DEFINITIONS, includePropertyDefinitions); + 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()); + } + } + + result.setList(new ArrayList(feed.getEntries().size())); + + // get the children + if (!feed.getEntries().isEmpty()) { + for (AtomEntry entry : feed.getEntries()) { + TypeDefinition child = null; + + lockTypeLinks(); + try { + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisTypeDefinitionType) { + child = convert((CmisTypeDefinitionType) element.getObject()); + } + } + } finally { + unlockTypeLinks(); + } + + if (child != null) { + result.getList().add(child); + } + } + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.RepositoryService#getTypeDescendants + * (java.lang.String, java.lang.String, java.math.BigInteger, + * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) + */ + public List getTypeDescendants(String repositoryId, String typeId, BigInteger depth, + Boolean includePropertyDefinitions, ExtensionsData extension) { + List result = new ArrayList(); + + // find the link + String link = null; + if (typeId == null) { + link = loadRepositoryLink(repositoryId, Constants.REP_REL_TYPEDESC); + } else { + link = loadTypeLink(repositoryId, typeId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); + } + + if (link == null) { + throw new CmisObjectNotFoundException("Unknown repository or type!"); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_TYPE_ID, typeId); + url.addParameter(Constants.PARAM_DEPTH, depth); + url.addParameter(Constants.PARAM_PROPERTY_DEFINITIONS, includePropertyDefinitions); + + // read and parse + HttpUtils.Response resp = read(url); + AtomFeed feed = parse(resp.getStream(), AtomFeed.class); + + // process tree + addTypeDescendantsLevel(repositoryId, feed, result); + + return result; + } + + /** + * Adds type descendants level recursively. + */ + private void addTypeDescendantsLevel(String repositoryId, AtomFeed feed, List containerList) { + if ((feed == null) || (feed.getEntries().isEmpty())) { + return; + } + + // walk through the feed + for (AtomEntry entry : feed.getEntries()) { + TypeDefinitionContainerImpl childContainer = null; + List childContainerList = new ArrayList(); + + // walk through the entry + lockTypeLinks(); + try { + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addTypeLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisTypeDefinitionType) { + childContainer = new TypeDefinitionContainerImpl(convert((CmisTypeDefinitionType) element + .getObject())); + } else if (element.getObject() instanceof AtomFeed) { + addTypeDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), childContainerList); + } + } + } finally { + unlockTypeLinks(); + } + + if (childContainer != null) { + childContainer.setChildren(childContainerList); + containerList.add(childContainer); + } + } + } } Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/SpiSessionParameter.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/SpiSessionParameter.java?rev=934881&r1=934880&r2=934881&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/SpiSessionParameter.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/SpiSessionParameter.java Fri Apr 16 14:02:38 2010 @@ -24,8 +24,8 @@ package org.apache.chemistry.opencmis.cl */ public final class SpiSessionParameter { - public static final String LINK_CACHE = "org.apache.chemistry.opencmis.provider.atompub.linkcache"; + public static final String LINK_CACHE = "org.apache.chemistry.opencmis.provider.atompub.linkcache"; - private SpiSessionParameter() { - } + private SpiSessionParameter() { + } }