You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bi...@apache.org on 2012/11/15 12:47:48 UTC

svn commit: r1409743 - in /camel/trunk/components/camel-aws: ./ src/main/java/org/apache/camel/component/aws/cw/ src/main/resources/META-INF/services/org/apache/camel/component/ src/test/java/org/apache/camel/component/aws/cw/ src/test/java/org/apache/...

Author: bibryam
Date: Thu Nov 15 11:47:47 2012
New Revision: 1409743

URL: http://svn.apache.org/viewvc?rev=1409743&view=rev
Log:
Added Amazon CloudWatch component with a producer

Added:
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java
    camel/trunk/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-cw
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java
Modified:
    camel/trunk/components/camel-aws/pom.xml

Modified: camel/trunk/components/camel-aws/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/pom.xml?rev=1409743&r1=1409742&r2=1409743&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/pom.xml (original)
+++ camel/trunk/components/camel-aws/pom.xml Thu Nov 15 11:47:47 2012
@@ -122,5 +122,10 @@
             <artifactId>slf4j-log4j12</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,52 @@
+/**
+ * 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.cw;
+
+import java.util.Map;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+/**
+ * Defines the <a href="http://aws.amazon.com/cloudwatch/">AWS CloudWatch Component</a>
+ */
+public class CwComponent extends DefaultComponent {
+
+    public CwComponent() {
+    }
+
+    public CwComponent(CamelContext context) {
+        super(context);
+    }
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        CwConfiguration configuration = new CwConfiguration();
+        setProperties(configuration, parameters);
+
+        if (remaining == null || remaining.trim().length() == 0) {
+            throw new IllegalArgumentException("Metric namespace must be specified.");
+        }
+        configuration.setNamespace(remaining);
+
+        if (configuration.getAmazonCwClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("AmazonCwClient or accessKey and secretKey must be specified");
+        }
+
+        CwEndpoint endpoint = new CwEndpoint(uri, this, configuration);
+        return endpoint;
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,121 @@
+/**
+ * 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.cw;
+
+/**
+ * The AWS CW component configuration properties
+ * 
+ */
+import java.util.Date;
+
+import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
+
+public class CwConfiguration implements Cloneable {
+
+    private AmazonCloudWatchClient amazonCwClient;
+    private String amazonCwEndpoint;
+    private String accessKey;
+    private String secretKey;
+    private String name;
+    private Double value;
+    private String unit;
+    private String namespace;
+    private Date timestamp;
+
+    public void setAmazonCwEndpoint(String amazonCwEndpoint) {
+        this.amazonCwEndpoint = amazonCwEndpoint;
+    }
+
+    public String getAmazonCwEndpoint() {
+        return amazonCwEndpoint;
+    }
+
+    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 getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    public void setTimestamp(Date timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public Date getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String toString() {
+        return "CwConfiguration[name=" + name
+                + ", amazonCwClient=" + amazonCwClient
+                + ", accessKey=" + accessKey
+                + ", secretKey=xxxxxxxxxxxxxxx"
+                + ", value=" + value
+                + ", unit=" + unit
+                + "]";
+    }
+
+    public AmazonCloudWatchClient getAmazonCwClient() {
+        return amazonCwClient;
+    }
+
+    public void setAmazonCwClient(AmazonCloudWatchClient amazonCwClient) {
+        this.amazonCwClient = amazonCwClient;
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java Thu Nov 15 11:47:47 2012
@@ -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.aws.cw;
+
+/**
+ * Constants used in Camel AWS CW module
+ */
+public interface CwConstants {
+    String METRIC_NAMESPACE = "CamelAwsCwMetricNamespace";
+    String METRIC_NAME = "CamelAwsCwMetricName";
+    String METRIC_VALUE = "CamelAwsCwMetricValue";
+    String METRIC_UNIT = "CamelAwsCwMetricUnit";
+    String METRIC_TIMESTAMP = "CamelAwsCwMetricTimestamp";
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java Thu Nov 15 11:47:47 2012
@@ -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.aws.cw;
+
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultEndpoint;
+
+/**
+ * Defines the <a href="http://aws.amazon.com/cloudwatch/">AWS CloudWatch Endpoint</a>
+ */
+public class CwEndpoint extends DefaultEndpoint {
+
+    private CwConfiguration configuration;
+    private AmazonCloudWatchClient cloudWatchClient;
+
+    @Deprecated
+    public CwEndpoint(String uri, CamelContext context, CwConfiguration configuration) {
+        super(uri, context);
+        this.configuration = configuration;
+    }
+
+    public CwEndpoint(String uri, Component component, CwConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    public Producer createProducer() throws Exception {
+        return new CwProducer(this);
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+    }
+
+    public CwConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(CwConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public void setCloudWatchClient(AmazonCloudWatchClient cloudWatchClient) {
+        this.cloudWatchClient = cloudWatchClient;
+    }
+
+    public AmazonCloudWatchClient getCloudWatchClient() {
+        if (cloudWatchClient == null) {
+            cloudWatchClient = configuration.getAmazonCwClient() != null
+                    ? configuration.getAmazonCwClient() : createCloudWatchClient();
+        }
+        return cloudWatchClient;
+    }
+
+    AmazonCloudWatchClient createCloudWatchClient() {
+        AWSCredentials credentials = new BasicAWSCredentials(configuration.getAccessKey(), configuration.getSecretKey());
+        AmazonCloudWatchClient client = new AmazonCloudWatchClient(credentials);
+        if (configuration.getAmazonCwEndpoint() != null) {
+            client.setEndpoint(configuration.getAmazonCwEndpoint());
+        }
+        return client;
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,122 @@
+/**
+ * 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.cw;
+
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import com.amazonaws.services.cloudwatch.model.MetricDatum;
+import com.amazonaws.services.cloudwatch.model.PutMetricDataRequest;
+import com.amazonaws.services.cloudwatch.model.StandardUnit;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.URISupport;
+
+/**
+ * A Producer which sends messages to the AWS CloudWatch Service
+ */
+public class CwProducer extends DefaultProducer {
+
+    public CwProducer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        List<MetricDatum> metricData = getMetricData(exchange);
+
+        PutMetricDataRequest request = new PutMetricDataRequest()
+                .withMetricData(metricData)
+                .withNamespace(determineNameSpace(exchange));
+
+        log.info("Sending request [{}] from exchange [{}]...", request, exchange);
+        getEndpoint().getCloudWatchClient().putMetricData(request);
+    }
+
+    private List<MetricDatum> getMetricData(Exchange exchange) {
+        Object body = exchange.getIn().getBody();
+        if (body instanceof List) {
+            return (List<MetricDatum>) body;
+        }
+
+        if (body instanceof MetricDatum) {
+            return Arrays.asList((MetricDatum) body);
+        }
+
+        return Arrays.asList(new MetricDatum()
+                .withMetricName(determineName(exchange))
+                .withValue(determineValue(exchange))
+                .withUnit(determineUnit(exchange))
+                .withTimestamp(determineTimestamp(exchange)));
+    }
+
+    private Date determineTimestamp(Exchange exchange) {
+        Date timestamp = exchange.getIn().getHeader(CwConstants.METRIC_TIMESTAMP, Date.class);
+        if (timestamp == null) {
+            timestamp = getConfiguration().getTimestamp();
+        }
+        return timestamp;
+    }
+
+    private String determineNameSpace(Exchange exchange) {
+        String namespace = exchange.getIn().getHeader(CwConstants.METRIC_NAMESPACE, String.class);
+        if (namespace == null) {
+            namespace = getConfiguration().getNamespace();
+        }
+        return namespace;
+    }
+
+    private String determineName(Exchange exchange) {
+        String name = exchange.getIn().getHeader(CwConstants.METRIC_NAME, String.class);
+        if (name == null) {
+            name = getConfiguration().getName();
+        }
+        return name;
+    }
+
+    private Double determineValue(Exchange exchange) {
+        Double value = exchange.getIn().getHeader(CwConstants.METRIC_VALUE, Double.class);
+        if (value == null) {
+            value = getConfiguration().getValue();
+        }
+        return value != null ? value : Double.valueOf(1);
+    }
+
+    private StandardUnit determineUnit(Exchange exchange) {
+        String unit = exchange.getIn().getHeader(CwConstants.METRIC_UNIT, String.class);
+        if (unit == null) {
+            unit = getConfiguration().getUnit();
+        }
+        return unit != null ? StandardUnit.valueOf(unit) : StandardUnit.Count;
+    }
+
+    protected CwConfiguration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        return "CwProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+    }
+
+    @Override
+    public CwEndpoint getEndpoint() {
+        return (CwEndpoint) super.getEndpoint();
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-cw
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-cw?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-cw (added)
+++ camel/trunk/components/camel-aws/src/main/resources/META-INF/services/org/apache/camel/component/aws-cw Thu Nov 15 11:47:47 2012
@@ -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.aws.cw.CwComponent

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,65 @@
+/**
+ * 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.cw;
+
+
+import java.util.Date;
+
+import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
+import org.apache.camel.component.aws.sns.SnsComponent;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.mockito.Mockito.*;
+
+public class CwComponentConfigurationTest extends CamelTestSupport {
+    private static final Date NOW = new Date();
+    AmazonCloudWatchClient amazonCwClient = mock(AmazonCloudWatchClient.class);
+
+    @Test
+    public void createEndpointWithAllOptions() throws Exception {
+        CwComponent component = new CwComponent(context);
+        CwEndpoint endpoint = (CwEndpoint) component.createEndpoint("aws-cw://camel.apache.org/test?amazonCwClient=#amazonCwClient&name=testMetric&value=2&unit=Count&timestamp=#now");
+
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("testMetric", endpoint.getConfiguration().getName());
+        assertEquals(Double.valueOf(2), endpoint.getConfiguration().getValue());
+        assertEquals("Count", endpoint.getConfiguration().getUnit());
+        assertEquals(NOW, endpoint.getConfiguration().getTimestamp());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAccessKeyConfiguration() throws Exception {
+        SnsComponent component = new SnsComponent(context);
+        component.createEndpoint("aws-cw://camel.apache.org/test?secretKey=yyy");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSecretKeyConfiguration() throws Exception {
+        CwComponent component = new CwComponent(context);
+        component.createEndpoint("aws-cw://camel.apache.org/test?accessKey=xxx");
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        registry.bind("amazonCwClient", amazonCwClient);
+        registry.bind("now", NOW);
+        return registry;
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,120 @@
+/**
+ * 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.cw;
+
+import java.util.Date;
+
+import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
+import com.amazonaws.services.cloudwatch.model.MetricDatum;
+import com.amazonaws.services.cloudwatch.model.PutMetricDataRequest;
+import com.amazonaws.services.cloudwatch.model.StandardUnit;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import org.mockito.ArgumentCaptor;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+public class CwComponentTest extends CamelTestSupport {
+    private static final Date NOW = new Date();
+    private static final Date LATER = new Date(NOW.getTime() + 1);
+    private AmazonCloudWatchClient cloudWatchClient = mock(AmazonCloudWatchClient.class);
+
+    @Test
+    public void sendMetricFromHeaderValues() throws Exception {
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(CwConstants.METRIC_NAMESPACE, "camel.apache.org/overriden");
+                exchange.getIn().setHeader(CwConstants.METRIC_NAME, "OverridenMetric");
+                exchange.getIn().setHeader(CwConstants.METRIC_VALUE, Double.valueOf(3));
+                exchange.getIn().setHeader(CwConstants.METRIC_UNIT, StandardUnit.Bytes.toString());
+                exchange.getIn().setHeader(CwConstants.METRIC_TIMESTAMP, LATER);
+            }
+        });
+
+
+        ArgumentCaptor<PutMetricDataRequest> argument = ArgumentCaptor.forClass(PutMetricDataRequest.class);
+        verify(cloudWatchClient).putMetricData(argument.capture());
+
+        assertEquals("camel.apache.org/overriden", argument.getValue().getNamespace());
+        assertEquals("OverridenMetric", argument.getValue().getMetricData().get(0).getMetricName());
+        assertEquals(Double.valueOf(3), argument.getValue().getMetricData().get(0).getValue());
+        assertEquals(StandardUnit.Bytes.toString(), argument.getValue().getMetricData().get(0).getUnit());
+        assertEquals(LATER, argument.getValue().getMetricData().get(0).getTimestamp());
+    }
+
+    @Test
+    public void sendManuallyCreatedMetric() throws Exception {
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                MetricDatum metricDatum = new MetricDatum()
+                        .withMetricName("errorCount")
+                        .withValue(Double.valueOf(0));
+                exchange.getIn().setBody(metricDatum);
+            }
+        });
+
+
+        ArgumentCaptor<PutMetricDataRequest> argument = ArgumentCaptor.forClass(PutMetricDataRequest.class);
+        verify(cloudWatchClient).putMetricData(argument.capture());
+
+        assertEquals("errorCount", argument.getValue().getMetricData().get(0).getMetricName());
+        assertEquals(Double.valueOf(0), argument.getValue().getMetricData().get(0).getValue());
+    }
+
+
+    @Test
+    public void useDefaultValuesForMetricUnitAndMetricValue() throws Exception {
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(CwConstants.METRIC_NAME, "errorCount");
+            }
+        });
+
+
+        ArgumentCaptor<PutMetricDataRequest> argument = ArgumentCaptor.forClass(PutMetricDataRequest.class);
+        verify(cloudWatchClient).putMetricData(argument.capture());
+
+        assertEquals("errorCount", argument.getValue().getMetricData().get(0).getMetricName());
+        assertEquals(Double.valueOf(1), argument.getValue().getMetricData().get(0).getValue());
+        assertEquals(StandardUnit.Count.toString(), argument.getValue().getMetricData().get(0).getUnit());
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        registry.bind("amazonCwClient", cloudWatchClient);
+        registry.bind("now", NOW);
+        return registry;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("aws-cw://camel.apache.org/test?amazonCwClient=#amazonCwClient&name=testMetric&unit=Count&timestamp=#now");
+            }
+        };
+    }
+}

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java?rev=1409743&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java Thu Nov 15 11:47:47 2012
@@ -0,0 +1,64 @@
+/**
+ * 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.cw.integration;
+
+import java.util.Date;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws.cw.CwConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+//@Ignore("Must be manually tested. Provide your own accessKey and secretKey!")
+public class CwComponentIntegrationTest extends CamelTestSupport {
+
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void sendInOnly() throws Exception {
+        mock.expectedMessageCount(1);
+
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(CwConstants.METRIC_NAME, "ExchangesCompleted");
+                exchange.getIn().setHeader(CwConstants.METRIC_VALUE, "2.0");
+                exchange.getIn().setHeader(CwConstants.METRIC_UNIT, "Count");
+            }
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("aws-cw://http://camel.apache.org/aws-cw?accessKey=XXX&secretKey=XXX")
+                        .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file