Author: davsclaus Date: Tue Jun 15 13:05:11 2010 New Revision: 954861 URL: http://svn.apache.org/viewvc?rev=954861&view=rev Log: CAMEL-2787: Introduced new contextScan for scanning context, eg spring registry for RouteBuilder.
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java - copied, changed from r954744, camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java (with props) camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java (contents, props changed) - copied, changed from r954744, camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/ - copied from r954744, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/componentscan/ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/ - copied from r954744, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/componentscan2/ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/ - copied from r954744, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/componentscan/ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/ - copied from r954744, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/componentscan2/ Removed: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/componentscan/ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/componentscan2/ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/componentscan/ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/componentscan2/ Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/scan/AntPathMatcher.java camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/MyRoute.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/MyOtherRoute.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/SpringPackageTest.xml camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java Tue Jun 15 13:05:11 2010 @@ -65,6 +65,12 @@ public class DefaultPackageScanClassReso scanFilters.add(filter); } + public void removeFilter(PackageScanFilter filter) { + if (scanFilters != null) { + scanFilters.remove(filter); + } + } + public Set<ClassLoader> getClassLoaders() { if (classLoaders == null) { classLoaders = new HashSet<ClassLoader>(); Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java (from r954744, camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java&r1=954744&r2=954861&rev=954861&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ContextScanDefinition.java Tue Jun 15 13:05:11 2010 @@ -18,21 +18,17 @@ package org.apache.camel.model; import java.util.ArrayList; import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** - * <code>PackageScanDefinition</code> represents a <package-scan/> element. + * <code>ContextScanDefinition</code> represents a <contextScan/> element. */ -...@xmlrootelement(name = "packageScan") +...@xmlrootelement(name = "contextScan") @XmlAccessorType(XmlAccessType.FIELD) -public class PackageScanDefinition { - - @XmlElement(name = "package", required = true) - private List<String> packages = new ArrayList<String>(); +public class ContextScanDefinition { @XmlElement(name = "excludes", required = false) private List<String> excludes = new ArrayList<String>(); @@ -48,14 +44,6 @@ public class PackageScanDefinition { return includes; } - public List<String> getPackages() { - return packages; - } - - public void setPackages(List<String> packages) { - this.packages = packages; - } - public void setExcludes(List<String> excludes) { this.excludes = excludes; } @@ -65,8 +53,7 @@ public class PackageScanDefinition { } protected void clear() { - packages.clear(); excludes.clear(); includes.clear(); } -} +} \ No newline at end of file Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/PackageScanDefinition.java Tue Jun 15 13:05:11 2010 @@ -25,7 +25,7 @@ import javax.xml.bind.annotation.XmlElem import javax.xml.bind.annotation.XmlRootElement; /** - * <code>PackageScanDefinition</code> represents a <package-scan/> element. + * <code>PackageScanDefinition</code> represents a <packageScan/> element. */ @XmlRootElement(name = "packageScan") @XmlAccessorType(XmlAccessType.FIELD) Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java Tue Jun 15 13:05:11 2010 @@ -77,13 +77,13 @@ public interface PackageScanClassResolve Set<Class<?>> findImplementations(Class<?> parent, String... packageNames); /** - * Attemsp to discover classes filter by the provided filter + * Attempts to discover classes filter by the provided filter * - * @param fiter filter to filter desired classes. + * @param filter filter to filter desired classes. * @param packageNames one or more package names to scan (including subpackages) for classes * @return the classes found, returns an empty set if none found */ - Set<Class<?>> findByFilter(PackageScanFilter fiter, String... packageNames); + Set<Class<?>> findByFilter(PackageScanFilter filter, String... packageNames); /** * Add a filter that will be applied to all scan operations @@ -91,4 +91,11 @@ public interface PackageScanClassResolve * @param filter filter to filter desired classes in all scan operations */ void addFilter(PackageScanFilter filter); + + /** + * Removes the filter + * + * @param filter filter to filter desired classes in all scan operations + */ + void removeFilter(PackageScanFilter filter); } Modified: camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index (original) +++ camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index Tue Jun 15 13:05:11 2010 @@ -20,6 +20,7 @@ BeanDefinition CatchDefinition ChoiceDefinition ConvertBodyDefinition +ContextScanDefinition DataFormatDefinition DelayDefinition DescriptionDefinition 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=954861&r1=954860&r2=954861&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 Tue Jun 15 13:05:11 2010 @@ -36,6 +36,7 @@ import org.apache.camel.core.xml.CamelJM import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition; import org.apache.camel.core.xml.CamelProxyFactoryDefinition; import org.apache.camel.core.xml.CamelServiceExporterDefinition; +import org.apache.camel.model.ContextScanDefinition; import org.apache.camel.model.InterceptDefinition; import org.apache.camel.model.InterceptFromDefinition; import org.apache.camel.model.InterceptSendToEndpointDefinition; @@ -48,6 +49,7 @@ import org.apache.camel.model.RouteDefin import org.apache.camel.model.ThreadPoolProfileDefinition; import org.apache.camel.model.config.PropertiesDefinition; import org.apache.camel.model.dataformat.DataFormatsDefinition; +import org.apache.camel.spi.PackageScanFilter; import org.osgi.framework.BundleContext; import org.osgi.service.blueprint.container.BlueprintContainer; @@ -89,6 +91,8 @@ public class CamelContextFactoryBean ext private String[] packages = {}; @XmlElement(name = "packageScan", type = PackageScanDefinition.class, required = false) private PackageScanDefinition packageScan; + @XmlElement(name = "contextScan", type = ContextScanDefinition.class, required = false) + private ContextScanDefinition contextScan; @XmlElement(name = "jmxAgent", type = CamelJMXAgentDefinition.class, required = false) private CamelJMXAgentDefinition camelJMXAgent; @XmlElements({ @@ -180,7 +184,11 @@ public class CamelContextFactoryBean ext } @Override - protected void findRouteBuilders(String[] normalized, List<RoutesBuilder> builders) throws Exception { + protected void findRouteBuildersByPackageScan(String[] packages, PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception { + } + + @Override + protected void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception { } public String getDependsOn() { @@ -311,6 +319,14 @@ public class CamelContextFactoryBean ext this.packageScan = packageScan; } + public ContextScanDefinition getContextScan() { + return contextScan; + } + + public void setContextScan(ContextScanDefinition contextScan) { + this.contextScan = contextScan; + } + public CamelJMXAgentDefinition getCamelJMXAgent() { return camelJMXAgent; } 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=954861&r1=954860&r2=954861&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 Tue Jun 15 13:05:11 2010 @@ -17,6 +17,8 @@ package org.apache.camel.core.xml; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -40,6 +42,7 @@ import org.apache.camel.management.Defau import org.apache.camel.management.DefaultManagementLifecycleStrategy; import org.apache.camel.management.DefaultManagementStrategy; import org.apache.camel.management.ManagedManagementStrategy; +import org.apache.camel.model.ContextScanDefinition; import org.apache.camel.model.FromDefinition; import org.apache.camel.model.IdentifiedType; import org.apache.camel.model.InterceptDefinition; @@ -72,6 +75,7 @@ import org.apache.camel.spi.InterceptStr import org.apache.camel.spi.LifecycleStrategy; import org.apache.camel.spi.ManagementStrategy; import org.apache.camel.spi.PackageScanClassResolver; +import org.apache.camel.spi.PackageScanFilter; import org.apache.camel.spi.ShutdownStrategy; import org.apache.camel.spi.ThreadPoolProfile; import org.apache.camel.util.CamelContextHelper; @@ -90,71 +94,8 @@ import org.apache.commons.logging.LogFac */ @XmlAccessorType(XmlAccessType.FIELD) public abstract class AbstractCamelContextFactoryBean<T extends CamelContext> extends IdentifiedType implements RouteContainer { - private static final Log LOG = LogFactory.getLog(AbstractCamelContextFactoryBean.class); -// @XmlAttribute(name = "depends-on", required = false) -// private String dependsOn; -// @XmlAttribute(required = false) -// private String trace; -// @XmlAttribute(required = false) -// private String streamCache = "false"; -// @XmlAttribute(required = false) -// private String delayer; -// @XmlAttribute(required = false) -// private String handleFault; -// @XmlAttribute(required = false) -// private String errorHandlerRef; -// @XmlAttribute(required = false) -// private String autoStartup = "true"; -// @XmlAttribute(required = false) -// private ShutdownRoute shutdownRoute; -// @XmlAttribute(required = false) -// private ShutdownRunningTask shutdownRunningTask; -// @XmlElement(name = "properties", required = false) -// private PropertiesDefinition properties; -// @XmlElement(name = "propertyPlaceholder", type = CamelPropertyPlaceholderDefinition.class, required = false) -// private CamelPropertyPlaceholderDefinition camelPropertyPlaceholder; -// @XmlElement(name = "package", required = false) -// private String[] packages = {}; -// @XmlElement(name = "packageScan", type = PackageScanDefinition.class, required = false) -// private PackageScanDefinition packageScan; -// @XmlElement(name = "jmxAgent", type = CamelJMXAgentDefinition.class, required = false) -// private CamelJMXAgentDefinition camelJMXAgent; -//// @XmlElements({ -//// @XmlElement(name = "beanPostProcessor", type = CamelBeanPostProcessor.class, required = false), -//// @XmlElement(name = "template", type = CamelProducerTemplateFactoryBean.class, required = false), -//// @XmlElement(name = "consumerTemplate", type = CamelConsumerTemplateFactoryBean.class, required = false), -//// @XmlElement(name = "proxy", type = CamelProxyFactoryDefinition.class, required = false), -//// @XmlElement(name = "export", type = CamelServiceExporterDefinition.class, required = false), -//// @XmlElement(name = "errorHandler", type = ErrorHandlerDefinition.class, required = false)}) -//// private List beans; -// @XmlElement(name = "routeBuilder", required = false) -// private List<RouteBuilderDefinition> builderRefs = new ArrayList<RouteBuilderDefinition>(); -// @XmlElement(name = "routeContextRef", required = false) -// private List<RouteContextRefDefinition> routeRefs = new ArrayList<RouteContextRefDefinition>(); -// @XmlElement(name = "threadPoolProfile", required = false) -// private List<ThreadPoolProfileDefinition> threadPoolProfiles; -//// @XmlElement(name = "threadPool", required = false) -//// private List<AbstractCamelThreadPoolFactoryBean> threadPools; -//// @XmlElement(name = "endpoint", required = false) -//// private List<AbstractCamelEndpointFactoryBean> endpoints; -// @XmlElement(name = "dataFormats", required = false) -// private DataFormatsDefinition dataFormats; -// @XmlElement(name = "onException", required = false) -// private List<OnExceptionDefinition> onExceptions = new ArrayList<OnExceptionDefinition>(); -// @XmlElement(name = "onCompletion", required = false) -// private List<OnCompletionDefinition> onCompletions = new ArrayList<OnCompletionDefinition>(); -// @XmlElement(name = "intercept", required = false) -// private List<InterceptDefinition> intercepts = new ArrayList<InterceptDefinition>(); -// @XmlElement(name = "interceptFrom", required = false) -// private List<InterceptFromDefinition> interceptFroms = new ArrayList<InterceptFromDefinition>(); -// @XmlElement(name = "interceptSendToEndpoint", required = false) -// private List<InterceptSendToEndpointDefinition> interceptSendToEndpoints = new ArrayList<InterceptSendToEndpointDefinition>(); -// @XmlElement(name = "route", required = false) -// private List<RouteDefinition> routes = new ArrayList<RouteDefinition>(); -// @XmlTransient -// private T context; @XmlTransient private List<RoutesBuilder> builders = new ArrayList<RoutesBuilder>(); @XmlTransient @@ -692,6 +633,10 @@ public abstract class AbstractCamelConte public abstract void setPackageScan(PackageScanDefinition packageScan); + public abstract ContextScanDefinition getContextScan(); + + public abstract void setContextScan(ContextScanDefinition contextScan); + public abstract CamelPropertyPlaceholderDefinition getCamelPropertyPlaceholder(); public abstract String getTrace(); @@ -846,9 +791,8 @@ public abstract class AbstractCamelConte * Strategy method to try find {...@link org.apache.camel.builder.RouteBuilder} instances on the classpath */ protected void findRouteBuilders() throws Exception { - PackageScanClassResolver resolver = getContext().getPackageScanClassResolver(); + // package scan addPackageElementContentsToScanDefinition(); - PackageScanDefinition packageScanDef = getPackageScan(); if (packageScanDef != null && packageScanDef.getPackages().size() > 0) { // use package scan filter @@ -862,14 +806,32 @@ public abstract class AbstractCamelConte exclude = getContext().resolvePropertyPlaceholders(exclude); filter.addExcludePattern(exclude); } - resolver.addFilter(filter); String[] normalized = normalizePackages(getContext(), packageScanDef.getPackages()); - findRouteBuilders(normalized, builders); + findRouteBuildersByPackageScan(normalized, filter, builders); + } + + // context scan + ContextScanDefinition contextScanDef = getContextScan(); + if (contextScanDef != null) { + // use package scan filter + PatternBasedPackageScanFilter filter = new PatternBasedPackageScanFilter(); + // support property placeholders in include and exclude + for (String include : contextScanDef.getIncludes()) { + include = getContext().resolvePropertyPlaceholders(include); + filter.addIncludePattern(include); + } + for (String exclude : contextScanDef.getExcludes()) { + exclude = getContext().resolvePropertyPlaceholders(exclude); + filter.addExcludePattern(exclude); + } + findRouteBuildersByContextScan(filter, builders); } } - protected abstract void findRouteBuilders(String[] normalized, List<RoutesBuilder> builders) throws Exception; + protected abstract void findRouteBuildersByPackageScan(String[] packages, PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception; + + protected abstract void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception; private void addPackageElementContentsToScanDefinition() { PackageScanDefinition packageScanDef = getPackageScan(); Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/scan/AntPathMatcher.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/scan/AntPathMatcher.java?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/scan/AntPathMatcher.java (original) +++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/scan/AntPathMatcher.java Tue Jun 15 13:05:11 2010 @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.camel.core.xml.scan; import java.util.ArrayList; 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=954861&r1=954860&r2=954861&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 Tue Jun 15 13:05:11 2010 @@ -18,7 +18,6 @@ package org.apache.camel.spring; import java.util.ArrayList; import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -37,6 +36,7 @@ import org.apache.camel.core.xml.CamelJM import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition; import org.apache.camel.core.xml.CamelProxyFactoryDefinition; import org.apache.camel.core.xml.CamelServiceExporterDefinition; +import org.apache.camel.model.ContextScanDefinition; import org.apache.camel.model.InterceptDefinition; import org.apache.camel.model.InterceptFromDefinition; import org.apache.camel.model.InterceptSendToEndpointDefinition; @@ -49,6 +49,7 @@ import org.apache.camel.model.RouteDefin import org.apache.camel.model.ThreadPoolProfileDefinition; import org.apache.camel.model.config.PropertiesDefinition; import org.apache.camel.model.dataformat.DataFormatsDefinition; +import org.apache.camel.spi.PackageScanFilter; import org.apache.camel.spi.Registry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -75,8 +76,8 @@ import static org.apache.camel.util.Obje @XmlRootElement(name = "camelContext") @XmlAccessorType(XmlAccessType.FIELD) @SuppressWarnings("unused") -public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<SpringCamelContext> - implements FactoryBean, InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener { +public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<SpringCamelContext> + implements FactoryBean, InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener { private static final Log LOG = LogFactory.getLog(CamelContextFactoryBean.class); @XmlAttribute(name = "depends-on", required = false) @@ -105,15 +106,17 @@ public class CamelContextFactoryBean ext private String[] packages = {}; @XmlElement(name = "packageScan", type = PackageScanDefinition.class, required = false) private PackageScanDefinition packageScan; + @XmlElement(name = "contextScan", type = ContextScanDefinition.class, required = false) + private ContextScanDefinition contextScan; @XmlElement(name = "jmxAgent", type = CamelJMXAgentDefinition.class, required = false) private CamelJMXAgentDefinition camelJMXAgent; @XmlElements({ - @XmlElement(name = "beanPostProcessor", type = CamelBeanPostProcessor.class, required = false), - @XmlElement(name = "template", type = CamelProducerTemplateFactoryBean.class, required = false), - @XmlElement(name = "consumerTemplate", type = CamelConsumerTemplateFactoryBean.class, required = false), - @XmlElement(name = "proxy", type = CamelProxyFactoryDefinition.class, required = false), - @XmlElement(name = "export", type = CamelServiceExporterDefinition.class, required = false), - @XmlElement(name = "errorHandler", type = ErrorHandlerDefinition.class, required = false)}) + @XmlElement(name = "beanPostProcessor", type = CamelBeanPostProcessor.class, required = false), + @XmlElement(name = "template", type = CamelProducerTemplateFactoryBean.class, required = false), + @XmlElement(name = "consumerTemplate", type = CamelConsumerTemplateFactoryBean.class, required = false), + @XmlElement(name = "proxy", type = CamelProxyFactoryDefinition.class, required = false), + @XmlElement(name = "export", type = CamelServiceExporterDefinition.class, required = false), + @XmlElement(name = "errorHandler", type = ErrorHandlerDefinition.class, required = false)}) private List beans; @XmlElement(name = "routeBuilder", required = false) private List<RouteBuilderDefinition> builderRefs = new ArrayList<RouteBuilderDefinition>(); @@ -172,19 +175,32 @@ public class CamelContextFactoryBean ext return bean; } - protected void findRouteBuilders(String[] normalized, List<RoutesBuilder> builders) throws Exception { - RouteBuilderFinder finder = new RouteBuilderFinder(getContext(), normalized, getContextClassLoaderOnStart(), - getBeanPostProcessor(), getContext().getPackageScanClassResolver()); + @Override + protected void findRouteBuildersByPackageScan(String[] packages, PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception { + // add filter to class resolver which then will filter + getContext().getPackageScanClassResolver().addFilter(filter); + + PackageScanRouteBuilderFinder finder = new PackageScanRouteBuilderFinder(getContext(), packages, getContextClassLoaderOnStart(), + getBeanPostProcessor(), getContext().getPackageScanClassResolver()); + finder.appendBuilders(builders); + + // and remove the filter + getContext().getPackageScanClassResolver().removeFilter(filter); + } + + @Override + protected void findRouteBuildersByContextScan(PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception { + ContextScanRouteBuilderFinder finder = new ContextScanRouteBuilderFinder(getContext(), filter); finder.appendBuilders(builders); } protected void initBeanPostProcessor(SpringCamelContext context) { if (beanPostProcessor != null) { if (beanPostProcessor instanceof ApplicationContextAware) { - ((ApplicationContextAware)beanPostProcessor).setApplicationContext(applicationContext); + ((ApplicationContextAware) beanPostProcessor).setApplicationContext(applicationContext); } if (beanPostProcessor instanceof CamelBeanPostProcessor) { - ((CamelBeanPostProcessor)beanPostProcessor).setCamelContext(getContext()); + ((CamelBeanPostProcessor) beanPostProcessor).setCamelContext(getContext()); } } } @@ -233,6 +249,7 @@ public class CamelContextFactoryBean ext // Properties // ------------------------------------------------------------------------- + public ApplicationContext getApplicationContext() { if (applicationContext == null) { throw new IllegalArgumentException("No applicationContext has been injected!"); @@ -243,7 +260,7 @@ public class CamelContextFactoryBean ext public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } - + public void setBeanPostProcessor(BeanPostProcessor postProcessor) { this.beanPostProcessor = postProcessor; } @@ -353,6 +370,21 @@ public class CamelContextFactoryBean ext this.packageScan = packageScan; } + public ContextScanDefinition getContextScan() { + return contextScan; + } + + /** + * Sets the context scanning (eg Spring's ApplicationContext) information. + * Context scanning allows for the automatic discovery of Camel routes runtime for inclusion + * e.g. {...@link org.apache.camel.builder.RouteBuilder} implementations + * + * @param contextScan the context scan + */ + public void setContextScan(ContextScanDefinition contextScan) { + this.contextScan = contextScan; + } + public CamelPropertyPlaceholderDefinition getCamelPropertyPlaceholder() { return camelPropertyPlaceholder; } Added: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java?rev=954861&view=auto ============================================================================== --- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java (added) +++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java Tue Jun 15 13:05:11 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.spring; + +import java.util.List; +import java.util.Map; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.spi.PackageScanFilter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.context.ApplicationContext; + +/** + * A helper class which will find all {...@link org.apache.camel.builder.RouteBuilder} instances on the + * Spring {...@link org.springframework.context.ApplicationContext}. + * + * @version $Revision$ + */ +public class ContextScanRouteBuilderFinder { + private static final transient Log LOG = LogFactory.getLog(ContextScanRouteBuilderFinder.class); + private final ApplicationContext applicationContext; + private final PackageScanFilter filter; + + public ContextScanRouteBuilderFinder(SpringCamelContext camelContext, PackageScanFilter filter) { + this.applicationContext = camelContext.getApplicationContext(); + this.filter = filter; + } + + /** + * Appends all the {...@link org.apache.camel.builder.RouteBuilder} instances that can be found in the context + */ + public void appendBuilders(List<RoutesBuilder> list) { + Map beans = applicationContext.getBeansOfType(RoutesBuilder.class, true, true); + + for (Object key : beans.keySet()) { + Object bean = beans.get(key); + + if (LOG.isTraceEnabled()) { + LOG.trace("Found RouteBuilder with id: " + key + " -> " + bean); + } + + // certain beans should be ignored + if (shouldIgnoreBean(bean)) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring RouteBuilder id: " + key); + } + continue; + } + + if (!isFilteredClass(bean)) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring filtered RouteBuilder id: " + key + " as class: " + bean.getClass()); + } + continue; + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Adding instantiated RouteBuilder id: " + key + " as class: " + bean.getClass()); + } + list.add((RoutesBuilder) bean); + } + } + + protected boolean shouldIgnoreBean(Object bean) { + return false; + } + + protected boolean isFilteredClass(Object bean) { + if (filter != null) { + return filter.matches(bean.getClass()); + } else { + return false; + } + } + +} \ No newline at end of file Propchange: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ContextScanRouteBuilderFinder.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java (from r954744, camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java?p2=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java&p1=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java&r1=954744&r2=954861&rev=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java (original) +++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java Tue Jun 15 13:05:11 2010 @@ -22,30 +22,27 @@ import java.util.Map; import java.util.Set; import org.apache.camel.RoutesBuilder; -import org.apache.camel.builder.RouteBuilder; import org.apache.camel.spi.PackageScanClassResolver; -import org.apache.camel.util.ObjectHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; /** * A helper class which will find all {...@link org.apache.camel.builder.RouteBuilder} instances on the classpath * * @version $Revision$ */ -public class RouteBuilderFinder { - private static final transient Log LOG = LogFactory.getLog(RouteBuilderFinder.class); +public class PackageScanRouteBuilderFinder { + private static final transient Log LOG = LogFactory.getLog(PackageScanRouteBuilderFinder.class); private final SpringCamelContext camelContext; private final String[] packages; - private PackageScanClassResolver resolver; - private ApplicationContext applicationContext; - private BeanPostProcessor beanPostProcessor; + private final PackageScanClassResolver resolver; + private final ApplicationContext applicationContext; + private final BeanPostProcessor beanPostProcessor; - public RouteBuilderFinder(SpringCamelContext camelContext, String[] packages, ClassLoader classLoader, - BeanPostProcessor postProcessor, PackageScanClassResolver resolver) { + public PackageScanRouteBuilderFinder(SpringCamelContext camelContext, String[] packages, ClassLoader classLoader, + BeanPostProcessor postProcessor, PackageScanClassResolver resolver) { this.camelContext = camelContext; this.applicationContext = camelContext.getApplicationContext(); this.packages = packages; @@ -65,16 +62,6 @@ public class RouteBuilderFinder { LOG.trace("Found RouteBuilder class: " + aClass); } - // check whether the class has already been instantiate by Spring as it was @Component annotated - // and its already enlisted in the Spring registry - RouteBuilder existing = isRouteBuilderAlreadyRegisteredByComponentAnnotation(aClass); - if (existing != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Adding existing @Component annotated RouteBuilder: " + aClass); - } - list.add(existing); - continue; - } // certain beans should be ignored if (shouldIgnoreBean(aClass)) { if (LOG.isDebugEnabled()) { @@ -104,43 +91,6 @@ public class RouteBuilderFinder { } /** - * Lookup if the given class has already been enlisted in Spring registry since the class - * has been @Component annotated. - * - * @param type the class type - * @return the existing route builder instance, or <tt>null</tt> if none existed - */ - protected RouteBuilder isRouteBuilderAlreadyRegisteredByComponentAnnotation(Class<?> type) { - Component ann = type.getAnnotation(Component.class); - if (ann != null) { - String id = ann.value(); - if (ObjectHelper.isEmpty(id)) { - // no explicit id set, so Spring auto assigns the id, so lets try to find that id then - String[] names = applicationContext.getBeanNamesForType(type, true, true); - if (names != null && names.length == 1) { - id = names[0]; - } - } - if (ObjectHelper.isNotEmpty(id)) { - boolean match = applicationContext.isTypeMatch(id, type); - if (LOG.isTraceEnabled()) { - LOG.trace("Is there already a RouteBuilder registering in Spring with id " + id + ": " + match); - } - if (match) { - Object existing = applicationContext.getBean(id, type); - if (existing instanceof RouteBuilder) { - if (LOG.isDebugEnabled()) { - LOG.debug("Found existing @Component annotated RouteBuilder with id " + id); - } - return RouteBuilder.class.cast(existing); - } - } - } - } - return null; - } - - /** * Lets ignore beans that are explicitly configured in the Spring XML files */ protected boolean shouldIgnoreBean(Class<?> type) { Propchange: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/PackageScanRouteBuilderFinder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java (original) +++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java Tue Jun 15 13:05:11 2010 @@ -270,6 +270,7 @@ public class CamelNamespaceHandler exten builder.addPropertyValue("routeRefs", factoryBean.getRouteRefs()); builder.addPropertyValue("properties", factoryBean.getProperties()); builder.addPropertyValue("packageScan", factoryBean.getPackageScan()); + builder.addPropertyValue("contextScan", factoryBean.getContextScan()); if (factoryBean.getPackages().length > 0) { builder.addPropertyValue("packages", factoryBean.getPackages()); } Modified: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/MyRoute.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/MyRoute.java?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/MyRoute.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/MyRoute.java Tue Jun 15 13:05:11 2010 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.spring.issues.componentscan; +package org.apache.camel.spring.issues.contextscan; import org.apache.camel.spring.SpringRouteBuilder; import org.springframework.stereotype.Component; Modified: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.java?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.java Tue Jun 15 13:05:11 2010 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.spring.issues.componentscan; +package org.apache.camel.spring.issues.contextscan; import org.apache.camel.spring.SpringTestSupport; import org.springframework.context.support.AbstractXmlApplicationContext; @@ -27,7 +27,7 @@ public class SpringRouteIsComponentAnnot @Override protected AbstractXmlApplicationContext createApplicationContext() { - return new ClassPathXmlApplicationContext("org/apache/camel/spring/issues/componentscan/SpringRouteIsComponentAnnotatedTest.xml"); + return new ClassPathXmlApplicationContext("org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml"); } public void testSpringRouteIsComponentAnnotated() throws Exception { Modified: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/MyOtherRoute.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/MyOtherRoute.java?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/MyOtherRoute.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/MyOtherRoute.java Tue Jun 15 13:05:11 2010 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.spring.issues.componentscan2; +package org.apache.camel.spring.issues.contextscan2; import org.apache.camel.spring.SpringRouteBuilder; import org.springframework.stereotype.Component; Modified: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.java?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.java Tue Jun 15 13:05:11 2010 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.spring.issues.componentscan2; +package org.apache.camel.spring.issues.contextscan2; import org.apache.camel.spring.SpringTestSupport; import org.springframework.context.support.AbstractXmlApplicationContext; @@ -27,7 +27,7 @@ public class SpringRouteIsComponentAnnot @Override protected AbstractXmlApplicationContext createApplicationContext() { - return new ClassPathXmlApplicationContext("org/apache/camel/spring/issues/componentscan2/SpringRouteIsComponentAnnotated2Test.xml"); + return new ClassPathXmlApplicationContext("org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml"); } public void testSpringRouteIsComponentAnnotated() throws Exception { Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/SpringPackageTest.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/SpringPackageTest.xml?rev=954861&r1=954860&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/SpringPackageTest.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/SpringPackageTest.xml Tue Jun 15 13:05:11 2010 @@ -26,7 +26,7 @@ <packageScan> <package>org.apache.camel.spring.issues</package> <excludes>**/*MyInjectionRouteBuilder*</excludes> - <excludes>*componentscan*</excludes> + <excludes>*contextscan*</excludes> </packageScan> </camelContext> Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan/SpringRouteIsComponentAnnotatedTest.xml Tue Jun 15 13:05:11 2010 @@ -26,11 +26,11 @@ <!-- START SNIPPET: e1 --> <!-- enable Spring @Component scan --> - <context:component-scan base-package="org.apache.camel.spring.issues.componentscan"/> + <context:component-scan base-package="org.apache.camel.spring.issues.contextscan"/> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> - <!-- and then let Camel find the route builders as well --> - <package>org.apache.camel.spring.issues.componentscan</package> + <!-- and then let Camel use those @Component scanned route builders --> + <contextScan/> </camelContext> <!-- END SNIPPET: e1 --> Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml?rev=954861&r1=954744&r2=954861&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/issues/contextscan2/SpringRouteIsComponentAnnotated2Test.xml Tue Jun 15 13:05:11 2010 @@ -25,11 +25,14 @@ "> <!-- enable Spring @Component scan --> - <context:component-scan base-package="org.apache.camel.spring.issues.componentscan2"/> + <context:component-scan base-package="org.apache.camel.spring.issues.contextscan2"/> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> - <!-- and then let Camel find the route builders as well --> - <package>org.apache.camel.spring.issues.componentscan2</package> + <!-- and then let Camel use those @Component scanned route builders --> + <contextScan> + <!-- and you can use includes/excludes to filter which classes to match --> + <includes>org.apache.camel.spring.issues.contextscan2.*</includes> + </contextScan> </camelContext> </beans>