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 2009/01/29 12:42:43 UTC

svn commit: r738826 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/component/file/ camel-core/src/main/java/org/apache/camel/converter/ camel-core/src/main/java/org/apache/camel/converter/jaxp/ c...

Author: davsclaus
Date: Thu Jan 29 11:42:42 2009
New Revision: 738826

URL: http://svn.apache.org/viewvc?rev=738826&view=rev
Log:
CAMEL-1300: Add @FallbackConverter for registering a fallback converter. Used by GenericFileConverter to allow us to delegte the from type to the wrapped body instead of the GenericFile that is just the wrapper class.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java   (contents, props changed)
      - copied, changed from r738760, camel/trunk/camel-core/src/main/java/org/apache/camel/Converter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java   (contents, props changed)
      - copied, changed from r738760, camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java   (contents, props changed)
      - copied, changed from r738760, camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java
Removed:
    camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConverter.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java
    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/DefaultTypeConverter.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/components/camel-xmlbeans/src/main/java/org/apache/camel/converter/xmlbeans/XmlBeansConverter.java

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java (from r738760, camel/trunk/camel-core/src/main/java/org/apache/camel/Converter.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/Converter.java&r1=738760&r2=738826&rev=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Converter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java Thu Jan 29 11:42:42 2009
@@ -23,15 +23,23 @@
 import java.lang.annotation.Target;
 
 /**
- * An annotation used to mark classes and methods to indicate code capable of
- * converting from a type to another type which are then auto-discovered using
+ * An annotation used to mark methods to indicate code capable of being a
+ * fallback converter which are then auto-discovered using
  * the <a href="http://camel.apache.org/type-converter.html">Type
- * Conversion Support</a>
- * 
+ * Conversion Support</a>.
+ * <p/>
+ * The difference between a regular <tt>@Converter</tt> and a <tt>@FallbackConverter</tt>
+ * is that the fallback is resolved at last if no regular converter could be found.
+ * Also the method signautre is scoped to be generic to allow handling a broader range
+ * of types trying to be converted. The fallback converter can just return <tt>null</tt>
+ * if it can not handle the types to convert from/to.
+ *
+ * @see org.apache.camel.component.file.GenericFileConverter GenericFileConverter for an example.
+ *
  * @version $Revision$
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Target({ElementType.TYPE, ElementType.METHOD })
-public @interface Converter {
-}
+public @interface FallbackConverter {
+}
\ No newline at end of file

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/FallbackConverter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java Thu Jan 29 11:42:42 2009
@@ -16,19 +16,14 @@
  */
 package org.apache.camel.component.file;
 
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
 import org.apache.camel.Converter;
-import org.apache.camel.converter.IOConverter;
+import org.apache.camel.Exchange;
+import org.apache.camel.FallbackConverter;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
 
 /**
- * A set of converter methods for working with remote file types
+ * A set of converter methods for working with generic file types
  */
 @Converter
 public final class GenericFileConverter {
@@ -37,34 +32,20 @@
         // Helper Class
     }
 
-    @Converter
-    public static InputStream toInputStream(GenericFile<File> file) throws FileNotFoundException {
-        return IOConverter.toInputStream(file.getFile());
-    }
-
-    @Converter
-    public static BufferedReader toReader(GenericFile<File> file) throws FileNotFoundException {
-        return IOConverter.toReader(file.getFile());
-    }
-
-    @Converter
-    public static OutputStream toOutputStream(GenericFile<File> file) throws FileNotFoundException {
-        return IOConverter.toOutputStream(file.getFile());
-    }
-
-    @Converter
-    public static BufferedWriter toWriter(GenericFile<File> file) throws IOException {
-        return IOConverter.toWriter(file.getFile());
-    }
-
-    @Converter
-    public static byte[] toByteArray(GenericFile<File> file) throws IOException {
-        return IOConverter.toByteArray(file.getFile());
-    }
-
-    @Converter
-    public static String toString(GenericFile<File> file) throws IOException {
-        return IOConverter.toString(file.getFile());
+    @FallbackConverter
+    public static <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
+        // use a fallback type converter so we can convert the embedded body if the value is GenericFile
+        if (GenericFile.class.isAssignableFrom(value.getClass())) {
+            GenericFile file = (GenericFile) value;
+            Class from = file.getBody().getClass();
+            TypeConverter tc = registry.lookup(type, from);
+            if (tc != null) {
+                Object body = file.getBody();
+                return tc.convertTo(type, exchange, body);
+            }
+        }
+        
+        return null;
     }
 
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java Thu Jan 29 11:42:42 2009
@@ -279,13 +279,29 @@
         return bos.toByteArray();
     }
 
