You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/02/26 07:38:38 UTC

camel git commit: CAMEL-9180 - camel-cmis Lazy Initialize Session Facade

Repository: camel
Updated Branches:
  refs/heads/master 1a54c78d2 -> e7b1cb426


CAMEL-9180 - camel-cmis Lazy Initialize Session Facade


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e7b1cb42
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e7b1cb42
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e7b1cb42

Branch: refs/heads/master
Commit: e7b1cb4262a4b9264e941cbcba8b0bf15ce620bb
Parents: 1a54c78
Author: lburgazzoli <lb...@gmail.com>
Authored: Thu Feb 25 18:44:58 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Feb 26 07:00:36 2016 +0100

----------------------------------------------------------------------
 .../camel/component/cmis/CMISComponent.java     | 17 +++++--
 .../camel/component/cmis/CMISConsumer.java      | 27 +++++++----
 .../camel/component/cmis/CMISEndpoint.java      | 42 +++++++++-------
 .../camel/component/cmis/CMISProducer.java      | 51 ++++++++++++--------
 .../camel/component/cmis/CMISQueryProducer.java | 22 +++++++--
 .../cmis/CMISSessionFacadeFactory.java          | 22 +++++++++
 .../camel/component/cmis/CMISProducerTest.java  |  4 +-
 7 files changed, 126 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISComponent.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISComponent.java
index dd66711..ba6ece2 100644
--- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISComponent.java
+++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISComponent.java
@@ -30,15 +30,24 @@ public class CMISComponent extends UriEndpointComponent {
         super(CMISEndpoint.class);
     }
 
