Author: davsclaus
Date: Wed Jan 20 11:21:53 2010
New Revision: 901136

URL: http://svn.apache.org/viewvc?rev=901136&view=rev
Log:
CAMEL-2382: Instance based @Converter can now have parent type converter 
injected with TypeConverterAware. Fixed CS.

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
   (with props)
    
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
   (with props)
    
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
   (with props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateAsyncTest.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java?rev=901136&r1=901135&r2=901136&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
 Wed Jan 20 11:21:53 2010
@@ -177,7 +177,7 @@
                             injector = new CachingInjector<Object>(registry, 
CastUtils.cast(type, Object.class));
                         }
                         registerTypeConverter(registry, method, toType, 
fromType,
-                                new InstanceMethodTypeConverter(injector, 
method));
+                                new InstanceMethodTypeConverter(injector, 
method, registry));
                     }
                 }
             }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java?rev=901136&r1=901135&r2=901136&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
 Wed Jan 20 11:21:53 2010
@@ -21,6 +21,8 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterAware;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -33,11 +35,13 @@
     private final CachingInjector<?>injector;
     private final Method method;
     private final boolean useExchange;
+    private final TypeConverterRegistry registry;
 
-    public InstanceMethodTypeConverter(CachingInjector<?> injector, Method 
method) {
+    public InstanceMethodTypeConverter(CachingInjector<?> injector, Method 
method, TypeConverterRegistry registry) {
         this.injector = injector;
         this.method = method;
         this.useExchange = method.getParameterTypes().length == 2;
+        this.registry = registry;
     }
 
     @Override
@@ -55,6 +59,13 @@
         if (instance == null) {
             throw new RuntimeCamelException("Could not instantiate an instance 
of: " + type.getCanonicalName());
         }
+        // inject parent type converter
+        if (instance instanceof TypeConverterAware) {
+            if (registry instanceof TypeConverter) {
+                TypeConverter parentTypeConverter = (TypeConverter) registry;
+                ((TypeConverterAware) 
instance).setTypeConverter(parentTypeConverter);
+            }
+        }
         return useExchange
             ? (T)ObjectHelper.invokeMethod(method, instance, value, exchange) 
: (T)ObjectHelper
                 .invokeMethod(method, instance, value);

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java?rev=901136&r1=901135&r2=901136&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
 Wed Jan 20 11:21:53 2010
@@ -46,7 +46,7 @@
      *
      * @param toType        the type to convert to
      * @param fromType      the type to convert from
-     * @return the type converter or null if not found.
+     * @return the type converter or <tt>null</tt> if not found.
      */
     TypeConverter lookup(Class<?> toType, Class<?> fromType);
 

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java?rev=901136&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
 Wed Jan 20 11:21:53 2010
@@ -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.converter;
+
+import java.math.BigDecimal;
+
+/**
+ * @version $Revision$
+ */
+public class PurchaseOrder {
+
+    private final String name;
+    private final BigDecimal price;
+    private final int amount;
+
+    public PurchaseOrder(String name, BigDecimal price, int amount) {
+        this.name = name;
+        this.price = price;
+        this.amount = amount;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public int getAmount() {
+        return amount;
+    }
+
+    public String toString() {
+        return "Ordering " + amount + " of " + name + " at total " + price;
+    }
+}

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrder.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java?rev=901136&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
 Wed Jan 20 11:21:53 2010
@@ -0,0 +1,61 @@
+/**
+ * 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.converter;
+
+import java.math.BigDecimal;
+
+import org.apache.camel.Converter;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterAware;
+
+/**
+ * @version $Revision$
+ */
+...@converter
+public class PurchaseOrderConverter implements TypeConverterAware {
+
+    private TypeConverter converter;
+
+    public void setTypeConverter(TypeConverter parentTypeConverter) {
+        this.converter = parentTypeConverter;
+    }
+
+    @Converter
+    public PurchaseOrder toPurchaseOrder(byte[] data) {
+        String s = converter.convertTo(String.class, data);
+
+        if (s == null || s.length() < 30) {
+            throw new IllegalArgumentException("data is invalid");
+        }
+
+        s = s.replaceAll("##START##", "");
+        s = s.replaceAll("##END##", "");
+
+        String name = s.substring(0, 9).trim();
+        String s2 = s.substring(10, 19).trim();
+        String s3 = s.substring(20).trim();
+
+        BigDecimal price = new BigDecimal(s2);
+        price.setScale(2);
+
+        Integer amount = converter.convertTo(Integer.class, s3);
+
+        PurchaseOrder order = new PurchaseOrder(name, price, amount);
+        return order;
+    }
+
+}

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/PurchaseOrderConverter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java?rev=901136&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
 Wed Jan 20 11:21:53 2010
@@ -0,0 +1,38 @@
+/**
+ * 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.converter;
+
+import org.apache.camel.ContextTestSupport;
+
+/**
+ * @version $Revision$
+ */
+public class TypeConverterAwareTest extends ContextTestSupport {
+
+    public void testPurchaseOrderConverter() throws Exception {
+        byte[] data = "##START##AKC4433   179       3##END##".getBytes();
+        PurchaseOrder order = 
context.getTypeConverter().convertTo(PurchaseOrder.class, data);
+        assertNotNull(order);
+
+        System.out.println(order);
+
+        assertEquals("AKC4433", order.getName());
+        assertEquals("179", order.getPrice().toString());
+        assertEquals(3, order.getAmount());
+    }
+
+}

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateAsyncTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateAsyncTest.java?rev=901136&r1=901135&r2=901136&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateAsyncTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerTemplateAsyncTest.java
 Wed Jan 20 11:21:53 2010
@@ -42,7 +42,7 @@
  */
 public class DefaultProducerTemplateAsyncTest extends ContextTestSupport {
 
-    private static final AtomicInteger order = new AtomicInteger(0);
+    private static final AtomicInteger ORDER = new AtomicInteger(0);
 
     public void testRequestAsync() throws Exception {
         Exchange exchange = new DefaultExchange(context);
@@ -307,7 +307,7 @@
     }
 
     public void testAsyncCallbackExchangeInOnly() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
@@ -319,22 +319,22 @@
         template.asyncCallback("direct:start", exchange, new 
SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("Hello World", exchange.getIn().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
         assertMockEndpointsSatisfied();
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     public void testAsyncCallbackExchangeInOut() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         final CountDownLatch latch = new CountDownLatch(1);
 
@@ -345,21 +345,21 @@
         template.asyncCallback("direct:echo", exchange, new 
SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("HelloHello", exchange.getOut().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     public void testAsyncCallbackExchangeInOnlyGetResult() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
@@ -369,22 +369,22 @@
         Future<Exchange> future = template.asyncCallback("direct:start", 
exchange, new SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("Hello World", exchange.getIn().getBody());
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         Exchange reply = future.get(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
         assertMockEndpointsSatisfied();
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
         assertNotNull(reply);
     }
 
     public void testAsyncCallbackExchangeInOutGetResult() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         Exchange exchange = 
context.getEndpoint("direct:start").createExchange();
         exchange.getIn().setBody("Hello");
@@ -393,22 +393,22 @@
         Future<Exchange> future = template.asyncCallback("direct:echo", 
exchange, new SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("HelloHello", exchange.getOut().getBody());
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         Exchange reply = future.get(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
         assertNotNull(reply);
         assertEquals("HelloHello", reply.getOut().getBody());
     }
 
     public void testAsyncCallbackBodyInOnly() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
@@ -417,85 +417,85 @@
         template.asyncCallbackSendBody("direct:start", "Hello", new 
SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("Hello World", exchange.getIn().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
         assertMockEndpointsSatisfied();
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     public void testAsyncCallbackBodyInOut() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         final CountDownLatch latch = new CountDownLatch(1);
 
         template.asyncCallbackRequestBody("direct:echo", "Hello", new 
SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("HelloHello", exchange.getOut().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     public void testAsyncCallbackBodyInOnlyGetResult() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
         Future<Object> future = template.asyncCallbackSendBody("direct:start", 
"Hello", new SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("Hello World", exchange.getIn().getBody());
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         Object reply = future.get(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
         assertMockEndpointsSatisfied();
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
         // no reply when in only
         assertEquals(null, reply);
     }
 
     public void testAsyncCallbackBodyInOutGetResult() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         Future<Object> future = 
template.asyncCallbackRequestBody("direct:echo", "Hello", new 
SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("HelloHello", exchange.getOut().getBody());
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         Object reply = future.get(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
         assertEquals("HelloHello", reply);
     }
 
     public void testAsyncCallbackInOnlyProcessor() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
 
@@ -508,22 +508,22 @@
         }, new SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("Hello World", exchange.getIn().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
         assertMockEndpointsSatisfied();
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     public void testAsyncCallbackInOutProcessor() throws Exception {
-        order.set(0);
+        ORDER.set(0);
 
         final CountDownLatch latch = new CountDownLatch(1);
 
@@ -535,17 +535,17 @@
         }, new SynchronizationAdapter() {
             @Override
             public void onDone(Exchange exchange) {
-                order.addAndGet(2);
+                ORDER.addAndGet(2);
                 assertEquals("HelloHello", exchange.getOut().getBody());
                 latch.countDown();
             }
         });
 
-        order.addAndGet(1);
+        ORDER.addAndGet(1);
         latch.await(10, TimeUnit.SECONDS);
-        order.addAndGet(4);
+        ORDER.addAndGet(4);
 
-        assertEquals(7, order.get());
+        assertEquals(7, ORDER.get());
     }
 
     @Override


Reply via email to