+    @Converter
+    public static byte[] toByteArray(ByteArrayOutputStream os) {
+        return os.toByteArray();
+    }
+
+    @Converter
+    public static String toString(ByteArrayOutputStream os) {
+        return os.toString();
+    }
+
+    @Converter
+    public static InputStream toInputStream(ByteArrayOutputStream os) {
+        return new ByteArrayInputStream(os.toByteArray());
+    }
+
     public static void copy(InputStream stream, OutputStream os) throws IOException {
         byte[] data = new byte[4096];
-        int read = stream.read(data);        
-        while (read != -1) {            
+        int read = stream.read(data);
+        while (read != -1) {
             os.write(data, 0, read);
             read = stream.read(data);
         }
         os.flush();
     }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java Thu Jan 29 11:42:42 2009
@@ -26,7 +26,6 @@
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
-import org.apache.camel.component.file.GenericFile;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -62,11 +61,6 @@
     }
 
     @Converter
-    public static ByteBuffer toByteBuffer(GenericFile<File> file) throws IOException {
-        return toByteBuffer(file.getFile());
-    }
-
-    @Converter
     public static ByteBuffer toByteBuffer(File file) throws IOException {
         InputStream in = null;
         try {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java Thu Jan 29 11:42:42 2009
@@ -53,7 +53,6 @@
 import org.xml.sax.XMLReader;
 
 import org.apache.camel.Converter;
-import org.apache.camel.component.file.GenericFile;
 import org.apache.camel.converter.IOConverter;
 import org.apache.camel.converter.NIOConverter;
 import org.apache.camel.util.ObjectHelper;
@@ -310,11 +309,6 @@
     }
 
     @Converter
-    public StreamSource toStreamSource(GenericFile<File> in) throws TransformerException {
-        return toStreamSource(in.getFile());
-    }
-
-    @Converter
     public StreamSource toStreamSource(byte[] in) throws TransformerException {
         if (in != null) {
             return new StreamSource(IOConverter.toInputStream(in));
@@ -535,18 +529,6 @@
     }
 
     /**
-     * Converts the given {@link File} to a DOM document
-     *
-     * @param file is the data to be parsed
-     * @return the parsed document
-     */
-    @Converter
-    public Document toDOMDocument(GenericFile<File> file) throws IOException, SAXException, ParserConfigurationException {
-        return toDOMDocument(file.getFile());
-    }
-
-
-    /**
      * Create a DOM document from the given source.
      */
     @Converter

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java Thu Jan 29 11:42:42 2009
@@ -41,6 +41,12 @@
         }
     }
 
