Repository: incubator-tamaya-extensions Updated Branches: refs/heads/master ac45f107b -> e190b34f2
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java index c2bc908..7450c27 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java @@ -21,6 +21,7 @@ package org.apache.tamaya.resolver; import org.apache.tamaya.ConfigException; import org.apache.tamaya.resolver.spi.ExpressionEvaluator; import org.apache.tamaya.resolver.spi.ExpressionResolver; +import org.apache.tamaya.spi.ServiceContext; import org.apache.tamaya.spi.ServiceContextManager; import java.util.Collection; @@ -36,17 +37,35 @@ public final class Resolver { private Resolver(){} /** - * Evaluates the current expression. + * Evaluates the current expression using the current thread's context classloader. * @param key the key, not null. * @param value the value to be filtered/evaluated. * @return the filtered/evaluated value, including null. */ public static String evaluateExpression(String key, String value){ - return evaluator().evaluateExpression(key, value, true); + return evaluator(Thread.currentThread().getContextClassLoader()).evaluateExpression(key, value, true); + } + + /** + * Evaluates the current expression. + * @param key the key, not null. + * @param value the value to be filtered/evaluated. + * @param classLoader the classloader to be used, not null. + * @return the filtered/evaluated value, including null. + */ + public static String evaluateExpression(String key, String value, ClassLoader classLoader){ + return evaluator(classLoader).evaluateExpression(key, value, true); } - private static ExpressionEvaluator evaluator() { - ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext().getService(ExpressionEvaluator.class); + /** + * Get the evaluator. + * @param classLoader the classloader to be used, not null. + * @return the evaluator, never null. + * @throws ConfigException if the evaluator cannot be evaluated. + */ + private static ExpressionEvaluator evaluator(ClassLoader classLoader) { + ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext(classLoader) + .getService(ExpressionEvaluator.class); if(evaluator==null){ throw new ConfigException("No ExpressionEvaluator registered."); } @@ -54,30 +73,55 @@ public final class Resolver { } /** - * Evaluates the current expression. + * Evaluates the current expression using the current thread's context classloader. * @param value the value to be filtered/evaluated. * @return the filtered/evaluated value, including null. */ public static String evaluateExpression(String value){ - return evaluateExpression(value, true); + + return evaluateExpression(value, true, Thread.currentThread().getContextClassLoader()); } /** * Evaluates the current expression. * @param value the value to be filtered/evaluated. + * @param classLoader the classloader to be used, not null. + * @return the filtered/evaluated value, including null. + */ + public static String evaluateExpression(String value, ClassLoader classLoader){ + return evaluateExpression(value, true, classLoader); + } + + /** + * Evaluates the current expression using the current thread's context classloader. + * @param value the value to be filtered/evaluated. * @param maskNotFound if true, not found expression parts will be replaced vy surrounding with []. * Setting to false will replace the value with an empty String. * @return the filtered/evaluated value, including null. */ public static String evaluateExpression(String value, boolean maskNotFound){ - return evaluator().evaluateExpression(null, value, maskNotFound); + return evaluateExpression(value, maskNotFound, Thread.currentThread().getContextClassLoader()); + } + + /** + * Evaluates the current expression. + * @param value the value to be filtered/evaluated. + * @param maskNotFound if true, not found expression parts will be replaced vy surrounding with []. + * Setting to false will replace the value with an empty String. + * @param classLoader the classloader to be used, not null. + * @return the filtered/evaluated value, including null. + */ + public static String evaluateExpression(String value, boolean maskNotFound, ClassLoader classLoader){ + return evaluator(classLoader).evaluateExpression(null, value, maskNotFound); } /** * Access a collection with the currently registered {@link ExpressionResolver} instances. * @return the resolvers currently known, never null. + * @deprecated will be removed. */ + @Deprecated public static Collection<ExpressionResolver> getResolvers(){ - return evaluator().getResolvers(); + return evaluator(Thread.currentThread().getContextClassLoader()).getResolvers(); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java index 4708a39..a7794ed 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java @@ -18,17 +18,21 @@ */ package org.apache.tamaya.resolver.internal; -import org.apache.tamaya.ConfigurationProvider; +import org.apache.tamaya.Configuration; import org.apache.tamaya.resolver.spi.ExpressionResolver; +import org.apache.tamaya.spi.ClassloaderAware; import javax.annotation.Priority; +import java.util.Objects; /** * Property resolver implementation that interprets the resolver expression as a reference to another configuration * entry. It can be explicitly addressed by prefixing {@code conf:}, e.g. {@code ${conf:my.other.config.value}}. */ @Priority(200) -public final class ConfigResolver implements ExpressionResolver{ +public final class ConfigResolver implements ExpressionResolver, ClassloaderAware { + + private ClassLoader classLoader; @Override public String getResolverPrefix() { @@ -37,7 +41,16 @@ public final class ConfigResolver implements ExpressionResolver{ @Override public String evaluate(String expression){ - return ConfigurationProvider.getConfiguration().get(expression); + return Configuration.current(classLoader).get(expression); + } + + @Override + public void init(ClassLoader classLoader) { + this.classLoader = Objects.requireNonNull(classLoader); } + @Override + public ClassLoader getClassLoader() { + return classLoader; + } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/DefaultExpressionEvaluator.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/DefaultExpressionEvaluator.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/DefaultExpressionEvaluator.java index c3fe387..41d39e7 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/DefaultExpressionEvaluator.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/DefaultExpressionEvaluator.java @@ -160,7 +160,7 @@ public class DefaultExpressionEvaluator implements ExpressionEvaluator { /** * Parses subexpression from tokenizer, hereby counting all open and closed brackets, but ignoring any - * meta characters. + * getMeta characters. * @param tokenizer the current tokenizer instance * @param valueToBeFiltered subexpression to be filtered for * @return the parsed sub expression http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java index e7d9ff6..72fd71c 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java @@ -20,12 +20,10 @@ package org.apache.tamaya.resolver.internal; import org.apache.tamaya.ConfigException; import org.apache.tamaya.resolver.spi.ExpressionEvaluator; -import org.apache.tamaya.spi.FilterContext; -import org.apache.tamaya.spi.PropertyFilter; -import org.apache.tamaya.spi.PropertyValue; -import org.apache.tamaya.spi.ServiceContextManager; +import org.apache.tamaya.spi.*; import javax.annotation.Priority; +import java.util.Objects; import java.util.logging.Logger; /** @@ -34,12 +32,25 @@ import java.util.logging.Logger; * has the advantage that different resolvers can be active in parallel. */ @Priority(10000) -public class ExpressionResolutionFilter implements PropertyFilter { +public class ExpressionResolutionFilter implements PropertyFilter, ClassloaderAware { private static final Logger LOG = Logger.getLogger(ExpressionResolutionFilter.class.getName()); + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + + @Override + public void init(ClassLoader classLoader) { + this.classLoader = Objects.requireNonNull(classLoader); + + } + + @Override + public ClassLoader getClassLoader() { + return classLoader; + } + private final ExpressionEvaluator evaluator(){ - ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext().getService(ExpressionEvaluator.class); + ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext(classLoader).getService(ExpressionEvaluator.class); if(evaluator==null){ throw new ConfigException("No ExpressionEvaluator registered."); } @@ -80,19 +91,17 @@ public class ExpressionResolutionFilter implements PropertyFilter { * <li><code>\${resolverId:expression}foo${resolverId2:expression2}bar</code> (first expression is escaped).</li> * </ul> * - * @param context the filter context * @param valueToBeFiltered value to be analyzed for expressions * @return the resolved value, or the input in case where no expression was detected. */ @Override - public PropertyValue filterProperty(PropertyValue valueToBeFiltered, FilterContext context){ + public PropertyValue filterProperty(PropertyValue valueToBeFiltered){ LOG.finest("Resolving " + valueToBeFiltered); String newVal = evaluator().evaluateExpression(valueToBeFiltered.getKey(), valueToBeFiltered.getValue(), true); if(newVal!=null){ - return valueToBeFiltered.toBuilder().setValue(newVal).build(); + return valueToBeFiltered.setValue(newVal); } return null; } - } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResourceResolver.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResourceResolver.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResourceResolver.java index 52db593..291fc49 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResourceResolver.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResourceResolver.java @@ -19,16 +19,14 @@ package org.apache.tamaya.resolver.internal; import org.apache.tamaya.resolver.spi.ExpressionResolver; +import org.apache.tamaya.spi.ClassloaderAware; import org.apache.tamaya.spi.ServiceContextManager; import javax.annotation.Priority; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.List; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -42,7 +40,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; * <p>If the {@code Resources} module is available this module is used for resolving the expression.</p> */ @Priority(300) -public final class ResourceResolver implements ExpressionResolver { +public final class ResourceResolver implements ExpressionResolver, ClassloaderAware { /** * The looger used. */ @@ -53,6 +51,8 @@ public final class ResourceResolver implements ExpressionResolver { */ private static final boolean IS_RESOURCE_MODULE_AVAILABLE = checkResourceModule(); + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + /** * Checks if the Tamaya ResourceLoader can be loaded from the classpath. * @@ -68,23 +68,23 @@ public final class ResourceResolver implements ExpressionResolver { } @Override + public void init(ClassLoader classLoader) { + this.classLoader = Objects.requireNonNull(classLoader); + } + + @Override + public ClassLoader getClassLoader() { + return classLoader; + } + + @Override public String getResolverPrefix() { return "resource:"; } @Override public String evaluate(String expression) { - List<ClassLoader> classLoaders = new ArrayList<>(); - for (ClassLoader cl : new ClassLoader[]{Thread.currentThread().getContextClassLoader(), getClass().getClassLoader(), ClassLoader.getSystemClassLoader()}) { - if (!classLoaders.contains(cl)) { - classLoaders.add(cl); - } - } - return readURL(expression, classLoaders); - } - - private String readURL(String expression, List<ClassLoader> classLoaders) { - URL url = getUrl(expression, classLoaders); + URL url = getUrl(expression, classLoader); if(url==null){ return null; } @@ -105,7 +105,7 @@ public final class ResourceResolver implements ExpressionResolver { } } - private URL getUrl(String expression, List<ClassLoader> classLoaders) { + private URL getUrl(String expression, ClassLoader... classLoaders) { if (IS_RESOURCE_MODULE_AVAILABLE) { org.apache.tamaya.resource.ResourceResolver resolver = ServiceContextManager.getServiceContext() .getService(org.apache.tamaya.resource.ResourceResolver.class); @@ -124,8 +124,8 @@ public final class ResourceResolver implements ExpressionResolver { List<URL> resources = new ArrayList<>(); Enumeration<URL> found; try { - found = ServiceContextManager.getServiceContext() - .getResources(expression, cl); + found = ServiceContextManager.getServiceContext(cl) + .getResources(expression); } catch (Exception e) { LOG.log(Level.SEVERE, "Error resolving expression: " + expression, e); continue; @@ -149,4 +149,5 @@ public final class ResourceResolver implements ExpressionResolver { return null; // no such resource found } + } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java index 051e366..aac6244 100644 --- a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java @@ -18,6 +18,7 @@ */ package org.apache.tamaya.resolver; +import org.apache.tamaya.Configuration; import org.apache.tamaya.ConfigurationProvider; import org.junit.Test; @@ -38,80 +39,80 @@ public class ConfigResolutionTest { @Test public void test_Prefix_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Before Text (prefixed)"), "My Java version is " + System.getProperty("java.version")); + assertEquals(Configuration.current().get("Before Text (prefixed)"), "My Java version is " + System.getProperty("java.version")); } @Test public void test_Midfix_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Before and After Text (prefixed)"), "My Java version is " + System.getProperty("java.version") + "."); + assertEquals(Configuration.current().get("Before and After Text (prefixed)"), "My Java version is " + System.getProperty("java.version") + "."); } @Test public void test_Prefix_Resolution_BadSyntax1() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will fail1."), "V$java.version"); + assertEquals(Configuration.current().get("Will fail1."), "V$java.version"); } @Test public void test_Prefix_Resolution_BadSyntax2() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will fail2."), "V$java.version}"); + assertEquals(Configuration.current().get("Will fail2."), "V$java.version}"); } @Test public void test_Prefix_Resolution_BadSyntax31() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail3."), "V${java.version"); + assertEquals(Configuration.current().get("Will not fail3."), "V${java.version"); } @Test public void test_Prefix_Resolution_Escaped1() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail1."), "V$\\{java.version"); + assertEquals(Configuration.current().get("Will not fail1."), "V$\\{java.version"); } @Test public void test_Prefix_Resolution_Escaped2() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail2."), "V\\${java.version"); + assertEquals(Configuration.current().get("Will not fail2."), "V\\${java.version"); } @Test public void test_Prefix_Resolution_EnvKeys() { - assertEquals(ConfigurationProvider.getConfiguration().get("env.keys"), System.getProperty("java.version") + " plus $java.version"); + assertEquals(Configuration.current().get("env.keys"), System.getProperty("java.version") + " plus $java.version"); } @Test public void test_Prefix_ExpressionOnly_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Expression Only"), System.getProperty("java.version")); + assertEquals(Configuration.current().get("Expression Only"), System.getProperty("java.version")); } @Test public void testConfig_Refs() { - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref"), "Expression Only -> " + System.getProperty("java.version")); - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref3"), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref2"), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertEquals(Configuration.current().get("config-ref"), "Expression Only -> " + System.getProperty("java.version")); + assertEquals(Configuration.current().get("config-ref3"), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertEquals(Configuration.current().get("config-ref2"), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); } @Test public void testClasspath_Refs() { - String value = ConfigurationProvider.getConfiguration().get("cp-ref"); + String value = Configuration.current().get("cp-ref"); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource.txt!")); } @Test public void testResource_Refs() { - String value = ConfigurationProvider.getConfiguration().get("res-ref"); + String value = Configuration.current().get("res-ref"); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource.txt!")); } @Test public void testFile_Refs() { - String value = ConfigurationProvider.getConfiguration().get("file-ref"); + String value = Configuration.current().get("file-ref"); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource2.txt!")); } @Test public void testFile_Refs_doNotAppendNewLineAtTheEnd() throws Exception { - String value = ConfigurationProvider.getConfiguration().get("file3-ref"); + String value = Configuration.current().get("file3-ref"); URI uri = getClass().getClassLoader().getResource("Testresource3.txt").toURI(); byte[] byteContent = Files.readAllBytes(Paths.get(uri)); @@ -122,14 +123,14 @@ public class ConfigResolutionTest { @Test public void testURL_Refs() { - String value = ConfigurationProvider.getConfiguration().get("url-ref"); + String value = Configuration.current().get("url-ref"); assertNotNull(value); assertTrue(value.contains("doctype html") || "[http://www.google.com]".equals(value)); } @Test public void testEscaping(){ - assertEquals(ConfigurationProvider.getConfiguration().get("escaped"), + assertEquals(Configuration.current().get("escaped"), "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + "newlines or \\r returns...YEP!"); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolverTest.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolverTest.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolverTest.java index 74c9d84..183183a 100644 --- a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolverTest.java +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolverTest.java @@ -28,14 +28,42 @@ import static org.junit.Assert.*; public class ResolverTest { @Test + public void testEvaluateExpression_withMask_NoKey() throws Exception { + assertEquals(Resolver.evaluateExpression("Version ${java.foo}", true), + "Version ?{java.foo}"); + } + + @Test + public void testEvaluateExpression_withMask_Classloader() throws Exception { + assertEquals(Resolver.evaluateExpression("Version ${java.foo}", true, + Thread.currentThread().getContextClassLoader()), + "Version ?{java.foo}"); + } + + + @Test public void testEvaluateExpression() throws Exception { assertEquals(Resolver.evaluateExpression("myKey", "Version ${java.version}"), "Version " + System.getProperty("java.version")); } @Test - public void testEvaluateExpression1() throws Exception { + public void testEvaluateExpression_NoKey() throws Exception { assertEquals(Resolver.evaluateExpression("Version ${java.version}"), "Version " + System.getProperty("java.version")); } + + @Test + public void testEvaluateExpression_ClassLoader() throws Exception { + assertEquals(Resolver.evaluateExpression("myKey", "Version ${java.version}", + Thread.currentThread().getContextClassLoader()), + "Version " + System.getProperty("java.version")); + } + + @Test + public void testEvaluateExpression1_NoKey_ClassLoader() throws Exception { + assertEquals(Resolver.evaluateExpression("Version ${java.version}", + Thread.currentThread().getContextClassLoader()), + "Version " + System.getProperty("java.version")); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/README.md ---------------------------------------------------------------------- diff --git a/modules/resources/README.md b/modules/resources/README.md index 96afaa3..e359656 100644 --- a/modules/resources/README.md +++ b/modules/resources/README.md @@ -21,6 +21,6 @@ the above expressions above are equivalent to file:c:\temp\**\* Most benefits are created, when also using the formats module, which provides an implementation of a -PropertySourceProvider taking a set of paths to be resolved and a number of supported formats. +PropertySourceProvider taking a setCurrent of paths to be resolved and a number of supported formats. http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/AbstractPathPropertySourceProvider.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/AbstractPathPropertySourceProvider.java b/modules/resources/src/main/java/org/apache/tamaya/resource/AbstractPathPropertySourceProvider.java index 760e688..d7462b9 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/AbstractPathPropertySourceProvider.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/AbstractPathPropertySourceProvider.java @@ -31,6 +31,7 @@ import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.tamaya.spi.ClassloaderAware; import org.apache.tamaya.spi.PropertySource; import org.apache.tamaya.spi.PropertySourceProvider; import org.apache.tamaya.spi.PropertyValue; @@ -40,12 +41,13 @@ import org.apache.tamaya.spi.PropertyValue; * included into the configuration. This is especially useful, when the current configuration policy in place * does not define the exact file names, but the file locations, where configuration can be provided. */ -public abstract class AbstractPathPropertySourceProvider implements PropertySourceProvider{ +public abstract class AbstractPathPropertySourceProvider implements PropertySourceProvider, ClassloaderAware { /** The log used. */ private static final Logger LOG = Logger.getLogger(AbstractPathPropertySourceProvider.class.getName()); /** The resource paths. */ private String[] resourcePaths; + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); /** * Creates a new instance using the given resource paths. @@ -60,11 +62,21 @@ public abstract class AbstractPathPropertySourceProvider implements PropertySour } @Override + public void init(ClassLoader classLoader){ + this.classLoader = Objects.requireNonNull(classLoader); + } + + @Override + public ClassLoader getClassLoader(){ + return classLoader; + } + + @Override public Collection<PropertySource> getPropertySources() { List<PropertySource> propertySources = new ArrayList<>(); for (String resource : getResourcePaths()) { try { - Collection<URL> resources = ConfigResources.getResourceResolver().getResources(resource); + Collection<URL> resources = ConfigResources.getResourceResolver().getResources(classLoader, resource); for (URL url : resources) { try { Collection<PropertySource> propertySourcesToInclude = getPropertySources(url); @@ -168,7 +180,7 @@ public abstract class AbstractPathPropertySourceProvider implements PropertySour } /** - * Returns the default ordinal used, when no ordinal is set, or the ordinal was not parseable to an int value. + * Returns the default ordinal used, when no ordinal is setCurrent, or the ordinal was not parseable to an int value. * * @return the default ordinal used, by default 0. */ http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/BaseResourceResolver.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/BaseResourceResolver.java b/modules/resources/src/main/java/org/apache/tamaya/resource/BaseResourceResolver.java index cb8c1f5..a407d81 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/BaseResourceResolver.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/BaseResourceResolver.java @@ -41,60 +41,12 @@ import java.util.Collection; * /user/home/A*b101_?.pid * /var/logs/**/*.log * </pre> + * @deprecated Will be removed, covered by default methods. */ +@Deprecated public abstract class BaseResourceResolver implements ResourceResolver { /** - * Resolves resource expressions to a list of {@link URL}s. Hereby - * the ordering of format matches the input of the resolved expressions. Nevertheless be aware that - * there is no determined ordering of format located within a classloader. - * - * @param expressions the expressions to be resolved, not empty. - * @return the corresponding collection of current {@link URL}s found, never - * null. - * . - */ - @Override - public Collection<URL> getResources(Collection<String> expressions) { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - if (cl == null) { - cl = getClass().getClassLoader(); - } - return getResources(cl, expressions); - } - - /** - * Resolves resource expressions to a list of {@link URL}s. Hereby - * the ordering of format matches the input of the resolved expressions. Nevertheless be aware that - * there is no determined ordering of format located within a classloader. - * - * @param expressions the expressions to be resolved, not empty. - * @return the corresponding collection of current {@link URL}s found, never - * null. - * . - */ - @Override - public Collection<URL> getResources(String... expressions) { - return getResources(Arrays.asList(expressions)); - } - - /** - * Resolves resource expressions to a list of {@link URL}s, considerubg - * the given classloader for classloader dependent format. Hereby - * the ordering of format matches the input of the resolved expressions. Nevertheless be aware that - * there is no determined ordering of format located within a classloader. - * - * @param expressions the expressions to be resolved, not empty. - * @return the corresponding collection of current {@link URL}s found, never - * null. - * . - */ - @Override - public Collection<URL> getResources(ClassLoader classLoader, String... expressions) { - return getResources(classLoader, Arrays.asList(expressions)); - } - - /** * Resolves resource expressions to a list of {@link URL}s, considerubg * the given classloader for classloader dependent format. Hereby * the ordering of format matches the input of the resolved expressions. Nevertheless be aware that http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/ConfigResources.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/ConfigResources.java b/modules/resources/src/main/java/org/apache/tamaya/resource/ConfigResources.java index ae08148..a0a2f20 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/ConfigResources.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/ConfigResources.java @@ -38,9 +38,23 @@ public final class ConfigResources { * @throws ConfigException if no ResourceResolver is available (should not happen). * * @return the current ResourceResolver instance, never null. + * @deprecated Use {@link #getResourceResolver(ClassLoader)} */ + @Deprecated public static ResourceResolver getResourceResolver() throws ConfigException { - ResourceResolver resolver = ServiceContextManager.getServiceContext().getService(ResourceResolver.class); + return getResourceResolver(Thread.currentThread().getContextClassLoader()); + } + + /** + * <p>Access the current ResourceResolver.</p> + * + * @throws ConfigException if no ResourceResolver is available (should not happen). + * + * @return the current ResourceResolver instance, never null. + */ + public static ResourceResolver getResourceResolver(ClassLoader classLoader) throws ConfigException { + ResourceResolver resolver = ServiceContextManager.getServiceContext(classLoader) + .getService(ResourceResolver.class); if (resolver == null) { throw new ConfigException("ResourceResolver not available."); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/ResourceResolver.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/ResourceResolver.java b/modules/resources/src/main/java/org/apache/tamaya/resource/ResourceResolver.java index d27b38f..f21cf02 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/ResourceResolver.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/ResourceResolver.java @@ -19,6 +19,7 @@ package org.apache.tamaya.resource; import java.net.URL; +import java.util.Arrays; import java.util.Collection; /** @@ -53,7 +54,13 @@ public interface ResourceResolver { * null. * . */ - Collection<URL> getResources(Collection<String> expressions); + default Collection<URL> getResources(Collection<String> expressions) { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == null) { + cl = getClass().getClassLoader(); + } + return getResources(cl, expressions); + } /** * Resolves resource expressions to a list of {@link URL}s. Hereby @@ -65,7 +72,9 @@ public interface ResourceResolver { * null. * . */ - Collection<URL> getResources(String... expressions); + default Collection<URL> getResources(String... expressions){ + return getResources(Arrays.asList(expressions)); + } /** * Resolves resource expressions to a list of {@link URL}s, considerubg @@ -77,7 +86,9 @@ public interface ResourceResolver { * @param expressions the expressions to be resolved, not empty. * @return the corresponding collection of current {@link URL}s found, never {@code null}. */ - Collection<URL> getResources(ClassLoader classLoader, String... expressions); + default Collection<URL> getResources(ClassLoader classLoader, String... expressions){ + return getResources(classLoader, Arrays.asList(expressions)); + } /** * Resolves resource expressions to a list of {@link URL}s, considerubg http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClassPathResourceLocator.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClassPathResourceLocator.java b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClassPathResourceLocator.java index 6c5d8d6..f198095 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClassPathResourceLocator.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClassPathResourceLocator.java @@ -53,8 +53,9 @@ public class ClassPathResourceLocator implements ResourceLocator{ public Collection<URL> lookup(ClassLoader classLoader, String expression) { List<URL> resources = new ArrayList<>(); try { - Enumeration<URL> urls = ServiceContextManager.getServiceContext() - .getResources(expression, classLoader); + Enumeration<URL> urls = ServiceContextManager.getServiceContext( + Thread.currentThread().getContextClassLoader() + ).getResources(expression); while (urls.hasMoreElements()) { URL url = urls.nextElement(); resources.add(url); http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClasspathCollector.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClasspathCollector.java b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClasspathCollector.java index 99ee5c4..d5a8d8b 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClasspathCollector.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/ClasspathCollector.java @@ -115,8 +115,10 @@ public class ClasspathCollector { Locator locator = Locator.of(expression); List<URL> result = new ArrayList<>(); try { - Enumeration<URL> rootResources = ServiceContextManager.getServiceContext() - .getResources(locator.getRootPath(), this.classLoader); + Enumeration<URL> rootResources = ServiceContextManager.getServiceContext( + this.classLoader + ) + .getResources(locator.getRootPath()); while (rootResources.hasMoreElements()) { URL resource = rootResources.nextElement(); try { @@ -277,8 +279,8 @@ public class ClasspathCollector { /** * Method that collects resources from a JBoss classloading system using Vfs. - * @param rootResource the root resource for evaluating its children. - * @param locationPattern the sub pattern that all children must mach, so they are selected. + * @param rootResource the root resource for evaluating its getChildren. + * @param locationPattern the sub pattern that all getChildren must mach, so they are selected. * @return the resources found, never null. * @throws IOException */ http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/DefaultResourceResolver.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/DefaultResourceResolver.java b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/DefaultResourceResolver.java index 6c1b5e6..b04b8ce 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/DefaultResourceResolver.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/DefaultResourceResolver.java @@ -56,7 +56,9 @@ public class DefaultResourceResolver extends BaseResourceResolver { @Override public Collection<ResourceLocator> getResourceLocators() { - return ServiceContextManager.getServiceContext().getServices(ResourceLocator.class); + return ServiceContextManager.getServiceContext( + Thread.currentThread().getContextClassLoader() + ).getServices(ResourceLocator.class); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/FileCollector.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/FileCollector.java b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/FileCollector.java index eccb873..3e79ba3 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/FileCollector.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/FileCollector.java @@ -76,7 +76,7 @@ public class FileCollector { * elements given by {@code subTokens}, starting at the given {@code tokenIndex}. * @param dir the directory to start * @param subTokens the overall subtoken to be analyzed - * @param tokenIndex the index where in the token list to start comparing + * @param tokenIndex the getIndex where in the token list to start comparing * @return the URLs matching the tokens */ static Collection<URL> traverseAndSelectFromChildren(File dir, List<String> subTokens, int tokenIndex) { @@ -158,10 +158,10 @@ public class FileCollector { } /** - * Constructs a sub expression, using the tokens from {@code subTokens} starting at index {@code startIndex}. + * Constructs a sub expression, using the tokens from {@code subTokens} starting at getIndex {@code startIndex}. * * @param subTokens the token list, not null - * @param startIndex the start index from where tokens should be taken to produce the path. + * @param startIndex the start getIndex from where tokens should be taken to produce the path. * @return the constructed path, never null. */ private static String getSubExpression(List<String> subTokens, int startIndex) { http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/VfsSupport.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/VfsSupport.java b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/VfsSupport.java index 7e75c99..e98280f 100644 --- a/modules/resources/src/main/java/org/apache/tamaya/resource/internal/VfsSupport.java +++ b/modules/resources/src/main/java/org/apache/tamaya/resource/internal/VfsSupport.java @@ -168,7 +168,7 @@ class VfsSupport { try { return (String) methodGetPathName.invoke(resource); } catch (Exception e) { - throw new IllegalStateException("Failed to get path name - " + resource, e); + throw new IllegalStateException("Failed to current path name - " + resource, e); } } @@ -209,8 +209,8 @@ class VfsSupport { * has a primitive type. * <p>Thrown exceptions are rethrown as {@link IllegalStateException}. * - * @param field the field to get - * @param target the target object from which to get the field + * @param field the field to current + * @param target the target object from which to current the field * @return the field's current value */ private static Object readField(Field field, Object target) { http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/test/java/org/apache/tamaya/resource/AbstractPathPropertySourceProviderTest.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/test/java/org/apache/tamaya/resource/AbstractPathPropertySourceProviderTest.java b/modules/resources/src/test/java/org/apache/tamaya/resource/AbstractPathPropertySourceProviderTest.java index 0dc6c91..a31f135 100644 --- a/modules/resources/src/test/java/org/apache/tamaya/resource/AbstractPathPropertySourceProviderTest.java +++ b/modules/resources/src/test/java/org/apache/tamaya/resource/AbstractPathPropertySourceProviderTest.java @@ -101,7 +101,7 @@ public class AbstractPathPropertySourceProviderTest { } /** - * Returns the default ordinal used, when no ordinal is set, or the ordinal was not parseable to an int value. + * Returns the default ordinal used, when no ordinal is setCurrent, or the ordinal was not parseable to an int value. * * @return the default ordinal used, by default 0. */ http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/resources/src/test/java/org/apache/tamaya/resource/internal/ClasspathCollectorTest.java ---------------------------------------------------------------------- diff --git a/modules/resources/src/test/java/org/apache/tamaya/resource/internal/ClasspathCollectorTest.java b/modules/resources/src/test/java/org/apache/tamaya/resource/internal/ClasspathCollectorTest.java index ccdc7bc..fecc24b 100644 --- a/modules/resources/src/test/java/org/apache/tamaya/resource/internal/ClasspathCollectorTest.java +++ b/modules/resources/src/test/java/org/apache/tamaya/resource/internal/ClasspathCollectorTest.java @@ -29,13 +29,11 @@ import static org.junit.Assert.assertEquals; * This tests is using testing the classpath collector functionality, either by accessing/searching entries * from the java.annotation jar as well from the current (file-based classpath). */ -@Ignore -// Tests work within IDE, but not with maven... public class ClasspathCollectorTest { @org.junit.Test public void testCollectAllClasses() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:javax/annotation/*.class"); assertEquals(8, found.size()); // 7 ordinary, 1 inner class. Collection<URL> found2 = cpc.collectFiles("javax/annotation/*.class"); @@ -44,7 +42,7 @@ public class ClasspathCollectorTest { @org.junit.Test public void testCollectAllInPackage() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:javax/**/sql/*.class"); assertEquals(2, found.size()); Collection<URL> found2 = cpc.collectFiles("javax/**/sql/*.class"); @@ -53,7 +51,7 @@ public class ClasspathCollectorTest { @org.junit.Test public void testCollectClassNames() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:javax/annotation/**/R*.class"); assertEquals(2, found.size()); Collection<URL> found2 = cpc.collectFiles("javax/annotation/**/R*.class"); @@ -62,7 +60,7 @@ public class ClasspathCollectorTest { @org.junit.Test public void testCollectWithExpression() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:javax/annotation/R?so*.class"); assertEquals(3, found.size()); Collection<URL> found2 = cpc.collectFiles("javax/annotation/R?so*.class"); @@ -71,7 +69,7 @@ public class ClasspathCollectorTest { @org.junit.Test public void testCollectResources() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:META-INF/maven/org.apache.geronimo.specs/**/*"); assertEquals(3, found.size()); Collection<URL> found2 = cpc.collectFiles("META-INF/maven/org.apache.geronimo.specs/**/*"); @@ -80,7 +78,7 @@ public class ClasspathCollectorTest { @org.junit.Test public void testCollectResourcesFromLocalFSPath() throws Exception { - ClasspathCollector cpc = new ClasspathCollector(ClassLoader.getSystemClassLoader()); + ClasspathCollector cpc = new ClasspathCollector(Thread.currentThread().getContextClassLoader()); Collection<URL> found = cpc.collectFiles("classpath:resources_testroot/**/*.file"); assertEquals(7, found.size()); Collection<URL> found2 = cpc.collectFiles("resources_testroot/**/*.file"); http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/ade6eb8b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringPropertySource.java ---------------------------------------------------------------------- diff --git a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringPropertySource.java b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringPropertySource.java index 2e8ac1c..d86c74a 100644 --- a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringPropertySource.java +++ b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringPropertySource.java @@ -19,6 +19,7 @@ package org.apache.tamaya.integration.spring; +import org.apache.tamaya.Configuration; import org.apache.tamaya.ConfigurationProvider; import org.springframework.core.env.PropertySource; @@ -33,7 +34,7 @@ public class TamayaSpringPropertySource extends PropertySource<String> { @Override public String getProperty(String name) { - return ConfigurationProvider.getConfiguration().get(name); + return Configuration.current().get(name); } } \ No newline at end of file
