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();
+        }
+    }
+
+}

Reply via email to