+    public void addFallbackTypeConverter(TypeConverter typeConverter) {
+        if (errors.size() == 0) {
+            errors.add("Method should not be invoked.");
+        }
+    }
+
     public TypeConverter lookup(Class toType, Class fromType) {
         if (errors.size() == 0) {
             errors.add("Method should not be invoked.");

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=738826&r1=738825&r2=738826&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 Thu Jan 29 11:42:42 2009
@@ -19,7 +19,6 @@
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-
 import java.lang.reflect.Method;
 
 import java.net.URL;
@@ -33,6 +32,7 @@
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
+import org.apache.camel.FallbackConverter;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
@@ -50,7 +50,7 @@
 public class AnnotationTypeConverterLoader implements TypeConverterLoader {
     public static final String META_INF_SERVICES = "META-INF/services/org/apache/camel/TypeConverter";
     private static final transient Log LOG = LogFactory.getLog(AnnotationTypeConverterLoader.class);
-    private ResolverUtil resolver;
+    protected ResolverUtil resolver;
     private Set<Class> visitedClasses = new HashSet<Class>();
 
     public AnnotationTypeConverterLoader() {
@@ -62,7 +62,7 @@
             resolver = new ResolverUtil();
         }
     }
-    
+
     public AnnotationTypeConverterLoader(ResolverUtil resolverUtil) {
         this.resolver = resolverUtil;
     }
@@ -122,7 +122,7 @@
      * Tokenizes the line from the META-IN/services file using commas and
      * ignoring whitespace between packages
      */
-    protected void tokenize(Set<String> packages, String line) {
+    private void tokenize(Set<String> packages, String line) {
         StringTokenizer iter = new StringTokenizer(line, ",");
         while (iter.hasMoreTokens()) {
             String name = iter.nextToken().trim();
@@ -148,34 +148,9 @@
                 // this may be prone to ClassLoader or packaging problems when the same class is defined
                 // in two different jars (as is the case sometimes with specs).
                 if (ObjectHelper.hasAnnotation(method, Converter.class, true)) {
-                    if (isValidConverterMethod(method)) {
-                        int modifiers = method.getModifiers();
-                        if (isAbstract(modifiers) || !isPublic(modifiers)) {
-                            LOG.warn("Ignoring bad converter on type: " + type.getName() + " method: " + method
-                                    + " as a converter method is not a public and concrete method");
-                        } else {
-                            Class<?> toType = method.getReturnType();
-                            if (toType.equals(Void.class)) {
-                                LOG.warn("Ignoring bad converter on type: " + type.getName() + " method: "
-                                        + method + " as a converter method returns a void method");
-                            } else {
-                                Class<?> fromType = method.getParameterTypes()[0];
-                                if (isStatic(modifiers)) {
-                                    registerTypeConverter(registry, method, toType, fromType,
-                                            new StaticMethodTypeConverter(method));
-                                } else {
-                                    if (injector == null) {
-                                        injector = new CachingInjector(registry, type);
-                                    }
-                                    registerTypeConverter(registry, method, toType, fromType,
-                                            new InstanceMethodTypeConverter(injector, method));
-                                }
-                            }
-                        }
-                    } else {
-                        LOG.warn("Ignoring bad converter on type: " + type.getName() + " method: " + method
-                                + " as a converter method should have one parameter");
-                    }
+                    injector = handleHasConverterAnnotation(registry, type, injector, method);
+                } else if (ObjectHelper.hasAnnotation(method, FallbackConverter.class, true)) {
+                    injector = handleHasFallbackConverterAnnotation(registry, type, injector, method);
                 }
             }
 
@@ -188,15 +163,86 @@
         }
     }
 
+    private CachingInjector handleHasConverterAnnotation(TypeConverterRegistry registry, Class type, CachingInjector injector, Method method) {
+        if (isValidConverterMethod(method)) {
+            int modifiers = method.getModifiers();
+            if (isAbstract(modifiers) || !isPublic(modifiers)) {
+                LOG.warn("Ignoring bad converter on type: " + type.getCanonicalName() + " method: " + method
+                        + " as a converter method is not a public and concrete method");
+            } else {
+                Class<?> toType = method.getReturnType();
+                if (toType.equals(Void.class)) {
+                    LOG.warn("Ignoring bad converter on type: " + type.getCanonicalName() + " method: "
+                            + method + " as a converter method returns a void method");
+                } else {
+                    Class<?> fromType = method.getParameterTypes()[0];
+                    if (isStatic(modifiers)) {
+                        registerTypeConverter(registry, method, toType, fromType,
+                                new StaticMethodTypeConverter(method));
+                    } else {
+                        if (injector == null) {
+                            injector = new CachingInjector(registry, type);
+                        }
+                        registerTypeConverter(registry, method, toType, fromType,
+                                new InstanceMethodTypeConverter(injector, method));
+                    }
+                }
+            }
+        } else {
+            LOG.warn("Ignoring bad converter on type: " + type.getCanonicalName() + " method: " + method
+                    + " as a converter method should have one parameter");
+        }
+        return injector;
+    }
+
+    private CachingInjector handleHasFallbackConverterAnnotation(TypeConverterRegistry registry, Class type, CachingInjector injector, Method method) {
+        if (isValidFallbackConverterMethod(method)) {
+            int modifiers = method.getModifiers();
+            if (isAbstract(modifiers) || !isPublic(modifiers)) {
+                LOG.warn("Ignoring bad fallback converter on type: " + type.getCanonicalName() + " method: " + method
+                        + " as a fallback converter method is not a public and concrete method");
+            } else {
+                Class<?> toType = method.getReturnType();
+                if (toType.equals(Void.class)) {
+                    LOG.warn("Ignoring bad fallback converter on type: " + type.getCanonicalName() + " method: "
+                            + method + " as a fallback converter method returns a void method");
+                } else {
+                    if (isStatic(modifiers)) {
+                        registerFallbackTypeConverter(registry, new StaticMethodFallbackTypeConverter(method, registry));
+                    } else {
+                        if (injector == null) {
+                            injector = new CachingInjector(registry, type);
+                        }
+                        registerFallbackTypeConverter(registry, new InstanceMethodFallbackTypeConverter(injector, method, registry));
+                    }
+                }
+            }
+        } else {
+            LOG.warn("Ignoring bad fallback converter on type: " + type.getCanonicalName() + " method: " + method
+                    + " as a fallback converter method should have one parameter");
+        }
+        return injector;
+    }
+
     protected void registerTypeConverter(TypeConverterRegistry registry,
                                          Method method, Class toType, Class fromType, TypeConverter typeConverter) {
-
         registry.addTypeConverter(toType, fromType, typeConverter);
     }
 
     protected boolean isValidConverterMethod(Method method) {
         Class<?>[] parameterTypes = method.getParameterTypes();
         return (parameterTypes != null) && (parameterTypes.length == 1
-            || (parameterTypes.length == 2 && Exchange.class.isAssignableFrom(parameterTypes[1])));
+                || (parameterTypes.length == 2 && Exchange.class.isAssignableFrom(parameterTypes[1])));
+    }
+
+    protected void registerFallbackTypeConverter(TypeConverterRegistry registry, TypeConverter typeConverter) {
+        registry.addFallbackTypeConverter(typeConverter);
+    }
+
+    protected boolean isValidFallbackConverterMethod(Method method) {
+        Class<?>[] parameterTypes = method.getParameterTypes();
+        return (parameterTypes != null) && (parameterTypes.length == 3
+                || (parameterTypes.length == 4 && Exchange.class.isAssignableFrom(parameterTypes[1]))
+                && (TypeConverterRegistry.class.isAssignableFrom(parameterTypes[parameterTypes.length - 1])));
     }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java Thu Jan 29 11:42:42 2009
@@ -34,7 +34,6 @@
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
 import static org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException;
 
 
@@ -55,11 +54,13 @@
     public DefaultTypeConverter(Injector injector) {
         typeConverterLoaders.add(new AnnotationTypeConverterLoader());
         this.injector = injector;
-        addFallbackConverter(new AsyncProcessorTypeConverter());
-        addFallbackConverter(new PropertyEditorTypeConverter());
-        addFallbackConverter(new ToStringTypeConverter());
-        addFallbackConverter(new ArrayTypeConverter());
-        addFallbackConverter(new EnumTypeConverter());
+        // add to string first as it will then be last in the last as to string can nearly
+        // always convert something to a string so we want it only as the last resort
+        addFallbackTypeConverter(new ToStringTypeConverter());
+        addFallbackTypeConverter(new EnumTypeConverter());
+        addFallbackTypeConverter(new ArrayTypeConverter());
+        addFallbackTypeConverter(new PropertyEditorTypeConverter());
+        addFallbackTypeConverter(new AsyncProcessorTypeConverter());
     }
 
     public List<TypeConverterLoader> getTypeConverterLoaders() {
@@ -123,6 +124,9 @@
     }
 
     public void addTypeConverter(Class toType, Class fromType, TypeConverter typeConverter) {
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Adding type converter: " + typeConverter);
+        }
         TypeMapping key = new TypeMapping(toType, fromType);
         synchronized (typeMappings) {
             TypeConverter converter = typeMappings.get(key);
@@ -133,10 +137,15 @@
         }
     }
 
