You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by se...@apache.org on 2017/02/21 12:44:11 UTC
[2/2] camel git commit: [CAMEL-10786] Adding the missing resources
[CAMEL-10786] Adding the missing resources
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/507e8b5f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/507e8b5f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/507e8b5f
Branch: refs/heads/master
Commit: 507e8b5f849e85f78548cba2acfd9341e5975b07
Parents: 1b40de6
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Tue Feb 21 12:43:51 2017 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Tue Feb 21 12:43:51 2017 +0000
----------------------------------------------------------------------
.../azure/queue/QueueServiceComponent.java | 70 ++++++++++
.../azure/queue/QueueServiceConfiguration.java | 66 ++++++++++
.../azure/queue/QueueServiceConstants.java | 28 ++++
.../azure/queue/QueueServiceConsumer.java | 68 ++++++++++
.../azure/queue/QueueServiceEndpoint.java | 83 ++++++++++++
.../azure/queue/QueueServiceOperations.java | 22 ++++
.../azure/queue/QueueServiceProducer.java | 93 ++++++++++++++
.../component/azure/queue/QueueServiceUtil.java | 67 ++++++++++
.../org/apache/camel/component/azure-queue | 18 +++
.../QueueServiceComponentConfigurationTest.java | 128 +++++++++++++++++++
.../azure/queue/QueueServiceUtilTest.java | 88 +++++++++++++
.../QueueServiceComponentAutoConfiguration.java | 80 ++++++++++++
12 files changed, 811 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..42bd47d
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceComponent.java
@@ -0,0 +1,70 @@
+/**
+ * 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.util.Map;
+
+import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.UriEndpointComponent;
+
+public class QueueServiceComponent extends UriEndpointComponent {
+
+ public QueueServiceComponent() {
+ super(QueueServiceEndpoint.class);
+ }
+
+ public QueueServiceComponent(CamelContext context) {
+ super(context, QueueServiceEndpoint.class);
+ }
+
+ protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+ QueueServiceConfiguration configuration = new QueueServiceConfiguration();
+ setProperties(configuration, parameters);
+
+ String[] parts = null;
+ if (remaining != null) {
+ parts = remaining.split("/");
+ }
+ if (parts == null || parts.length < 2) {
+ throw new IllegalArgumentException("The account and queue names must be specified.");
+ }
+ if (parts.length > 2) {
+ throw new IllegalArgumentException("Only the account and queue names must be specified.");
+ }
+
+ configuration.setAccountName(parts[0]);
+ configuration.setQueueName(parts[1]);
+
+ checkCredentials(configuration);
+
+ QueueServiceEndpoint endpoint = new QueueServiceEndpoint(uri, this, configuration);
+ setProperties(endpoint, parameters);
+ return endpoint;
+ }
+
+ private void checkCredentials(QueueServiceConfiguration cfg) {
+ CloudQueue client = cfg.getAzureQueueClient();
+ StorageCredentials creds = client == null ? cfg.getCredentials()
+ : client.getServiceClient().getCredentials();
+ if (creds == null) {
+ throw new IllegalArgumentException("Credentials must be specified.");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d211d7e
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConfiguration.java
@@ -0,0 +1,66 @@
+/**
+ * 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 com.microsoft.azure.storage.queue.CloudQueue;
+import org.apache.camel.component.azure.common.AbstractConfiguration;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+@UriParams
+public class QueueServiceConfiguration extends AbstractConfiguration {
+
+ private String queueName;
+ @UriParam
+ private CloudQueue azureQueueClient;
+
+ @UriParam(label = "producer", defaultValue = "getMessage")
+ private QueueServiceOperations operation = QueueServiceOperations.getMessage;
+
+ public String getQueueName() {
+ return queueName;
+ }
+
+ /**
+ * The queue resource name
+ */
+ public void setQueueName(String queueName) {
+ this.queueName = queueName;
+ }
+
+ public CloudQueue getAzureQueueClient() {
+ return azureQueueClient;
+ }
+
+ /**
+ * The queue service client
+ */
+ public void setAzureQueueClient(CloudQueue azureQueueClient) {
+ this.azureQueueClient = azureQueueClient;
+ }
+
+ public QueueServiceOperations getOperation() {
+ return operation;
+ }
+
+ /**
+ * Queue service operation hint to the producer
+ */
+ public void setOperation(QueueServiceOperations operation) {
+ this.operation = operation;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConstants.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConstants.java
new file mode 100644
index 0000000..0e7a523
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConstants.java
@@ -0,0 +1,28 @@
+/**
+ * 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;
+
+public interface QueueServiceConstants {
+
+ String OPERATION = "operation";
+ String QUEUE_CLIENT = "AzureQueueClient";
+
+ String SERVICE_URI_SEGMENT = ".queue.core.windows.net";
+ String ACCESS_CONDITION = "BlobAccessCondition";
+ String BLOB_REQUEST_OPTIONS = "BlobRequestOptions";
+ String OPERATION_CONTEXT = "BlobOperationContext";
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConsumer.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConsumer.java
new file mode 100644
index 0000000..9793a1c
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceConsumer.java
@@ -0,0 +1,68 @@
+/**
+ * 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 com.microsoft.azure.storage.StorageException;
+import org.apache.camel.Exchange;
+import org.apache.camel.NoFactoryAvailableException;
+import org.apache.camel.Processor;
+import org.apache.camel.impl.ScheduledPollConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A Consumer of the queue content from the Azure Queue Service
+ */
+public class QueueServiceConsumer extends ScheduledPollConsumer {
+ private static final Logger LOG = LoggerFactory.getLogger(QueueServiceConsumer.class);
+
+ public QueueServiceConsumer(QueueServiceEndpoint endpoint, Processor processor) throws NoFactoryAvailableException {
+ super(endpoint, processor);
+ }
+
+ @Override
+ protected int poll() throws Exception {
+ Exchange exchange = super.getEndpoint().createExchange();
+ try {
+ getMessage(exchange);
+ super.getAsyncProcessor().process(exchange);
+ return 1;
+ } catch (StorageException ex) {
+ if (404 == ex.getHttpStatusCode()) {
+ return 0;
+ } else {
+ throw ex;
+ }
+ }
+ }
+
+ private void getMessage(Exchange exchange) throws Exception {
+ LOG.trace("Getting the message from the queue [{}] from exchange [{}]...",
+ getConfiguration().getQueueName(), exchange);
+ throw new UnsupportedOperationException();
+ }
+
+ protected QueueServiceConfiguration getConfiguration() {
+ return getEndpoint().getConfiguration();
+ }
+
+ @Override
+ public QueueServiceEndpoint getEndpoint() {
+ return (QueueServiceEndpoint) super.getEndpoint();
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceEndpoint.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceEndpoint.java
new file mode 100644
index 0000000..3f70804
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceEndpoint.java
@@ -0,0 +1,83 @@
+/**
+ * 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 org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.azure.blob.BlobServiceConfiguration;
+import org.apache.camel.component.azure.blob.BlobServiceConsumer;
+import org.apache.camel.component.azure.blob.BlobServiceOperations;
+import org.apache.camel.component.azure.blob.BlobServiceProducer;
+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 azure-queue component is used for storing and retrieving messages from Azure Storage Queue Service.
+ */
+@UriEndpoint(firstVersion = "2.19.0",
+ scheme = "azure-queue",
+ title = "Azure Storage Queue Service",
+ syntax = "azure-blob:queueOrMessageUri",
+ consumerClass = QueueServiceConsumer.class,
+ label = "cloud,queue,azure")
+public class QueueServiceEndpoint extends DefaultEndpoint {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QueueServiceEndpoint.class);
+
+ @UriPath(description = "Queue or Message compact Uri")
+ @Metadata(required = "true")
+ private String queueOrMessageUri; // to support component docs
+ @UriParam
+ private QueueServiceConfiguration configuration;
+
+ public QueueServiceEndpoint(String uri, Component comp, QueueServiceConfiguration configuration) {
+ super(uri, comp);
+ this.configuration = configuration;
+ }
+
+ public Consumer createConsumer(Processor processor) throws Exception {
+ LOG.trace("Creating a consumer");
+ QueueServiceConsumer consumer = new QueueServiceConsumer(this, processor);
+ configureConsumer(consumer);
+ return consumer;
+ }
+
+ public Producer createProducer() throws Exception {
+ LOG.trace("Creating a producer");
+ return new QueueServiceProducer(this);
+ }
+
+ public boolean isSingleton() {
+ return true;
+ }
+
+ public QueueServiceConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ public void setConfiguration(QueueServiceConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceOperations.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceOperations.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceOperations.java
new file mode 100644
index 0000000..a1e0898
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceOperations.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.azure.queue;
+
+public enum QueueServiceOperations {
+ getMessage,
+ putMessage
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceProducer.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceProducer.java
new file mode 100644
index 0000000..434ed2d
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceProducer.java
@@ -0,0 +1,93 @@
+/**
+ * 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 org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.azure.blob.BlobServiceConstants;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A Producer which sends messages to the Azure Storage Queue Service
+ */
+public class QueueServiceProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QueueServiceProducer.class);
+
+ public QueueServiceProducer(final Endpoint endpoint) {
+ super(endpoint);
+ }
+
+ @Override
+ public void process(final Exchange exchange) throws Exception {
+ QueueServiceOperations operation = determineOperation(exchange);
+ if (ObjectHelper.isEmpty(operation)) {
+ operation = QueueServiceOperations.getMessage;
+ } else {
+ switch (operation) {
+ case getMessage:
+ getMessage(exchange);
+ break;
+ case putMessage:
+ putMessage(exchange);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported operation");
+ }
+ }
+
+ }
+
+ private void getMessage(Exchange exchange) {
+ LOG.trace("Getting the message from the queue [{}] from exchange [{}]...",
+ getConfiguration().getQueueName(), exchange);
+ throw new UnsupportedOperationException();
+ }
+ private void putMessage(Exchange exchange) {
+ LOG.trace("Putting the message into the queue [{}] from exchange [{}]...",
+ getConfiguration().getQueueName(), exchange);
+ throw new UnsupportedOperationException();
+ }
+
+ private QueueServiceOperations determineOperation(Exchange exchange) {
+ QueueServiceOperations operation = exchange.getIn().getHeader(BlobServiceConstants.OPERATION,
+ QueueServiceOperations.class);
+ if (operation == null) {
+ operation = getConfiguration().getOperation();
+ }
+ return operation;
+ }
+
+ protected QueueServiceConfiguration getConfiguration() {
+ return getEndpoint().getConfiguration();
+ }
+
+ @Override
+ public String toString() {
+ return "StorageQueueProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+ }
+
+ @Override
+ public QueueServiceEndpoint getEndpoint() {
+ return (QueueServiceEndpoint) super.getEndpoint();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
new file mode 100644
index 0000000..17121b0
--- /dev/null
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/queue/QueueServiceUtil.java
@@ -0,0 +1,67 @@
+/**
+ * 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.queue.CloudQueue;
+
+public final class QueueServiceUtil {
+ private QueueServiceUtil() {
+ }
+
+ public static URI prepareStorageQueueUri(QueueServiceConfiguration cfg) {
+ return prepareStorageQueueUri(cfg, true);
+ }
+
+ public static URI prepareStorageQueueUri(QueueServiceConfiguration cfg, boolean isForMessages) {
+ StringBuilder uriBuilder = new StringBuilder();
+ uriBuilder.append("https://")
+ .append(cfg.getAccountName())
+ .append(QueueServiceConstants.SERVICE_URI_SEGMENT)
+ .append("/")
+ .append(cfg.getQueueName());
+ if (isForMessages) {
+ uriBuilder.append("/messages");
+ }
+ return URI.create(uriBuilder.toString());
+ }
+
+ public static CloudQueue createQueueClient(QueueServiceConfiguration cfg)
+ throws Exception {
+ CloudQueue client = (CloudQueue) getConfiguredClient(cfg);
+ if (client == null) {
+ URI uri = prepareStorageQueueUri(cfg);
+ StorageCredentials creds = getAccountCredentials(cfg);
+ client = new CloudQueue(uri, creds);
+ }
+ return client;
+ }
+
+ public static CloudQueue getConfiguredClient(QueueServiceConfiguration cfg) {
+ CloudQueue client = cfg.getAzureQueueClient();
+ if (client != null && !client.getUri().equals(prepareStorageQueueUri(cfg))) {
+ throw new IllegalArgumentException("Invalid Client URI");
+ }
+ return client;
+ }
+
+ public static StorageCredentials getAccountCredentials(QueueServiceConfiguration cfg) {
+ return cfg.getCredentials();
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/main/resources/META-INF/services/org/apache/camel/component/azure-queue
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/main/resources/META-INF/services/org/apache/camel/component/azure-queue b/components/camel-azure/src/main/resources/META-INF/services/org/apache/camel/component/azure-queue
new file mode 100644
index 0000000..debd117
--- /dev/null
+++ b/components/camel-azure/src/main/resources/META-INF/services/org/apache/camel/component/azure-queue
@@ -0,0 +1,18 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+class=org.apache.camel.component.azure.queue.QueueServiceComponent
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
new file mode 100644
index 0000000..800aebc
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceComponentConfigurationTest.java
@@ -0,0 +1,128 @@
+/**
+ * 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.impl.JndiRegistry;
+import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class QueueServiceComponentConfigurationTest extends CamelTestSupport {
+
+ @Test
+ public void testCreateEndpointWithMinConfigForClientOnly() throws Exception {
+ CloudQueue client =
+ new CloudQueue(URI.create("https://camelazure.queue.core.windows.net/testqueue/messages"),
+ newAccountKeyCredentials());
+
+ JndiRegistry registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+ registry.bind("azureQueueClient", client);
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue?azureQueueClient=#azureQueueClient");
+
+ 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);
+ }
+
+ 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());
+ }
+ 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");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("The account and queue names 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() {
+ JndiRegistry registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+ registry.bind("creds", newAccountKeyCredentials());
+ }
+ private StorageCredentials newAccountKeyCredentials() {
+ return new StorageCredentialsAccountAndKey("camelazure",
+ Base64.encode("key".getBytes()));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
----------------------------------------------------------------------
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
new file mode 100644
index 0000000..40bf2a4
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/queue/QueueServiceUtilTest.java
@@ -0,0 +1,88 @@
+/**
+ * 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.impl.JndiRegistry;
+import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class QueueServiceUtilTest extends CamelTestSupport {
+
+ @Test
+ public void testPrepareUri() throws Exception {
+ registerCredentials();
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue?credentials=#creds");
+ URI uri =
+ QueueServiceUtil.prepareStorageQueueUri(endpoint.getConfiguration());
+ assertEquals("https://camelazure.queue.core.windows.net/testqueue/messages", uri.toString());
+ }
+
+ @Test
+ public void testGetConfiguredClient() throws Exception {
+ CloudQueue client =
+ new CloudQueue(URI.create("https://camelazure.queue.core.windows.net/testqueue/messages"),
+ newAccountKeyCredentials());
+
+ JndiRegistry registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+ registry.bind("azureQueueClient", client);
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue?azureQueueClient=#azureQueueClient");
+ assertSame(client, QueueServiceUtil.getConfiguredClient(endpoint.getConfiguration()));
+ }
+ @Test
+ public void testGetConfiguredClientUriMismatch() throws Exception {
+ CloudQueue client =
+ new CloudQueue(URI.create("https://camelazure.queue.core.windows.net/testqueue"),
+ newAccountKeyCredentials());
+
+ JndiRegistry registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+ registry.bind("azureQueueClient", client);
+
+ QueueServiceComponent component = new QueueServiceComponent(context);
+ QueueServiceEndpoint endpoint =
+ (QueueServiceEndpoint) component.createEndpoint("azure-queue://camelazure/testqueue2?azureQueueClient=#azureQueueClient");
+
+ try {
+ QueueServiceUtil.getConfiguredClient(endpoint.getConfiguration());
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Invalid Client URI", ex.getMessage());
+ }
+ }
+
+ private void registerCredentials() {
+ JndiRegistry registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+ registry.bind("creds", newAccountKeyCredentials());
+ }
+
+ private StorageCredentials newAccountKeyCredentials() {
+ return new StorageCredentialsAccountAndKey("camelazure",
+ Base64.encode("key".getBytes()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/507e8b5f/platforms/spring-boot/components-starter/camel-azure-starter/src/main/java/org/apache/camel/component/azure/queue/springboot/QueueServiceComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-azure-starter/src/main/java/org/apache/camel/component/azure/queue/springboot/QueueServiceComponentAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-azure-starter/src/main/java/org/apache/camel/component/azure/queue/springboot/QueueServiceComponentAutoConfiguration.java
new file mode 100644
index 0000000..a929af0
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-azure-starter/src/main/java/org/apache/camel/component/azure/queue/springboot/QueueServiceComponentAutoConfiguration.java
@@ -0,0 +1,80 @@
+/**
+ * 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.springboot;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.azure.queue.QueueServiceComponent;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionMessage;
+import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+/**
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Configuration
+@ConditionalOnBean(type = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@Conditional(QueueServiceComponentAutoConfiguration.Condition.class)
+@AutoConfigureAfter(name = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+public class QueueServiceComponentAutoConfiguration {
+
+ @Lazy
+ @Bean(name = "azure-queue-component")
+ @ConditionalOnClass(CamelContext.class)
+ @ConditionalOnMissingBean(QueueServiceComponent.class)
+ public QueueServiceComponent configureQueueServiceComponent(
+ CamelContext camelContext) throws Exception {
+ QueueServiceComponent component = new QueueServiceComponent();
+ component.setCamelContext(camelContext);
+ return component;
+ }
+
+ public static class Condition extends SpringBootCondition {
+ @Override
+ public ConditionOutcome getMatchOutcome(
+ ConditionContext conditionContext,
+ AnnotatedTypeMetadata annotatedTypeMetadata) {
+ boolean groupEnabled = isEnabled(conditionContext,
+ "camel.component.", true);
+ ConditionMessage.Builder message = ConditionMessage
+ .forCondition("camel.component.azure-queue");
+ if (isEnabled(conditionContext, "camel.component.azure-queue.",
+ groupEnabled)) {
+ return ConditionOutcome.match(message.because("enabled"));
+ }
+ return ConditionOutcome.noMatch(message.because("not enabled"));
+ }
+
+ private boolean isEnabled(
+ org.springframework.context.annotation.ConditionContext context,
+ java.lang.String prefix, boolean defaultValue) {
+ RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
+ context.getEnvironment(), prefix);
+ return resolver.getProperty("enabled", Boolean.class, defaultValue);
+ }
+ }
+}
\ No newline at end of file