You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/08 18:53:27 UTC

[3/5] camel git commit: CAMEL-9430 Create camel-component for braintreepayments

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodGatewayIntegrationTest.java
new file mode 100644
index 0000000..fec897d
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodGatewayIntegrationTest.java
@@ -0,0 +1,205 @@
+/**
+ * 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.braintree;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.braintreegateway.BraintreeGateway;
+import com.braintreegateway.Customer;
+import com.braintreegateway.CustomerRequest;
+import com.braintreegateway.PaymentMethod;
+import com.braintreegateway.PaymentMethodRequest;
+import com.braintreegateway.Result;
+import com.google.common.collect.Lists;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.PaymentMethodGatewayApiMethod;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PaymentMethodGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PaymentMethodGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = getApiNameAsString(PaymentMethodGatewayApiMethod.class);
+
+    private BraintreeGateway gateway;
+    private Customer customer;
+    private final List<String> paymentMethodsTokens;
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    public PaymentMethodGatewayIntegrationTest() {
+        this.customer = null;
+        this.gateway = null;
+        this.paymentMethodsTokens = Lists.newLinkedList();
+    }
+
+    @Override
+    protected void doPostSetup() throws Exception {
+        this.gateway = getGateway();
+        this.customer = gateway.customer().create(
+            new CustomerRequest()
+                .firstName("user")
+                .lastName(UUID.randomUUID().toString())
+            ).getTarget();
+
+        if (customer != null) {
+            LOG.info("Customer created - id={}", this.customer.getId());
+        }
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        if (this.gateway != null) {
+            for (String token : this.paymentMethodsTokens) {
+                if (this.gateway.paymentMethod().delete(token).isSuccess()) {
+                    LOG.info("PaymentMethod deleted - token={}", token);
+                } else {
+                    LOG.warn("Unable to delete PaymentMethod - token={}", token);
+                }
+            }
+
+            this.paymentMethodsTokens.clear();
+
+            if (this.gateway.customer().delete(this.customer.getId()).isSuccess()) {
+                LOG.info("Customer deleted - id={}", this.customer.getId());
+            } else {
+                LOG.warn("Unable to delete customer - id={}", this.customer.getId());
+            }
+        }
+    }
+
+    private PaymentMethod createPaymentMethod() {
+        Result<? extends PaymentMethod> result = this.gateway.paymentMethod().create(
+            new PaymentMethodRequest()
+                .customerId(this.customer.getId())
+                .paymentMethodNonce("fake-valid-payroll-nonce"));
+
+        assertNotNull("create result", result);
+        assertTrue(result.isSuccess());
+
+        LOG.info("PaymentMethod created - token={}", result.getTarget().getToken());
+
+        return result.getTarget();
+    }
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    @Test
+    public void testCreate() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+        assertNotNull("Customer can't be null", this.customer);
+
+        final Result<PaymentMethod> result = requestBody("direct://CREATE",
+            new PaymentMethodRequest()
+                .customerId(this.customer.getId())
+                .paymentMethodNonce("fake-valid-payroll-nonce"),
+            Result.class);
+
+        assertNotNull("create result", result);
+        assertTrue(result.isSuccess());
+
+        LOG.info("PaymentMethod created - token={}", result.getTarget().getToken());
+        this.paymentMethodsTokens.add(result.getTarget().getToken());
+    }
+
+    @Test
+    public void testDelete() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+        assertNotNull("Customer can't be null", this.customer);
+
+        final PaymentMethod paymentMethod = createPaymentMethod();
+        final Result<PaymentMethod> deleteResult = requestBody(
+            "direct://DELETE", paymentMethod.getToken(), Result.class);
+
+        assertNotNull("create result", deleteResult);
+        assertTrue(deleteResult.isSuccess());
+
+        LOG.info("PaymentMethod deleted - token={}", paymentMethod.getToken());
+    }
+
+    @Test
+    public void testFind() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+        assertNotNull("Customer can't be null", this.customer);
+
+        final PaymentMethod paymentMethod = createPaymentMethod();
+        this.paymentMethodsTokens.add(paymentMethod.getToken());
+
+        final PaymentMethod method = requestBody(
+            "direct://FIND", paymentMethod.getToken(), PaymentMethod.class
+        );
+
+        assertNotNull("find result", method);
+        LOG.info("PaymentMethod found - token={}", method.getToken());
+    }
+
+    @Test
+    public void testUpdate() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+        assertNotNull("Customer can't be null", this.customer);
+
+        final PaymentMethod paymentMethod = createPaymentMethod();
+        this.paymentMethodsTokens.add(paymentMethod.getToken());
+
+        final Result<PaymentMethod> result = requestBodyAndHeaders(
+            "direct://UPDATE", null,
+            new BraintreeHeaderBuilder()
+                .add("token", paymentMethod.getToken())
+                .add("request", new PaymentMethodRequest()
+                    .billingAddress()
+                    .company("Apache")
+                    .streetAddress("100 Maple Lane")
+                    .done())
+                .build(),
+            Result.class);
+
+        assertNotNull("update result", result);
+        assertTrue(result.isSuccess());
+
+        LOG.info("PaymentMethod updated - token={}", result.getTarget().getToken());
+    }
+
+    // *************************************************************************
+    // ROUTES
+    // *************************************************************************
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for create
+                from("direct://CREATE")
+                    .to("braintree://" + PATH_PREFIX + "/create?inBody=request");
+                // test route for delete
+                from("direct://DELETE")
+                    .to("braintree://" + PATH_PREFIX + "/delete?inBody=token");
+                // test route for find
+                from("direct://FIND")
+                    .to("braintree://" + PATH_PREFIX + "/find?inBody=token");
+                // test route for update
+                from("direct://UPDATE")
+                    .to("braintree://" + PATH_PREFIX + "/update");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodNonceGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodNonceGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodNonceGatewayIntegrationTest.java
new file mode 100644
index 0000000..99ddcd0
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PaymentMethodNonceGatewayIntegrationTest.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.braintree;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.BraintreeApiCollection;
+import org.apache.camel.component.braintree.internal.PaymentMethodNonceGatewayApiMethod;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PaymentMethodNonceGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PaymentMethodNonceGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = BraintreeApiCollection.getCollection().getApiName(PaymentMethodNonceGatewayApiMethod.class).getName();
+
+    // TODO provide parameter values for create
+    @Ignore
+    @Test
+    public void testCreate() throws Exception {
+        // using String message body for single parameter "paymentMethodToken"
+        final com.braintreegateway.Result result = requestBody("direct://CREATE", null);
+
+        assertNotNull("create result", result);
+        LOG.debug("create: " + result);
+    }
+
+    // TODO provide parameter values for find
+    @Ignore
+    @Test
+    public void testFind() throws Exception {
+        // using String message body for single parameter "paymentMethodNonce"
+        final com.braintreegateway.PaymentMethodNonce result = requestBody("direct://FIND", null);
+
+        assertNotNull("find result", result);
+        LOG.debug("find: " + result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for create
+                from("direct://CREATE")
+                    .to("braintree://" + PATH_PREFIX + "/create?inBody=paymentMethodToken");
+                // test route for find
+                from("direct://FIND")
+                    .to("braintree://" + PATH_PREFIX + "/find?inBody=paymentMethodNonce");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PlanGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PlanGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PlanGatewayIntegrationTest.java
new file mode 100644
index 0000000..0ec6ee8
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/PlanGatewayIntegrationTest.java
@@ -0,0 +1,53 @@
+/**
+ * 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.braintree;
+
+import java.util.List;
+
+import com.braintreegateway.Plan;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.PlanGatewayApiMethod;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PlanGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PlanGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = getApiNameAsString(PlanGatewayApiMethod.class);
+
+    @Ignore
+    @Test
+    public void testAll() throws Exception {
+        final List<Plan> result = requestBody("direct://ALL", null, List.class);
+
+        assertNotNull("all result", result);
+        LOG.debug("all: " + result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for all
+                from("direct://ALL")
+                    .to("braintree://" + PATH_PREFIX + "/all");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SettlementBatchSummaryGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SettlementBatchSummaryGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SettlementBatchSummaryGatewayIntegrationTest.java
new file mode 100644
index 0000000..201ca8f
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SettlementBatchSummaryGatewayIntegrationTest.java
@@ -0,0 +1,75 @@
+/**
+ * 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.braintree;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.BraintreeApiCollection;
+import org.apache.camel.component.braintree.internal.SettlementBatchSummaryGatewayApiMethod;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SettlementBatchSummaryGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SettlementBatchSummaryGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = BraintreeApiCollection.getCollection().getApiName(SettlementBatchSummaryGatewayApiMethod.class).getName();
+
+    // TODO provide parameter values for generate
+    @Ignore
+    @Test
+    public void testGenerate() throws Exception {
+        // using java.util.Calendar message body for single parameter "settlementDate"
+        final com.braintreegateway.Result result = requestBody("direct://GENERATE", null);
+
+        assertNotNull("generate result", result);
+        LOG.debug("generate: " + result);
+    }
+
+    // TODO provide parameter values for generate
+    @Ignore
+    @Test
+    public void testGenerateWithCustomFields() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is java.util.Calendar
+        headers.put("CamelBraintree.settlementDate", null);
+        // parameter type is String
+        headers.put("CamelBraintree.groupByCustomField", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://GENERATE_1", null, headers);
+
+        assertNotNull("generate result", result);
+        LOG.debug("generate: " + result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for generate
+                from("direct://GENERATE")
+                    .to("braintree://" + PATH_PREFIX + "/generate?inBody=settlementDate");
+                // test route for generate
+                from("direct://GENERATE_1")
+                    .to("braintree://" + PATH_PREFIX + "/generate");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SubscriptionGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SubscriptionGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SubscriptionGatewayIntegrationTest.java
new file mode 100644
index 0000000..0694ae9
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/SubscriptionGatewayIntegrationTest.java
@@ -0,0 +1,169 @@
+/**
+ * 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.braintree;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.BraintreeApiCollection;
+import org.apache.camel.component.braintree.internal.SubscriptionGatewayApiMethod;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SubscriptionGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SubscriptionGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = BraintreeApiCollection.getCollection().getApiName(SubscriptionGatewayApiMethod.class).getName();
+
+    // TODO provide parameter values for cancel
+    @Ignore
+    @Test
+    public void testCancel() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://CANCEL", null);
+
+        assertNotNull("cancel result", result);
+        LOG.debug("cancel: " + result);
+    }
+
+    // TODO provide parameter values for create
+    @Ignore
+    @Test
+    public void testCreate() throws Exception {
+        // using com.braintreegateway.SubscriptionRequest message body for single parameter "request"
+        final com.braintreegateway.Result result = requestBody("direct://CREATE", null);
+
+        assertNotNull("create result", result);
+        LOG.debug("create: " + result);
+    }
+
+    // TODO provide parameter values for delete
+    @Ignore
+    @Test
+    public void testDelete() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is String
+        headers.put("CamelBraintree.customerId", null);
+        // parameter type is String
+        headers.put("CamelBraintree.id", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://DELETE", null, headers);
+
+        assertNotNull("delete result", result);
+        LOG.debug("delete: " + result);
+    }
+
+    // TODO provide parameter values for find
+    @Ignore
+    @Test
+    public void testFind() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Subscription result = requestBody("direct://FIND", null);
+
+        assertNotNull("find result", result);
+        LOG.debug("find: " + result);
+    }
+
+    // TODO provide parameter values for retryCharge
+    @Ignore
+    @Test
+    public void testRetryCharge() throws Exception {
+        // using String message body for single parameter "subscriptionId"
+        final com.braintreegateway.Result result = requestBody("direct://RETRYCHARGE", null);
+
+        assertNotNull("retryCharge result", result);
+        LOG.debug("retryCharge: " + result);
+    }
+
+    // TODO provide parameter values for retryCharge
+    @Ignore
+    @Test
+    public void testRetryChargeWithAmount() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is String
+        headers.put("CamelBraintree.subscriptionId", null);
+        // parameter type is java.math.BigDecimal
+        headers.put("CamelBraintree.amount", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://RETRYCHARGE_1", null, headers);
+
+        assertNotNull("retryCharge result", result);
+        LOG.debug("retryCharge: " + result);
+    }
+
+    // TODO provide parameter values for search
+    @Ignore
+    @Test
+    public void testSearch() throws Exception {
+        // using com.braintreegateway.SubscriptionSearchRequest message body for single parameter "searchRequest"
+        final com.braintreegateway.ResourceCollection result = requestBody("direct://SEARCH", null);
+
+        assertNotNull("search result", result);
+        LOG.debug("search: " + result);
+    }
+
+    // TODO provide parameter values for update
+    @Ignore
+    @Test
+    public void testUpdate() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is String
+        headers.put("CamelBraintree.id", null);
+        // parameter type is com.braintreegateway.SubscriptionRequest
+        headers.put("CamelBraintree.request", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://UPDATE", null, headers);
+
+        assertNotNull("update result", result);
+        LOG.debug("update: " + result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for cancel
+                from("direct://CANCEL")
+                    .to("braintree://" + PATH_PREFIX + "/cancel?inBody=id");
+                // test route for create
+                from("direct://CREATE")
+                    .to("braintree://" + PATH_PREFIX + "/create?inBody=request");
+                // test route for delete
+                from("direct://DELETE")
+                    .to("braintree://" + PATH_PREFIX + "/delete");
+                // test route for find
+                from("direct://FIND")
+                    .to("braintree://" + PATH_PREFIX + "/find?inBody=id");
+                // test route for retryCharge
+                from("direct://RETRYCHARGE")
+                    .to("braintree://" + PATH_PREFIX + "/retryCharge?inBody=subscriptionId");
+                // test route for retryCharge
+                from("direct://RETRYCHARGE_1")
+                    .to("braintree://" + PATH_PREFIX + "/retryCharge");
+                // test route for search
+                from("direct://SEARCH")
+                    .to("braintree://" + PATH_PREFIX + "/search?inBody=searchRequest");
+                // test route for update
+                from("direct://UPDATE")
+                    .to("braintree://" + PATH_PREFIX + "/update");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/TransactionGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/TransactionGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/TransactionGatewayIntegrationTest.java
new file mode 100644
index 0000000..211628d
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/TransactionGatewayIntegrationTest.java
@@ -0,0 +1,431 @@
+/**
+ * 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.braintree;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.braintreegateway.BraintreeGateway;
+import com.braintreegateway.Result;
+import com.braintreegateway.Transaction;
+import com.braintreegateway.TransactionCloneRequest;
+import com.braintreegateway.TransactionRequest;
+import com.google.common.collect.Lists;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.BraintreeApiCollection;
+import org.apache.camel.component.braintree.internal.TransactionGatewayApiMethod;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TransactionGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TransactionGatewayIntegrationTest.class);
+    private static final String PATH_PREFIX = BraintreeApiCollection.getCollection().getApiName(TransactionGatewayApiMethod.class).getName();
+
+    private BraintreeGateway gateway;
+    private final List<String> transactionIds;
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    public TransactionGatewayIntegrationTest() {
+        this.gateway = null;
+        this.transactionIds = Lists.newLinkedList();
+    }
+
+    @Override
+    protected void doPostSetup() throws Exception {
+        this.gateway = getGateway();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        if (this.gateway != null) {
+            for (String token : this.transactionIds) {
+                // TODO: cleanup
+            }
+
+            this.transactionIds.clear();
+        }
+    }
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    @Test
+    public void testSale() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> result = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                    .submitForSettlement(true)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", result);
+        assertTrue(result.isSuccess());
+
+        LOG.info("Transaction done - id={}", result.getTarget().getId());
+        this.transactionIds.add(result.getTarget().getId());
+    }
+
+    @Test
+    public void testCloneTransaction() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> createResult = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                    .submitForSettlement(false)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", createResult);
+        assertTrue(createResult.isSuccess());
+
+        LOG.info("Transaction done - id={}", createResult.getTarget().getId());
+        this.transactionIds.add(createResult.getTarget().getId());
+
+        final Result<Transaction> cloneResult = requestBodyAndHeaders(
+            "direct://CLONETRANSACTION",
+            null,
+            new BraintreeHeaderBuilder()
+                .add("id", createResult.getTarget().getId())
+                .add("cloneRequest", new TransactionCloneRequest()
+                    .amount(new BigDecimal("99.00"))
+                    .options()
+                        .submitForSettlement(true)
+                    .done())
+                .build(),
+            Result.class);
+
+        assertNotNull("clone result", cloneResult);
+        assertTrue(cloneResult.isSuccess());
+
+        LOG.info("Clone Transaction done - clonedId={}, id={}",
+            createResult.getTarget().getId(), cloneResult.getTarget().getId());
+
+        this.transactionIds.add(cloneResult.getTarget().getId());
+    }
+
+    @Test
+    public void testFind() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> createResult = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                    .submitForSettlement(false)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", createResult);
+        assertTrue(createResult.isSuccess());
+
+        LOG.info("Transaction done - id={}", createResult.getTarget().getId());
+        this.transactionIds.add(createResult.getTarget().getId());
+
+
+        // using String message body for single parameter "id"
+        final Transaction result = requestBody("direct://FIND", createResult.getTarget().getId());
+
+        assertNotNull("find result", result);
+        LOG.info("Transaction found - id={}", result.getId());
+    }
+
+    @Test
+    public void testSubmitForSettlementWithId() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> createResult = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                    .submitForSettlement(false)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", createResult);
+        assertTrue(createResult.isSuccess());
+
+        LOG.info("Transaction done - id={}", createResult.getTarget().getId());
+        this.transactionIds.add(createResult.getTarget().getId());
+
+        final Result<Transaction> result = requestBody(
+            "direct://SUBMITFORSETTLEMENT_WITH_ID",
+            createResult.getTarget().getId(),
+            Result.class);
+
+        assertNotNull("Submit For Settlement result", result);
+        LOG.debug("Transaction submitted for settlement - id={}" + result.getTarget().getId());
+    }
+
+    @Test
+    public void testSubmitForSettlementWithIdAndAmount() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> createResult = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                .submitForSettlement(false)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", createResult);
+        assertTrue(createResult.isSuccess());
+
+        LOG.info("Transaction done - id={}", createResult.getTarget().getId());
+        this.transactionIds.add(createResult.getTarget().getId());
+
+        final Result<Transaction> result = requestBodyAndHeaders(
+            "direct://SUBMITFORSETTLEMENT_WITH_ID_ADN_AMOUNT",
+            null,
+            new BraintreeHeaderBuilder()
+                .add("id", createResult.getTarget().getId())
+                .add("amount", new BigDecimal("100.00"))
+                .build(),
+            Result.class);
+
+        assertNotNull("Submit For Settlement result", result);
+        LOG.debug("Transaction submitted for settlement - id={}" + result.getTarget().getId());
+    }
+
+    @Test
+    public void testSubmitForSettlementWithRequest() throws Exception {
+        assertNotNull("BraintreeGateway can't be null", this.gateway);
+
+        final Result<Transaction> createResult = requestBody(
+            "direct://SALE",
+            new TransactionRequest()
+                .amount(new BigDecimal("100.00"))
+                .paymentMethodNonce("fake-valid-nonce")
+                .options()
+                    .submitForSettlement(false)
+                .done(),
+            Result.class);
+
+        assertNotNull("sale result", createResult);
+        assertTrue(createResult.isSuccess());
+
+        LOG.info("Transaction done - id={}", createResult.getTarget().getId());
+        this.transactionIds.add(createResult.getTarget().getId());
+
+        final Result<Transaction> result = requestBodyAndHeaders(
+            "direct://SUBMITFORSETTLEMENT_WITH_REQUEST",
+            null,
+            new BraintreeHeaderBuilder()
+                .add("id", createResult.getTarget().getId())
+                .add("request", new TransactionRequest()
+                    .amount(new BigDecimal("100.00")))
+                .build(),
+            Result.class);
+
+        assertNotNull("Submit For Settlement result", result);
+        LOG.debug("Transaction submitted for settlement - id={}" + result.getTarget().getId());
+    }
+
+    // *************************************************************************
+    // Auto generated tests
+    // *************************************************************************
+
+    // TODO provide parameter values for cancelRelease
+    @Ignore
+    @Test
+    public void testCancelRelease() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://CANCELRELEASE", null);
+
+        assertNotNull("cancelRelease result", result);
+        LOG.debug("cancelRelease: " + result);
+    }
+
+    // TODO provide parameter values for credit
+    @Ignore
+    @Test
+    public void testCredit() throws Exception {
+        // using com.braintreegateway.TransactionRequest message body for single parameter "request"
+        final com.braintreegateway.Result result = requestBody("direct://CREDIT", null);
+
+        assertNotNull("credit result", result);
+        LOG.debug("credit: " + result);
+    }
+
+    // TODO provide parameter values for holdInEscrow
+    @Ignore
+    @Test
+    public void testHoldInEscrow() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://HOLDINESCROW", null);
+
+        assertNotNull("holdInEscrow result", result);
+        LOG.debug("holdInEscrow: " + result);
+    }
+
+    // TODO provide parameter values for refund
+    @Ignore
+    @Test
+    public void testRefund() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://REFUND", null);
+
+        assertNotNull("refund result", result);
+        LOG.debug("refund: " + result);
+    }
+
+    // TODO provide parameter values for refund
+    @Ignore
+    @Test
+    public void testRefundWithAmount() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is String
+        headers.put("CamelBraintree.id", null);
+        // parameter type is java.math.BigDecimal
+        headers.put("CamelBraintree.amount", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://REFUND_1", null, headers);
+
+        assertNotNull("refund result", result);
+        LOG.debug("refund: " + result);
+    }
+
+    // TODO provide parameter values for releaseFromEscrow
+    @Ignore
+    @Test
+    public void testReleaseFromEscrow() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://RELEASEFROMESCROW", null);
+
+        assertNotNull("releaseFromEscrow result", result);
+        LOG.debug("releaseFromEscrow: " + result);
+    }
+
+    // TODO provide parameter values for search
+    @Ignore
+    @Test
+    public void testSearch() throws Exception {
+        // using com.braintreegateway.TransactionSearchRequest message body for single parameter "query"
+        final com.braintreegateway.ResourceCollection result = requestBody("direct://SEARCH", null);
+
+        assertNotNull("search result", result);
+        LOG.debug("search: " + result);
+    }
+
+    // TODO provide parameter values for submitForPartialSettlement
+    @Ignore
+    @Test
+    public void testSubmitForPartialSettlement() throws Exception {
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        // parameter type is String
+        headers.put("CamelBraintree.id", null);
+        // parameter type is java.math.BigDecimal
+        headers.put("CamelBraintree.amount", null);
+
+        final com.braintreegateway.Result result = requestBodyAndHeaders("direct://SUBMITFORPARTIALSETTLEMENT", null, headers);
+
+        assertNotNull("submitForPartialSettlement result", result);
+        LOG.debug("submitForPartialSettlement: " + result);
+    }
+
+    // TODO provide parameter values for voidTransaction
+    @Ignore
+    @Test
+    public void testVoidTransaction() throws Exception {
+        // using String message body for single parameter "id"
+        final com.braintreegateway.Result result = requestBody("direct://VOIDTRANSACTION", null);
+
+        assertNotNull("voidTransaction result", result);
+        LOG.debug("voidTransaction: " + result);
+    }
+
+    // *************************************************************************
+    // ROUTES
+    // *************************************************************************
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for cancelRelease
+                from("direct://CANCELRELEASE")
+                    .to("braintree://" + PATH_PREFIX + "/cancelRelease?inBody=id");
+                // test route for cloneTransaction
+                from("direct://CLONETRANSACTION")
+                    .to("braintree://" + PATH_PREFIX + "/cloneTransaction");
+                // test route for credit
+                from("direct://CREDIT")
+                    .to("braintree://" + PATH_PREFIX + "/credit?inBody=request");
+                // test route for find
+                from("direct://FIND")
+                    .to("braintree://" + PATH_PREFIX + "/find?inBody=id");
+                // test route for holdInEscrow
+                from("direct://HOLDINESCROW")
+                    .to("braintree://" + PATH_PREFIX + "/holdInEscrow?inBody=id");
+                // test route for refund
+                from("direct://REFUND")
+                    .to("braintree://" + PATH_PREFIX + "/refund?inBody=id");
+                // test route for refund
+                from("direct://REFUND_1")
+                    .to("braintree://" + PATH_PREFIX + "/refund");
+                // test route for releaseFromEscrow
+                from("direct://RELEASEFROMESCROW")
+                    .to("braintree://" + PATH_PREFIX + "/releaseFromEscrow?inBody=id");
+                // test route for sale
+                from("direct://SALE")
+                    .to("braintree://" + PATH_PREFIX + "/sale?inBody=request");
+                // test route for search
+                from("direct://SEARCH")
+                    .to("braintree://" + PATH_PREFIX + "/search?inBody=query");
+                // test route for submitForPartialSettlement
+                from("direct://SUBMITFORPARTIALSETTLEMENT")
+                    .to("braintree://" + PATH_PREFIX + "/submitForPartialSettlement");
+                // test route for submitForSettlement
+                from("direct://SUBMITFORSETTLEMENT_WITH_ID")
+                    .to("braintree://" + PATH_PREFIX + "/submitForSettlement?inBody=id");
+                // test route for submitForSettlement
+                from("direct://SUBMITFORSETTLEMENT_WITH_ID_ADN_AMOUNT")
+                    .to("braintree://" + PATH_PREFIX + "/submitForSettlement");
+                // test route for submitForSettlement
+                from("direct://SUBMITFORSETTLEMENT_WITH_REQUEST")
+                    .to("braintree://" + PATH_PREFIX + "/submitForSettlement");
+                // test route for voidTransaction
+                from("direct://VOIDTRANSACTION")
+                    .to("braintree://" + PATH_PREFIX + "/voidTransaction?inBody=id");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/WebhookNotificationGatewayIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/WebhookNotificationGatewayIntegrationTest.java b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/WebhookNotificationGatewayIntegrationTest.java
new file mode 100644
index 0000000..211a56c
--- /dev/null
+++ b/components/camel-braintree/src/test/java/org/apache/camel/component/braintree/WebhookNotificationGatewayIntegrationTest.java
@@ -0,0 +1,69 @@
+/**
+ * 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.braintree;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.braintreegateway.BraintreeGateway;
+import com.braintreegateway.WebhookNotification;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.braintree.internal.BraintreeApiCollection;
+import org.apache.camel.component.braintree.internal.BraintreeConstants;
+import org.apache.camel.component.braintree.internal.WebhookNotificationGatewayApiMethod;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WebhookNotificationGatewayIntegrationTest extends AbstractBraintreeTestSupport {
+
+    private static final String PATH_PREFIX = BraintreeApiCollection.getCollection().getApiName(WebhookNotificationGatewayApiMethod.class).getName();
+    private static final Logger LOG = LoggerFactory.getLogger(WebhookNotificationGatewayIntegrationTest.class);
+
+    @Test
+    public void testParse() throws Exception {
+        final BraintreeGateway gateway = getGateway();
+
+        Map<String, String> notification = gateway.webhookTesting().sampleNotification(
+            WebhookNotification.Kind.SUBSCRIPTION_WENT_PAST_DUE,
+            "my_id"
+        );
+
+        final Map<String, Object> headers = new HashMap<>();
+        headers.put(BraintreeConstants.PROPERTY_PREFIX + "signature", notification.get("bt_signature"));
+        headers.put(BraintreeConstants.PROPERTY_PREFIX + "payload", notification.get("bt_payload"));
+
+        final WebhookNotification result = requestBodyAndHeaders("direct://PARSE", null, headers);
+
+        assertNotNull("parse result", result);
+        assertEquals("my_id", result.getSubscription().getId());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                // test route for parse
+                from("direct://PARSE")
+                    .to("braintree://" + PATH_PREFIX + "/parse");
+                // test route for verify
+                from("direct://VERIFY")
+                    .to("braintree://" + PATH_PREFIX + "/verify?inBody=challenge");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/resources/log4j.properties b/components/camel-braintree/src/test/resources/log4j.properties
new file mode 100644
index 0000000..befa085
--- /dev/null
+++ b/components/camel-braintree/src/test/resources/log4j.properties
@@ -0,0 +1,31 @@
+#
+# 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.
+#
+
+#
+# The logging properties used
+#
+log4j.rootLogger=INFO, out
+
+# uncomment the following line to turn on Camel debugging
+#log4j.logger.org.apache.camel=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
+#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/camel-braintree/src/test/resources/test-options.properties
----------------------------------------------------------------------
diff --git a/components/camel-braintree/src/test/resources/test-options.properties b/components/camel-braintree/src/test/resources/test-options.properties
new file mode 100644
index 0000000..ed68e7d
--- /dev/null
+++ b/components/camel-braintree/src/test/resources/test-options.properties
@@ -0,0 +1,21 @@
+#
+# 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.
+#
+
+#environment = SANDBOX
+#merchantId  = 
+#publicKey   = 
+#privateKey  = 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/components/pom.xml
----------------------------------------------------------------------
diff --git a/components/pom.xml b/components/pom.xml
index 8529c15..33846eb 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -74,6 +74,7 @@
     <module>camel-bindy</module>
     <module>camel-boon</module>
     <module>camel-box</module>
+    <module>camel-braintree</module>
     <module>camel-cache</module>
     <module>camel-cassandraql</module>
     <module>camel-castor</module>

http://git-wip-us.apache.org/repos/asf/camel/blob/e8b00192/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 281388a..74c1b57 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -76,6 +76,8 @@
     <boon-version>0.33</boon-version>
     <bouncycastle-version>1.53</bouncycastle-version>
     <boxjavalibv2.version>3.2.1</boxjavalibv2.version>
+    <braintree-gateway-version>2.53.0</braintree-gateway-version>
+    <braintree-gateway-bundle-version>2.53.0_1</braintree-gateway-bundle-version>
     <build-helper-maven-plugin-version>1.8</build-helper-maven-plugin-version>
     <c3p0-version>0.9.5.2</c3p0-version>
     <californium-version>1.0.0-M3</californium-version>
@@ -732,6 +734,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-braintree</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-cache</artifactId>
         <version>${project.version}</version>
       </dependency>