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 3d509a7d0913c1ca0242cf9c95562527fe8435c5
Author: Andrea Cosentino <ancosen@gmail.com>
AuthorDate: Thu May 2 12:29:55 2019 +0200
CAMEL-13453 - Camel-Azure: add automatic injection of single instance bean, Azure-Blob
---
.../component/azure/blob/BlobServiceComponent.java | 17 +-
.../azure/blob/BlobServiceConfiguration.java | 14 ++
...lobServiceComponentConfigurationClientTest.java | 260 +++++++++++++++++++++
3 files changed, 289 insertions(+), 2 deletions(-)
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
index 4ed2c7f..14bd646 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceComponent.java
@@ -17,27 +17,33 @@
package org.apache.camel.component.azure.blob;
import java.util.Map;
+import java.util.Set;
import com.microsoft.azure.storage.StorageCredentials;
import com.microsoft.azure.storage.StorageCredentialsAnonymous;
import com.microsoft.azure.storage.blob.CloudBlob;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.annotations.Component;
import org.apache.camel.support.DefaultComponent;
@Component("azure-blob")
public class BlobServiceComponent extends DefaultComponent {
+
+ @Metadata(label = "advanced")
+ private BlobServiceConfiguration configuration;
public BlobServiceComponent() {
}
public BlobServiceComponent(CamelContext context) {
super(context);
+ this.configuration = new BlobServiceConfiguration();
}
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object>
parameters) throws Exception {
- BlobServiceConfiguration configuration = new BlobServiceConfiguration();
+ final BlobServiceConfiguration configuration = this.configuration.copy();
setProperties(configuration, parameters);
String[] parts = null;
@@ -62,7 +68,7 @@ public class BlobServiceComponent extends DefaultComponent {
}
configuration.setBlobName(sb.toString());
}
-
+ checkAndSetRegistryClient(configuration);
checkCredentials(configuration);
BlobServiceEndpoint endpoint = new BlobServiceEndpoint(uri, this, configuration);
@@ -79,4 +85,11 @@ public class BlobServiceComponent extends DefaultComponent {
throw new IllegalArgumentException("Credentials must be specified.");
}
}
+
+ private void checkAndSetRegistryClient(BlobServiceConfiguration configuration) {
+ Set<CloudBlob> clients = getCamelContext().getRegistry().findByType(CloudBlob.class);
+ if (clients.size() == 1) {
+ configuration.setAzureBlobClient(clients.stream().findFirst().get());
+ }
+ }
}
diff --git a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceConfiguration.java
b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceConfiguration.java
index b89f664..457edfd 100644
--- a/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceConfiguration.java
+++ b/components/camel-azure/src/main/java/org/apache/camel/component/azure/blob/BlobServiceConfiguration.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.azure.blob;
import java.util.Map;
import com.microsoft.azure.storage.blob.CloudBlob;
+
+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;
@@ -248,4 +250,16 @@ public class BlobServiceConfiguration extends AbstractConfiguration {
public void setUseFlatListing(boolean useFlatListing) {
this.useFlatListing = useFlatListing;
}
+
+ // *************************************************
+ //
+ // *************************************************
+
+ public BlobServiceConfiguration copy() {
+ try {
+ return (BlobServiceConfiguration)super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeCamelException(e);
+ }
+ }
}
\ No newline at end of file
diff --git a/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
new file mode 100644
index 0000000..560a00f
--- /dev/null
+++ b/components/camel-azure/src/test/java/org/apache/camel/component/azure/blob/BlobServiceComponentConfigurationClientTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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.blob;
+
+import java.net.URI;
+import java.util.Collections;
+
+import com.microsoft.azure.storage.StorageCredentials;
+import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
+import com.microsoft.azure.storage.StorageCredentialsAnonymous;
+import com.microsoft.azure.storage.blob.CloudBlob;
+import com.microsoft.azure.storage.blob.CloudBlockBlob;
+import com.microsoft.azure.storage.core.Base64;
+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 BlobServiceComponentConfigurationClientTest extends CamelTestSupport {
+
+ @Test
+ public void testCreateEndpointWithMinConfigForClientOnly() throws Exception {
+ CloudBlockBlob client =
+ new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"),
+ newAccountKeyCredentials());
+
+ context.getRegistry().bind("azureBlobClient", client);
+
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint("azure-blob://camelazure/container/blob");
+
+ doTestCreateEndpointWithMinConfig(endpoint, true);
+ }
+
+ @Test
+ public void testCreateEndpointWithMinConfigForCredsOnly() throws Exception {
+ registerCredentials();
+
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint("azure-blob://camelazure/container/blob?credentials=#creds");
+
+ doTestCreateEndpointWithMinConfig(endpoint, false);
+ }
+
+ private void doTestCreateEndpointWithMinConfig(BlobServiceEndpoint endpoint, boolean
clientExpected)
+ throws Exception {
+ assertEquals("camelazure", endpoint.getConfiguration().getAccountName());
+ assertEquals("container", endpoint.getConfiguration().getContainerName());
+ assertEquals("blob", endpoint.getConfiguration().getBlobName());
+ if (clientExpected) {
+ assertNotNull(endpoint.getConfiguration().getAzureBlobClient());
+ assertNull(endpoint.getConfiguration().getCredentials());
+ } else {
+ assertNull(endpoint.getConfiguration().getAzureBlobClient());
+ assertNotNull(endpoint.getConfiguration().getCredentials());
+ }
+
+ assertEquals(BlobType.blockblob, endpoint.getConfiguration().getBlobType());
+ assertNull(endpoint.getConfiguration().getBlobPrefix());
+ assertNull(endpoint.getConfiguration().getFileDir());
+ assertEquals(Long.valueOf(0L), endpoint.getConfiguration().getBlobOffset());
+ assertNull(endpoint.getConfiguration().getBlobMetadata());
+ assertNull(endpoint.getConfiguration().getDataLength());
+ assertEquals(BlobServiceOperations.listBlobs, endpoint.getConfiguration().getOperation());
+ assertEquals(0, endpoint.getConfiguration().getStreamWriteSize());
+ assertEquals(0, endpoint.getConfiguration().getStreamReadSize());
+ assertTrue(endpoint.getConfiguration().isCloseStreamAfterRead());
+ assertTrue(endpoint.getConfiguration().isCloseStreamAfterWrite());
+ assertFalse(endpoint.getConfiguration().isPublicForRead());
+ assertTrue(endpoint.getConfiguration().isUseFlatListing());
+
+ createConsumer(endpoint);
+ }
+
+ @Test
+ public void testCreateEndpointWithMaxConfig() throws Exception {
+ registerCredentials();
+ context.getRegistry().bind("metadata", Collections.emptyMap());
+
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint(
+ "azure-blob://camelazure/container/blob?credentials=#creds&blobType=pageblob"
+ + "&blobPrefix=blob1&fileDir=/tmp&blobOffset=512&operation=clearPageBlob&dataLength=1024"
+ + "&streamWriteSize=512&streamReadSize=1024&closeStreamAfterRead=false&closeStreamAfterWrite=false"
+ + "&publicForRead=true&useFlatListing=false&blobMetadata=#metadata");
+
+ assertEquals("camelazure", endpoint.getConfiguration().getAccountName());
+ assertEquals("container", endpoint.getConfiguration().getContainerName());
+ assertEquals("blob", endpoint.getConfiguration().getBlobName());
+ assertNull(endpoint.getConfiguration().getAzureBlobClient());
+ assertNotNull(endpoint.getConfiguration().getCredentials());
+
+ assertEquals(BlobType.pageblob, endpoint.getConfiguration().getBlobType());
+ assertEquals("blob1", endpoint.getConfiguration().getBlobPrefix());
+ assertEquals("/tmp", endpoint.getConfiguration().getFileDir());
+ assertEquals(Long.valueOf(512L), endpoint.getConfiguration().getBlobOffset());
+ assertNotNull(endpoint.getConfiguration().getBlobMetadata());
+ assertEquals(Long.valueOf(1024L), endpoint.getConfiguration().getDataLength());
+ assertEquals(BlobServiceOperations.clearPageBlob, endpoint.getConfiguration().getOperation());
+ assertEquals(512, endpoint.getConfiguration().getStreamWriteSize());
+ assertEquals(1024, endpoint.getConfiguration().getStreamReadSize());
+ assertFalse(endpoint.getConfiguration().isCloseStreamAfterRead());
+ assertFalse(endpoint.getConfiguration().isCloseStreamAfterWrite());
+ assertTrue(endpoint.getConfiguration().isPublicForRead());
+ assertFalse(endpoint.getConfiguration().isUseFlatListing());
+ }
+
+ @Test
+ public void testNoClientAndCredentials() throws Exception {
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ try {
+ component.createEndpoint("azure-blob://camelazure/container/blob");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Credentials must be specified.", ex.getMessage());
+ }
+ }
+ @Test
+ public void testNoClientAndCredentialsPublicForRead() throws Exception {
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint("azure-blob://camelazure/container/blob?publicForRead=true");
+ assertTrue(endpoint.getConfiguration().isPublicForRead());
+ }
+
+ @Test
+ public void testClientWithoutCredentials() throws Exception {
+ CloudBlockBlob client =
+ new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
+
+ doTestClientWithoutCredentials(client);
+ }
+ @Test
+ public void testClientWithoutAnonymousCredentials() throws Exception {
+ CloudBlockBlob client =
+ new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"),
+ StorageCredentialsAnonymous.ANONYMOUS);
+
+ doTestClientWithoutCredentials(client);
+ }
+ @Test
+ public void testClientWithoutCredentialsPublicRead() throws Exception {
+ CloudBlockBlob client =
+ new CloudBlockBlob(URI.create("https://camelazure.blob.core.windows.net/container/blob"));
+
+ context.getRegistry().bind("azureBlobClient", client);
+
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint("azure-blob://camelazure/container/blob?azureBlobClient=#azureBlobClient&publicForRead=true");
+ assertTrue(endpoint.getConfiguration().isPublicForRead());
+ }
+ private void doTestClientWithoutCredentials(CloudBlob client) throws Exception {
+ context.getRegistry().bind("azureBlobClient", client);
+
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ try {
+ component.createEndpoint("azure-blob://camelazure/container/blob?azureBlobClient=#azureBlobClient");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Credentials must be specified.", ex.getMessage());
+ }
+ }
+
+ @Test
+ public void testNoBlobNameProducerWithOp() throws Exception {
+ registerCredentials();
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpointWithOp =
+ (BlobServiceEndpoint) component.createEndpoint(
+ "azure-blob://camelazure/container?operation=deleteBlob&credentials=#creds");
+ try {
+ endpointWithOp.createProducer();
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Blob name must be specified.", ex.getMessage());
+ }
+ }
+ @Test
+ public void testNoBlobNameProducerDefaultOp() throws Exception {
+ registerCredentials();
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint(
+ "azure-blob://camelazure/container?credentials=#creds");
+ endpoint.createProducer();
+ assertEquals(BlobServiceOperations.listBlobs, endpoint.getConfiguration().getOperation());
+ }
+
+ @Test
+ public void testNoBlobNameConsumer() throws Exception {
+ registerCredentials();
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint) component.createEndpoint(
+ "azure-blob://camelazure/container?credentials=#creds");
+ try {
+ createConsumer(endpoint);
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("Blob name must be specified.", ex.getMessage());
+ }
+ }
+
+ @Test
+ public void testTooFewPathSegments() throws Exception {
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ try {
+ component.createEndpoint("azure-blob://camelazure");
+ fail();
+ } catch (IllegalArgumentException ex) {
+ assertEquals("At least the account and container names must be specified.", ex.getMessage());
+ }
+ }
+
+ @Test
+ public void testHierarchicalBlobName() throws Exception {
+ registerCredentials();
+ BlobServiceComponent component = new BlobServiceComponent(context);
+ BlobServiceEndpoint endpoint =
+ (BlobServiceEndpoint)component.createEndpoint("azure-blob://camelazure/component1/blob/sub?credentials=#creds");
+ assertEquals("blob/sub", endpoint.getConfiguration().getBlobName());
+ }
+
+ 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()));
+ }
+
+}
|