Changed language resolver
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ded7e742 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ded7e742 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ded7e742 Branch: refs/heads/master Commit: ded7e742687d8d632093ff623d60f0fd9f3a18b1 Parents: ef8edc8 Author: Nicola Ferraro <ni.ferr...@gmail.com> Authored: Wed Jul 27 16:57:22 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Jul 28 08:41:34 2016 +0200 ---------------------------------------------------------------------- .../camel/impl/DefaultComponentResolver.java | 4 +- .../camel/impl/DefaultLanguageResolver.java | 47 ++++++++----- .../impl/DefaultCamelContextResolverTest.java | 74 ++++++++++++++++++-- 3 files changed, 99 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/ded7e742/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java index abce3af..53c8b79 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java +++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java @@ -98,11 +98,11 @@ public class DefaultComponentResolver implements ComponentResolver { } if (bean != null) { - break; + return bean; } } - return bean; + return null; } private Class<?> findComponent(String name, CamelContext context) throws ClassNotFoundException, IOException { http://git-wip-us.apache.org/repos/asf/camel/blob/ded7e742/camel-core/src/main/java/org/apache/camel/impl/DefaultLanguageResolver.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultLanguageResolver.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultLanguageResolver.java index 161e1d9..9fe1c42 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/DefaultLanguageResolver.java +++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultLanguageResolver.java @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory; * Default language resolver that looks for language factories in <b>META-INF/services/org/apache/camel/language/</b> and * language resolvers in <b>META-INF/services/org/apache/camel/language/resolver/</b>. * - * @version + * @version */ public class DefaultLanguageResolver implements LanguageResolver { public static final String LANGUAGE_RESOURCE_PATH = "META-INF/services/org/apache/camel/language/"; @@ -42,20 +42,11 @@ public class DefaultLanguageResolver implements LanguageResolver { public Language resolveLanguage(String name, CamelContext context) { // lookup in registry first - Object bean = null; - try { - bean = context.getRegistry().lookupByName(name); - if (bean != null) { - getLog().debug("Found language: {} in registry: {}", name, bean); - } - } catch (Exception e) { - if (getLog().isDebugEnabled()) { - getLog().debug("Ignored error looking up bean: " + name + ". Error: " + e); - } - } + Object bean = lookupInRegistry(context, name, name + "-language"); + if (bean != null) { if (bean instanceof Language) { - return (Language)bean; + return (Language) bean; } // we do not throw the exception here and try to auto create a Language from META-INF } @@ -71,7 +62,7 @@ public class DefaultLanguageResolver implements LanguageResolver { if (type != null) { if (Language.class.isAssignableFrom(type)) { - return (Language)context.getInjector().newInstance(type); + return (Language) context.getInjector().newInstance(type); } else { throw new IllegalArgumentException("Resolving language: " + name + " detected type conflict: Not a Language implementation. Found: " + type.getName()); } @@ -81,6 +72,28 @@ public class DefaultLanguageResolver implements LanguageResolver { } } + private Object lookupInRegistry(CamelContext context, String... names) { + Object bean = null; + for (String name : names) { + try { + bean = context.getRegistry().lookupByName(name); + if (bean != null) { + getLog().debug("Found language: {} in registry: {}", name, bean); + } + } catch (Exception e) { + if (getLog().isDebugEnabled()) { + getLog().debug("Ignored error looking up bean: " + name + ". Error: " + e); + } + } + + if (bean != null) { + return bean; + } + } + + return null; + } + protected Language noSpecificLanguageFound(String name, CamelContext context) { Class<?> type = null; try { @@ -94,7 +107,7 @@ public class DefaultLanguageResolver implements LanguageResolver { } if (type != null) { if (LanguageResolver.class.isAssignableFrom(type)) { - LanguageResolver resolver = (LanguageResolver)context.getInjector().newInstance(type); + LanguageResolver resolver = (LanguageResolver) context.getInjector().newInstance(type); return resolver.resolveLanguage(name, context); } else { throw new IllegalArgumentException("Resolving language: " + name + " detected type conflict: Not a LanguageResolver implementation. Found: " + type.getName()); @@ -102,14 +115,14 @@ public class DefaultLanguageResolver implements LanguageResolver { } throw new NoSuchLanguageException(name); } - + protected Class<?> findLanguage(String name, CamelContext context) throws Exception { if (languageFactory == null) { languageFactory = context.getFactoryFinder(LANGUAGE_RESOURCE_PATH); } return languageFactory.findClass(name); } - + protected Class<?> findLanguageResolver(String name, CamelContext context) throws Exception { if (languageResolver == null) { languageResolver = context.getFactoryFinder(LANGUAGE_RESOLVER_RESOURCE_PATH); http://git-wip-us.apache.org/repos/asf/camel/blob/ded7e742/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java index fb11a19..2284d9c 100644 --- a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java +++ b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextResolverTest.java @@ -24,9 +24,13 @@ import org.apache.camel.CamelContext; import org.apache.camel.Component; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.Expression; +import org.apache.camel.NoSuchLanguageException; +import org.apache.camel.Predicate; import org.apache.camel.spi.DataFormat; -import org.junit.After; -import org.junit.Before; +import org.apache.camel.spi.Language; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertFalse; @@ -40,10 +44,10 @@ import static org.junit.Assert.assertTrue; */ public class DefaultCamelContextResolverTest { - private CamelContext context; + private static CamelContext context; - @Before - public void createContext() throws Exception { + @BeforeClass + public static void createContext() throws Exception { SimpleRegistry registry = new SimpleRegistry(); context = new DefaultCamelContext(registry); @@ -53,6 +57,9 @@ public class DefaultCamelContextResolverTest { // Add a data format using its fallback name registry.put("green-dataformat", new SampleDataFormat(true)); + // Add a language using its fallback name + registry.put("green-language", new SampleLanguage(true)); + // Add a component using both names registry.put("yellow", new SampleComponent(false)); registry.put("yellow-component", new SampleComponent(true)); @@ -61,11 +68,15 @@ public class DefaultCamelContextResolverTest { registry.put("red", new SampleDataFormat(false)); registry.put("red-dataformat", new SampleDataFormat(true)); + // Add a language using both names + registry.put("blue", new SampleLanguage(false)); + registry.put("blue-language", new SampleLanguage(true)); + context.start(); } - @After - public void destroyContext() throws Exception { + @AfterClass + public static void destroyContext() throws Exception { context.stop(); context = null; } @@ -103,6 +114,22 @@ public class DefaultCamelContextResolverTest { } @Test + public void testLanguageWithFallbackNames() throws Exception { + Language language = context.resolveLanguage("green"); + assertNotNull("Language not found in registry", language); + assertTrue("Wrong instance type of the Language", language instanceof SampleLanguage); + assertTrue("Here we should have the fallback Language", ((SampleLanguage) language).isFallback()); + } + + @Test + public void testLanguageWithBothNames() throws Exception { + Language language = context.resolveLanguage("blue"); + assertNotNull("Language not found in registry", language); + assertTrue("Wrong instance type of the Language", language instanceof SampleLanguage); + assertFalse("Here we should NOT have the fallback Language", ((SampleLanguage) language).isFallback()); + } + + @Test public void testNullLookupComponent() throws Exception { Component component = context.getComponent("xxxxxxxxx"); assertNull("Non-existent Component should be null", component); @@ -114,6 +141,11 @@ public class DefaultCamelContextResolverTest { assertNull("Non-existent DataFormat should be null", dataFormat); } + @Test(expected = NoSuchLanguageException.class) + public void testNullLookupLanguage() throws Exception { + context.resolveLanguage("xxxxxxxxx"); + } + public static class SampleComponent extends DefaultComponent { private boolean fallback; @@ -163,4 +195,32 @@ public class DefaultCamelContextResolverTest { } } + public static class SampleLanguage implements Language { + + private boolean fallback; + + public SampleLanguage(boolean fallback) { + this.fallback = fallback; + } + + @Override + public Predicate createPredicate(String expression) { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public Expression createExpression(String expression) { + throw new UnsupportedOperationException("Should not be called"); + } + + public boolean isFallback() { + return fallback; + } + + public void setFallback(boolean fallback) { + this.fallback = fallback; + } + } + + }