Repository: camel Updated Branches: refs/heads/master 3b5c6aeef -> c1e500b09
Added support for secondary types (CMIS 1.1) Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e9703d34 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e9703d34 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e9703d34 Branch: refs/heads/master Commit: e9703d3415733bc1d0a5c607e70cecc7a6d84ebe Parents: 3b5c6ae Author: bpeters <bas.pet...@alfresco.com> Authored: Fri Jun 5 10:14:22 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Jul 19 11:33:14 2015 +0200 ---------------------------------------------------------------------- .../camel/component/cmis/CMISProducer.java | 272 ++++++++++--------- .../camel/component/cmis/CMISSessionFacade.java | 13 + .../camel/component/cmis/CMISProducerTest.java | 22 ++ .../camel/component/cmis/CMISTestSupport.java | 4 +- 4 files changed, 178 insertions(+), 133 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e9703d34/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISProducer.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISProducer.java index b05346d..49e4f80 100644 --- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISProducer.java +++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISProducer.java @@ -16,7 +16,9 @@ */ package org.apache.camel.component.cmis; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -30,7 +32,6 @@ import org.apache.camel.util.MessageHelper; import org.apache.chemistry.opencmis.client.api.CmisObject; import org.apache.chemistry.opencmis.client.api.Document; import org.apache.chemistry.opencmis.client.api.Folder; -import org.apache.chemistry.opencmis.client.api.ObjectType; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.data.ContentStream; import org.apache.chemistry.opencmis.commons.enums.VersioningState; @@ -42,134 +43,143 @@ import org.slf4j.LoggerFactory; * The CMIS producer. */ public class CMISProducer extends DefaultProducer { - private static final Logger LOG = LoggerFactory.getLogger(CMISProducer.class); - private final CMISSessionFacade cmisSessionFacade; - - public CMISProducer(CMISEndpoint endpoint, CMISSessionFacade cmisSessionFacade) { - super(endpoint); - this.cmisSessionFacade = cmisSessionFacade; - } - - public void process(Exchange exchange) throws Exception { - CmisObject cmisObject = createNode(exchange); - LOG.debug("Created node with id: {}", cmisObject.getId()); - exchange.getOut().setBody(cmisObject.getId()); - } - - private Map<String, Object> filterTypeProperties(Map<String, Object> properties) { - Map<String, Object> result = new HashMap<String, Object>(properties.size()); - String objectTypeName = CamelCMISConstants.CMIS_DOCUMENT; - if (properties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { - objectTypeName = (String) properties.get(PropertyIds.OBJECT_TYPE_ID); - } - - Set<String> types = cmisSessionFacade.getPropertiesFor(objectTypeName); - for (Map.Entry<String, Object> entry : properties.entrySet()) { - if (types.contains(entry.getKey())) { - result.put(entry.getKey(), entry.getValue()); - } - } - return result; - } - - private CmisObject createNode(Exchange exchange) throws Exception { - validateRequiredHeader(exchange, PropertyIds.NAME); - - Message message = exchange.getIn(); - String parentFolderPath = parentFolderPathFor(message); - Folder parentFolder = getFolderOnPath(exchange, parentFolderPath); - Map<String, Object> cmisProperties = filterTypeProperties(message.getHeaders()); - - if (isDocument(exchange)) { - String fileName = message.getHeader(PropertyIds.NAME, String.class); - String mimeType = getMimeType(message); - byte[] buf = getBodyData(message); - ContentStream contentStream = cmisSessionFacade.createContentStream(fileName, buf, mimeType); - return storeDocument(parentFolder, cmisProperties, contentStream); - } else if (isFolder(message)) { - return storeFolder(parentFolder, cmisProperties); - } else { //other types - return storeDocument(parentFolder, cmisProperties, null); - } - } - - private Folder getFolderOnPath(Exchange exchange, String path) { - try { - return (Folder)cmisSessionFacade.getObjectByPath(path); - } catch (CmisObjectNotFoundException e) { - throw new RuntimeExchangeException("Path not found " + path, exchange, e); - } - } - - private String parentFolderPathFor(Message message) { - String customPath = message.getHeader(CamelCMISConstants.CMIS_FOLDER_PATH, String.class); - if (customPath != null) { - return customPath; - } - - if (isFolder(message)) { - String path = (String)message.getHeader(PropertyIds.PATH); - String name = (String)message.getHeader(PropertyIds.NAME); - if (path != null && path.length() > name.length()) { - return path.substring(0, path.length() - name.length()); - } - } - - return "/"; - } - - private boolean isFolder(Message message) { - String baseTypeId = message.getHeader(PropertyIds.OBJECT_TYPE_ID, String.class); - if (baseTypeId != null) { - return CamelCMISConstants.CMIS_FOLDER.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId)); - } - return message.getBody() == null; - } - - private Folder storeFolder(Folder parentFolder, Map<String, Object> cmisProperties) { - if (!cmisProperties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { - cmisProperties.put(PropertyIds.OBJECT_TYPE_ID, CamelCMISConstants.CMIS_FOLDER); - } - LOG.debug("Creating folder with properties: {}", cmisProperties); - return parentFolder.createFolder(cmisProperties); - } - - private Document storeDocument(Folder parentFolder, Map<String, Object> cmisProperties, - ContentStream contentStream) { - if (!cmisProperties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { - cmisProperties.put(PropertyIds.OBJECT_TYPE_ID, CamelCMISConstants.CMIS_DOCUMENT); - } - - VersioningState versioningState = VersioningState.NONE; - if (cmisSessionFacade - .isObjectTypeVersionable((String)cmisProperties.get(PropertyIds.OBJECT_TYPE_ID))) { - versioningState = VersioningState.MAJOR; - } - LOG.debug("Creating document with properties: {}", cmisProperties); - return parentFolder.createDocument(cmisProperties, contentStream, versioningState); - } - - private void validateRequiredHeader(Exchange exchange, String name) throws NoSuchHeaderException { - ExchangeHelper.getMandatoryHeader(exchange, name, String.class); - } - - private boolean isDocument(Exchange exchange) { - String baseTypeId = exchange.getIn().getHeader(PropertyIds.OBJECT_TYPE_ID, String.class); - if (baseTypeId != null) { - return CamelCMISConstants.CMIS_DOCUMENT.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId)); - } - return exchange.getIn().getBody() != null; - } - - private byte[] getBodyData(Message message) { - return message.getBody(byte[].class); - } - - private String getMimeType(Message message) throws NoSuchHeaderException { - String mimeType = message.getHeader(PropertyIds.CONTENT_STREAM_MIME_TYPE, String.class); - if (mimeType == null) { - mimeType = MessageHelper.getContentType(message); - } - return mimeType; - } + private static final Logger LOG = LoggerFactory.getLogger(CMISProducer.class); + private final CMISSessionFacade cmisSessionFacade; + + public CMISProducer(CMISEndpoint endpoint, CMISSessionFacade cmisSessionFacade) { + super(endpoint); + this.cmisSessionFacade = cmisSessionFacade; + } + + public void process(Exchange exchange) throws Exception { + CmisObject cmisObject = createNode(exchange); + LOG.debug("Created node with id: {}", cmisObject.getId()); + exchange.getOut().setBody(cmisObject.getId()); + } + + private Map<String, Object> filterTypeProperties(Map<String, Object> properties) { + Map<String, Object> result = new HashMap<String, Object>(properties.size()); + + String objectTypeName = CamelCMISConstants.CMIS_DOCUMENT; + if (properties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { + objectTypeName = (String) properties.get(PropertyIds.OBJECT_TYPE_ID); + } + + Set<String> types = new HashSet<String>(); + types.addAll(cmisSessionFacade.getPropertiesFor(objectTypeName)); + + if (cmisSessionFacade.supportsSecondaries() && properties.containsKey(PropertyIds.SECONDARY_OBJECT_TYPE_IDS)) { + @SuppressWarnings("unchecked") + Collection<String> secondaryTypes = (Collection<String>) properties.get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS); + for (String secondaryType : secondaryTypes) { + types.addAll(cmisSessionFacade.getPropertiesFor(secondaryType)); + } + } + + for (Map.Entry<String, Object> entry : properties.entrySet()) { + if (types.contains(entry.getKey())) { + result.put(entry.getKey(), entry.getValue()); + } + } + return result; + } + + private CmisObject createNode(Exchange exchange) throws Exception { + validateRequiredHeader(exchange, PropertyIds.NAME); + + Message message = exchange.getIn(); + String parentFolderPath = parentFolderPathFor(message); + Folder parentFolder = getFolderOnPath(exchange, parentFolderPath); + Map<String, Object> cmisProperties = filterTypeProperties(message.getHeaders()); + + if (isDocument(exchange)) { + String fileName = message.getHeader(PropertyIds.NAME, String.class); + String mimeType = getMimeType(message); + byte[] buf = getBodyData(message); + ContentStream contentStream = cmisSessionFacade.createContentStream(fileName, buf, mimeType); + return storeDocument(parentFolder, cmisProperties, contentStream); + } else if (isFolder(message)) { + return storeFolder(parentFolder, cmisProperties); + } else { // other types + return storeDocument(parentFolder, cmisProperties, null); + } + } + + private Folder getFolderOnPath(Exchange exchange, String path) { + try { + return (Folder) cmisSessionFacade.getObjectByPath(path); + } catch (CmisObjectNotFoundException e) { + throw new RuntimeExchangeException("Path not found " + path, exchange, e); + } + } + + private String parentFolderPathFor(Message message) { + String customPath = message.getHeader(CamelCMISConstants.CMIS_FOLDER_PATH, String.class); + if (customPath != null) { + return customPath; + } + + if (isFolder(message)) { + String path = (String) message.getHeader(PropertyIds.PATH); + String name = (String) message.getHeader(PropertyIds.NAME); + if (path != null && path.length() > name.length()) { + return path.substring(0, path.length() - name.length()); + } + } + + return "/"; + } + + private boolean isFolder(Message message) { + String baseTypeId = message.getHeader(PropertyIds.OBJECT_TYPE_ID, String.class); + if (baseTypeId != null) { + return CamelCMISConstants.CMIS_FOLDER.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId)); + } + return message.getBody() == null; + } + + private Folder storeFolder(Folder parentFolder, Map<String, Object> cmisProperties) { + if (!cmisProperties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { + cmisProperties.put(PropertyIds.OBJECT_TYPE_ID, CamelCMISConstants.CMIS_FOLDER); + } + LOG.debug("Creating folder with properties: {}", cmisProperties); + return parentFolder.createFolder(cmisProperties); + } + + private Document storeDocument(Folder parentFolder, Map<String, Object> cmisProperties, ContentStream contentStream) { + if (!cmisProperties.containsKey(PropertyIds.OBJECT_TYPE_ID)) { + cmisProperties.put(PropertyIds.OBJECT_TYPE_ID, CamelCMISConstants.CMIS_DOCUMENT); + } + + VersioningState versioningState = VersioningState.NONE; + if (cmisSessionFacade.isObjectTypeVersionable((String) cmisProperties.get(PropertyIds.OBJECT_TYPE_ID))) { + versioningState = VersioningState.MAJOR; + } + LOG.debug("Creating document with properties: {}", cmisProperties); + return parentFolder.createDocument(cmisProperties, contentStream, versioningState); + } + + private void validateRequiredHeader(Exchange exchange, String name) throws NoSuchHeaderException { + ExchangeHelper.getMandatoryHeader(exchange, name, String.class); + } + + private boolean isDocument(Exchange exchange) { + String baseTypeId = exchange.getIn().getHeader(PropertyIds.OBJECT_TYPE_ID, String.class); + if (baseTypeId != null) { + return CamelCMISConstants.CMIS_DOCUMENT.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId)); + } + return exchange.getIn().getBody() != null; + } + + private byte[] getBodyData(Message message) { + return message.getBody(byte[].class); + } + + private String getMimeType(Message message) throws NoSuchHeaderException { + String mimeType = message.getHeader(PropertyIds.CONTENT_STREAM_MIME_TYPE, String.class); + if (mimeType == null) { + mimeType = MessageHelper.getContentType(message); + } + return mimeType; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/e9703d34/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacade.java ---------------------------------------------------------------------- diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacade.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacade.java index 898b7e1..34d6a4a 100644 --- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacade.java +++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacade.java @@ -35,7 +35,9 @@ import org.apache.chemistry.opencmis.client.api.Session; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.SessionParameter; import org.apache.chemistry.opencmis.commons.data.ContentStream; +import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; import org.apache.chemistry.opencmis.commons.enums.BindingType; +import org.apache.chemistry.opencmis.commons.enums.CmisVersion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -194,6 +196,17 @@ public class CMISSessionFacade { return false; } + public boolean supportsSecondaries() { + if (session.getRepositoryInfo().getCmisVersion() == CmisVersion.CMIS_1_0) + return false; + for (ObjectType type : session.getTypeChildren(null, false)) { + if (BaseTypeId.CMIS_SECONDARY.value().equals(type.getId())) { + return true; + } + } + return false; + } + public ContentStream createContentStream(String fileName, byte[] buf, String mimeType) throws Exception { return buf != null ? session.getObjectFactory() .createContentStream(fileName, buf.length, mimeType, new ByteArrayInputStream(buf)) : null; http://git-wip-us.apache.org/repos/asf/camel/blob/e9703d34/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISProducerTest.java b/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISProducerTest.java index 10fc7ce..6cb0445 100644 --- a/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISProducerTest.java +++ b/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISProducerTest.java @@ -16,6 +16,9 @@ */ package org.apache.camel.component.cmis; +import java.util.Arrays; +import java.util.List; + import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.NoSuchHeaderException; @@ -124,6 +127,25 @@ public class CMISProducerTest extends CMISTestSupport { newNode.getPropertyValue(PropertyIds.CONTENT_STREAM_MIME_TYPE)); } + @Test + public void cmisSecondaryTypePropertiesAreStored() throws Exception { + + List<String> secondaryTypes = Arrays.asList("MySecondaryType"); + + Exchange exchange = createExchangeWithInBody("Some content to be store"); + exchange.getIn().getHeaders().put(PropertyIds.CONTENT_STREAM_MIME_TYPE, "text/plain; charset=UTF-8"); + exchange.getIn().getHeaders().put(PropertyIds.NAME, "test.txt"); + exchange.getIn().getHeaders().put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondaryTypes); + exchange.getIn().getHeaders().put("SecondaryStringProp", "secondaryTypePropValue"); + + template.send(exchange); + String newNodeId = exchange.getOut().getBody(String.class); + CmisObject newNode = retrieveCMISObjectByIdFromServer(newNodeId); + + assertEquals(1, newNode.getSecondaryTypes().size()); + assertEquals("secondaryTypePropValue", newNode.getPropertyValue("SecondaryStringProp")); + } + @Test(expected = ResolveEndpointFailedException.class) public void failConnectingToNonExistingRepository() throws Exception { Endpoint endpoint = context.getEndpoint("cmis://" + getUrl() http://git-wip-us.apache.org/repos/asf/camel/blob/e9703d34/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISTestSupport.java ---------------------------------------------------------------------- diff --git a/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISTestSupport.java b/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISTestSupport.java index 6f2bd32..1c0bc9e 100644 --- a/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISTestSupport.java +++ b/components/camel-cmis/src/test/java/org/apache/camel/component/cmis/CMISTestSupport.java @@ -51,9 +51,9 @@ import org.junit.BeforeClass; public class CMISTestSupport extends CamelTestSupport { protected static final String CMIS_ENDPOINT_TEST_SERVER - = "http://localhost:%s/chemistry-opencmis-server-inmemory/atom"; + = "http://localhost:%s/chemistry-opencmis-server-inmemory/atom11"; protected static final String OPEN_CMIS_SERVER_WAR_PATH - = "target/dependency/chemistry-opencmis-server-inmemory-0.8.0.war"; + = "target/dependency/chemistry-opencmis-server-inmemory-0.13.0.war"; protected static Server cmisServer; protected static int port;