Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6FE8C10158 for ; Mon, 1 Jul 2013 08:01:13 +0000 (UTC) Received: (qmail 7476 invoked by uid 500); 1 Jul 2013 08:01:12 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 7433 invoked by uid 500); 1 Jul 2013 08:01:04 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 7425 invoked by uid 99); 1 Jul 2013 08:01:02 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 01 Jul 2013 08:01:02 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 9D796452A6; Mon, 1 Jul 2013 08:01:01 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ningjiang@apache.org To: commits@camel.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: git commit: CAMEL-6498 Improvement to allow passing in a parameter to a NamedQuery via Camel JPA Date: Mon, 1 Jul 2013 08:01:01 +0000 (UTC) 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 Authored: Mon Jul 1 14:56:03 2013 +0800 Committer: Willem Jiang 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 parameters; private Class resultClass; private boolean transacted; @@ -194,6 +197,14 @@ public class JpaConsumer extends ScheduledBatchPollingConsumer { public void setDeleteHandler(DeleteHandler deleteHandler) { this.deleteHandler = deleteHandler; } + + public void setParameters(Map params) { + this.parameters = params; + } + + public Map 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 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() { + 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 params = new HashMap(); + 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