Skip to content

Commit

Permalink
CAMEL-12147 - Camel-AWS MQ: Add the ability to specify credentials an…
Browse files Browse the repository at this point in the history
…d region at component level
  • Loading branch information
oscerd committed Jan 16, 2018
1 parent abd022d commit d05ee46
Show file tree
Hide file tree
Showing 5 changed files with 275 additions and 3 deletions.
14 changes: 13 additions & 1 deletion components/camel-aws/src/main/docs/aws-mq-component.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,19 @@ You can append query options to the URI in the following format,


// component options: START
The AWS MQ component has no options.
The AWS MQ component supports 5 options which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *configuration* (advanced) | The AWS MQ default configuration | | MQConfiguration
| *accessKey* (producer) | Amazon AWS Access Key | | String
| *secretKey* (producer) | Amazon AWS Secret Key | | String
| *region* (producer) | The region in which MQ client needs to work | | String
| *resolveProperty Placeholders* (advanced) | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | boolean
|===
// component options: END


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,98 @@
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.DefaultComponent;
import org.apache.camel.spi.Metadata;
import org.apache.camel.util.ObjectHelper;

/**
* For working with Amazon MQ.
*/
public class MQComponent extends DefaultComponent {

@Metadata
private String accessKey;
@Metadata
private String secretKey;
@Metadata
private String region;
@Metadata(label = "advanced")
private MQConfiguration configuration;

public MQComponent() {
this(null);
}

public MQComponent(CamelContext context) {
super(context);

this.configuration = new MQConfiguration();
registerExtension(new MQComponentVerifierExtension());
}

@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
MQConfiguration configuration = new MQConfiguration();
MQConfiguration configuration = this.configuration.copy();
setProperties(configuration, parameters);

if (ObjectHelper.isEmpty(configuration.getAccessKey())) {
setAccessKey(accessKey);
}
if (ObjectHelper.isEmpty(configuration.getSecretKey())) {
setSecretKey(secretKey);
}
if (ObjectHelper.isEmpty(configuration.getRegion())) {
setRegion(region);
}
if (configuration.getAmazonMqClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
throw new IllegalArgumentException("amazonMQClient or accessKey and secretKey must be specified");
}

MQEndpoint endpoint = new MQEndpoint(uri, this, configuration);
return endpoint;
}

public MQConfiguration getConfiguration() {
return configuration;
}

/**
* The AWS MQ default configuration
*/
public void setConfiguration(MQConfiguration configuration) {
this.configuration = configuration;
}

public String getAccessKey() {
return configuration.getAccessKey();
}

/**
* Amazon AWS Access Key
*/
public void setAccessKey(String accessKey) {
configuration.setAccessKey(accessKey);
}

public String getSecretKey() {
return configuration.getSecretKey();
}

/**
* Amazon AWS Secret Key
*/
public void setSecretKey(String secretKey) {
configuration.setSecretKey(secretKey);
}

public String getRegion() {
return configuration.getRegion();
}

/**
* The region in which MQ client needs to work
*/
public void setRegion(String region) {
configuration.setRegion(region);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@

import com.amazonaws.services.mq.AmazonMQ;

import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;

@UriParams
public class MQConfiguration {
public class MQConfiguration implements Cloneable {

@UriPath(description = "Logical name")
@Metadata(required = "true")
Expand Down Expand Up @@ -121,4 +122,16 @@ public String getRegion() {
public void setRegion(String region) {
this.region = region;
}

// *************************************************
//
// *************************************************

public MQConfiguration copy() {
try {
return (MQConfiguration)super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeCamelException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* 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.aws.mq;

import com.amazonaws.regions.Regions;

import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class MQComponentConfigurationTest extends CamelTestSupport {


@Test
public void createEndpointWithComponentElements() throws Exception {
MQComponent component = new MQComponent(context);
component.setAccessKey("XXX");
component.setSecretKey("YYY");
MQEndpoint endpoint = (MQEndpoint)component.createEndpoint("aws-mq://MyQueue");

assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
}

@Test
public void createEndpointWithComponentAndEndpointElements() throws Exception {
MQComponent component = new MQComponent(context);
component.setAccessKey("XXX");
component.setSecretKey("YYY");
component.setRegion(Regions.US_WEST_1.toString());
MQEndpoint endpoint = (MQEndpoint)component.createEndpoint("aws-mq://MyQueue?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");

assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package org.apache.camel.component.aws.mq.springboot;

import javax.annotation.Generated;
import com.amazonaws.services.mq.AmazonMQ;
import org.apache.camel.component.aws.mq.MQOperations;
import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
import org.springframework.boot.context.properties.ConfigurationProperties;

Expand All @@ -31,13 +33,62 @@ public class MQComponentConfiguration
extends
ComponentConfigurationPropertiesCommon {

/**
* The AWS MQ default configuration
*/
private MQConfigurationNestedConfiguration configuration;
/**
* Amazon AWS Access Key
*/
private String accessKey;
/**
* Amazon AWS Secret Key
*/
private String secretKey;
/**
* The region in which MQ client needs to work
*/
private String region;
/**
* Whether the component should resolve property placeholders on itself when
* starting. Only properties which are of String type can use property
* placeholders.
*/
private Boolean resolvePropertyPlaceholders = true;

public MQConfigurationNestedConfiguration getConfiguration() {
return configuration;
}

public void setConfiguration(
MQConfigurationNestedConfiguration configuration) {
this.configuration = configuration;
}

public String getAccessKey() {
return accessKey;
}

public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}

public String getSecretKey() {
return secretKey;
}

public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}

public String getRegion() {
return region;
}

public void setRegion(String region) {
this.region = region;
}

public Boolean getResolvePropertyPlaceholders() {
return resolvePropertyPlaceholders;
}
Expand All @@ -46,4 +97,84 @@ public void setResolvePropertyPlaceholders(
Boolean resolvePropertyPlaceholders) {
this.resolvePropertyPlaceholders = resolvePropertyPlaceholders;
}

public static class MQConfigurationNestedConfiguration {
public static final Class CAMEL_NESTED_CLASS = org.apache.camel.component.aws.mq.MQConfiguration.class;
/**
* To use a existing configured AmazonMQClient as client
*/
private AmazonMQ amazonMqClient;
/**
* Amazon AWS Access Key
*/
private String accessKey;
/**
* Amazon AWS Secret Key
*/
private String secretKey;
/**
* The operation to perform. It can be
* listBrokers,createBroker,deleteBroker
*/
private MQOperations operation;
private String proxyHost;
private Integer proxyPort;
private String region;

public AmazonMQ getAmazonMqClient() {
return amazonMqClient;
}

public void setAmazonMqClient(AmazonMQ amazonMqClient) {
this.amazonMqClient = amazonMqClient;
}

public String getAccessKey() {
return accessKey;
}

public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}

public String getSecretKey() {
return secretKey;
}

public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}

public MQOperations getOperation() {
return operation;
}

public void setOperation(MQOperations operation) {
this.operation = operation;
}

public String getProxyHost() {
return proxyHost;
}

public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}

public Integer getProxyPort() {
return proxyPort;
}

public void setProxyPort(Integer proxyPort) {
this.proxyPort = proxyPort;
}

public String getRegion() {
return region;
}

public void setRegion(String region) {
this.region = region;
}
}
}

0 comments on commit d05ee46

Please sign in to comment.