You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2016/11/09 01:01:51 UTC

incubator-tamaya-extensions git commit: TAMAYA-182: Added additional constructors for better support for programmtic filter creation using the builder API.

Repository: incubator-tamaya-extensions
Updated Branches:
  refs/heads/master 26381baac -> 0a4fdbb54


TAMAYA-182: Added additional constructors for better support for programmtic filter creation using the builder API.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/0a4fdbb5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/0a4fdbb5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/0a4fdbb5

Branch: refs/heads/master
Commit: 0a4fdbb5432c3a428fc0e6b8ecc6ec4c29d5fae4
Parents: 26381ba
Author: anatole <an...@apache.org>
Authored: Wed Nov 9 01:39:29 2016 +0100
Committer: anatole <an...@apache.org>
Committed: Wed Nov 9 01:39:29 2016 +0100

----------------------------------------------------------------------
 modules/filter/pom.xml                          |   6 +
 .../tamaya/filter/ConfigurationFilter.java      |  36 +++---
 .../org/apache/tamaya/filter/FilterContext.java | 118 +++++++++++++++++++
 .../tamaya/filter/ProgrammableFilter.java       | 118 -------------------
 .../tamaya/filter/RegexPropertyFilter.java      |  56 ---------
 .../tamaya/filter/ConfigurationFilterTest.java  |  30 ++---
 .../tamaya/filter/ProgrammableFilterTest.java   | 100 ++++++++--------
 .../tamaya/filter/RegexPropertyFilterTest.java  |  55 ---------
 .../tamaya/spisupport/RegexPropertyFilter.java  |  82 +++++++++++++
 .../spisupport/RegexPropertyFilterTest.java     |  57 +++++++++
 10 files changed, 350 insertions(+), 308 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/pom.xml
----------------------------------------------------------------------
diff --git a/modules/filter/pom.xml b/modules/filter/pom.xml
index a0f9584..5355a6c 100644
--- a/modules/filter/pom.xml
+++ b/modules/filter/pom.xml
@@ -57,6 +57,12 @@ under the License.
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-spisupport</artifactId>
+            <version>0.3-incubating-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/main/java/org/apache/tamaya/filter/ConfigurationFilter.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/main/java/org/apache/tamaya/filter/ConfigurationFilter.java b/modules/filter/src/main/java/org/apache/tamaya/filter/ConfigurationFilter.java
index c2739a1..4848bdc 100644
--- a/modules/filter/src/main/java/org/apache/tamaya/filter/ConfigurationFilter.java
+++ b/modules/filter/src/main/java/org/apache/tamaya/filter/ConfigurationFilter.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tamaya.filter;
 
-import org.apache.tamaya.spi.FilterContext;
 import org.apache.tamaya.spi.PropertyFilter;
 
 
@@ -47,17 +46,17 @@ public final class ConfigurationFilter implements PropertyFilter{
         }
     };
 
