TAMAYA-60 Automatic loading of provided PropertyFilter service providers is now configurable.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/89087580 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/89087580 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/89087580 Branch: refs/heads/master Commit: 8908758046deca512c08b16e21ab8c3658669f48 Parents: b51df05 Author: Oliver B. Fischer <[email protected]> Authored: Sun Feb 8 22:02:20 2015 +0100 Committer: Oliver B. Fischer <[email protected]> Committed: Sun Feb 8 22:02:20 2015 +0100 ---------------------------------------------------------------------- .../tamaya/builder/ConfigurationBuilder.java | 26 ++++++++ .../ProgrammaticConfigurationContext.java | 17 ++++- .../builder/ConfigurationBuilderTest.java | 68 ++++++++++++++++++++ .../tamaya/builder/TestPropertyFilter.java | 34 ++++++++++ .../org.apache.tamaya.spi.PropertyFilter | 19 ++++++ 5 files changed, 163 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/89087580/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java ---------------------------------------------------------------------- diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java index a773527..f60294d 100644 --- a/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java +++ b/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java @@ -35,6 +35,7 @@ import java.util.Objects; * - configurable loading of provided PropertyConverter DONE * - configurable loading of provided PropertySources DONE * - configurable loading of provided PropertySourceProviders DONE + * - configurable loading of provided PropertyFilters DONE * - Rethink the default behaviour for SPI loading * - Work on all TODOs for TAMAYA-60 * - Write JavaDoc @@ -71,6 +72,8 @@ public class ConfigurationBuilder { private boolean loadProvidedPropertySources = false; private boolean loadProvidedPropertySourceProviders = false; + private boolean isLoadProvidedPropertyFilters = false; + /** * Allows to set configuration context during unit tests. @@ -171,6 +174,28 @@ public class ConfigurationBuilder { return loadProvidedPropertySources; } + + public boolean isPropertyFilterLoadingEnabled() { + return isLoadProvidedPropertyFilters; + } + + + public ConfigurationBuilder enabledProvidedPropertyFilters() { + checkBuilderState(); + + isLoadProvidedPropertyFilters = true; + + return this; + } + + public ConfigurationBuilder disableProvidedPropertyFilters() { + checkBuilderState(); + + isLoadProvidedPropertyFilters = false; + + return this; + } + public ConfigurationBuilder disableProvidedPropertySources() { checkBuilderState(); @@ -215,6 +240,7 @@ public class ConfigurationBuilder { contextBuilder.loadProvidedPropertyConverters(isPropertyConverterLoadingEnabled()); contextBuilder.loadProvidedPropertySources(isPropertySourcesLoadingEnabled()); contextBuilder.loadProvidedPropertySourceProviders(isPropertySourceProvidersLoadingEnabled()); + contextBuilder.loadProvidedPropertyFilters(isLoadProvidedPropertyFilters); return new DefaultConfiguration(contextBuilder.build()); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/89087580/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java ---------------------------------------------------------------------- diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java b/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java index fc1e653..faf5960 100644 --- a/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java +++ b/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java @@ -96,7 +96,7 @@ class ProgrammaticConfigurationContext implements ConfigurationContext { LOG.info(() -> "Using " + immutablePropertySources.size() + " property sources: " + createStringList(immutablePropertySources, ps -> ps.getName() + '[' + ps.getClass().getName() + ']')); - immutablePropertyFilters.addAll(builder.propertyFilters); + immutablePropertyFilters.addAll(getPropertyFilters(builder)); Collections.sort(immutablePropertyFilters, this::comparePropertyFilters); immutablePropertyFilters = Collections.unmodifiableList(immutablePropertyFilters); LOG.info(() -> "Using " + immutablePropertyFilters.size() + " property filters: " + @@ -117,6 +117,16 @@ class ProgrammaticConfigurationContext implements ConfigurationContext { LOG.info(() -> "Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy); } + private List<PropertyFilter> getPropertyFilters(Builder builder) { + List<PropertyFilter> provided = builder.loadProvidedPropertyFilters + ? ServiceContext.getInstance().getServices(PropertyFilter.class) + : new ArrayList<>(0); + + List<PropertyFilter> configured = builder.propertyFilters; + + return join(provided, configured); + } + private List<PropertySource> getAllPropertySources(Builder builder) { List<PropertySource> provided = builder.loadProvidedPropertySources ? ServiceContext.getInstance().getServices(PropertySource.class) @@ -273,6 +283,7 @@ class ProgrammaticConfigurationContext implements ConfigurationContext { private boolean loadProvidedPropertyConverters; private boolean loadProvidedPropertySources; private boolean loadProvidedPropertySourceProviders; + private boolean loadProvidedPropertyFilters; public Builder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy) { this.propertyValueCombinationPolicy = Objects.requireNonNull(policy); @@ -354,6 +365,10 @@ class ProgrammaticConfigurationContext implements ConfigurationContext { public void loadProvidedPropertySourceProviders(boolean state) { loadProvidedPropertySourceProviders = state; } + + public void loadProvidedPropertyFilters(boolean state) { + loadProvidedPropertyFilters = state; + } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/89087580/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java ---------------------------------------------------------------------- diff --git a/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java b/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java index 5c2f2b4..e3faed2 100644 --- a/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java +++ b/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java @@ -18,6 +18,7 @@ */ package org.apache.tamaya.builder; +import jdk.nashorn.internal.runtime.regexp.joni.Config; import org.apache.tamaya.ConfigException; import org.apache.tamaya.Configuration; import org.apache.tamaya.TypeLiteral; @@ -450,6 +451,73 @@ public class ConfigurationBuilderTest { /********************************************************************* * Tests for enabling and disabling of automatic loading of + * P r o p e r t y F i l t e r s + */ + + @Test + public void enablingOfPropertyFiltersLoadingIsOk() { + PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER); + + doReturn("source").when(source).getName(); + doReturn("A").when(source).get("key"); + doReturn(100).when(source).getOrdinal(); + + ConfigurationBuilder builder = new ConfigurationBuilder(); + + Configuration config = builder.disableProvidedPropertyFilters() + .enabledProvidedPropertyFilters() + .addPropertySources(source) + .build(); + + String property = config.get("key"); + + assertThat(property, CoreMatchers.notNullValue()); + assertThat(property, Matchers.equalTo("AinBerlin")); + } + + @Test + public void disablingOfPropertyFiltersLoadingIsOk() { + ConfigurationBuilder builder = new ConfigurationBuilder(); + + builder.enabledProvidedPropertyFilters() + .disableProvidedPropertyFilters(); + + assertThat(builder.isPropertyFilterLoadingEnabled(), is(false)); + } + + @Test + public void loadingOfPropertyFiltersCanBeDisabled() { + ConfigurationBuilder builder = new ConfigurationBuilder(); + + builder.disableProvidedPropertyFilters() + .enabledProvidedPropertyFilters(); + + assertThat(builder.isPropertyFilterLoadingEnabled(), is(true)); + } + + @Test + public void loadingOfPropertyFiltersCanBeEnabled() { + PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER); + + doReturn("source").when(source).getName(); + doReturn("A").when(source).get("key"); + doReturn(100).when(source).getOrdinal(); + + ConfigurationBuilder builder = new ConfigurationBuilder(); + + Configuration config = builder.enabledProvidedPropertyFilters() + .disableProvidedPropertyFilters() + .addPropertySources(source) + .build(); + + String property = config.get("key"); + + assertThat(property, CoreMatchers.notNullValue()); + assertThat(property, Matchers.equalTo("A")); + } + + /********************************************************************* + * Tests for enabling and disabling of automatic loading of * P r o p e r t y S o u r c e P r o v i d e r s */ http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/89087580/modules/builder/src/test/java/org/apache/tamaya/builder/TestPropertyFilter.java ---------------------------------------------------------------------- diff --git a/modules/builder/src/test/java/org/apache/tamaya/builder/TestPropertyFilter.java b/modules/builder/src/test/java/org/apache/tamaya/builder/TestPropertyFilter.java new file mode 100644 index 0000000..80c4cb3 --- /dev/null +++ b/modules/builder/src/test/java/org/apache/tamaya/builder/TestPropertyFilter.java @@ -0,0 +1,34 @@ +/* + * 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.builder; + +import org.apache.tamaya.spi.PropertyFilter; + +public class TestPropertyFilter implements PropertyFilter { + @Override + public String filterProperty(String key, String value) { + String result = value; + + if (!result.contains(("inBerlin"))) { + result = value + "inBerlin"; + } + + return result; + } +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/89087580/modules/builder/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter ---------------------------------------------------------------------- diff --git a/modules/builder/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter b/modules/builder/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter new file mode 100644 index 0000000..f35e9c5 --- /dev/null +++ b/modules/builder/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter @@ -0,0 +1,19 @@ +# +# 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 current 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. +# +org.apache.tamaya.builder.TestPropertyFilter
