You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/07/01 10:01:01 UTC

git commit: CAMEL-6498 Improvement to allow passing in a parameter to a NamedQuery via Camel JPA

Updated Branches:
  refs/heads/master 71c42850a -> 1dda127c8


CAMEL-6498 Improvement to allow passing in a parameter to a NamedQuery via Camel JPA


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1dda127c
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1dda127c
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1dda127c

Branch: refs/heads/master
Commit: 1dda127c80c660f7a9840755065f232b8f2e85dc
Parents: 71c4285
Author: Willem Jiang <ni...@apache.org>
Authored: Mon Jul 1 14:56:03 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Mon Jul 1 15:50:42 2013 +0800

----------------------------------------------------------------------
 .../apache/camel/component/jpa/JpaConsumer.java |  18 +++
 .../jpa/JpaWithNamedQueryAndParametersTest.java | 152 +++++++++++++++++++
 .../org/apache/camel/examples/Customer.java     |   2 +
 3 files changed, 172 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1dda127c/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
index 88baa8d..595c626 100644
--- a/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
+++ b/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.jpa;
 import java.lang.reflect.Method;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Queue;
 
 import javax.persistence.Entity;
@@ -49,6 +51,7 @@ public class JpaConsumer extends ScheduledBatchPollingConsumer {
     private String query;
     private String namedQuery;
     private String nativeQuery;
+    private Map<String, Object> parameters;
     private Class<?> resultClass;
     private boolean transacted;
 
@@ -194,6 +197,14 @@ public class JpaConsumer extends ScheduledBatchPollingConsumer {
     public void setDeleteHandler(DeleteHandler<Object> deleteHandler) {
         this.deleteHandler = deleteHandler;
     }
+    
+    public void setParameters(Map<String, Object> params) {
+        this.parameters = params;
+    }
+    
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
 
     public String getNamedQuery() {
         return namedQuery;
@@ -351,6 +362,13 @@ public class JpaConsumer extends ScheduledBatchPollingConsumer {
         if (maxResults > 0) {
             query.setMaxResults(maxResults);
         }
+        // setup the parameter
+        if (parameters != null) {
+            for (Entry<String, Object> entry : parameters.entrySet()) {
+                query.setParameter(entry.getKey(), entry.getValue());
+            }
+        }
+        
     }
 
     protected Exchange createExchange(Object result) {

http://git-wip-us.apache.org/repos/asf/camel/blob/1dda127c/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java
new file mode 100644
index 0000000..4c751aa
--- /dev/null
+++ b/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNamedQueryAndParametersTest.java
@@ -0,0 +1,152 @@
+/**
+ * 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.jpa;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.examples.Customer;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.SimpleRegistry;
+import org.apache.camel.util.ServiceHelper;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.orm.jpa.JpaTemplate;
+
+public class JpaWithNamedQueryAndParametersTest extends Assert {
+    
+    protected static final transient Logger LOG = LoggerFactory.getLogger(JpaWithNamedQueryAndParametersTest.class);
+    
+    protected DefaultCamelContext camelContext;
+    protected ProducerTemplate template;
+    protected JpaEndpoint endpoint;
+    protected TransactionStrategy transactionStrategy;
+    protected JpaTemplate jpaTemplate;
+    protected Consumer consumer;
+    protected Exchange receivedExchange;
+    protected CountDownLatch latch = new CountDownLatch(1);
+    protected String entityName = Customer.class.getName();
+    protected String queryText = "select o from " + entityName + " o where o.name like 'Willem'";
+
+    @Test
+    public void testProducerInsertsIntoDatabaseThenConsumerFiresMessageExchange() throws Exception {
+        transactionStrategy.execute(new JpaCallback<Object>() {
+            public Object doInJpa(EntityManager entityManager) throws PersistenceException {
+                // lets delete any exiting records before the test
+                entityManager.createQuery("delete from " + entityName).executeUpdate();
+                // now lets create a dummy entry
+                Customer dummy = new Customer();
+                dummy.setName("Test");
+                entityManager.persist(dummy);
+                return null;
+            }
+        });
+
+        List<?> results = jpaTemplate.find(queryText);
+        assertEquals("Should have no results: " + results, 0, results.size());
+
+        // lets produce some objects
+        template.send(endpoint, new Processor() {
+            public void process(Exchange exchange) {
+                Customer customer = new Customer();
+                customer.setName("Willem");
+                exchange.getIn().setBody(customer);
+            }
+        });
+
+        // now lets assert that there is a result
+        results = jpaTemplate.find(queryText);
+        assertEquals("Should have results: " + results, 1, results.size());
+        Customer customer = (Customer)results.get(0);
+        assertEquals("name property", "Willem", customer.getName());
+
+        // now lets create a consumer to consume it
+        consumer = endpoint.createConsumer(new Processor() {
+            public void process(Exchange e) {
+                LOG.info("Received exchange: " + e.getIn());
+                receivedExchange = e;
+                latch.countDown();
+            }
+        });
+        consumer.start();
+
+        assertTrue(latch.await(10, TimeUnit.SECONDS));
+
+        assertReceivedResult(receivedExchange);
+        
+        JpaConsumer jpaConsumer = (JpaConsumer) consumer;
+        assertURIQueryOption(jpaConsumer);
+    }
+
+    protected void assertReceivedResult(Exchange exchange) {
+        assertNotNull(exchange);
+        Customer result = exchange.getIn().getBody(Customer.class);
+        assertNotNull("Received a POJO", result);
+        assertEquals("name property", "Willem", result.getName());
+    }
+   
+    protected void assertURIQueryOption(JpaConsumer jpaConsumer) {
+        assertEquals("findAllCustomersWithName", jpaConsumer.getNamedQuery());
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        camelContext = new DefaultCamelContext();
+        SimpleRegistry registry = new SimpleRegistry();
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("custName", "Willem");
+        // bind the params
+        registry.put("params", params);
+        camelContext.setRegistry(registry);
+        
+        template = camelContext.createProducerTemplate();
+        ServiceHelper.startServices(template, camelContext);
+
+        Endpoint value = camelContext.getEndpoint(getEndpointUri());
+        assertNotNull("Could not find endpoint!", value);
+        assertTrue("Should be a JPA endpoint but was: " + value, value instanceof JpaEndpoint);
+        endpoint = (JpaEndpoint)value;
+
+        transactionStrategy = endpoint.createTransactionStrategy();
+        jpaTemplate = endpoint.getTemplate();
+    }
+
+    protected String getEndpointUri() {
+        return "jpa://" + Customer.class.getName() + "?consumer.namedQuery=findAllCustomersWithName&consumer.parameters=#params";
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ServiceHelper.stopServices(consumer, template, camelContext);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/1dda127c/components/camel-jpa/src/test/java/org/apache/camel/examples/Customer.java
----------------------------------------------------------------------
diff --git a/components/camel-jpa/src/test/java/org/apache/camel/examples/Customer.java b/components/camel-jpa/src/test/java/org/apache/camel/examples/Customer.java
index 719ff3e..c5f50a6 100644
--- a/components/camel-jpa/src/test/java/org/apache/camel/examples/Customer.java
+++ b/components/camel-jpa/src/test/java/org/apache/camel/examples/Customer.java
@@ -20,12 +20,14 @@ import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToOne;
 
 /**
  * @version 
  */
 @Entity
+@NamedQuery(name="findAllCustomersWithName", query = "SELECT c FROM Customer c WHERE c.name LIKE :custName ")
 public class Customer {
     
     @Id