This is an automated email from the ASF dual-hosted git repository. anatole pushed a commit to branch vote-0.4-incubating-01 in repository https://gitbox.apache.org/repos/asf/incubator-tamaya-extensions.git
commit 33c14780edae0b19c324058ea16f8c727af24b93 Author: Anatole Tresch <[email protected]> AuthorDate: Sun Aug 25 13:40:03 2019 +0200 TAMAYA-356 Extended resolver abtraction so a complete manual setup is possible without using the ServiceContext. --- .../internal/DefaultExpressionEvaluator.java | 22 +++++++- .../internal/ExpressionResolutionFilter.java | 31 ++++++++--- .../apache/tamaya/resolver/ManualSetupTest.java | 65 ++++++++++++++++++++++ 3 files changed, 108 insertions(+), 10 deletions(-) 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 4b27954..ecc5ccb 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 @@ -38,6 +38,22 @@ public class DefaultExpressionEvaluator implements ExpressionEvaluator { private static final Logger LOG = Logger.getLogger(DefaultExpressionEvaluator.class.getName()); + List<ExpressionResolver> resolvers = new ArrayList<>(); + + /** + * Default constructor loading its resolvers from the current service context. + */ + public DefaultExpressionEvaluator(){ + loadResolversFromServiceContext(); + } + + /** + * Default constructor loading its resolvers from the current service context. + * @param resolvers the resolvers to be used for evaluation, resolvers at the beginning have precedence. + */ + public DefaultExpressionEvaluator(List<ExpressionResolver> resolvers){ + this.resolvers.addAll(resolvers); + } /** * Comparator used (not needed with Java8). @@ -112,10 +128,12 @@ public class DefaultExpressionEvaluator implements ExpressionEvaluator { @Override public Collection<ExpressionResolver> getResolvers() { - List<ExpressionResolver> resolvers = new ArrayList<>(); + return resolvers; + } + + private void loadResolversFromServiceContext() { resolvers.addAll(ServiceContextManager.getServiceContext().getServices(ExpressionResolver.class)); resolvers.sort(RESOLVER_COMPARATOR); - return resolvers; } /** 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 1f43f61..31e9651 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 @@ -42,6 +42,27 @@ public class ExpressionResolutionFilter implements PropertyFilter, ClassloaderAw private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + private ExpressionEvaluator evaluator; + + /** + * Default constructor loading the {@link ExpressionEvaluator} from the current service context. + */ + public ExpressionResolutionFilter(){ + this.evaluator = ServiceContextManager.getServiceContext(classLoader).getService(ExpressionEvaluator.class); + if(evaluator==null){ + throw new ConfigException("No ExpressionEvaluator registered."); + } + } + + /** + * Constructor allowing to pass your own {@link ExpressionEvaluator} or to configure your custom evaluator. + * @param evaluator the evaluator, not null. + * @see DefaultExpressionEvaluator + */ + public ExpressionResolutionFilter(ExpressionEvaluator evaluator){ + this.evaluator = Objects.requireNonNull(evaluator); + } + @Override public void init(ClassLoader classLoader) { this.classLoader = Objects.requireNonNull(classLoader); @@ -53,13 +74,7 @@ public class ExpressionResolutionFilter implements PropertyFilter, ClassloaderAw return classLoader; } - private final ExpressionEvaluator evaluator(){ - ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext(classLoader).getService(ExpressionEvaluator.class); - if(evaluator==null){ - throw new ConfigException("No ExpressionEvaluator registered."); - } - return evaluator; - } + /** * Resolves an expression in the form current <code>${resolverId:expression}</code> or @@ -101,7 +116,7 @@ public class ExpressionResolutionFilter implements PropertyFilter, ClassloaderAw @Override public PropertyValue filterProperty(PropertyValue valueToBeFiltered, FilterContext context){ LOG.finest("Resolving " + valueToBeFiltered); - PropertyValue newVal = evaluator().evaluateExpression(valueToBeFiltered, true); + PropertyValue newVal = evaluator.evaluateExpression(valueToBeFiltered, true); if(newVal!=null){ return newVal; } diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ManualSetupTest.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ManualSetupTest.java new file mode 100644 index 0000000..cbff1fe --- /dev/null +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ManualSetupTest.java @@ -0,0 +1,65 @@ +/* + * 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.tamaya.resolver; + +import org.apache.tamaya.Configuration; +import org.apache.tamaya.ConfigurationProvider; +import org.apache.tamaya.resolver.internal.DefaultExpressionEvaluator; +import org.apache.tamaya.resolver.internal.ExpressionResolutionFilter; +import org.apache.tamaya.resolver.spi.ExpressionEvaluator; +import org.apache.tamaya.resolver.spi.ExpressionResolver; +import org.apache.tamaya.spi.ConfigurationBuilder; +import org.apache.tamaya.spi.FilterContext; +import org.apache.tamaya.spi.PropertyValue; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ManualSetupTest { + + @Test + public void testManualFilterSetup(){ + ExpressionEvaluator evaluator = new DefaultExpressionEvaluator(Arrays.asList(new CustomResolver())); + ExpressionResolutionFilter reolverFilter = new ExpressionResolutionFilter(evaluator); + PropertyValue filtered = reolverFilter.filterProperty(PropertyValue.createValue("foo", "${foo:cccabABabbaaaba}"), null); + assertNotNull(filtered); + PropertyValue unfiltered = reolverFilter.filterProperty(PropertyValue.createValue("foo", "${url:cccabABabbaaaba}"), null); + assertNotNull(filtered); + assertEquals("CCCBBABBBBBBBBB", filtered.getValue()); + assertNotNull(unfiltered); + assertEquals("?{url:cccabABabbaaaba}", unfiltered.getValue()); + } + + private static final class CustomResolver implements ExpressionResolver{ + + @Override + public String getResolverPrefix() { + return "foo:"; + } + + @Override + public String evaluate(String expression) { + return expression.replaceAll("a", "b").toUpperCase(); + } + } + +}
