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 2010/10/20 10:05:46 UTC

svn commit: r1024542 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/impl/converter/ camel-core/src/main/java/org/apache/camel/spi/ camel-core/src/t...

Author: davsclaus
Date: Wed Oct 20 08:05:45 2010
New Revision: 1024542

URL: http://svn.apache.org/viewvc?rev=1024542&view=rev
Log:
CAMEL-3255: Type converters can now be lazy loaded. Thanks to Mark Ford for patch which I can leverage pieces from.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java   (contents, props changed)
      - copied, changed from r1024527, 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/DefaultTypeConverter.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/LazyLoadingTypeConverter.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextLazyLoadTypeConvertersTest.java
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.java
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml
      - copied, changed from r1024527, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterAware.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
    camel/trunk/camel-core/src/test/resources/log4j.properties
    camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
    camel/trunk/components/camel-blueprint/src/test/resources/test.xml
    camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
    camel/trunk/components/camel-spring/src/test/resources/log4j.properties

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Wed Oct 20 08:05:45 2010
@@ -910,4 +910,19 @@ public interface CamelContext extends Su
      * @param uuidGenerator the UUID Generator
      */
     void setUuidGenerator(UuidGenerator uuidGenerator);
+
+    /**
+     * Whether or not type converters should be loaded lazy
+     *
+     * @return <tt>true</tt> to load lazy, <tt>false</tt> to load on startup
+     */
+    Boolean isLazyLoadTypeConverters();
+
+    /**
+     * Sets whether type converters should be loaded lazy
+     *
+     * @param lazyLoadTypeConverters <tt>true</tt> to load lazy, <tt>false</tt> to load on startup
+     */
+    void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters);
+
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Wed Oct 20 08:05:45 2010
@@ -61,7 +61,9 @@ import org.apache.camel.TypeConverter;
 import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.component.properties.PropertiesComponent;
+import org.apache.camel.impl.converter.BaseTypeConverterRegistry;
 import org.apache.camel.impl.converter.DefaultTypeConverter;
+import org.apache.camel.impl.converter.LazyLoadingTypeConverter;
 import org.apache.camel.management.DefaultManagementAgent;
 import org.apache.camel.management.DefaultManagementLifecycleStrategy;
 import org.apache.camel.management.DefaultManagementStrategy;
@@ -153,6 +155,7 @@ public class DefaultCamelContext extends
     private Boolean streamCache = Boolean.FALSE;
     private Boolean handleFault = Boolean.FALSE;
     private Boolean disableJMX = Boolean.FALSE;
+    private Boolean lazyLoadTypeConverters = Boolean.FALSE;
     private Long delay;
     private ErrorHandlerBuilder errorHandlerBuilder;
     private Map<String, DataFormatDefinition> dataFormats = new HashMap<String, DataFormatDefinition>();
@@ -1814,7 +1817,12 @@ public class DefaultCamelContext extends
      * Lazily create a default implementation
      */
     protected TypeConverter createTypeConverter() {
-        DefaultTypeConverter answer = new DefaultTypeConverter(packageScanClassResolver, getInjector(), getDefaultFactoryFinder());
+        BaseTypeConverterRegistry answer;
+        if (isLazyLoadTypeConverters()) {
+            answer = new LazyLoadingTypeConverter(packageScanClassResolver, getInjector(), getDefaultFactoryFinder());
+        } else {
+            answer = new DefaultTypeConverter(packageScanClassResolver, getInjector(), getDefaultFactoryFinder());
+        }
         setTypeConverterRegistry(answer);
         return answer;
     }
@@ -2018,6 +2026,14 @@ public class DefaultCamelContext extends
     public Boolean isAutoStartup() {
         return autoStartup != null && autoStartup;
     }