-    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters)
-        throws Exception {
+    protected Endpoint createEndpoint(String uri, final String remaining, final Map<String, Object> parameters) throws Exception {
         boolean queryMode = removeQueryMode(parameters);
 
         CMISSessionFacade sessionFacade = new CMISSessionFacade(remaining);
         setProperties(sessionFacade, parameters);
-        sessionFacade.initSession();
-        CMISEndpoint endpoint = new CMISEndpoint(uri, this, sessionFacade);
+
+        CMISEndpoint endpoint = new CMISEndpoint(uri, this, new CMISSessionFacadeFactory() {
+            @Override
+            public CMISSessionFacade create() throws Exception {
+                CMISSessionFacade sessionFacade = new CMISSessionFacade(remaining);
+                setProperties(sessionFacade, parameters);
+
+                return sessionFacade;
+            }
+        });
+
         endpoint.setQueryMode(queryMode);
+
         return endpoint;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISConsumer.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISConsumer.java
index 8042d31..c17329b 100644
--- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISConsumer.java
+++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISConsumer.java
@@ -31,24 +31,22 @@ import org.slf4j.LoggerFactory;
  */
 public class CMISConsumer extends ScheduledPollConsumer {
     private static final Logger LOG = LoggerFactory.getLogger(CMISConsumer.class);
+    private final CMISSessionFacadeFactory sessionFacadeFactory;
     private CMISSessionFacade sessionFacade;
 
-    public CMISConsumer(CMISEndpoint endpoint, Processor processor) {
-        super(endpoint, processor);
-    }
-
-    public CMISConsumer(CMISEndpoint cmisEndpoint, Processor processor, CMISSessionFacade sessionFacade) {
-        this(cmisEndpoint, processor);
-        this.sessionFacade = sessionFacade;
+    public CMISConsumer(CMISEndpoint cmisEndpoint, Processor processor, CMISSessionFacadeFactory sessionFacadeFactory) {
+        super(cmisEndpoint, processor);
+        this.sessionFacadeFactory = sessionFacadeFactory;
+        this.sessionFacade = null;
     }
 
     @Override
     protected int poll() throws Exception {
-        return this.sessionFacade.poll(this);
+        return getSessionFacade().poll(this);
     }
     
-    public OperationContext createOperationContext() {
-        return sessionFacade.createOperationContext();
+    public OperationContext createOperationContext() throws Exception {
+        return getSessionFacade().createOperationContext();
     }
 
     int sendExchangeWithPropsAndBody(Map<String, Object> properties, InputStream inputStream)
@@ -60,4 +58,13 @@ public class CMISConsumer extends ScheduledPollConsumer {
         getProcessor().process(exchange);
         return 1;
     }
+
+    private CMISSessionFacade getSessionFacade() throws Exception {
+        if (sessionFacade == null) {
+            sessionFacade = sessionFacadeFactory.create();
+            sessionFacade.initSession();
+        }
+
+        return sessionFacade;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISEndpoint.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISEndpoint.java
index c66f7b9..b7a4fb4 100644
--- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISEndpoint.java
+++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISEndpoint.java
@@ -20,43 +20,49 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The cmis component uses the Apache Chemistry client API and allows you to add/read nodes to/from a CMIS compliant content repositories.
  */
 @UriEndpoint(scheme = "cmis", title = "CMIS", syntax = "cmis:url", consumerClass = CMISConsumer.class, label = "cms,database")
 public class CMISEndpoint extends DefaultEndpoint {
+    private static final Logger LOG = LoggerFactory.getLogger(CMISEndpoint.class);
+
+    private final CMISSessionFacadeFactory sessionFacadeFactory;
+
+    @UriPath(description = "the cmis url")
+    @Metadata(required = "true")
+    private final String url;
 
-    @UriParam
-    private CMISSessionFacade sessionFacade;
     @UriParam(label = "producer")
     private boolean queryMode;
 
-    public CMISEndpoint() {
-    }
-
-    public CMISEndpoint(String uri, CMISComponent component) {
-        super(uri, component);
-    }
+    public CMISEndpoint(String uri, CMISComponent cmisComponent, CMISSessionFacadeFactory sessionFacadeFactory) {
+        super(uri, cmisComponent);
 
-    public CMISEndpoint(String uri, CMISComponent cmisComponent, CMISSessionFacade sessionFacade) {
-        this(uri, cmisComponent);
-        this.sessionFacade = sessionFacade;
+        this.url = uri;
+        this.sessionFacadeFactory = sessionFacadeFactory;
     }
 
+    @Override
     public Producer createProducer() throws Exception {
-        if (this.queryMode) {
-            return new CMISQueryProducer(this, sessionFacade);
-        }
-        return new CMISProducer(this, sessionFacade);
+        return this.queryMode
+            ? new CMISQueryProducer(this, sessionFacadeFactory)
+            : new CMISProducer(this, sessionFacadeFactory);
     }
 
+    @Override
     public Consumer createConsumer(Processor processor) throws Exception {
-        CMISConsumer answer = new CMISConsumer(this, processor, sessionFacade);
-        configureConsumer(answer);
-        return answer;
+        CMISConsumer consumer = new CMISConsumer(this, processor, sessionFacadeFactory);
+        configureConsumer(consumer);
+
+        return consumer;
     }
 
     public boolean isSingleton() {

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/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 f3d1b76..dcc9f29 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
@@ -44,11 +44,13 @@ import org.slf4j.LoggerFactory;
  */
 public class CMISProducer extends DefaultProducer {
     private static final Logger LOG = LoggerFactory.getLogger(CMISProducer.class);
-    private final CMISSessionFacade cmisSessionFacade;
+    private final CMISSessionFacadeFactory sessionFacadeFactory;
+    private CMISSessionFacade sessionFacade;
 
-    public CMISProducer(CMISEndpoint endpoint, CMISSessionFacade cmisSessionFacade) {
+    public CMISProducer(CMISEndpoint endpoint, CMISSessionFacadeFactory sessionFacadeFactory) {
         super(endpoint);
-        this.cmisSessionFacade = cmisSessionFacade;
+        this.sessionFacadeFactory = sessionFacadeFactory;
+        this.sessionFacade = null;
     }
 
     public void process(Exchange exchange) throws Exception {
@@ -57,22 +59,22 @@ public class CMISProducer extends DefaultProducer {
         exchange.getOut().setBody(cmisObject.getId());
     }
 
-    private Map<String, Object> filterTypeProperties(Map<String, Object> properties) {
-        Map<String, Object> result = new HashMap<String, Object>(properties.size());
+    private Map<String, Object> filterTypeProperties(Map<String, Object> properties) throws Exception {
+        Map<String, Object> result = new HashMap<>(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));
+        Set<String> types = new HashSet<>();
+        types.addAll(getSessionFacade().getPropertiesFor(objectTypeName));
 
-        if (cmisSessionFacade.supportsSecondaries() && properties.containsKey(PropertyIds.SECONDARY_OBJECT_TYPE_IDS)) {
+        if (getSessionFacade().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));
+                types.addAll(getSessionFacade().getPropertiesFor(secondaryType));
             }
         }
 
@@ -96,7 +98,7 @@ public class CMISProducer extends DefaultProducer {
             String fileName = message.getHeader(PropertyIds.NAME, String.class);
             String mimeType = getMimeType(message);
             byte[] buf = getBodyData(message);
-            ContentStream contentStream = cmisSessionFacade.createContentStream(fileName, buf, mimeType);
+            ContentStream contentStream = getSessionFacade().createContentStream(fileName, buf, mimeType);
             return storeDocument(parentFolder, cmisProperties, contentStream);
         } else if (isFolder(message)) {
             return storeFolder(parentFolder, cmisProperties);
@@ -105,15 +107,15 @@ public class CMISProducer extends DefaultProducer {
         }
     }
 
-    private Folder getFolderOnPath(Exchange exchange, String path) {
+    private Folder getFolderOnPath(Exchange exchange, String path) throws Exception {
         try {
-            return (Folder) cmisSessionFacade.getObjectByPath(path);
+            return (Folder) getSessionFacade().getObjectByPath(path);
         } catch (CmisObjectNotFoundException e) {
             throw new RuntimeExchangeException("Path not found " + path, exchange, e);
         }
     }
 
-    private String parentFolderPathFor(Message message) {
+    private String parentFolderPathFor(Message message) throws Exception {
         String customPath = message.getHeader(CamelCMISConstants.CMIS_FOLDER_PATH, String.class);
         if (customPath != null) {
             return customPath;
@@ -130,15 +132,15 @@ public class CMISProducer extends DefaultProducer {
         return "/";
     }
 
-    private boolean isFolder(Message message) {
+    private boolean isFolder(Message message) throws Exception {
         String baseTypeId = message.getHeader(PropertyIds.OBJECT_TYPE_ID, String.class);
         if (baseTypeId != null) {
-            return CamelCMISConstants.CMIS_FOLDER.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId));
+            return CamelCMISConstants.CMIS_FOLDER.equals(getSessionFacade().getCMISTypeFor(baseTypeId));
         }
         return message.getBody() == null;
     }
 
-    private Folder storeFolder(Folder parentFolder, Map<String, Object> cmisProperties) {
+    private Folder storeFolder(Folder parentFolder, Map<String, Object> cmisProperties) throws Exception {
         if (!cmisProperties.containsKey(PropertyIds.OBJECT_TYPE_ID)) {
             cmisProperties.put(PropertyIds.OBJECT_TYPE_ID, CamelCMISConstants.CMIS_FOLDER);
         }
@@ -146,13 +148,13 @@ public class CMISProducer extends DefaultProducer {
         return parentFolder.createFolder(cmisProperties);
     }
 
-    private Document storeDocument(Folder parentFolder, Map<String, Object> cmisProperties, ContentStream contentStream) {
+    private Document storeDocument(Folder parentFolder, Map<String, Object> cmisProperties, ContentStream contentStream) throws Exception {
         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))) {
+        if (getSessionFacade().isObjectTypeVersionable((String) cmisProperties.get(PropertyIds.OBJECT_TYPE_ID))) {
             versioningState = VersioningState.MAJOR;
         }
         LOG.debug("Creating document with properties: {}", cmisProperties);
@@ -163,10 +165,10 @@ public class CMISProducer extends DefaultProducer {
         ExchangeHelper.getMandatoryHeader(exchange, name, String.class);
     }
 
-    private boolean isDocument(Exchange exchange) {
+    private boolean isDocument(Exchange exchange) throws Exception {
         String baseTypeId = exchange.getIn().getHeader(PropertyIds.OBJECT_TYPE_ID, String.class);
         if (baseTypeId != null) {
-            return CamelCMISConstants.CMIS_DOCUMENT.equals(cmisSessionFacade.getCMISTypeFor(baseTypeId));
+            return CamelCMISConstants.CMIS_DOCUMENT.equals(getSessionFacade().getCMISTypeFor(baseTypeId));
         }
         return exchange.getIn().getBody() != null;
     }
@@ -182,4 +184,13 @@ public class CMISProducer extends DefaultProducer {
         }
         return mimeType;
     }
+
+    private CMISSessionFacade getSessionFacade() throws Exception {
+        if (sessionFacade == null) {
+            sessionFacade = sessionFacadeFactory.create();
+            sessionFacade.initSession();
+        }
+
+        return sessionFacade;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISQueryProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISQueryProducer.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISQueryProducer.java
index 57810dc..1b5809e 100644
--- a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISQueryProducer.java
+++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISQueryProducer.java
@@ -28,11 +28,14 @@ import org.apache.chemistry.opencmis.client.api.QueryResult;
  * The CMIS Query producer.
  */
 public class CMISQueryProducer extends DefaultProducer {
-    private final CMISSessionFacade cmisSessionFacade;
 
-    public CMISQueryProducer(CMISEndpoint endpoint, CMISSessionFacade cmisSessionFacade) {
+    private final CMISSessionFacadeFactory sessionFacadeFactory;
+    private CMISSessionFacade sessionFacade;
+
+    public CMISQueryProducer(CMISEndpoint endpoint, CMISSessionFacadeFactory sessionFacadeFactory) {
         super(endpoint);
-        this.cmisSessionFacade = cmisSessionFacade;
+        this.sessionFacadeFactory = sessionFacadeFactory;
+        this.sessionFacade = null;
     }
 
     public void process(Exchange exchange) throws Exception {
@@ -46,8 +49,8 @@ public class CMISQueryProducer extends DefaultProducer {
         Boolean retrieveContent = getRetrieveContent(exchange);
         Integer readSize = getReadSize(exchange);
 
-        ItemIterable<QueryResult> itemIterable = cmisSessionFacade.executeQuery(query);
-        return cmisSessionFacade.retrieveResult(retrieveContent, readSize, itemIterable);
+        ItemIterable<QueryResult> itemIterable = getSessionFacade().executeQuery(query);
+        return getSessionFacade().retrieveResult(retrieveContent, readSize, itemIterable);
     }
 
     private Integer getReadSize(Exchange exchange) {
@@ -57,4 +60,13 @@ public class CMISQueryProducer extends DefaultProducer {
     private Boolean getRetrieveContent(Exchange exchange) {
         return exchange.getIn().getHeader(CamelCMISConstants.CAMEL_CMIS_RETRIEVE_CONTENT, Boolean.class);
     }
+
+    private CMISSessionFacade getSessionFacade() throws Exception {
+        if (sessionFacade == null) {
+            sessionFacade = sessionFacadeFactory.create();
+            sessionFacade.initSession();
+        }
+
+        return sessionFacade;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacadeFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacadeFactory.java b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacadeFactory.java
new file mode 100644
index 0000000..0c293cb
--- /dev/null
+++ b/components/camel-cmis/src/main/java/org/apache/camel/component/cmis/CMISSessionFacadeFactory.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.cmis;
+
+interface CMISSessionFacadeFactory {
+    CMISSessionFacade create() throws Exception;
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e7b1cb42/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 06e1cab..c8748d3 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
@@ -25,13 +25,13 @@ import org.apache.camel.NoSuchHeaderException;
 import org.apache.camel.Produce;
 import org.apache.camel.Producer;
 import org.apache.camel.ProducerTemplate;
-import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.RuntimeExchangeException;
 import org.apache.camel.builder.RouteBuilder;
 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.commons.PropertyIds;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.junit.Test;
 
 public class CMISProducerTest extends CMISTestSupport {
@@ -146,7 +146,7 @@ public class CMISProducerTest extends CMISTestSupport {
         assertEquals("secondaryTypePropValue", newNode.getPropertyValue("SecondaryStringProp"));
     }
 
-    @Test(expected = ResolveEndpointFailedException.class)
+    @Test(expected = CmisInvalidArgumentException.class)
     public void failConnectingToNonExistingRepository() throws Exception {
         Endpoint endpoint = context.getEndpoint("cmis://" + getUrl()
                 + "?username=admin&password=admin&repositoryId=NON_EXISTING_ID");