Author: ningjiang Date: Tue Jan 6 19:09:24 2009 New Revision: 732207 URL: http://svn.apache.org/viewvc?rev=732207&view=rev Log: CAMEL-1223 FactoryFinder should support OSGI as well
Added: activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java (with props) Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Tue Jan 6 19:09:24 2009 @@ -31,6 +31,7 @@ import org.apache.camel.spi.LifecycleStrategy; import org.apache.camel.spi.Registry; import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.camel.util.FactoryFinder; /** * Interface used to represent the context used to configure routes and the @@ -302,4 +303,17 @@ * @return the data formats available */ Map<String, DataFormatType> getDataFormats(); + + /** + * Create a FactoryFinder which will be used for the loading the factory class from META-INF + * @return the factory finder + */ + FactoryFinder createFactoryFinder(); + + /** + * Create a FactoryFinder which will be used for the loading the factory class from META-INF + * @param path the META-INF path + * @return the factory finder + */ + FactoryFinder createFactoryFinder(String path); } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/FileEndpoint.java Tue Jan 6 19:09:24 2009 @@ -477,7 +477,7 @@ protected FileProcessStrategy createFileStrategy() { Class<?> factory = null; try { - FactoryFinder finder = new FactoryFinder("META-INF/services/org/apache/camel/component/"); + FactoryFinder finder = getCamelContext().createFactoryFinder("META-INF/services/org/apache/camel/component/"); factory = finder.findClass("file", "strategy.factory."); } catch (ClassNotFoundException e) { LOG.debug("'strategy.factory.class' not found", e); Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Tue Jan 6 19:09:24 2009 @@ -17,6 +17,7 @@ package org.apache.camel.impl; import java.io.IOException; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -68,7 +69,6 @@ import static org.apache.camel.util.ServiceHelper.startServices; import static org.apache.camel.util.ServiceHelper.stopServices; - /** * Represents the context used to configure routes and the policies to use. * @@ -99,6 +99,7 @@ private Long delay; private ErrorHandlerBuilder errorHandlerBuilder; private Map<String, DataFormatType> dataFormats = new HashMap<String, DataFormatType>(); + private Class<? extends FactoryFinder> factoryFinderClass = FactoryFinder.class; public DefaultCamelContext() { name = NAME_PREFIX + ++nameSuffix; @@ -716,7 +717,7 @@ * Lazily create a default implementation */ protected Injector createInjector() { - FactoryFinder finder = new FactoryFinder(); + FactoryFinder finder = createFactoryFinder(); try { return (Injector) finder.newInstance("Injector"); } catch (NoFactoryAvailableException e) { @@ -794,4 +795,27 @@ public Map<String, DataFormatType> getDataFormats() { return dataFormats; } + + public void setFactoryFinderClass(Class<? extends FactoryFinder> finderClass) { + factoryFinderClass = finderClass; + } + + public FactoryFinder createFactoryFinder() { + try { + return factoryFinderClass.newInstance(); + } catch (Exception e) { + throw new RuntimeCamelException(e); + } + } + + public FactoryFinder createFactoryFinder(String path) { + try { + Constructor<? extends FactoryFinder> constructor; + constructor = factoryFinderClass.getConstructor(String.class); + return constructor.newInstance(path); + } catch (Exception e) { + throw new RuntimeCamelException(e); + } + + } } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java Tue Jan 6 19:09:24 2009 @@ -32,7 +32,7 @@ */ public class FactoryFinder { private final String path; - private final ConcurrentHashMap classMap = new ConcurrentHashMap(); + protected final ConcurrentHashMap<String, Class> classMap = new ConcurrentHashMap<String, Class>(); public FactoryFinder() { this("META-INF/services/org/apache/camel/"); @@ -66,7 +66,7 @@ public Object newInstance(String key, Injector injector, String propertyPrefix) throws IOException, ClassNotFoundException { - Class type = findClass(key, propertyPrefix); + Class<?> type = findClass(key, propertyPrefix); return injector.newInstance(type); } @@ -77,7 +77,7 @@ public <T> T newInstance(String key, Injector injector, String propertyPrefix, Class<T> expectedType) throws IOException, ClassNotFoundException { - Class type = findClass(key, propertyPrefix); + Class<?> type = findClass(key, propertyPrefix); Object value = injector.newInstance(type); if (expectedType.isInstance(value)) { return expectedType.cast(value); Modified: activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java (original) +++ activemq/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java Tue Jan 6 19:09:24 2009 @@ -389,7 +389,7 @@ protected RemoteFileProcessStrategy createRemoteFileStrategy() { Class<?> factory = null; try { - FactoryFinder finder = new FactoryFinder("META-INF/services/org/apache/camel/component/"); + FactoryFinder finder = getCamelContext().createFactoryFinder("META-INF/services/org/apache/camel/component/"); factory = finder.findClass("ftp", "strategy.factory."); } catch (ClassNotFoundException e) { LOG.debug("'strategy.factory.class' not found", e); Modified: activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java (original) +++ activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java Tue Jan 6 19:09:24 2009 @@ -27,6 +27,7 @@ import org.apache.camel.impl.converter.DefaultTypeConverter; import org.apache.camel.impl.converter.TypeConverterLoader; import org.apache.camel.spring.SpringCamelContext; +import org.apache.camel.util.FactoryFinder; import org.osgi.framework.BundleContext; import org.springframework.osgi.context.BundleContextAware; @@ -44,14 +45,14 @@ public void setBundleContext(BundleContext bundleContext) { this.bundleContext = bundleContext; } - - + protected SpringCamelContext createContext() { SpringCamelContext context = super.createContext(); if (bundleContext != null) { context.setComponentResolver(new OsgiComponentResolver()); context.setLanguageResolver(new OsgiLanguageResolver()); - addOsgiAnnotationTypeConverterLoader(context, bundleContext); + addOsgiAnnotationTypeConverterLoader(context, bundleContext); + context.setFactoryFinderClass(OsgiFactoryFinder.class); } return context; @@ -72,6 +73,6 @@ typeConverterLoaders.remove(atLoader); } typeConverterLoaders.add(new OsgiAnnotationTypeConverterLoader(bundleContext)); - } - + } + } Added: activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java?rev=732207&view=auto ============================================================================== --- activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java (added) +++ activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java Tue Jan 6 19:09:24 2009 @@ -0,0 +1,99 @@ +/** + * 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.osgi; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Properties; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +import org.apache.camel.util.FactoryFinder; +import org.apache.camel.util.NoFactoryAvailableException; +import org.apache.camel.util.ObjectHelper; + +public class OsgiFactoryFinder extends FactoryFinder { + + private class BundleEntry { + URL url; + Bundle bundle; + } + + public OsgiFactoryFinder() { + super(); + } + + public OsgiFactoryFinder(String path) { + super(path); + } + + public Class findClass(String key, String propertyPrefix) throws ClassNotFoundException, IOException { + if (propertyPrefix == null) { + propertyPrefix = ""; + } + + Class clazz = (Class)classMap.get(propertyPrefix + key); + Properties properties = null; + if (clazz == null) { + BundleEntry entry = getResource(key); + if (entry != null) { + URL url = entry.url; + InputStream in = url.openStream(); + // lets load the file + BufferedInputStream reader = null; + try { + reader = new BufferedInputStream(in); + properties = new Properties(); + properties.load(reader); + String className = properties.getProperty(propertyPrefix + "class"); + if (className == null) { + throw new IOException("Expected property is missing: " + propertyPrefix + "class"); + } + clazz = entry.bundle.loadClass(className); + classMap.put(propertyPrefix + key, clazz); + } finally { + ObjectHelper.close(reader, key, null); + ObjectHelper.close(in, key, null); + } + } else { + throw new NoFactoryAvailableException(propertyPrefix + key); + } + } + return clazz; + } + + + public BundleEntry getResource(String path) { + URL url = null; + BundleEntry entry = null; + BundleContext bundleContext = Activator.getBundle().getBundleContext(); + for (Bundle bundle : bundleContext.getBundles()) { + url = bundle.getEntry(path); + if (url != null) { + entry = new BundleEntry(); + entry.url = url; + entry.bundle = bundle; + break; + } + } + return entry; + } + +} Propchange: activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: activemq/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiFactoryFinder.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java?rev=732207&r1=732206&r2=732207&view=diff ============================================================================== --- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java (original) +++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java Tue Jan 6 19:09:24 2009 @@ -18,7 +18,6 @@ import org.apache.camel.Endpoint; import org.apache.camel.NoTypeConversionAvailableException; -import org.apache.camel.Processor; import org.apache.camel.component.bean.BeanProcessor; import org.apache.camel.component.event.EventComponent; import org.apache.camel.component.event.EventEndpoint; @@ -213,5 +212,6 @@ public boolean getShouldStartContext() { return shouldStartContext; - } + } + }