-    private static final ThreadLocal<ProgrammableFilter> THREADED_MAP_FILTERS = new ThreadLocal<ProgrammableFilter>(){
+    private static final ThreadLocal<FilterContext> THREADED_MAP_FILTERS = new ThreadLocal<FilterContext>(){
         @Override
-        protected ProgrammableFilter initialValue() {
-            return new ProgrammableFilter();
+        protected FilterContext initialValue() {
+            return new FilterContext();
         }
     };
 
-    private static final ThreadLocal<ProgrammableFilter> THREADED_SINGLE_FILTERS = new ThreadLocal<ProgrammableFilter>(){
+    private static final ThreadLocal<FilterContext> THREADED_VALUE_FILTERS = new ThreadLocal<FilterContext>(){
         @Override
-        protected ProgrammableFilter initialValue() {
-            return new ProgrammableFilter();
+        protected FilterContext initialValue() {
+            return new FilterContext();
         }
     };
 
@@ -72,7 +71,7 @@ public final class ConfigurationFilter implements PropertyFilter{
 
     /**
      * Seactivates metadata filtering also on global map access for this thread.
-     * @see #clearFilters()
+     * @see #cleanupFilterContext()
      * @param filtered true,to enable metadata filtering (default).
      */
     public static void setMetadataFiltered(boolean filtered){
@@ -80,35 +79,38 @@ public final class ConfigurationFilter implements PropertyFilter{
     }
 
     /**
-     * Access the filtering configuration that is used for filtering single property values accessed.
+     * Access the filtering configuration that is used on the current thread for
+     * filtering single property values accessed.
+     *
      * @return the filtering config, never null.
      */
-    public static ProgrammableFilter getSingleFilters(){
-        return THREADED_SINGLE_FILTERS.get();
+    public static FilterContext getSingleValueFilterContext(){
+        return THREADED_VALUE_FILTERS.get();
     }
 
     /**
-     * Access the filtering configuration that is used for filtering configuration properties accessed as full
+     * Access the filtering configuration that is used used on the current thread
+     * for filtering configuration properties accessed as full
      * map.
      * @return the filtering config, never null.
      */
-    public static ProgrammableFilter getMapFilters(){
+    public static FilterContext getMapFilterContext(){
         return THREADED_MAP_FILTERS.get();
     }
 
     /**
      * Removes all programmable filters active on the current thread.
      */
-    public static void clearFilters(){
+    public static void cleanupFilterContext(){
         THREADED_MAP_FILTERS.get().clearFilters();
-        THREADED_SINGLE_FILTERS.get().clearFilters();
+        THREADED_VALUE_FILTERS.get().clearFilters();
         THREADED_METADATA_FILTERED.set(true);
     }
 
     @Override
-    public String filterProperty(String valueToBeFiltered, FilterContext context) {
+    public String filterProperty(String valueToBeFiltered, org.apache.tamaya.spi.FilterContext context) {
         if(context.isSinglePropertyScoped()){
-            for(PropertyFilter pred: THREADED_SINGLE_FILTERS.get().getFilters()){
+            for(PropertyFilter pred: THREADED_VALUE_FILTERS.get().getFilters()){
                 valueToBeFiltered = pred.filterProperty(valueToBeFiltered, context);
             }
         }else{

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/main/java/org/apache/tamaya/filter/FilterContext.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/main/java/org/apache/tamaya/filter/FilterContext.java b/modules/filter/src/main/java/org/apache/tamaya/filter/FilterContext.java
new file mode 100644
index 0000000..596c67f
--- /dev/null
+++ b/modules/filter/src/main/java/org/apache/tamaya/filter/FilterContext.java
@@ -0,0 +1,118 @@
+/*
+ * 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.filter;
+
+import org.apache.tamaya.spi.PropertyFilter;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A set of property filter and accessor methods. This class is built for
+ * usage within a single threaded context, so it is NOT thread-safe.
+ */
+public final class FilterContext implements PropertyFilter{
+    /** The filters. */
+    private List<PropertyFilter> filters = new ArrayList<>();
+
+    /**
+     * Add a filter.
+     * @param filter the filter.
+     */
+    public void addFilter(PropertyFilter filter){
+        filters.add(filter);
+    }
+
+    /**
+     * Adds a filter at given position.
+     * @param pos the position.
+     * @param filter the filter.
+     */
+    public void addFilter(int pos, PropertyFilter filter){
+        filters.add(pos, filter);
+    }
+
+    /**
+     * Removes a filter at a given position.
+     * @param pos the position.
+     * @return the filter removed, or null.
+     */
+    public PropertyFilter removeFilter(int pos){
+        return filters.remove(pos);
+    }
+
+    /**
+     * Removes a filter.
+     * @param filter the filter to be removed, not null.
+     */
+    public void removeFilter(PropertyFilter filter) {
+        filters.remove(filter);
+    }
+
+    /**
+     * Clears all filters.
+     */
+    public void clearFilters(){
+        filters.clear();
+    }
+
+    /**
+     * Set the filters.
+     * @param filters the filters to be applied.
+     */
+    public void setFilters(PropertyFilter... filters){
+        setFilters(Arrays.asList(filters));
+    }
+
+    /**
+     * Set the filters.
+     * @param filters the filters to be applied.
+     */
+    public void setFilters(Collection<PropertyFilter> filters) {
+        this.filters.clear();
+        this.filters.addAll(filters);
+    }
+
+    /**
+     * Get all filters.
+     * @return all filters.
+     */
+    public List<PropertyFilter> getFilters(){
+        return Collections.unmodifiableList(filters);
+    }
+
+    @Override
+    public String filterProperty(String valueToBeFiltered, org.apache.tamaya.spi.FilterContext context) {
+        for(PropertyFilter filter:filters){
+            valueToBeFiltered = filter.filterProperty(valueToBeFiltered, context);
+        }
+        return valueToBeFiltered;
+    }
+
+    @Override
+    public String toString() {
+        return "ProgrammableFilter{" +
+                "filters=" + filters +
+                '}';
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/main/java/org/apache/tamaya/filter/ProgrammableFilter.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/main/java/org/apache/tamaya/filter/ProgrammableFilter.java b/modules/filter/src/main/java/org/apache/tamaya/filter/ProgrammableFilter.java
deleted file mode 100644
index ec6040c..0000000
--- a/modules/filter/src/main/java/org/apache/tamaya/filter/ProgrammableFilter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.filter;
-
-import org.apache.tamaya.spi.FilterContext;
-import org.apache.tamaya.spi.PropertyFilter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A set of property filter and accessor methods.
- */
-public final class ProgrammableFilter implements PropertyFilter{
-    /** The filters. */
-    private List<PropertyFilter> filters = new ArrayList<>();
-
-    /**
-     * Add a filter.
-     * @param filter the filter.
-     */
-    public void addFilter(PropertyFilter filter){
-        filters.add(filter);
-    }
-
-    /**
-     * Adds a filter at given position.
-     * @param pos the position.
-     * @param filter the filter.
-     */
-    public void addFilter(int pos, PropertyFilter filter){
-        filters.add(pos, filter);
-    }
-
-    /**
-     * Removes a filter at a given position.
-     * @param pos the position.
-     * @return the filter removed, or null.
-     */
-    public PropertyFilter removeFilter(int pos){
-        return filters.remove(pos);
-    }
-
-    /**
-     * Removes a filter.
-     * @param filter the filter to be removed, not null.
-     */
-    public void removeFilter(PropertyFilter filter) {
-        filters.remove(filter);
-    }
-
-    /**
-     * Clears all filters.
-     */
-    public void clearFilters(){
-        filters.clear();
-    }
-
-    /**
-     * Set the filters.
-     * @param filters the filters to be applied.
-     */
-    public void setFilters(PropertyFilter... filters){
-        setFilters(Arrays.asList(filters));
-    }
-
-    /**
-     * Set the filters.
-     * @param filters the filters to be applied.
-     */
-    public void setFilters(Collection<PropertyFilter> filters) {
-        this.filters.clear();
-        this.filters.addAll(filters);
-    }
-
-    /**
-     * Get all filters.
-     * @return all filters.
-     */
-    public List<PropertyFilter> getFilters(){
-        return Collections.unmodifiableList(filters);
-    }
-
-    @Override
-    public String filterProperty(String valueToBeFiltered, FilterContext context) {
-        for(PropertyFilter filter:filters){
-            valueToBeFiltered = filter.filterProperty(valueToBeFiltered, context);
-        }
-        return valueToBeFiltered;
-    }
-
-    @Override
-    public String toString() {
-        return "ProgrammableFilter{" +
-                "filters=" + filters +
-                '}';
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/main/java/org/apache/tamaya/filter/RegexPropertyFilter.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/main/java/org/apache/tamaya/filter/RegexPropertyFilter.java b/modules/filter/src/main/java/org/apache/tamaya/filter/RegexPropertyFilter.java
deleted file mode 100644
index 1ed43ba..0000000
--- a/modules/filter/src/main/java/org/apache/tamaya/filter/RegexPropertyFilter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.filter;
-
-import org.apache.tamaya.spi.FilterContext;
-import org.apache.tamaya.spi.PropertyFilter;
-
-import java.util.Objects;
-
-/**
- * Predicate filtering using a regex expression operating on the key.
- */
-public final class RegexPropertyFilter implements PropertyFilter{
-    /** The expression used to filter. */
-    private String expression;
-
-    /**
-     * Creates a new regex filter expression.
-     * @param expression the reged expression, not null.
-     */
-    public RegexPropertyFilter(String expression){
-        this.expression = Objects.requireNonNull(expression);
-    }
-
-    @Override
-    public String filterProperty(String valueToBeFiltered, FilterContext context) {
-        if(context.getKey().matches(expression)){
-            return null;
-        }
-        return valueToBeFiltered;
-    }
-
-    @Override
-    public String toString() {
-        return "RegexPropertyFilter{" +
-                "expression='" + expression + '\'' +
-                '}';
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/test/java/org/apache/tamaya/filter/ConfigurationFilterTest.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/test/java/org/apache/tamaya/filter/ConfigurationFilterTest.java b/modules/filter/src/test/java/org/apache/tamaya/filter/ConfigurationFilterTest.java
index 9d0da1f..73602c8 100644
--- a/modules/filter/src/test/java/org/apache/tamaya/filter/ConfigurationFilterTest.java
+++ b/modules/filter/src/test/java/org/apache/tamaya/filter/ConfigurationFilterTest.java
@@ -42,80 +42,80 @@ public class ConfigurationFilterTest {
     @Test
     public void testGetSingleFilters() throws Exception {
         Configuration config = ConfigurationProvider.getConfiguration();
-        assertNotNull(ConfigurationFilter.getSingleFilters());
+        assertNotNull(ConfigurationFilter.getSingleValueFilterContext());
         PropertyFilter testFilter = new PropertyFilter() {
             @Override
             public String filterProperty(String value, FilterContext context) {
                 return context.getKey() + ":testGetSingleFilters";
             }
         };
-        ConfigurationFilter.getSingleFilters().addFilter(testFilter);
+        ConfigurationFilter.getSingleValueFilterContext().addFilter(testFilter);
         assertEquals("user.home:testGetSingleFilters", config.get("user.home"));
-        ConfigurationFilter.getSingleFilters().removeFilter(testFilter);
+        ConfigurationFilter.getSingleValueFilterContext().removeFilter(testFilter);
         assertNotSame("user.home:testGetSingleFilters", config.get("user.home"));
     }
 
     @Test
     public void testRemoveSingleFiltersAt0() throws Exception {
         Configuration config = ConfigurationProvider.getConfiguration();
-        assertNotNull(ConfigurationFilter.getSingleFilters());
+        assertNotNull(ConfigurationFilter.getSingleValueFilterContext());
         PropertyFilter testFilter = new PropertyFilter() {
             @Override
             public String filterProperty(String value, FilterContext context) {
                 return context.getKey() + ":testGetSingleFilters";
             }
         };
-        ConfigurationFilter.getSingleFilters().addFilter(testFilter);
+        ConfigurationFilter.getSingleValueFilterContext().addFilter(testFilter);
         assertEquals("user.home:testGetSingleFilters", config.get("user.home"));
-        ConfigurationFilter.getSingleFilters().removeFilter(0);
+        ConfigurationFilter.getSingleValueFilterContext().removeFilter(0);
         assertNotSame("user.home:testGetSingleFilters", config.get("user.home"));
     }
 
     @Test
     public void testGetMapFilters() throws Exception {
         Configuration config = ConfigurationProvider.getConfiguration();
-        assertNotNull(ConfigurationFilter.getMapFilters());
+        assertNotNull(ConfigurationFilter.getMapFilterContext());
         PropertyFilter testFilter = new PropertyFilter() {
             @Override
             public String filterProperty(String value, FilterContext context) {
                 return context.getKey() + ":testGetMapFilters";
             }
         };
-        ConfigurationFilter.getMapFilters().addFilter(testFilter);
+        ConfigurationFilter.getMapFilterContext().addFilter(testFilter);
         assertEquals("user.home:testGetMapFilters", config.getProperties().get("user.home"));
-        ConfigurationFilter.getSingleFilters().removeFilter(testFilter);
+        ConfigurationFilter.getSingleValueFilterContext().removeFilter(testFilter);
         assertNotSame("user.home:testGetSingleFilters", config.getProperties().get("user.home"));
     }
 
     @Test
     public void testRemoveMapFilterAt0() throws Exception {
         Configuration config = ConfigurationProvider.getConfiguration();
-        assertNotNull(ConfigurationFilter.getMapFilters());
+        assertNotNull(ConfigurationFilter.getMapFilterContext());
         PropertyFilter testFilter = new PropertyFilter() {
             @Override
             public String filterProperty(String value, FilterContext context) {
                 return context.getKey() + ":testGetMapFilters";
             }
         };
-        ConfigurationFilter.getMapFilters().addFilter(testFilter);
+        ConfigurationFilter.getMapFilterContext().addFilter(testFilter);
         assertEquals("user.home:testGetMapFilters", config.getProperties().get("user.home"));
-        ConfigurationFilter.getMapFilters().removeFilter(0);
+        ConfigurationFilter.getMapFilterContext().removeFilter(0);
         assertNotSame("user.home:testGetSingleFilters", config.getProperties().get("user.home"));
     }
 
     @Test
     public void testClearFilters() throws Exception {
         Configuration config = ConfigurationProvider.getConfiguration();
-        assertNotNull(ConfigurationFilter.getSingleFilters());
+        assertNotNull(ConfigurationFilter.getSingleValueFilterContext());
         PropertyFilter testFilter = new PropertyFilter() {
             @Override
             public String filterProperty(String value, FilterContext context) {
                 return context.getKey() + ":testGetSingleFilters";
             }
         };
-        ConfigurationFilter.getSingleFilters().addFilter(testFilter);
+        ConfigurationFilter.getSingleValueFilterContext().addFilter(testFilter);
         assertEquals("user.home:testGetSingleFilters", config.get("user.home"));
-        ConfigurationFilter.clearFilters();
+        ConfigurationFilter.cleanupFilterContext();
         assertNotSame("user.home:testGetSingleFilters", config.get("user.home"));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/test/java/org/apache/tamaya/filter/ProgrammableFilterTest.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/test/java/org/apache/tamaya/filter/ProgrammableFilterTest.java b/modules/filter/src/test/java/org/apache/tamaya/filter/ProgrammableFilterTest.java
index 73db677..3bbd482 100644
--- a/modules/filter/src/test/java/org/apache/tamaya/filter/ProgrammableFilterTest.java
+++ b/modules/filter/src/test/java/org/apache/tamaya/filter/ProgrammableFilterTest.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tamaya.filter;
 
-import org.apache.tamaya.spi.FilterContext;
 import org.apache.tamaya.spi.PropertyFilter;
+import org.apache.tamaya.spisupport.RegexPropertyFilter;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -29,96 +29,101 @@ import java.util.Map;
 import static org.junit.Assert.*;
 
 /**
- * Tests for {@link ProgrammableFilter}. Created by atsticks on 11.02.16.
+ * Tests for {@link FilterContext}. Created by atsticks on 11.02.16.
  */
 public class ProgrammableFilterTest {
 
     @Test
     public void testAddRemoveFilter() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        FilterContext filter = new FilterContext();
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         Map<String,String> map = new HashMap<>();
         map.put("test1", "test1");
         map.put("test2", "test2");
         map.put("test.test3", "test.test3");
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
         filter.addFilter(regexFilter);
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)));
         filter.removeFilter(0);
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
         filter.addFilter(0, regexFilter);
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)));
     }
 
     @Test
     public void testClearFilters() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        FilterContext filter = new FilterContext();
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         Map<String,String> map = new HashMap<>();
         map.put("test1", "test1");
         map.put("test2", "test2");
         map.put("test.test3", "test.test3");
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
         filter.addFilter(regexFilter);
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)));
         filter.clearFilters();
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
     }
 
     @Test
     public void testSetFilters() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        FilterContext filter = new FilterContext();
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         Map<String,String> map = new HashMap<>();
         map.put("test1", "test1");
         map.put("test2", "test2");
         map.put("test.test3", "test.test3");
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
         filter.setFilters(regexFilter);
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)));
     }
 
     @Test
     public void testSetFilters1() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        FilterContext filter = new FilterContext();
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         Map<String,String> map = new HashMap<>();
         map.put("test1", "test1");
         map.put("test2", "test2");
         map.put("test.test3", "test.test3");
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertEquals(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)), "test.test3");
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertEquals(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)), "test.test3");
         filter.setFilters(Arrays.asList(new PropertyFilter[]{regexFilter}));
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        assertEquals(filter.filterProperty("test1", new org.apache.tamaya.spi.FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new org.apache.tamaya.spi.FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new org.apache.tamaya.spi.FilterContext("test.test3", map, true)));
     }
 
     @Test
     public void testGetFilters() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
+        FilterContext filter = new FilterContext();
         assertNotNull(filter.getFilters());
         assertTrue(filter.getFilters().isEmpty());
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         filter.addFilter(regexFilter);
         assertNotNull(filter.getFilters());
         assertFalse(filter.getFilters().isEmpty());
@@ -128,11 +133,12 @@ public class ProgrammableFilterTest {
 
     @Test
     public void testToString() throws Exception {
-        ProgrammableFilter filter = new ProgrammableFilter();
+        FilterContext filter = new FilterContext();
         assertFalse(filter.toString().contains("test\\..*"));
         assertTrue(filter.toString().contains("ProgrammableFilter"));
         assertFalse(filter.toString().contains("RegexPropertyFilter"));
-        RegexPropertyFilter regexFilter = new RegexPropertyFilter("test\\..*");
+        RegexPropertyFilter regexFilter = new RegexPropertyFilter();
+        regexFilter.setIncludes("test\\..*");
         filter.addFilter(regexFilter);
         assertTrue(filter.toString().contains("test\\..*"));
         assertTrue(filter.toString().contains("ProgrammableFilter"));

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/filter/src/test/java/org/apache/tamaya/filter/RegexPropertyFilterTest.java
----------------------------------------------------------------------
diff --git a/modules/filter/src/test/java/org/apache/tamaya/filter/RegexPropertyFilterTest.java b/modules/filter/src/test/java/org/apache/tamaya/filter/RegexPropertyFilterTest.java
deleted file mode 100644
index a560b04..0000000
--- a/modules/filter/src/test/java/org/apache/tamaya/filter/RegexPropertyFilterTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.filter;
-
-import org.apache.tamaya.spi.FilterContext;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests for {@link RegexPropertyFilter}. Created by anatole on 11.02.16.
- */
-public class RegexPropertyFilterTest {
-
-    @org.junit.Test
-    public void testFilterProperty() throws Exception {
-        RegexPropertyFilter filter = new RegexPropertyFilter("test\\..*");
-        Map<String,String> map = new HashMap<>();
-        map.put("test1", "test1");
-        map.put("test2", "test2");
-        map.put("test.test3", "test.test3");
-        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
-        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
-        filter = new RegexPropertyFilter(".*");
-        assertNull(filter.filterProperty("test1", new FilterContext("test1", map, true)));
-        assertNull(filter.filterProperty("test2", new FilterContext("test2", map, true)));
-        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
-    }
-
-    @org.junit.Test
-    public void testToString() throws Exception {
-        RegexPropertyFilter filter = new RegexPropertyFilter("test\\..*");
-        assertTrue(filter.toString().contains("test\\..*"));
-        assertTrue(filter.toString().contains("RegexPropertyFilter"));
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/spi-support/src/main/java/org/apache/tamaya/spisupport/RegexPropertyFilter.java
----------------------------------------------------------------------
diff --git a/modules/spi-support/src/main/java/org/apache/tamaya/spisupport/RegexPropertyFilter.java b/modules/spi-support/src/main/java/org/apache/tamaya/spisupport/RegexPropertyFilter.java
new file mode 100644
index 0000000..85580a7
--- /dev/null
+++ b/modules/spi-support/src/main/java/org/apache/tamaya/spisupport/RegexPropertyFilter.java
@@ -0,0 +1,82 @@
+/*
+ * 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.spisupport;
+
+import org.apache.tamaya.spi.FilterContext;
+import org.apache.tamaya.spi.PropertyFilter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Predicate filtering using a regex expression operating on the key. It allows either
+ * to define the target keys to be selected (includes), or to be excluded (excludes).
+ */
+public final class RegexPropertyFilter implements PropertyFilter{
+    /** The expression used to include entries that match. */
+    private List<String> includes;
+    /** The expression used to exclude entries that match. */
+    private List<String> excludes;
+
+    /**
+     * Sets the regex expression to be applied on the key to filter the corresponding entry
+     * if matching.
+     * @param expressions the regular expression for inclusion, not null.
+     */
+    public void setIncludes(String... expressions){
+        this.includes= Arrays.asList(expressions);
+    }
+
+    /**
+     * Sets the regex expression to be applied on the key to remove the corresponding entries
+     * if matching.
+     * @param expressions the regular expressions for exclusion, not null.
+     */
+    public void setExcludes(String... expressions){
+        this.excludes= Arrays.asList(expressions);
+    }
+
+    @Override
+    public String filterProperty(String valueToBeFiltered, FilterContext context) {
+        if(includes!=null){
+            for(String expression:includes){
+                if(!context.getKey().matches(expression)){
+                    return null;
+                }
+            }
+        }
+        if(excludes!=null){
+            for(String expression:excludes){
+                if(context.getKey().matches(expression)){
+                    return null;
+                }
+            }
+        }
+        return valueToBeFiltered;
+    }
+
+    @Override
+    public String toString() {
+        return "RegexPropertyFilter{" +
+                "includes='" + includes + '\'' +
+                "excludes='" + excludes + '\'' +
+                '}';
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/0a4fdbb5/modules/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
----------------------------------------------------------------------
diff --git a/modules/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java b/modules/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
new file mode 100644
index 0000000..789edd0
--- /dev/null
+++ b/modules/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.spisupport;
+
+import org.apache.tamaya.spi.FilterContext;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests for {@link RegexPropertyFilter}. Created by anatole on 11.02.16.
+ */
+public class RegexPropertyFilterTest {
+
+    @org.junit.Test
+    public void testFilterProperty() throws Exception {
+        RegexPropertyFilter filter = new RegexPropertyFilter();
+        filter.setIncludes("test\\..*");
+        Map<String,String> map = new HashMap<>();
+        map.put("test1", "test1");
+        map.put("test2", "test2");
+        map.put("test.test3", "test.test3");
+        assertEquals(filter.filterProperty("test1", new FilterContext("test1", map, true)), "test1");
+        assertEquals(filter.filterProperty("test2", new FilterContext("test2", map, true)), "test2");
+        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+        filter = new RegexPropertyFilter();
+        assertNull(filter.filterProperty("test1", new FilterContext("test1", map, true)));
+        assertNull(filter.filterProperty("test2", new FilterContext("test2", map, true)));
+        assertNull(filter.filterProperty("test.test3", new FilterContext("test.test3", map, true)));
+    }
+
+    @org.junit.Test
+    public void testToString() throws Exception {
+        RegexPropertyFilter filter = new RegexPropertyFilter();
+        filter.setIncludes("test\\..*");
+        assertTrue(filter.toString().contains("test\\..*"));
+        assertTrue(filter.toString().contains("RegexPropertyFilter"));
+    }
+}
\ No newline at end of file