You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2019/05/02 11:03:08 UTC
[camel] 04/05: CAMEL-13453 - CAMEL-13453 - Camel-Azure: add
automatic injection of single instance bean, Azure-Queue
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 6ea2d928cff426a8aafebe7fc6fd685b30cacf95
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu May 2 13:00:19 2019 +0200
CAMEL-13453 - CAMEL-13453 - Camel-Azure: add automatic injection of single instance bean, Azure-Queue
---
.../azure/queue/QueueServiceComponent.java | 29 +++-
.../azure/queue/QueueServiceConfiguration.java | 13 ++
...eueServiceComponentClientConfigurationTest.java | 161 +++++++++++++++++++++
3 files changed, 202 insertions(+), 1 deletion(-)
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
index 770a6a1..e153b9f 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
@@ -17,27 +17,35 @@
package org.apache.camel.component.azure.queue;
import java.util.Map;
+import java.util.Set;
import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.blob.CloudBlob;
import com.microsoft.azure.storage.queue.CloudQueue;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
+import org.apache.camel.component.azure.blob.BlobServiceConfiguration;
+import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.annotations.Component;
import org.apache.camel.support.DefaultComponent;
@Component("azure-queue")
public class QueueServiceComponent extends DefaultComponent {
+
+ @Metadata(label = "advanced")
+ private QueueServiceConfiguration configuration;
public QueueServiceComponent() {
}
public QueueServiceComponent(CamelContext context) {
super(context);
+ this.configuration = new QueueServiceConfiguration();
}
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
- QueueServiceConfiguration configuration = new QueueServiceConfiguration();
+ final QueueServiceConfiguration configuration = this.configuration.copy();
setProperties(configuration, parameters);
String[] parts = null;
@@ -63,6 +71,7 @@ public class QueueServiceComponent extends DefaultComponent {
configuration.setQueueName(parts[1]);
}
+ checkAndSetRegistryClient(configuration);
checkCredentials(configuration);
QueueServiceEndpoint endpoint = new QueueServiceEndpoint(uri, this, configuration);
@@ -70,6 +79,17 @@ public class QueueServiceComponent extends DefaultComponent {
return endpoint;
}
+ public QueueServiceConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ /**
+ * The Queue Service configuration
+ */
+ public void setConfiguration(QueueServiceConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
private void checkCredentials(QueueServiceConfiguration cfg) {
CloudQueue client = cfg.getAzureQueueClient();
StorageCredentials creds = client == null ? cfg.getCredentials() : client.getServiceClient().getCredentials();
@@ -77,4 +97,11 @@ public class QueueServiceComponent extends DefaultComponent {
throw new IllegalArgumentException("Credentials must be specified.");
}
}
+
+ private void checkAndSetRegistryClient(QueueServiceConfiguration configuration) {
+ Set<CloudQueue> clients = getCamelContext().getRegistry().findByType(CloudQueue.class);
+ if (clients.size() == 1) {
+ configuration.setAzureQueueClient(clients.stream().findFirst().get());
+ }
+ }
}
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java
index e08c000..1a5e52e 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.azure.queue;
import com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.component.azure.common.AbstractConfiguration;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
@@ -105,4 +106,16 @@ public class QueueServiceConfiguration extends AbstractConfiguration {
public void setQueuePrefix(String queuePrefix) {
this.queuePrefix = queuePrefix;
}
+
+ // *************************************************
+ //
+ // *************************************************
+
+ public QueueServiceConfiguration copy() {
+ try {
+ return (QueueServiceConfiguration)super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeCamelException(e);
+ }
+ }
}
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java
new file mode 100644
index 0000000..cd837cc
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentClientConfigurationTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.azure.queue;
+
+import java.net.URI;
+
+import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
+import com.microsoft.azure.storage.core.Base64;
+import com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class QueueServiceComponentClientConfigurationTest extends CamelTestSupport {
+
+ @Test
+ public void testCreateEndpointWithMinConfigForClientOnly() throws Exception {
+ CloudQueue client =
+ new CloudQueue(URI.create("https://camelazure.queue.core.windows.net/testqueue/messages"),
+ newAccountKeyCredentials());
+
+ context.getRegistry().bind("azureQueueClient", client);
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue");
+
+ doTestCreateEndpointWithMinConfig(endpoint, true);
+ }
+
+ @Test
+ public void testCreateEndpointWithMinConfigForCredsOnly() throws Exception {
+ registerCredentials();
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue?credentials=#creds");
+
+ doTestCreateEndpointWithMinConfig(endpoint, false);
+ }
+
+ @Test
+ public void testCreateEndpointWithMaxConfig() throws Exception {
+ registerCredentials();
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue?credentials=#creds"
+ + "&operation=addMessage&queuePrefix=prefix&messageTimeToLive=100&messageVisibilityDelay=10");
+
+ doTestCreateEndpointWithMaxConfig(endpoint, false);
+ }
+
+ private void doTestCreateEndpointWithMinConfig(QueueServiceEndpoint endpoint, boolean clientExpected)
+ throws Exception {
+ assertEquals("camelazure", endpoint.getConfiguration().getAccountName());
+ assertEquals("testqueue", endpoint.getConfiguration().getQueueName());
+ if (clientExpected) {
+ assertNotNull(endpoint.getConfiguration().getAzureQueueClient());
+ assertNull(endpoint.getConfiguration().getCredentials());
+ } else {
+ assertNull(endpoint.getConfiguration().getAzureQueueClient());
+ assertNotNull(endpoint.getConfiguration().getCredentials());
+ }
+ assertEquals(QueueServiceOperations.listQueues, endpoint.getConfiguration().getOperation());
+
+ assertNull(endpoint.getConfiguration().getQueuePrefix());
+ assertEquals(0, endpoint.getConfiguration().getMessageTimeToLive());
+ assertEquals(0, endpoint.getConfiguration().getMessageVisibilityDelay());
+ createConsumer(endpoint);
+ }
+
+ private void doTestCreateEndpointWithMaxConfig(QueueServiceEndpoint endpoint, boolean clientExpected)
+ throws Exception {
+ assertEquals("camelazure", endpoint.getConfiguration().getAccountName());
+ assertEquals("testqueue", endpoint.getConfiguration().getQueueName());
+ if (clientExpected) {
+ assertNotNull(endpoint.getConfiguration().getAzureQueueClient());
+ assertNull(endpoint.getConfiguration().getCredentials());
+ } else {
+ assertNull(endpoint.getConfiguration().getAzureQueueClient());
+ assertNotNull(endpoint.getConfiguration().getCredentials());
+ }
+ assertEquals(QueueServiceOperations.addMessage, endpoint.getConfiguration().getOperation());
+
+ assertEquals("prefix", endpoint.getConfiguration().getQueuePrefix());
+ assertEquals(100, endpoint.getConfiguration().getMessageTimeToLive());
+ assertEquals(10, endpoint.getConfiguration().getMessageVisibilityDelay());
+
+ createConsumer(endpoint);
+ }
+
+ @Test
+ public void testNoCredentials() throws Exception {
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ try {
+ component.createEndpoint("azure-queue://camelazure/testqueue");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Credentials must be specified.", ex.getMessage());
+ }
+ }
+
+ @Test
+ public void testTooManyPathSegments() throws Exception {
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ try {
+ component.createEndpoint("azure-queue://camelazure/testqueue/1");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Only the account and queue names must be specified.", ex.getMessage());
+ }
+ }
+
+ @Test
+ public void testTooFewPathSegments() throws Exception {
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ try {
+ component.createEndpoint("azure-queue://camelazure?operation=addMessage");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("The queue name must be specified.", ex.getMessage());
+ }
+ }
+
+
+ private static void createConsumer(Endpoint endpoint) throws Exception {
+ endpoint.createConsumer(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // noop
+ }
+ });
+ }
+
+ private void registerCredentials() {
+ context.getRegistry().bind("creds", newAccountKeyCredentials());
+ }
+ private StorageCredentials newAccountKeyCredentials() {
+ return new StorageCredentialsAccountAndKey("camelazure",
+ Base64.encode("key".getBytes()));
+ }
+
+}