-    public void addFallbackConverter(TypeConverter converter) {
-        fallbackConverters.add(converter);
-        if (converter instanceof TypeConverterAware) {
-            TypeConverterAware typeConverterAware = (TypeConverterAware)converter;
+    public void addFallbackTypeConverter(TypeConverter typeConverter) {
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Adding fallback type converter: " + typeConverter);
+        }
+
+        // add in top of fallback as the toString() fallback will nearly always be able to convert
+        fallbackConverters.add(0, typeConverter);
+        if (typeConverter instanceof TypeConverterAware) {
+            TypeConverterAware typeConverterAware = (TypeConverterAware)typeConverter;
             typeConverterAware.setTypeConverter(this);
         }
     }
@@ -268,7 +277,7 @@
         List<TypeConverter> converters = finder.newInstances("FallbackTypeConverter", getInjector(),
                                                              TypeConverter.class);
         for (TypeConverter converter : converters) {
-            addFallbackConverter(converter);
+            addFallbackTypeConverter(converter);
         }
     }
 

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java (from r738760, 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/InstanceMethodFallbackTypeConverter.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java&r1=738760&r2=738826&rev=738826&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/InstanceMethodFallbackTypeConverter.java Thu Jan 29 11:42:42 2009
@@ -21,28 +21,31 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
 
 /**
- * A {@link TypeConverter} implementation which instantiates an object
- * so that an instance method can be used as a type converter
+ * A {@link org.apache.camel.TypeConverter} implementation which instantiates an object
+ * so that an instance method can be used as a fallback type converter
  *
  * @version $Revision$
  */
-public class InstanceMethodTypeConverter implements TypeConverter {
+public class InstanceMethodFallbackTypeConverter implements TypeConverter {
     private final CachingInjector injector;
     private final Method method;
     private final boolean useExchange;
+    private final TypeConverterRegistry registry;
 
-    public InstanceMethodTypeConverter(CachingInjector injector, Method method) {
+    public InstanceMethodFallbackTypeConverter(CachingInjector injector, Method method, TypeConverterRegistry registry) {
         this.injector = injector;
         this.method = method;
-        this.useExchange = method.getParameterTypes().length == 2;
+        this.useExchange = method.getParameterTypes().length == 4;
+        this.registry = registry;
     }
 
     @Override
     public String toString() {
-        return "InstanceMethodTypeConverter: " + method;
+        return "InstanceMethodFallbackTypeConverter: " + method;
     }
 
     public <T> T convertTo(Class<T> type, Object value) {
@@ -52,10 +55,10 @@
     public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
         Object instance = injector.newInstance();
         if (instance == null) {
-            throw new RuntimeCamelException("Could not instantiate an instance of: " + type.getName());
+            throw new RuntimeCamelException("Could not instantiate an instance of: " + type.getCanonicalName());
         }
         return useExchange
-            ? (T)ObjectHelper.invokeMethod(method, instance, value, exchange) : (T)ObjectHelper
-                .invokeMethod(method, instance, value);
+            ? (T)ObjectHelper.invokeMethod(method, instance, type, value, exchange, registry) : (T)ObjectHelper
+                .invokeMethod(method, instance, type, value, registry);
     }
-}
+}
\ No newline at end of file

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=738826&r1=738825&r2=738826&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 Thu Jan 29 11:42:42 2009
@@ -52,7 +52,7 @@
     public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
         Object instance = injector.newInstance();
         if (instance == null) {
-            throw new RuntimeCamelException("Could not instantiate an instance of: " + type.getName());
+            throw new RuntimeCamelException("Could not instantiate an instance of: " + type.getCanonicalName());
         }
         return useExchange
             ? (T)ObjectHelper.invokeMethod(method, instance, value, exchange) : (T)ObjectHelper

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java (from r738760, camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java&r1=738760&r2=738826&rev=738826&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java Thu Jan 29 11:42:42 2009
@@ -20,25 +20,29 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
 
 /**
- * A {@link TypeConverter} implementation which invokes a static method to convert from a type to another type
+ * A {@link org.apache.camel.TypeConverter} implementation which invokes a static method
+ * as a fallback type converter from a type to another type
  *
  * @version $Revision$
  */
-public class StaticMethodTypeConverter implements TypeConverter {
+public class StaticMethodFallbackTypeConverter implements TypeConverter {
     private final Method method;
     private final boolean useExchange;
+    private final TypeConverterRegistry registry;
 
-    public StaticMethodTypeConverter(Method method) {
+    public StaticMethodFallbackTypeConverter(Method method, TypeConverterRegistry registry) {
         this.method = method;
-        this.useExchange = method.getParameterTypes().length == 2;
+        this.useExchange = method.getParameterTypes().length == 4;
+        this.registry = registry;
     }
 
     @Override
     public String toString() {
-        return "StaticMethodTypeConverter: " + method;
+        return "StaticMethodFallbackTypeConverter: " + method;
     }
 
     public <T> T convertTo(Class<T> type, Object value) {
@@ -46,7 +50,7 @@
     }
 
     public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
-        return useExchange ? (T)ObjectHelper.invokeMethod(method, null, value, exchange)
-            : (T)ObjectHelper.invokeMethod(method, null, value);
+        return useExchange ? (T)ObjectHelper.invokeMethod(method, null, type, exchange, value, registry)
+            : (T)ObjectHelper.invokeMethod(method, null, type, value, registry);
     }
-}
+}
\ No newline at end of file

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodFallbackTypeConverter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=738826&r1=738825&r2=738826&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 Thu Jan 29 11:42:42 2009
@@ -35,6 +35,13 @@
     void addTypeConverter(Class toType, Class fromType, TypeConverter typeConverter);
 
     /**
+     * Registers a new fallback type converter
+     *
+     * @param typeConverter the type converter to use
+     */
+    void addFallbackTypeConverter(TypeConverter typeConverter);
+
+    /**
      * Performs a lookup for a given type converter.
      *
      * @param toType        the type to convert to

Modified: camel/trunk/components/camel-xmlbeans/src/main/java/org/apache/camel/converter/xmlbeans/XmlBeansConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-xmlbeans/src/main/java/org/apache/camel/converter/xmlbeans/XmlBeansConverter.java?rev=738826&r1=738825&r2=738826&view=diff
==============================================================================
--- camel/trunk/components/camel-xmlbeans/src/main/java/org/apache/camel/converter/xmlbeans/XmlBeansConverter.java (original)
+++ camel/trunk/components/camel-xmlbeans/src/main/java/org/apache/camel/converter/xmlbeans/XmlBeansConverter.java Thu Jan 29 11:42:42 2009
@@ -32,7 +32,6 @@
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
-import org.apache.camel.component.file.GenericFile;
 import org.apache.camel.converter.IOConverter;
 import org.apache.camel.converter.NIOConverter;
 import org.apache.camel.converter.jaxp.XmlConverter;
@@ -51,11 +50,6 @@
     private XmlConverter xmlConverter = new XmlConverter();
 
     @Converter
-    public static XmlObject toXmlObject(GenericFile<File> value) throws IOException, XmlException {
-        return toXmlObject(value.getFile());
-    }
-
-    @Converter
     public static XmlObject toXmlObject(File value) throws IOException, XmlException {
         return XmlObject.Factory.parse(value);
     }