You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2011/12/19 15:16:49 UTC

svn commit: r1220758 [1/3] - in /camel/trunk: components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ components/camel-aws/src/test/java/org/apache/camel/component/aw...

Author: cmueller
Date: Mon Dec 19 14:16:47 2011
New Revision: 1220758

URL: http://svn.apache.org/viewvc?rev=1220758&view=rev
Log:
CAMEL-4793: Improve Camel aws-sdb component

Added:
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/AbstractSdbCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteDomainCommand.java
      - copied, changed from r1220715, camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DomainMetadataCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/GetAttributesCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ListDomainsCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/PutAttributesCommand.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbOperations.java
      - copied, changed from r1220715, camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SelectCommand.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AbstractSdbCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteDomainCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DomainMetadataCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/GetAttributesCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ListDomainsCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/PutAttributesCommandTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/SdbComponentConfigurationTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/SdbComponentSpringTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/SdbOperationsTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/SelectCommandTest.java
    camel/trunk/components/camel-aws/src/test/resources/org/apache/camel/component/aws/sdb/
    camel/trunk/components/camel-aws/src/test/resources/org/apache/camel/component/aws/sdb/SDBComponentSpringTest-context.xml
      - copied, changed from r1220715, camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/aws/CamelIntegrationContext.xml
    camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/aws/AmazonSDBClientMock.java
    camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/aws/AwsSdbIntegrationTest.java
    camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/aws/AwsSdbTest.java