+    
+    public Boolean isLazyLoadTypeConverters() {
+        return lazyLoadTypeConverters != null && lazyLoadTypeConverters;
+    }
+    
+    public void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters) {
+        this.lazyLoadTypeConverters = lazyLoadTypeConverters;
+    }
 
     public ClassLoader getApplicationContextClassLoader() {
         return applicationContextClassLoader;

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java (from r1024527, 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/BaseTypeConverterRegistry.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java&r1=1024527&r2=1024542&rev=1024542&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/BaseTypeConverterRegistry.java Wed Oct 20 08:05:45 2010
@@ -45,22 +45,22 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
- * Default implementation of a type converter registry used for
+ * Base implementation of a type converter registry used for
  * <a href="http://camel.apache.org/type-converter.html">type converters</a> in Camel.
  *
  * @version $Revision$
  */
-public class DefaultTypeConverter extends ServiceSupport implements TypeConverter, TypeConverterRegistry {
-    private static final transient Log LOG = LogFactory.getLog(DefaultTypeConverter.class);
-    private final Map<TypeMapping, TypeConverter> typeMappings = new ConcurrentHashMap<TypeMapping, TypeConverter>();
-    private final Map<TypeMapping, TypeMapping> misses = new ConcurrentHashMap<TypeMapping, TypeMapping>();
-    private final List<TypeConverterLoader> typeConverterLoaders = new ArrayList<TypeConverterLoader>();
-    private final List<FallbackTypeConverter> fallbackConverters = new ArrayList<FallbackTypeConverter>();
-    private Injector injector;
-    private final FactoryFinder factoryFinder;
-    private final PropertyEditorTypeConverter propertyEditorTypeConverter = new PropertyEditorTypeConverter();
+public abstract class BaseTypeConverterRegistry extends ServiceSupport implements TypeConverter, TypeConverterRegistry {
+    protected final transient Log log = LogFactory.getLog(getClass());
+    protected final Map<TypeMapping, TypeConverter> typeMappings = new ConcurrentHashMap<TypeMapping, TypeConverter>();
+    protected final Map<TypeMapping, TypeMapping> misses = new ConcurrentHashMap<TypeMapping, TypeMapping>();
+    protected final List<TypeConverterLoader> typeConverterLoaders = new ArrayList<TypeConverterLoader>();
+    protected final List<FallbackTypeConverter> fallbackConverters = new ArrayList<FallbackTypeConverter>();
+    protected Injector injector;
+    protected final FactoryFinder factoryFinder;
+    protected final PropertyEditorTypeConverter propertyEditorTypeConverter = new PropertyEditorTypeConverter();
 
-    public DefaultTypeConverter(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder) {
+    public BaseTypeConverterRegistry(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder) {
         this.injector = injector;
         this.factoryFinder = factoryFinder;
         this.typeConverterLoaders.add(new AnnotationTypeConverterLoader(resolver));
@@ -107,8 +107,8 @@ public class DefaultTypeConverter extend
             }
 
             // we cannot convert so return null
-            if (LOG.isDebugEnabled()) {
-                LOG.debug(NoTypeConversionAvailableException.createMessage(value, type)
+            if (log.isDebugEnabled()) {
+                log.debug(NoTypeConversionAvailableException.createMessage(value, type)
                         + " Caused by: " + e.getMessage() + ". Will ignore this and continue.");
             }
             return null;
@@ -146,9 +146,9 @@ public class DefaultTypeConverter extend
     }
 
     @SuppressWarnings("unchecked")
-    public Object doConvertTo(final Class type, final Exchange exchange, final Object value) {
-        if (LOG.isTraceEnabled()) {
-            LOG.trace("Converting " + (value == null ? "null" : value.getClass().getCanonicalName())
+    protected Object doConvertTo(final Class type, final Exchange exchange, final Object value) {
+        if (log.isTraceEnabled()) {
+            log.trace("Converting " + (value == null ? "null" : value.getClass().getCanonicalName())
                     + " -> " + type.getCanonicalName() + " with value: " + value);
         }
 
@@ -175,8 +175,8 @@ public class DefaultTypeConverter extend
         // try to find a suitable type converter
         TypeConverter converter = getOrFindTypeConverter(type, value);
         if (converter != null) {
-            if (LOG.isTraceEnabled()) {
-                LOG.trace("Using converter: " + converter + " to convert " + key);
+            if (log.isTraceEnabled()) {
+                log.trace("Using converter: " + converter + " to convert " + key);
             }
             Object rc = converter.convertTo(type, exchange, value);
             if (rc != null) {
@@ -197,16 +197,16 @@ public class DefaultTypeConverter extend
                 // if fallback can promote then let it be promoted to a first class type converter
                 if (fallback.isCanPromote()) {
                     // add it as a known type converter since we found a fallback that could do it
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Promoting fallback type converter as a known type converter to convert from: "
+                    if (log.isDebugEnabled()) {
+                        log.debug("Promoting fallback type converter as a known type converter to convert from: "
                                 + type.getCanonicalName() + " to: " + value.getClass().getCanonicalName()
                                 + " for the fallback converter: " + fallback.getFallbackTypeConverter());
                     }
                     addTypeConverter(type, value.getClass(), fallback.getFallbackTypeConverter());
                 }
 
-                if (LOG.isTraceEnabled()) {
-                    LOG.trace("Fallback type converter " + fallback.getFallbackTypeConverter() + " converted type from: "
+                if (log.isTraceEnabled()) {
+                    log.trace("Fallback type converter " + fallback.getFallbackTypeConverter() + " converted type from: "
                                 + type.getCanonicalName() + " to: " + value.getClass().getCanonicalName());
                 }
 
@@ -233,8 +233,8 @@ public class DefaultTypeConverter extend
     }
 
     public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
-        if (LOG.isTraceEnabled()) {
-            LOG.trace("Adding type converter: " + typeConverter);
+        if (log.isTraceEnabled()) {
+            log.trace("Adding type converter: " + typeConverter);
         }
         TypeMapping key = new TypeMapping(toType, fromType);
         synchronized (typeMappings) {
@@ -243,7 +243,7 @@ public class DefaultTypeConverter extend
             // as race conditions can lead to many threads trying to promote the same fallback converter
             if (typeConverter != converter) {
                 if (converter != null) {
-                    LOG.warn("Overriding type converter from: " + converter + " to: " + typeConverter);
+                    log.warn("Overriding type converter from: " + converter + " to: " + typeConverter);
                 }
                 typeMappings.put(key, typeConverter);
             }
@@ -251,8 +251,8 @@ public class DefaultTypeConverter extend
     }
 
     public void addFallbackTypeConverter(TypeConverter typeConverter, boolean canPromote) {
-        if (LOG.isTraceEnabled()) {
-            LOG.trace("Adding fallback type converter: " + typeConverter + " which can promote: " + canPromote);
+        if (log.isTraceEnabled()) {
+            log.trace("Adding fallback type converter: " + typeConverter + " which can promote: " + canPromote);
         }
 
         // add in top of fallback as the toString() fallback will nearly always be able to convert
@@ -326,7 +326,7 @@ public class DefaultTypeConverter extend
         return doLookup(toType, fromType, false);
     }
 
-    private TypeConverter doLookup(Class<?> toType, Class<?> fromType, boolean isSuper) {
+    protected TypeConverter doLookup(Class<?> toType, Class<?> fromType, boolean isSuper) {
 
         if (fromType != null) {
             // lets try if there is a direct match
@@ -389,7 +389,7 @@ public class DefaultTypeConverter extend
     protected void loadTypeConverters() throws Exception {
         StopWatch watch = new StopWatch();
 
-        LOG.debug("Loading type converters ...");
+        log.debug("Loading type converters ...");
         for (TypeConverterLoader typeConverterLoader : getTypeConverterLoaders()) {
             typeConverterLoader.load(this);
         }
@@ -400,11 +400,11 @@ public class DefaultTypeConverter extend
         } catch (NoFactoryAvailableException e) {
             // ignore its fine to have none
         }
-        LOG.debug("Loading type converters done");
+        log.debug("Loading type converters done");
 
         // report how long time it took to load
-        if (LOG.isInfoEnabled()) {
-            LOG.info("Loaded " + typeMappings.size() + " type converters in " + TimeUtils.printDuration(watch.stop()));
+        if (log.isInfoEnabled()) {
+            log.info("Loaded " + typeMappings.size() + " type converters in " + TimeUtils.printDuration(watch.stop()));
         }
     }
 
@@ -418,7 +418,6 @@ public class DefaultTypeConverter extend
     @Override
     protected void doStart() throws Exception {
         ServiceHelper.startService(propertyEditorTypeConverter);
-        loadTypeConverters();
     }
 
     @Override

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

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

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

Added: 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=1024542&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java Wed Oct 20 08:05:45 2010
@@ -0,0 +1,44 @@
+/**
+ * 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.impl.converter;
+
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.PackageScanClassResolver;
+
+/**
+ * Default implementation of a type converter registry used for
+ * <a href="http://camel.apache.org/type-converter.html">type converters</a> in Camel.
+ * <p/>
+ * This implementation will load type converters up-front on startup.
+ *
+ * @version $Revision$
+ */
+public class DefaultTypeConverter extends BaseTypeConverterRegistry {
+
+    public DefaultTypeConverter(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder) {
+        super(resolver, injector, factoryFinder);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        // load type converters up front
+        loadTypeConverters();
+    }
+
+}

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/LazyLoadingTypeConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/LazyLoadingTypeConverter.java?rev=1024542&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/LazyLoadingTypeConverter.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/LazyLoadingTypeConverter.java Wed Oct 20 08:05:45 2010
@@ -0,0 +1,91 @@
+/**
+ * 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.impl.converter;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.PackageScanClassResolver;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Lazy implementation of a type converter registry used for
+ * <a href="http://camel.apache.org/type-converter.html">type converters</a> in Camel.
+ * <p/>
+ * This implementation will lazy load type converters on-demand.
+ *
+ * @version $Revision$
+ */
+public class LazyLoadingTypeConverter extends BaseTypeConverterRegistry {
+    private final AtomicBoolean loaded = new AtomicBoolean();
+
+    public LazyLoadingTypeConverter(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder) {
+        super(resolver, injector, factoryFinder);
+    }
+
+    @Override
+    protected Object doConvertTo(final Class type, final Exchange exchange, final Object value) {
+        ensureLoaded();
+        return super.doConvertTo(type, exchange, value);
+    }
+
+    @Override
+    public TypeConverter getTypeConverter(Class<?> toType, Class<?> fromType) {
+        ensureLoaded();
+        return super.getTypeConverter(toType, fromType);
+    }
+
+    @Override
+    public Set<Class<?>> getFromClassMappings() {
+        ensureLoaded();
+        return super.getFromClassMappings();
+    }
+
+    @Override
+    public Map<Class<?>, TypeConverter> getToClassMappings(Class<?> fromClass) {
+        ensureLoaded();
+        return super.getToClassMappings(fromClass);
+    }
+
+    @Override
+    public Map<TypeMapping, TypeConverter> getTypeMappings() {
+        ensureLoaded();
+        return super.getTypeMappings();
+    }
+
+    @Override
+    protected TypeConverter doLookup(Class<?> toType, Class<?> fromType, boolean isSuper) {
+        ensureLoaded();
+        return super.doLookup(toType, fromType, isSuper);
+    }
+
+    private synchronized void ensureLoaded() {
+        if (loaded.compareAndSet(false, true)) {
+            try {
+                super.loadTypeConverters();
+            } catch (Exception e) {
+                throw ObjectHelper.wrapRuntimeCamelException(e);
+            }
+        }
+    }
+
+}

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterAware.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterAware.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterAware.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterAware.java Wed Oct 20 08:05:45 2010
@@ -22,7 +22,7 @@ import org.apache.camel.TypeConverter;
  * An interface for an object which is interested in being injected with the root {@link TypeConverter}
  * such as for implementing a fallback type converter
  *
- * @see org.apache.camel.impl.converter.DefaultTypeConverter#addFallbackTypeConverter(org.apache.camel.TypeConverter, boolean)
+ * @see TypeConverterRegistry
  * @version $Revision$
  */
 public interface TypeConverterAware {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java Wed Oct 20 08:05:45 2010
@@ -36,7 +36,6 @@ import org.apache.camel.util.ServiceHelp
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-
 /**
  * @version $Revision$
  */

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextLazyLoadTypeConvertersTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextLazyLoadTypeConvertersTest.java?rev=1024542&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextLazyLoadTypeConvertersTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextLazyLoadTypeConvertersTest.java Wed Oct 20 08:05:45 2010
@@ -0,0 +1,63 @@
+/**
+ * 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.impl;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.TestSupport;
+import org.apache.camel.TypeConverter;
+
+/**
+ * Tests the lazy loading property of the camel context. The default behavior is to
+ * load all of the type converters up front. When the lazy load property is enabled
+ * on the context, the loading will be deferred until the converters are accessed.
+ */
+public class DefaultCamelContextLazyLoadTypeConvertersTest extends TestSupport {
+
+    private CamelContext context = new DefaultCamelContext();
+
+    public void testLazyLoadDefault() throws Exception {
+        assertFalse("Default setting should have been true", context.isLazyLoadTypeConverters());
+    }
+
+    public void testConvertLoadUpFront() throws Exception {
+        context.setLazyLoadTypeConverters(false);
+        doConvertTest();
+    }
+
+    public void testConvertLazyLoad() throws Exception {
+        context.setLazyLoadTypeConverters(true);
+        doConvertTest();
+    }
+    
+    private void doConvertTest() throws Exception {
+        context.start();
+        convert();
+        context.stop();
+        convert();
+    }
+
+    private void convert() throws Exception {
+        TypeConverter converter = context.getTypeConverter();
+        Integer value = converter.convertTo(Integer.class, "1000");
+        assertNotNull(value);
+        assertEquals("Converted to Integer", new Integer(1000), value);
+
+        String text = converter.convertTo(String.class, value);
+        assertEquals("Converted to String", "1000", text);
+    }
+    
+}

Modified: camel/trunk/camel-core/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/log4j.properties (original)
+++ camel/trunk/camel-core/src/test/resources/log4j.properties Wed Oct 20 08:05:45 2010
@@ -20,7 +20,7 @@
 #
 log4j.rootLogger=INFO, file
 
-log4j.logger.org.apache.camel.impl.converter=WARN
+#log4j.logger.org.apache.camel.impl.converter=WARN
 log4j.logger.org.apache.camel.management=WARN
 log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
 #log4j.logger.org.apache.camel.impl.converter.DefaultTypeConverter=TRACE

Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java Wed Oct 20 08:05:45 2010
@@ -83,6 +83,8 @@ public class CamelContextFactoryBean ext
     private ShutdownRoute shutdownRoute;
     @XmlAttribute(required = false)
     private ShutdownRunningTask shutdownRunningTask;
+    @XmlAttribute(required = false)
+    private Boolean lazyLoadTypeConverters = Boolean.FALSE;
     @XmlElement(name = "properties", required = false)
     private PropertiesDefinition properties;
     @XmlElement(name = "propertyPlaceholder", type = CamelPropertyPlaceholderDefinition.class, required = false)
@@ -212,6 +214,14 @@ public class CamelContextFactoryBean ext
         this.autoStartup = autoStartup;
     }
 
+    public Boolean getLazyLoadTypeConverters() {
+        return lazyLoadTypeConverters;
+    }
+
+    public void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters) {
+        this.lazyLoadTypeConverters = lazyLoadTypeConverters;
+    }
+
     public ShutdownRoute getShutdownRoute() {
         return shutdownRoute;
     }

Modified: camel/trunk/components/camel-blueprint/src/test/resources/test.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/test/resources/test.xml?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/test/resources/test.xml (original)
+++ camel/trunk/components/camel-blueprint/src/test/resources/test.xml Wed Oct 20 08:05:45 2010
@@ -21,8 +21,8 @@
 
     <camelContext xmlns="http://camel.apache.org/schema/blueprint">
         <route>
-            <from uri="timer:test" />
-            <to uri="log:test" />
+            <from uri="timer:test"/>
+            <to uri="log:test"/>
         </route>
     </camelContext>
 

Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java Wed Oct 20 08:05:45 2010
@@ -131,7 +131,11 @@ public abstract class AbstractCamelConte
             getContext().setProperties(getProperties().asMap());
         }
 
-        // set the resolvers first
+        // set the type converter mode first
+        if (getLazyLoadTypeConverters() != null) {
+            getContext().setLazyLoadTypeConverters(getLazyLoadTypeConverters());
+        }
+
         PackageScanClassResolver packageResolver = getBeanForType(PackageScanClassResolver.class);
         if (packageResolver != null) {
             LOG.info("Using custom PackageScanClassResolver: " + packageResolver);
@@ -564,6 +568,8 @@ public abstract class AbstractCamelConte
 
     public abstract String getAutoStartup();
 
+    public abstract Boolean getLazyLoadTypeConverters();
+
     public abstract CamelJMXAgentDefinition getCamelJMXAgent();
 
     public abstract List<RouteBuilderDefinition> getBuilderRefs();

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Wed Oct 20 08:05:45 2010
@@ -100,6 +100,8 @@ public class CamelContextFactoryBean ext
     private ShutdownRoute shutdownRoute;
     @XmlAttribute(required = false)
     private ShutdownRunningTask shutdownRunningTask;
+    @XmlAttribute(required = false)
+    private Boolean lazyLoadTypeConverters = Boolean.FALSE;
     @XmlElement(name = "properties", required = false)
     private PropertiesDefinition properties;
     @XmlElement(name = "propertyPlaceholder", type = CamelPropertyPlaceholderDefinition.class, required = false)
@@ -442,6 +444,14 @@ public class CamelContextFactoryBean ext
         this.autoStartup = autoStartup;
     }
 
+    public Boolean getLazyLoadTypeConverters() {
+        return lazyLoadTypeConverters;
+    }
+
+    public void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters) {
+        this.lazyLoadTypeConverters = lazyLoadTypeConverters;
+    }
+
     public CamelJMXAgentDefinition getCamelJMXAgent() {
         return camelJMXAgent;
     }

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.java?rev=1024542&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.java Wed Oct 20 08:05:45 2010
@@ -0,0 +1,48 @@
+/**
+ * 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.spring;
+
+import org.apache.camel.TypeConverter;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision$
+ */
+public class CamelContextLazyLoadTypeConvertersTest extends SpringTestSupport {
+
+    @Override
+    protected int getExpectedRouteCount() {
+        return 0;
+    }
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml");
+    }
+
+    public void testConvert() throws Exception {
+        TypeConverter converter = context.getTypeConverter();
+        Integer value = converter.convertTo(Integer.class, "1000");
+        assertNotNull(value);
+        assertEquals("Converted to Integer", new Integer(1000), value);
+
+        String text = converter.convertTo(String.class, value);
+        assertEquals("Converted to String", "1000", text);
+    }
+
+}

Modified: camel/trunk/components/camel-spring/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/log4j.properties?rev=1024542&r1=1024541&r2=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/log4j.properties (original)
+++ camel/trunk/components/camel-spring/src/test/resources/log4j.properties Wed Oct 20 08:05:45 2010
@@ -21,7 +21,7 @@
 log4j.rootLogger=INFO, file
 
 log4j.logger.org.springframework=WARN
-log4j.logger.org.apache.camel.impl.converter=WARN
+#log4j.logger.org.apache.camel.impl.converter=WARN
 log4j.logger.org.apache.camel.management=WARN
 log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
 

Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml (from r1024527, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml&r1=1024527&r2=1024542&rev=1024542&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/camelContextAwareBean.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/CamelContextLazyLoadTypeConvertersTest.xml Wed Oct 20 08:05:45 2010
@@ -23,20 +23,9 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-  <camelContext id="camel1" xmlns="http://camel.apache.org/schema/spring">
-    <properties>
-       <property key="org.apache.camel.test" value="this is a test first"/>
-    </properties>
-    <template id="producer1"/>
-  </camelContext>
-  
-  <camel:camelContext id="camel2">
-    <camel:template id="producer2"/>
-    <camel:consumerTemplate id="consumer"/>
-  </camel:camelContext>
-
-  <bean id="bean1" class="org.apache.camel.spring.CamelContextAwareBean">
-     <property name="camelContext" ref="camel1" />
-  </bean>
+    <!-- lazy load type converters -->
+    <camelContext lazyLoadTypeConverters="true" xmlns="http://camel.apache.org/schema/spring">
+        <!-- noop -->
+    </camelContext>
 
 </beans>