Modified:
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbComponent.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConfiguration.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbEndpoint.java
    camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbProducer.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AmazonSDBClientMock.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/SdbComponentTest.java
    camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/integration/SdbComponentIntegrationTest.java
    camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/aws/CamelContext.xml
    camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/aws/CamelIntegrationContext.xml

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/AbstractSdbCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/AbstractSdbCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/AbstractSdbCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/AbstractSdbCommand.java Mon Dec 19 14:16:47 2011
@@ -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.aws.sdb;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.UpdateCondition;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractSdbCommand {
+    
+    protected final transient Logger log = LoggerFactory.getLogger(getClass());
+    
+    protected AmazonSimpleDB sdbClient;
+    protected SdbConfiguration configuration;
+    protected Exchange exchange;
+
+    public AbstractSdbCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        this.sdbClient = sdbClient;
+        this.configuration = configuration;
+        this.exchange = exchange;
+    }
+
+    public abstract void execute();
+    
+    protected Message getMessageForResponse(Exchange exchange) {
+        if (exchange.getPattern().isOutCapable()) {
+            Message out = exchange.getOut();
+            out.copyFrom(exchange.getIn());
+            return out;
+        }
+        return exchange.getIn();
+    }
+
+    protected String determineDomainName() {
+        String domainName = exchange.getIn().getHeader(SdbConstants.DOMAIN_NAME, String.class);
+        return domainName != null ? domainName : configuration.getDomainName();
+    }
+    
+    protected String determineItemName() {
+        String key = exchange.getIn().getHeader(SdbConstants.ITEM_NAME, String.class);
+        if (key == null) {
+            throw new IllegalArgumentException("AWS SDB Item Name header is missing.");
+        }
+        return key;
+    }
+    
+    protected Boolean determineConsistentRead() {
+        Boolean consistentRead = exchange.getIn().getHeader(SdbConstants.CONSISTENT_READ, Boolean.class);
+        if (consistentRead == null) {
+            consistentRead = this.configuration.getConsistentRead();
+        }
+        return consistentRead;
+    }
+    
+    protected UpdateCondition determineUpdateCondition() {
+        return exchange.getIn().getHeader(SdbConstants.UPDATE_CONDITION, UpdateCondition.class);
+    }
+    
+    protected String determineNextToken() {
+        return exchange.getIn().getHeader(SdbConstants.NEXT_TOKEN, String.class);
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,48 @@
+/**
+ * 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.sdb;
+
+import java.util.Collection;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.BatchDeleteAttributesRequest;
+import com.amazonaws.services.simpledb.model.DeletableItem;
+
+import org.apache.camel.Exchange;
+
+public class BatchDeleteAttributesCommand extends AbstractSdbCommand {
+
+    public BatchDeleteAttributesCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        BatchDeleteAttributesRequest request = new BatchDeleteAttributesRequest()
+            .withDomainName(determineDomainName())
+            .withItems(determineDeletableItems());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        this.sdbClient.batchDeleteAttributes(request);
+        
+        log.trace("Request sent");
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Collection<DeletableItem> determineDeletableItems() {
+        return exchange.getIn().getHeader(SdbConstants.DELETABLE_ITEMS, Collection.class);
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,48 @@
+/**
+ * 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.sdb;
+
+import java.util.Collection;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.BatchPutAttributesRequest;
+import com.amazonaws.services.simpledb.model.ReplaceableItem;
+
+import org.apache.camel.Exchange;
+
+public class BatchPutAttributesCommand extends AbstractSdbCommand {
+
+    public BatchPutAttributesCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        BatchPutAttributesRequest request = new BatchPutAttributesRequest()
+            .withDomainName(determineDomainName())
+            .withItems(determineReplaceableItems());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        this.sdbClient.batchPutAttributes(request);
+        
+        log.trace("Request sent");
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Collection<ReplaceableItem> determineReplaceableItems() {
+        return exchange.getIn().getHeader(SdbConstants.REPLACEABLE_ITEMS, Collection.class);
+    }
+}

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,50 @@
+/**
+ * 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.sdb;
+
+import java.util.Collection;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.Attribute;
+import com.amazonaws.services.simpledb.model.DeleteAttributesRequest;
+
+import org.apache.camel.Exchange;
+
+public class DeleteAttributesCommand extends AbstractSdbCommand {
+
+    public DeleteAttributesCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        DeleteAttributesRequest request = new DeleteAttributesRequest()
+            .withDomainName(determineDomainName())
+            .withItemName(determineItemName())
+            .withExpected(determineUpdateCondition())
+            .withAttributes(determineAttributes());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        this.sdbClient.deleteAttributes(request);
+        
+        log.trace("Request sent");
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Collection<Attribute> determineAttributes() {
+        return exchange.getIn().getHeader(SdbConstants.ATTRIBUTES, Collection.class);
+    }
+}
\ No newline at end of file

Copied: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteDomainCommand.java (from r1220715, camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteDomainCommand.java?p2=camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteDomainCommand.java&p1=camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java&r1=1220715&r2=1220758&rev=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DeleteDomainCommand.java Mon Dec 19 14:16:47 2011
@@ -16,13 +16,24 @@
  */
 package org.apache.camel.component.aws.sdb;
 
-public interface SdbConstants {
-    String MESSAGE_ID = "CamelAwsSdbMessageId";
-    String DOMAIN_NAME = "CamelAwsSdbDomainName";
-    String ITEM_KEY = "CamelAwsSdbItemKey";
-    String ATTRIBUTE_PREFIX = "CamelAwsSdbAttributePrefix";
-    String OPERATION = "CamelAwsSdbOperation";
-    String OPERATION_PUT = "CamelAwsSdbPut";
-    String OPERATION_GET = "CamelAwsSdbGet";
-    String OPERATION_DELETE = "CamelAwsSdbDelete";
-}
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.DeleteDomainRequest;
+
+import org.apache.camel.Exchange;
+
+public class DeleteDomainCommand extends AbstractSdbCommand {
+
+    public DeleteDomainCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        DeleteDomainRequest request = new DeleteDomainRequest()
+            .withDomainName(determineDomainName());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        this.sdbClient.deleteDomain(request);
+        
+        log.trace("Request sent");
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DomainMetadataCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DomainMetadataCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DomainMetadataCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/DomainMetadataCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,50 @@
+/**
+ * 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.sdb;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.DomainMetadataRequest;
+import com.amazonaws.services.simpledb.model.DomainMetadataResult;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+
+public class DomainMetadataCommand extends AbstractSdbCommand {
+
+    public DomainMetadataCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        DomainMetadataRequest request = new DomainMetadataRequest()
+            .withDomainName(determineDomainName());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        DomainMetadataResult result = this.sdbClient.domainMetadata(request);
+        
+        log.trace("Received result [{}]", result);
+        
+        Message msg = getMessageForResponse(exchange);
+        msg.setHeader(SdbConstants.TIMESTAMP, result.getTimestamp());
+        msg.setHeader(SdbConstants.ITEM_COUNT, result.getItemCount());
+        msg.setHeader(SdbConstants.ATTRIBUTE_NAME_COUNT, result.getAttributeNameCount());
+        msg.setHeader(SdbConstants.ATTRIBUTE_VALUE_COUNT, result.getAttributeValueCount());
+        msg.setHeader(SdbConstants.ATTRIBUTE_NAME_SIZE, result.getAttributeNamesSizeBytes());
+        msg.setHeader(SdbConstants.ATTRIBUTE_VALUE_SIZE, result.getAttributeValuesSizeBytes());
+        msg.setHeader(SdbConstants.ITEM_NAME_SIZE, result.getItemNamesSizeBytes());
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/GetAttributesCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/GetAttributesCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/GetAttributesCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/GetAttributesCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,54 @@
+/**
+ * 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.sdb;
+
+import java.util.Collection;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.GetAttributesRequest;
+import com.amazonaws.services.simpledb.model.GetAttributesResult;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+
+public class GetAttributesCommand extends AbstractSdbCommand {
+    
+    public GetAttributesCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        GetAttributesRequest request = new GetAttributesRequest()
+            .withDomainName(determineDomainName())
+            .withItemName(determineItemName())
+            .withConsistentRead(determineConsistentRead())
+            .withAttributeNames(determineAttributeNames());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        GetAttributesResult result = this.sdbClient.getAttributes(request);
+        
+        log.trace("Received result [{}]", result);
+        
+        Message msg = getMessageForResponse(exchange);
+        msg.setHeader(SdbConstants.ATTRIBUTES, result.getAttributes());
+    }
+
+    @SuppressWarnings("unchecked")
+    protected Collection<String> determineAttributeNames() {
+        return exchange.getIn().getHeader(SdbConstants.ATTRIBUTE_NAMES, Collection.class);
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ListDomainsCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ListDomainsCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ListDomainsCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/ListDomainsCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,54 @@
+/**
+ * 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.sdb;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.ListDomainsRequest;
+import com.amazonaws.services.simpledb.model.ListDomainsResult;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+
+public class ListDomainsCommand extends AbstractSdbCommand {
+
+    public ListDomainsCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        ListDomainsRequest request = new ListDomainsRequest()
+            .withMaxNumberOfDomains(determineMaxNumberOfDomains())
+            .withNextToken(determineNextToken());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        ListDomainsResult result = this.sdbClient.listDomains(request);
+        
+        log.trace("Received result [{}]", result);
+        
+        Message msg = getMessageForResponse(exchange);
+        msg.setHeader(SdbConstants.NEXT_TOKEN, result.getNextToken());
+        msg.setHeader(SdbConstants.DOMAIN_NAMES, result.getDomainNames());
+    }
+
+    protected Integer determineMaxNumberOfDomains() {
+        Integer maxNumberOfDomains = exchange.getIn().getHeader(SdbConstants.MAX_NUMBER_OF_DOMAINS, Integer.class);
+        if (maxNumberOfDomains == null) {
+            maxNumberOfDomains = this.configuration.getMaxNumberOfDomains();
+        }
+        return maxNumberOfDomains;
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/PutAttributesCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/PutAttributesCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/PutAttributesCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/PutAttributesCommand.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,50 @@
+/**
+ * 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.sdb;
+
+import java.util.Collection;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.PutAttributesRequest;
+import com.amazonaws.services.simpledb.model.ReplaceableAttribute;
+
+import org.apache.camel.Exchange;
+
+public class PutAttributesCommand extends AbstractSdbCommand {
+    
+    public PutAttributesCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        PutAttributesRequest request = new PutAttributesRequest()
+            .withDomainName(determineDomainName())
+            .withItemName(determineItemName())
+            .withAttributes(determineReplaceableAttributes())
+            .withExpected(determineUpdateCondition());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+
+        this.sdbClient.putAttributes(request);
+        
+        log.trace("Request sent");
+    }
+    
+    @SuppressWarnings("unchecked")
+    protected Collection<ReplaceableAttribute> determineReplaceableAttributes() {
+        return exchange.getIn().getHeader(SdbConstants.REPLACEABLE_ATTRIBUTES, Collection.class);
+    }
+}
\ No newline at end of file

Modified: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbComponent.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbComponent.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbComponent.java Mon Dec 19 14:16:47 2011
@@ -22,6 +22,9 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.impl.DefaultComponent;
 
+/**
+ * Defines the <a href="http://aws.amazon.com/simpledb/">AWS SDB component</a> 
+ */
 public class SdbComponent extends DefaultComponent {
 
     public SdbComponent() {
@@ -41,11 +44,11 @@ public class SdbComponent extends Defaul
         }
         configuration.setDomainName(remaining);
 
-        if (configuration.getAmazonSdbClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
-            throw new IllegalArgumentException("amazonSdbClient or accessKey and secretKey must be specified");
+        if (configuration.getAmazonSDBClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("amazonSDBClient or accessKey and secretKey must be specified");
         }
 
         SdbEndpoint endpoint = new SdbEndpoint(uri, getCamelContext(), configuration);
         return endpoint;
     }
-}
+}
\ No newline at end of file

Modified: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConfiguration.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConfiguration.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConfiguration.java Mon Dec 19 14:16:47 2011
@@ -18,13 +18,20 @@ package org.apache.camel.component.aws.s
 
 import com.amazonaws.services.simpledb.AmazonSimpleDB;
 
+/**
+ * The AWS SDB component configuration properties
+ * 
+ */
 public class SdbConfiguration {
+    
     private String accessKey;
     private String secretKey;
-    private AmazonSimpleDB amazonSdbClient;
+    private AmazonSimpleDB amazonSDBClient;
     private String amazonSdbEndpoint;
     private String domainName;
-    private String operation;
+    private Integer maxNumberOfDomains;
+    private Boolean consistentRead;
+    private SdbOperations operation = SdbOperations.PutAttributes;
 
     public void setAmazonSdbEndpoint(String amazonSdbEndpoint) {
         this.amazonSdbEndpoint = amazonSdbEndpoint;
@@ -50,12 +57,12 @@ public class SdbConfiguration {
         this.secretKey = secretKey;
     }
 
-    public AmazonSimpleDB getAmazonSdbClient() {
-        return amazonSdbClient;
+    public AmazonSimpleDB getAmazonSDBClient() {
+        return amazonSDBClient;
     }
 
-    public void setAmazonSdbClient(AmazonSimpleDB amazonSdbClient) {
-        this.amazonSdbClient = amazonSdbClient;
+    public void setAmazonSDBClient(AmazonSimpleDB amazonSDBClient) {
+        this.amazonSDBClient = amazonSDBClient;
     }
 
     public String getDomainName() {
@@ -66,11 +73,27 @@ public class SdbConfiguration {
         this.domainName = domainName;
     }
 
-    public String getOperation() {
+    public SdbOperations getOperation() {
         return operation;
     }
 
-    public void setOperation(String operation) {
+    public void setOperation(SdbOperations operation) {
         this.operation = operation;
     }
+
+    public Integer getMaxNumberOfDomains() {
+        return maxNumberOfDomains;
+    }
+
+    public void setMaxNumberOfDomains(Integer maxNumberOfDomains) {
+        this.maxNumberOfDomains = maxNumberOfDomains;
+    }
+
+    public Boolean getConsistentRead() {
+        return consistentRead;
+    }
+
+    public void setConsistentRead(Boolean consistentRead) {
+        this.consistentRead = consistentRead;
+    }
 }

Modified: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java Mon Dec 19 14:16:47 2011
@@ -16,13 +16,32 @@
  */
 package org.apache.camel.component.aws.sdb;
 
+/**
+ * Constants used in Camel AWS SDB component
+ */
 public interface SdbConstants {
-    String MESSAGE_ID = "CamelAwsSdbMessageId";
+    
+    String ATTRIBUTES = "CamelAwsSdbAttributes";
+    String ATTRIBUTE_NAMES = "CamelAwsSdbAttributeNames";
+    String ATTRIBUTE_NAME_COUNT = "CamelAwsSdbAttributeNameCount";
+    String ATTRIBUTE_NAME_SIZE = "CamelAwsSdbAttributeNameSize";
+    String ATTRIBUTE_VALUE_COUNT = "CamelAwsSdbAttributeValueCount";
+    String ATTRIBUTE_VALUE_SIZE = "CamelAwsSdbAttributeValueSize";
+    String CONSISTENT_READ = "CamelAwsSdbConsistentRead";
+    String DELETABLE_ITEMS = "CamelAwsSdbDeletableItems";
     String DOMAIN_NAME = "CamelAwsSdbDomainName";
-    String ITEM_KEY = "CamelAwsSdbItemKey";
-    String ATTRIBUTE_PREFIX = "CamelAwsSdbAttributePrefix";
+    String DOMAIN_NAMES = "CamelAwsSdbDomainNames";
+    String ITEMS = "CamelAwsSdbItems";
+    String ITEM_COUNT = "CamelAwsSdbItemCount";
+    String ITEM_NAME_SIZE = "CamelAwsSdbItemNameSize";
+    String ITEM_NAME = "CamelAwsSdbItemName";
+    String MAX_NUMBER_OF_DOMAINS = "CamelAwsSdbMaxNumberOfDomains";
+    String MESSAGE_ID = "CamelAwsSdbMessageId";
+    String NEXT_TOKEN = "CamelAwsSdbNextToken";
     String OPERATION = "CamelAwsSdbOperation";
-    String OPERATION_PUT = "CamelAwsSdbPut";
-    String OPERATION_GET = "CamelAwsSdbGet";
-    String OPERATION_DELETE = "CamelAwsSdbDelete";
+    String REPLACEABLE_ATTRIBUTES = "CamelAwsSdbReplaceableAttributes";
+    String REPLACEABLE_ITEMS = "CamelAwsSdbReplaceableItems";
+    String SELECT_EXPRESSION = "CamelAwsSdbSelectExpression";
+    String TIMESTAMP = "CamelAwsSdbTimestamp";
+    String UPDATE_CONDITION = "CamelAwsSdbUpdateCondition";
 }

Modified: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbEndpoint.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbEndpoint.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbEndpoint.java Mon Dec 19 14:16:47 2011
@@ -32,7 +32,12 @@ import org.apache.camel.impl.ScheduledPo
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Defines the <a href="http://camel.apache.org/aws.html">AWS SDB Endpoint</a>.  
+ *
+ */
 public class SdbEndpoint extends ScheduledPollEndpoint {
+    
     private static final Logger LOG = LoggerFactory.getLogger(S3Endpoint.class);
     private SdbConfiguration configuration;
 
@@ -56,6 +61,7 @@ public class SdbEndpoint extends Schedul
     @Override
     public void doStart() throws Exception {
         super.doStart();
+        
         AmazonSimpleDB sdbClient = getSdbClient();
         String domainName = getConfiguration().getDomainName();
         LOG.trace("Querying whether domain [{}] already exists...", domainName);
@@ -66,8 +72,9 @@ public class SdbEndpoint extends Schedul
             return;
         } catch (NoSuchDomainException ase) {
             LOG.trace("Domain [{}] doesn't exist yet", domainName);
+            LOG.trace("Creating domain [{}]...", domainName);
             sdbClient.createDomain(new CreateDomainRequest(domainName));
-            LOG.trace("Domain created:" + domainName);
+            LOG.trace("Domain [{}] created", domainName);
         }
     }
 
@@ -76,7 +83,7 @@ public class SdbEndpoint extends Schedul
     }
 
     public AmazonSimpleDB getSdbClient() {
-        return configuration.getAmazonSdbClient() != null ? configuration.getAmazonSdbClient() : createSdbClient();
+        return configuration.getAmazonSDBClient() != null ? configuration.getAmazonSDBClient() : createSdbClient();
     }
 
     AmazonSimpleDBClient createSdbClient() {
@@ -85,7 +92,7 @@ public class SdbEndpoint extends Schedul
         if (configuration.getAmazonSdbEndpoint() != null) {
             client.setEndpoint(configuration.getAmazonSdbEndpoint());
         }
-        configuration.setAmazonSdbClient(client);
+        configuration.setAmazonSDBClient(client);
         return client;
     }
 }

Copied: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbOperations.java (from r1220715, camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbOperations.java?p2=camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbOperations.java&p1=camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java&r1=1220715&r2=1220758&rev=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbConstants.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbOperations.java Mon Dec 19 14:16:47 2011
@@ -16,13 +16,15 @@
  */
 package org.apache.camel.component.aws.sdb;
 
-public interface SdbConstants {
-    String MESSAGE_ID = "CamelAwsSdbMessageId";
-    String DOMAIN_NAME = "CamelAwsSdbDomainName";
-    String ITEM_KEY = "CamelAwsSdbItemKey";
-    String ATTRIBUTE_PREFIX = "CamelAwsSdbAttributePrefix";
-    String OPERATION = "CamelAwsSdbOperation";
-    String OPERATION_PUT = "CamelAwsSdbPut";
-    String OPERATION_GET = "CamelAwsSdbGet";
-    String OPERATION_DELETE = "CamelAwsSdbDelete";
+public enum SdbOperations {
+
+    BatchDeleteAttributes,
+    BatchPutAttributes,
+    DeleteAttributes,
+    DeleteDomain,
+    DomainMetadata,
+    GetAttributes,
+    ListDomains,
+    PutAttributes,
+    Select;
 }

Modified: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbProducer.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbProducer.java (original)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SdbProducer.java Mon Dec 19 14:16:47 2011
@@ -16,102 +16,61 @@
  */
 package org.apache.camel.component.aws.sdb;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import com.amazonaws.services.simpledb.model.Attribute;
-import com.amazonaws.services.simpledb.model.DeleteAttributesRequest;
-import com.amazonaws.services.simpledb.model.GetAttributesRequest;
-import com.amazonaws.services.simpledb.model.GetAttributesResult;
-import com.amazonaws.services.simpledb.model.PutAttributesRequest;
-import com.amazonaws.services.simpledb.model.ReplaceableAttribute;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.util.URISupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+/**
+ * A Producer which sends messages to the Amazon SimpleDB Service
+ * <a href="http://aws.amazon.com/simpledb/">AWS SDB</a>
+ */
 public class SdbProducer extends DefaultProducer {
-    private static final Logger LOG = LoggerFactory.getLogger(SdbProducer.class);
-
+    
     public SdbProducer(Endpoint endpoint) {
         super(endpoint);
     }
 
     public void process(Exchange exchange) throws Exception {
-        String domainName = determineDomainName(exchange);
-        String itemName = determineItemName(exchange);
-        String operation = determineOperation(exchange);
-
-        if (SdbConstants.OPERATION_PUT.equals(operation)) {
-            executePut(exchange, domainName, itemName);
-        } else if (SdbConstants.OPERATION_GET.equals(operation)) {
-            executeGet(exchange, domainName, itemName);
-        } else if (SdbConstants.OPERATION_DELETE.equals(operation)) {
-            executeDelete(domainName, itemName);
-        } else {
-            throw new UnsupportedOperationException("Not supported operation: " + operation);
-        }
-    }
-
-    private void executeDelete(String domainName, String itemName) {
-        LOG.trace("Deleting item [{}] from domain [{}]...", itemName, domainName);
-        getEndpoint().getSdbClient().deleteAttributes(new DeleteAttributesRequest(domainName, itemName));
-    }
-
-    private void executeGet(Exchange exchange, String domainName, String itemName) {
-        LOG.trace("Getting item [{}] from domain [{}]...", itemName, domainName);
-        GetAttributesRequest getAttributesRequest = new GetAttributesRequest(domainName, itemName);
-        GetAttributesResult result = getEndpoint().getSdbClient().getAttributes(getAttributesRequest);
-        populateExchangeWithResult(exchange, result);
-    }
-
-    private void populateExchangeWithResult(Exchange exchange, GetAttributesResult attributesResult) {
-        for (Attribute attribute : attributesResult.getAttributes()) {
-            exchange.getIn().setHeader(attribute.getName(), attribute.getValue());
+        switch (determineOperation(exchange)) {
+        case BatchDeleteAttributes:
+            new BatchDeleteAttributesCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case BatchPutAttributes:
+            new BatchPutAttributesCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case DeleteAttributes:
+            new DeleteAttributesCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case DeleteDomain:
+            new DeleteDomainCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case DomainMetadata:
+            new DomainMetadataCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case GetAttributes:
+            new GetAttributesCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case ListDomains:
+            new ListDomainsCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case PutAttributes:
+            new PutAttributesCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        case Select:
+            new SelectCommand(getEndpoint().getSdbClient(), getConfiguration(), exchange).execute();
+            break;
+        default:
+            throw new IllegalArgumentException("Unsupported operation");
         }
     }
 
-    private void executePut(Exchange exchange, String domainName, String itemName) {
-        List<ReplaceableAttribute> attributes = extractAttributesFrom(exchange);
-        PutAttributesRequest request = new PutAttributesRequest(domainName, itemName, attributes);
-
-        LOG.trace("Put object [{}] from exchange [{}]...", request, exchange);
-        getEndpoint().getSdbClient().putAttributes(request);
-    }
-
-    private List<ReplaceableAttribute> extractAttributesFrom(Exchange exchange) {
-        List<ReplaceableAttribute> attributes = new ArrayList<ReplaceableAttribute>();
-        for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
-            if (entry.getKey().startsWith(SdbConstants.ATTRIBUTE_PREFIX)) {
-                String fieldName = entry.getKey().substring(SdbConstants.ATTRIBUTE_PREFIX.length());
-                attributes.add(new ReplaceableAttribute(fieldName, (String) entry.getValue(), true));
-            }
-        }
-        return attributes;
-    }
-
-    private String determineDomainName(Exchange exchange) {
-        String domainName = exchange.getIn().getHeader(SdbConstants.DOMAIN_NAME, String.class);
-        return domainName != null ? domainName : getConfiguration().getDomainName();
-    }
-
-    private String determineOperation(Exchange exchange) {
-        String operation = exchange.getIn().getHeader(SdbConstants.OPERATION, String.class);
+    private SdbOperations determineOperation(Exchange exchange) {
+        SdbOperations operation = exchange.getIn().getHeader(SdbConstants.OPERATION, SdbOperations.class);
         if (operation == null) {
             operation = getConfiguration().getOperation();
         }
-        return operation != null ? operation : SdbConstants.OPERATION_PUT;
-    }
-
-    private String determineItemName(Exchange exchange) {
-        String key = exchange.getIn().getHeader(SdbConstants.ITEM_KEY, String.class);
-        if (key == null) {
-            throw new IllegalArgumentException("AWS SDB Item Key header is missing.");
-        }
-        return key;
+        return operation;
     }
 
     protected SdbConfiguration getConfiguration() {
@@ -127,4 +86,4 @@ public class SdbProducer extends Default
     public SdbEndpoint getEndpoint() {
         return (SdbEndpoint) super.getEndpoint();
     }
-}
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SelectCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SelectCommand.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SelectCommand.java (added)
+++ camel/trunk/components/camel-aws/src/main/java/org/apache/camel/component/aws/sdb/SelectCommand.java Mon Dec 19 14:16:47 2011
@@ -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.sdb;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.SelectRequest;
+import com.amazonaws.services.simpledb.model.SelectResult;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+
+public class SelectCommand extends AbstractSdbCommand {
+
+    public SelectCommand(AmazonSimpleDB sdbClient, SdbConfiguration configuration, Exchange exchange) {
+        super(sdbClient, configuration, exchange);
+    }
+
+    public void execute() {
+        SelectRequest request = new SelectRequest()
+            .withSelectExpression(determineSelectExpression())
+            .withConsistentRead(determineConsistentRead())
+            .withNextToken(determineNextToken());
+        log.trace("Sending request [{}] for exchange [{}]...", request, exchange);
+        
+        SelectResult result = this.sdbClient.select(request);
+        
+        log.trace("Received result [{}]", result);
+        
+        Message msg = getMessageForResponse(exchange);
+        msg.setHeader(SdbConstants.ITEMS, result.getItems());
+        msg.setHeader(SdbConstants.NEXT_TOKEN, result.getNextToken());
+    }
+
+    protected String determineSelectExpression() {
+        return exchange.getIn().getHeader(SdbConstants.SELECT_EXPRESSION, String.class);
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AbstractSdbCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AbstractSdbCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AbstractSdbCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AbstractSdbCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,116 @@
+/**
+ * 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.sdb;
+
+import com.amazonaws.services.simpledb.AmazonSimpleDB;
+import com.amazonaws.services.simpledb.model.UpdateCondition;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
+public class AbstractSdbCommandTest {
+
+    private AbstractSdbCommand command;
+    private AmazonSimpleDB sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        configuration.setConsistentRead(Boolean.TRUE);
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        this.command = new AbstractSdbCommand(sdbClient, configuration, exchange) {
+            @Override
+            public void execute() {
+                // noop
+            }
+        };
+    }
+    
+    @Test
+    public void getMessageForResponse() {
+        assertSame(exchange.getIn(), this.command.getMessageForResponse(exchange));
+        
+        exchange.setPattern(ExchangePattern.InOut);
+        
+        assertSame(exchange.getOut(), this.command.getMessageForResponse(exchange));
+    }
+    
+    @Test
+    public void determineDomainName() {
+        assertEquals("DOMAIN1", this.command.determineDomainName());
+        
+        exchange.getIn().setHeader(SdbConstants.DOMAIN_NAME, "DOMAIN2");
+        
+        assertEquals("DOMAIN2", this.command.determineDomainName());
+    }
+    
+    @Test
+    public void determineItemName() {
+        try {
+            this.command.determineItemName();
+            fail("IllegalArgumentException expected");
+        } catch (IllegalArgumentException e) {
+            assertEquals("AWS SDB Item Name header is missing.", e.getMessage());
+        }
+        
+        exchange.getIn().setHeader(SdbConstants.ITEM_NAME, "ITEM1");
+        
+        assertEquals("ITEM1", this.command.determineItemName());
+    }
+    
+    @Test
+    public void determineConsistentRead() {
+        assertEquals(Boolean.TRUE, this.command.determineConsistentRead());
+        
+        exchange.getIn().setHeader(SdbConstants.CONSISTENT_READ, Boolean.FALSE);
+        
+        assertEquals(Boolean.FALSE, this.command.determineConsistentRead());
+    }
+    
+    @Test
+    public void determineUpdateCondition() {
+        assertNull(this.command.determineUpdateCondition());
+        
+        UpdateCondition condition = new UpdateCondition("Key1", "Value1", true);
+        exchange.getIn().setHeader(SdbConstants.UPDATE_CONDITION, condition);
+        
+        assertSame(condition, this.command.determineUpdateCondition());
+    }
+    
+    @Test
+    public void determineNextToken() {
+        assertNull(this.command.determineNextToken());
+        
+        exchange.getIn().setHeader(SdbConstants.NEXT_TOKEN, "Token1");
+        
+        assertEquals("Token1", this.command.determineNextToken());
+    }
+}
\ No newline at end of file

Modified: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AmazonSDBClientMock.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AmazonSDBClientMock.java?rev=1220758&r1=1220757&r2=1220758&view=diff
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AmazonSDBClientMock.java (original)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/AmazonSDBClientMock.java Mon Dec 19 14:16:47 2011
@@ -21,64 +21,122 @@ import com.amazonaws.AmazonServiceExcept
 import com.amazonaws.auth.BasicAWSCredentials;
 import com.amazonaws.services.simpledb.AmazonSimpleDBClient;
 import com.amazonaws.services.simpledb.model.Attribute;
+import com.amazonaws.services.simpledb.model.BatchDeleteAttributesRequest;
+import com.amazonaws.services.simpledb.model.BatchPutAttributesRequest;
 import com.amazonaws.services.simpledb.model.CreateDomainRequest;
 import com.amazonaws.services.simpledb.model.DeleteAttributesRequest;
+import com.amazonaws.services.simpledb.model.DeleteDomainRequest;
 import com.amazonaws.services.simpledb.model.DomainMetadataRequest;
 import com.amazonaws.services.simpledb.model.DomainMetadataResult;
 import com.amazonaws.services.simpledb.model.GetAttributesRequest;
 import com.amazonaws.services.simpledb.model.GetAttributesResult;
+import com.amazonaws.services.simpledb.model.Item;
+import com.amazonaws.services.simpledb.model.ListDomainsRequest;
+import com.amazonaws.services.simpledb.model.ListDomainsResult;
 import com.amazonaws.services.simpledb.model.NoSuchDomainException;
 import com.amazonaws.services.simpledb.model.PutAttributesRequest;
+import com.amazonaws.services.simpledb.model.SelectRequest;
+import com.amazonaws.services.simpledb.model.SelectResult;
 
 public class AmazonSDBClientMock extends AmazonSimpleDBClient {
-    private String domainNameToCreate;
-    private String itemNameToDelete;
-    private PutAttributesRequest putAttributesRequest;
+    
+    protected BatchDeleteAttributesRequest batchDeleteAttributesRequest;
+    protected BatchPutAttributesRequest batchPutAttributesRequest;
+    protected CreateDomainRequest createDomainRequest;
+    protected DeleteAttributesRequest deleteAttributesRequest;
+    protected DeleteDomainRequest deleteDomainRequest;
+    protected DomainMetadataRequest domainMetadataRequest;
+    protected GetAttributesRequest getAttributesRequest;
+    protected ListDomainsRequest listDomainsRequest;
+    protected PutAttributesRequest putAttributesRequest;
+    protected SelectRequest selectRequest;
 
     public AmazonSDBClientMock() {
         super(new BasicAWSCredentials("user", "secret"));
     }
-
+    
     @Override
-    public DomainMetadataResult domainMetadata(DomainMetadataRequest domainMetadataRequest) throws AmazonServiceException, AmazonClientException {
-        throw new NoSuchDomainException(domainNameToCreate + " doesn't exist");
+    public void batchDeleteAttributes(BatchDeleteAttributesRequest batchDeleteAttributesRequest) throws AmazonServiceException, AmazonClientException {
+        this.batchDeleteAttributesRequest = batchDeleteAttributesRequest;
     }
-
+    
     @Override
-    public void createDomain(CreateDomainRequest createDomainRequest) throws AmazonServiceException, AmazonClientException {
-        this.domainNameToCreate = createDomainRequest.getDomainName();
+    public void batchPutAttributes(BatchPutAttributesRequest batchPutAttributesRequest) throws AmazonServiceException, AmazonClientException {
+        this.batchPutAttributesRequest = batchPutAttributesRequest;
     }
-
+    
     @Override
-    public void putAttributes(PutAttributesRequest putAttributesRequest) throws AmazonServiceException, AmazonClientException {
-        this.putAttributesRequest = putAttributesRequest;
+    public void createDomain(CreateDomainRequest createDomainRequest) throws AmazonServiceException, AmazonClientException {
+        this.createDomainRequest = createDomainRequest;
     }
-
+    
     @Override
     public void deleteAttributes(DeleteAttributesRequest deleteAttributesRequest) throws AmazonServiceException, AmazonClientException {
+        this.deleteAttributesRequest = deleteAttributesRequest;
+        
         String domainName = deleteAttributesRequest.getDomainName();
         if ("MissingDomain".equals(domainName)) {
             throw new NoSuchDomainException(domainName);
         }
-        this.itemNameToDelete = deleteAttributesRequest.getItemName();
+    }
+    
+    @Override
+    public void deleteDomain(DeleteDomainRequest deleteDomainRequest) throws AmazonServiceException, AmazonClientException {
+        this.deleteDomainRequest = deleteDomainRequest;
     }
 
     @Override
+    public DomainMetadataResult domainMetadata(DomainMetadataRequest domainMetadataRequest) throws AmazonServiceException, AmazonClientException {
+        this.domainMetadataRequest = domainMetadataRequest;
+        
+        if ("NonExistingDomain".equals(domainMetadataRequest.getDomainName())) {
+            throw new NoSuchDomainException("Domain 'NonExistingDomain' doesn't exist.");
+        }
+        
+        DomainMetadataResult result = new DomainMetadataResult();
+        result.setTimestamp(new Integer(10));
+        result.setItemCount(new Integer(11));
+        result.setAttributeNameCount(new Integer(12));
+        result.setAttributeValueCount(new Integer(13));
+        result.setAttributeNamesSizeBytes(new Long(1000000));
+        result.setAttributeValuesSizeBytes(new Long(2000000));
+        result.setItemNamesSizeBytes(new Long(3000000));
+        return result;
+    }
+    
+    @Override
     public GetAttributesResult getAttributes(GetAttributesRequest getAttributesRequest) throws AmazonServiceException, AmazonClientException {
+        this.getAttributesRequest = getAttributesRequest;
+        
         return new GetAttributesResult()
                 .withAttributes(new Attribute("AttributeOne", "Value One"))
                 .withAttributes(new Attribute("AttributeTwo", "Value Two"));
     }
-
-    public PutAttributesRequest getPutAttributesRequest() {
-        return putAttributesRequest;
+    
+    @Override
+    public ListDomainsResult listDomains(ListDomainsRequest listDomainsRequest) throws AmazonServiceException, AmazonClientException {
+        this.listDomainsRequest = listDomainsRequest;
+        
+        ListDomainsResult result = new ListDomainsResult();
+        result.getDomainNames().add("DOMAIN1");
+        result.getDomainNames().add("DOMAIN2");
+        result.setNextToken("TOKEN2");
+        return result;
     }
 
-    public String getDomainNameToCreate() {
-        return domainNameToCreate;
+    @Override
+    public void putAttributes(PutAttributesRequest putAttributesRequest) throws AmazonServiceException, AmazonClientException {
+        this.putAttributesRequest = putAttributesRequest;
     }
-
-    public String getItemNameToDelete() {
-        return itemNameToDelete;
+    
+    @Override
+    public SelectResult select(SelectRequest selectRequest) throws AmazonServiceException, AmazonClientException {
+        this.selectRequest = selectRequest;
+        
+        SelectResult result = new SelectResult();
+        result.setNextToken("TOKEN2");
+        result.getItems().add(new Item("ITEM1", null));
+        result.getItems().add(new Item("ITEM2", null));
+        return result;
     }
-}
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchDeleteAttributesCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,72 @@
+/**
+ * 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.sdb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.amazonaws.services.simpledb.model.Item;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class BatchDeleteAttributesCommandTest {
+    
+    private BatchDeleteAttributesCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new BatchDeleteAttributesCommand(sdbClient, configuration, exchange);
+    }
+
+    @Test
+    public void execute() {
+        List<Item> deletableItems = new ArrayList<Item>();
+        deletableItems.add(new Item());
+        exchange.getIn().setHeader(SdbConstants.DELETABLE_ITEMS, deletableItems);
+        
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.batchDeleteAttributesRequest.getDomainName());
+        assertEquals(deletableItems, sdbClient.batchDeleteAttributesRequest.getItems());
+    }
+
+    @Test
+    public void determineDeletableItems() {
+        assertNull(this.command.determineDeletableItems());
+        
+        List<Item> deletableItems = new ArrayList<Item>();
+        deletableItems.add(new Item());
+        exchange.getIn().setHeader(SdbConstants.DELETABLE_ITEMS, deletableItems);
+        
+        assertEquals(deletableItems, this.command.determineDeletableItems());
+    }
+}

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/BatchPutAttributesCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,72 @@
+/**
+ * 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.sdb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.amazonaws.services.simpledb.model.ReplaceableItem;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class BatchPutAttributesCommandTest {
+
+    private BatchPutAttributesCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new BatchPutAttributesCommand(sdbClient, configuration, exchange);
+    }
+
+    @Test
+    public void execute() {
+        List<ReplaceableItem> replaceableItems = new ArrayList<ReplaceableItem>();
+        replaceableItems.add(new ReplaceableItem("ITEM1"));
+        exchange.getIn().setHeader(SdbConstants.REPLACEABLE_ITEMS, replaceableItems);
+        
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.batchPutAttributesRequest.getDomainName());
+        assertEquals(replaceableItems, sdbClient.batchPutAttributesRequest.getItems());
+    }
+
+    @Test
+    public void determineReplaceableItems() {
+        assertNull(this.command.determineReplaceableItems());
+        
+        List<ReplaceableItem> replaceableItems = new ArrayList<ReplaceableItem>();
+        replaceableItems.add(new ReplaceableItem("ITEM1"));
+        exchange.getIn().setHeader(SdbConstants.REPLACEABLE_ITEMS, replaceableItems);
+        
+        assertEquals(replaceableItems, this.command.determineReplaceableItems());
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteAttributesCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,89 @@
+/**
+ * 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.sdb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.amazonaws.services.simpledb.model.Attribute;
+import com.amazonaws.services.simpledb.model.UpdateCondition;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class DeleteAttributesCommandTest {
+
+    private DeleteAttributesCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new DeleteAttributesCommand(sdbClient, configuration, exchange);
+    }
+
+    @Test
+    public void execute() {
+        List<Attribute> attributes = new ArrayList<Attribute>();
+        attributes.add(new Attribute("NAME1", "VALUE1"));
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTES, attributes);
+        exchange.getIn().setHeader(SdbConstants.ITEM_NAME, "ITEM1");
+        UpdateCondition condition = new UpdateCondition("Key1", "Value1", true);
+        exchange.getIn().setHeader(SdbConstants.UPDATE_CONDITION, condition);
+        
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.deleteAttributesRequest.getDomainName());
+        assertEquals("ITEM1", sdbClient.deleteAttributesRequest.getItemName());
+        assertEquals(condition, sdbClient.deleteAttributesRequest.getExpected());
+        assertEquals(attributes, sdbClient.deleteAttributesRequest.getAttributes());
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void executeWithoutItemName() {
+        List<Attribute> attributes = new ArrayList<Attribute>();
+        attributes.add(new Attribute("NAME1", "VALUE1"));
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTES, attributes);
+        UpdateCondition condition = new UpdateCondition("Key1", "Value1", true);
+        exchange.getIn().setHeader(SdbConstants.UPDATE_CONDITION, condition);
+        
+        command.execute();
+    }
+
+    @Test
+    public void determineAttributes() {
+        assertNull(this.command.determineAttributes());
+        
+        List<Attribute> attributes = new ArrayList<Attribute>();
+        attributes.add(new Attribute("NAME1", "VALUE1"));
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTES, attributes);
+        
+        assertEquals(attributes, this.command.determineAttributes());
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteDomainCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteDomainCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteDomainCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DeleteDomainCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,50 @@
+/**
+ * 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.sdb;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DeleteDomainCommandTest {
+
+    private DeleteDomainCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new DeleteDomainCommand(sdbClient, configuration, exchange);
+    }
+
+    @Test
+    public void testExecute() {
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.deleteDomainRequest.getDomainName());
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DomainMetadataCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DomainMetadataCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DomainMetadataCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/DomainMetadataCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,58 @@
+/**
+ * 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.sdb;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DomainMetadataCommandTest {
+
+    private DomainMetadataCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new DomainMetadataCommand(sdbClient, configuration, exchange);
+    }
+
+    @Test
+    public void execute() {
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.domainMetadataRequest.getDomainName());
+        
+        assertEquals(new Integer(10), exchange.getIn().getHeader(SdbConstants.TIMESTAMP));
+        assertEquals(new Integer(11), exchange.getIn().getHeader(SdbConstants.ITEM_COUNT));
+        assertEquals(new Integer(12), exchange.getIn().getHeader(SdbConstants.ATTRIBUTE_NAME_COUNT));
+        assertEquals(new Integer(13), exchange.getIn().getHeader(SdbConstants.ATTRIBUTE_VALUE_COUNT));
+        assertEquals(new Long(1000000), exchange.getIn().getHeader(SdbConstants.ATTRIBUTE_NAME_SIZE));
+        assertEquals(new Long(2000000), exchange.getIn().getHeader(SdbConstants.ATTRIBUTE_VALUE_SIZE));
+        assertEquals(new Long(3000000), exchange.getIn().getHeader(SdbConstants.ITEM_NAME_SIZE));
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/GetAttributesCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/GetAttributesCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/GetAttributesCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/GetAttributesCommandTest.java Mon Dec 19 14:16:47 2011
@@ -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.sdb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.amazonaws.services.simpledb.model.Attribute;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class GetAttributesCommandTest {
+
+    private GetAttributesCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        configuration.setConsistentRead(Boolean.TRUE);
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new GetAttributesCommand(sdbClient, configuration, exchange);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void execute() {
+        List<String> attributeNames = new ArrayList<String>();
+        attributeNames.add("ATTRIBUTE1");
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTE_NAMES, attributeNames);
+        exchange.getIn().setHeader(SdbConstants.ITEM_NAME, "ITEM1");
+        
+        command.execute();
+        
+        assertEquals("DOMAIN1", sdbClient.getAttributesRequest.getDomainName());
+        assertEquals("ITEM1", sdbClient.getAttributesRequest.getItemName());
+        assertEquals(Boolean.TRUE, sdbClient.getAttributesRequest.getConsistentRead());
+        assertEquals(attributeNames, sdbClient.getAttributesRequest.getAttributeNames());
+        
+        List<Attribute> attributes = exchange.getIn().getHeader(SdbConstants.ATTRIBUTES, List.class);
+        assertEquals(2, attributes.size());
+        assertEquals("AttributeOne", attributes.get(0).getName());
+        assertEquals("Value One", attributes.get(0).getValue());
+        assertEquals("AttributeTwo", attributes.get(1).getName());
+        assertEquals("Value Two", attributes.get(1).getValue());
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void executeWithoutItemName() {
+        List<String> attributeNames = new ArrayList<String>();
+        attributeNames.add("ATTRIBUTE1");
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTE_NAMES, attributeNames);
+        
+        command.execute();
+    }
+    
+    @Test
+    public void determineAttributeNames() {
+        assertNull(this.command.determineAttributeNames());
+        
+        List<String> attributeNames = new ArrayList<String>();
+        attributeNames.add("ATTRIBUTE1");
+        exchange.getIn().setHeader(SdbConstants.ATTRIBUTE_NAMES, attributeNames);
+        
+        assertEquals(attributeNames, this.command.determineAttributeNames());
+    }
+}
\ No newline at end of file

Added: camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ListDomainsCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ListDomainsCommandTest.java?rev=1220758&view=auto
==============================================================================
--- camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ListDomainsCommandTest.java (added)
+++ camel/trunk/components/camel-aws/src/test/java/org/apache/camel/component/aws/sdb/ListDomainsCommandTest.java Mon Dec 19 14:16:47 2011
@@ -0,0 +1,73 @@
+/**
+ * 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.sdb;
+
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ListDomainsCommandTest {
+
+    private ListDomainsCommand command;
+    private AmazonSDBClientMock sdbClient;
+    private SdbConfiguration configuration;
+    private Exchange exchange;
+    
+    @Before
+    public void setUp() {
+        sdbClient = new AmazonSDBClientMock();
+        configuration = new SdbConfiguration();
+        configuration.setDomainName("DOMAIN1");
+        configuration.setMaxNumberOfDomains(new Integer(5));
+        exchange = new DefaultExchange(new DefaultCamelContext());
+        
+        command = new ListDomainsCommand(sdbClient, configuration, exchange);
+    }
+
+    @SuppressWarnings({ "unchecked" })
+    @Test
+    public void execute() {
+        exchange.getIn().setHeader(SdbConstants.NEXT_TOKEN, "TOKEN1");
+        
+        command.execute();
+        
+        assertEquals(new Integer(5), sdbClient.listDomainsRequest.getMaxNumberOfDomains());
+        assertEquals("TOKEN1", sdbClient.listDomainsRequest.getNextToken());
+        
+        List<String> domains = exchange.getIn().getHeader(SdbConstants.DOMAIN_NAMES, List.class);
+        assertEquals("TOKEN2", exchange.getIn().getHeader(SdbConstants.NEXT_TOKEN));
+        assertEquals(2, domains.size());
+        assertTrue(domains.contains("DOMAIN1"));
+        assertTrue(domains.contains("DOMAIN2"));
+    }
+
+    @Test
+    public void determineMaxNumberOfDomains() {
+        assertEquals(new Integer(5), this.command.determineMaxNumberOfDomains());
+
+        exchange.getIn().setHeader(SdbConstants.MAX_NUMBER_OF_DOMAINS, new Integer(10));
+
+        assertEquals(new Integer(10), this.command.determineMaxNumberOfDomains());
+    }
+}
\ No newline at end of file