From a0f8cc1567fca79c4ef48c6c145998de22af25d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Wed, 27 Nov 2013 10:15:51 +0100 Subject: [PATCH 001/448] fixed use of slf4j to avoid log4j dependency --- pom.xml | 20 +++++++++++-------- .../configbuilder/util/CommandLineHelper.java | 5 +++-- .../configbuilder/util/ConfigValidator.java | 5 +++-- .../util/ConstructionHelper.java | 5 +++-- .../configbuilder/util/FieldSetter.java | 5 +++-- .../util/FieldValueExtractor.java | 5 +++-- .../util/FieldValueTransformer.java | 5 +++-- 7 files changed, 30 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index f8ee0683..61045e82 100644 --- a/pom.xml +++ b/pom.xml @@ -20,8 +20,8 @@ git@github.com:TNG/config-builder.git scm:git:git@github.com:TNG/config-builder.git scm:git:git@github.com:TNG/config-builder.git - HEAD - + HEAD + Matthias Bollwein @@ -166,22 +166,26 @@ validation-api 1.0.0.GA - - log4j - log4j - 1.2.17 - org.hibernate hibernate-validator-annotation-processor 4.1.0.Final + + org.slf4j + slf4j-api + ${slf4j.version} + org.slf4j slf4j-log4j12 - 1.5.2 + ${slf4j.version} + test + + 1.7.5 + diff --git a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java index 3da0e556..bebffc84 100644 --- a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java @@ -4,13 +4,14 @@ import com.tngtech.configbuilder.configuration.ErrorMessageSetup; import com.tngtech.configbuilder.exception.ConfigBuilderException; import org.apache.commons.cli.*; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; public class CommandLineHelper { - private final static Logger log = Logger.getLogger(CommandLineHelper.class); + private final static Logger log = LoggerFactory.getLogger(CommandLineHelper.class); private final ConfigBuilderFactory configBuilderFactory; private final AnnotationHelper annotationHelper; diff --git a/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java b/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java index 1ffb855e..a7ebe655 100644 --- a/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java +++ b/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java @@ -4,7 +4,8 @@ import com.tngtech.configbuilder.annotation.validation.Validation; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; import com.tngtech.configbuilder.exception.ValidatorException; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.validation.ConstraintViolation; import javax.validation.ValidatorFactory; @@ -13,7 +14,7 @@ public class ConfigValidator { - private final static Logger log = Logger.getLogger(ConfigValidator.class); + private final static Logger log = LoggerFactory.getLogger(ConfigValidator.class); private final ConfigBuilderFactory configBuilderFactory; private final ErrorMessageSetup errorMessageSetup; diff --git a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java index 62becb06..39bf224a 100644 --- a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java @@ -3,14 +3,15 @@ import com.tngtech.configbuilder.configuration.ErrorMessageSetup; import com.tngtech.configbuilder.exception.ConfigBuilderException; import com.tngtech.configbuilder.exception.NoConstructorFoundException; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ConstructionHelper { - private final static Logger log = Logger.getLogger(ConstructionHelper.class); + private final static Logger log = LoggerFactory.getLogger(ConstructionHelper.class); private ErrorMessageSetup errorMessageSetup; diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java index 2ec2d3bb..e2a3a274 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java @@ -4,13 +4,14 @@ import com.tngtech.configbuilder.configuration.BuilderConfiguration; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; import com.tngtech.configbuilder.exception.ConfigBuilderException; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; public class FieldSetter { - private final static Logger log = Logger.getLogger(FieldSetter.class); + private final static Logger log = LoggerFactory.getLogger(FieldSetter.class); private final FieldValueTransformer fieldValueTransformer; private final FieldValueExtractor fieldValueExtractor; diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java b/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java index 218c0403..569503d6 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java @@ -4,14 +4,15 @@ import com.tngtech.configbuilder.annotation.valueextractor.ValueExtractorProcessor; import com.tngtech.configbuilder.annotation.valueextractor.ValueExtractorAnnotation; import com.tngtech.configbuilder.configuration.BuilderConfiguration; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.annotation.Annotation; import java.lang.reflect.Field; public class FieldValueExtractor { - private final static Logger log = Logger.getLogger(FieldValueExtractor.class); + private final static Logger log = LoggerFactory.getLogger(FieldValueExtractor.class); private final AnnotationHelper annotationHelper; private final ConfigBuilderFactory configBuilderFactory; diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java b/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java index ac2a9f8d..4f505774 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java @@ -5,7 +5,8 @@ import com.tngtech.configbuilder.annotation.typetransformer.*; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; import com.tngtech.configbuilder.exception.TypeTransformerException; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Type; @@ -14,7 +15,7 @@ //TODO: Content transformers (transform even if types already match, allow null as argument) public class FieldValueTransformer { - private final static Logger log = Logger.getLogger(FieldValueTransformer.class); + private final static Logger log = LoggerFactory.getLogger(FieldValueTransformer.class); private final ConfigBuilderFactory configBuilderFactory; private final ErrorMessageSetup errorMessageSetup; From ca5383052a8471d9ae0d13f15d21a5fe7e881417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Wed, 27 Nov 2013 11:22:51 +0100 Subject: [PATCH 002/448] made config builder compatible to java 1.6 --- pom.xml | 4 ++-- .../valueextractor/ImportedValueProcessor.java | 12 +++++++++--- .../configbuilder/util/ConstructionHelper.java | 12 ++++++++++-- .../configbuilder/util/GenericsAndCastingHelper.java | 2 +- .../configbuilder/ConfigBuilderIntegrationTest.java | 2 +- .../com/tngtech/configbuilder/ConfigBuilderTest.java | 2 +- .../valueextractor/ImportedValueProcessorTest.java | 2 +- .../configbuilder/util/ConfigValidatorTest.java | 2 +- .../configbuilder/util/ConstructionHelperTest.java | 4 ++-- .../tngtech/configbuilder/util/FieldSetterTest.java | 6 +++--- 10 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index f8ee0683..7ac7c53b 100644 --- a/pom.xml +++ b/pom.xml @@ -57,8 +57,8 @@ maven-compiler-plugin 2.3.2 - 1.7 - 1.7 + 1.6 + 1.6 diff --git a/src/main/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessor.java b/src/main/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessor.java index 9d2be835..879263e9 100644 --- a/src/main/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessor.java +++ b/src/main/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessor.java @@ -26,11 +26,17 @@ public Object getValue(Annotation annotation, ConfigBuilderFactory configBuilder Field field = importedConfiguration.getClass().getDeclaredField(fieldName); field.setAccessible(true); result = field.get(importedConfiguration); - } catch (NoSuchFieldException | IllegalAccessException e) { - ErrorMessageSetup errorMessageSetup = configBuilderFactory.getInstance(ErrorMessageSetup.class); - throw new ImportedConfigurationException(errorMessageSetup.getErrorMessage(ImportedConfigurationException.class, fieldName)); + } catch (NoSuchFieldException e) { + throw createException(configBuilderFactory, fieldName); + } catch (IllegalAccessException e) { + throw createException(configBuilderFactory, fieldName); } return result; } + + private ImportedConfigurationException createException(ConfigBuilderFactory configBuilderFactory, String fieldName) { + ErrorMessageSetup errorMessageSetup = configBuilderFactory.getInstance(ErrorMessageSetup.class); + return new ImportedConfigurationException(errorMessageSetup.getErrorMessage(ImportedConfigurationException.class, fieldName)); + } } diff --git a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java index 62becb06..af062196 100644 --- a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java @@ -24,11 +24,19 @@ public T getInstance(Class configClass, Object... objects) { log.info(String.format("found constructor - instantiating %s", configClass.getName())); tConstructor.setAccessible(true); return tConstructor.newInstance(objects); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new ConfigBuilderException(errorMessageSetup.getErrorMessage(e), e); + } catch (InstantiationException e) { + throw createConfigBuilderException(e); + } catch (IllegalAccessException e) { + throw createConfigBuilderException(e); + } catch (InvocationTargetException e) { + throw createConfigBuilderException(e); } } + private ConfigBuilderException createConfigBuilderException(Exception e) { + return new ConfigBuilderException(errorMessageSetup.getErrorMessage(e), e); + } + @SuppressWarnings("unchecked") private Constructor findSuitableConstructor(Class configClass, Object... objects) { log.debug(String.format("trying to find a constructor for %s matching the arguments of build()", configClass.getName())); diff --git a/src/main/java/com/tngtech/configbuilder/util/GenericsAndCastingHelper.java b/src/main/java/com/tngtech/configbuilder/util/GenericsAndCastingHelper.java index b89125b3..4d08becf 100644 --- a/src/main/java/com/tngtech/configbuilder/util/GenericsAndCastingHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/GenericsAndCastingHelper.java @@ -11,7 +11,7 @@ public class GenericsAndCastingHelper { private final Map, Class> primitiveToWrapperMapping; public GenericsAndCastingHelper() { - primitiveToWrapperMapping = new HashMap<>(); + primitiveToWrapperMapping = new HashMap, Class>(); primitiveToWrapperMapping.put(boolean.class, Boolean.class); primitiveToWrapperMapping.put(byte.class, Byte.class); primitiveToWrapperMapping.put(short.class, Short.class); diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java index 1b38026c..f9b7b729 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java @@ -73,7 +73,7 @@ public void testConfigBuilderWithParameters() { @Test public void testConfigBuilderWithConstructorArgument() { - ConfigBuilder configBuilder = new ConfigBuilder<>(TestConfigWithoutDefaultConstructor.class); + ConfigBuilder configBuilder = new ConfigBuilder(TestConfigWithoutDefaultConstructor.class); TestConfigWithoutDefaultConstructor c = configBuilder.build(3); assertEquals(3, c.getNumber()); } diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java index 6f59e10f..b5d10d8b 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java @@ -80,7 +80,7 @@ public void setUp() throws Exception { when(propertyLoaderConfigurator.configurePropertyLoader(TestConfig.class)).thenReturn(propertyLoader); when(commandLineHelper.getOptions(TestConfig.class)).thenReturn(commandLineOptions); - configBuilder = new ConfigBuilder<>(TestConfig.class, configBuilderFactory); + configBuilder = new ConfigBuilder(TestConfig.class, configBuilderFactory); } @After diff --git a/src/test/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessorTest.java b/src/test/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessorTest.java index ebd76c36..6258f7a3 100644 --- a/src/test/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessorTest.java +++ b/src/test/java/com/tngtech/configbuilder/annotation/valueextractor/ImportedValueProcessorTest.java @@ -47,7 +47,7 @@ public void testGetIntegerValue() { when(builderConfiguration.getImportedConfiguration()).thenReturn(importedTestConfig); when(importedValue.value()).thenReturn("intField"); - int actualResult = (int) importedValueProcessor.getValue(importedValue, configBuilderFactory); + int actualResult = (Integer) importedValueProcessor.getValue(importedValue, configBuilderFactory); assertThat(actualResult, equalTo(23)); } diff --git a/src/test/java/com/tngtech/configbuilder/util/ConfigValidatorTest.java b/src/test/java/com/tngtech/configbuilder/util/ConfigValidatorTest.java index 1d40e98b..39b1dbf1 100644 --- a/src/test/java/com/tngtech/configbuilder/util/ConfigValidatorTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/ConfigValidatorTest.java @@ -59,7 +59,7 @@ public void setUp() throws Exception { when(configBuilderFactory.getInstance(ValidatorFactory.class)).thenReturn(validatorFactory); when(validatorFactory.getValidator()).thenReturn(validator); - configValidator = new ConfigValidator<>(configBuilderFactory); + configValidator = new ConfigValidator(configBuilderFactory); } @Test diff --git a/src/test/java/com/tngtech/configbuilder/util/ConstructionHelperTest.java b/src/test/java/com/tngtech/configbuilder/util/ConstructionHelperTest.java index b4763695..95775dc2 100644 --- a/src/test/java/com/tngtech/configbuilder/util/ConstructionHelperTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/ConstructionHelperTest.java @@ -55,7 +55,7 @@ public void setUp() throws Exception { @Test public void testGetInstance() throws Exception { - ConstructionHelper constructionHelper = new ConstructionHelper<>(configBuilderFactory); + ConstructionHelper constructionHelper = new ConstructionHelper(configBuilderFactory); TestConfig testConfig = constructionHelper.getInstance(TestConfig.class, "string", 3); assertEquals("string", testConfig.getString()); assertEquals(3, (long) testConfig.getInteger()); @@ -65,7 +65,7 @@ public void testGetInstance() throws Exception { public void testGetInstanceThrowsException() throws Exception { expectedException.expect(NoConstructorFoundException.class); expectedException.expectMessage("NoConstructorFoundException"); - ConstructionHelper constructionHelper = new ConstructionHelper<>(configBuilderFactory); + ConstructionHelper constructionHelper = new ConstructionHelper(configBuilderFactory); constructionHelper.getInstance(TestConfigForException.class, "string", 3); } } diff --git a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java index 457e56d1..fcdee792 100644 --- a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java @@ -72,7 +72,7 @@ public void testSetFieldsThrowsIllegalArgumentException() throws Exception { when(fieldValueTransformer.transformFieldValue(Matchers.any(Field.class), Matchers.any(String.class))).thenReturn("stringValue"); when(errorMessageSetup.getErrorMessage(Matchers.any(IllegalArgumentException.class), Matchers.any(String.class), Matchers.any(String.class), Matchers.any(String.class))).thenReturn("IllegalArgumentException"); - FieldSetter fieldSetter = new FieldSetter<>(configBuilderFactory); + FieldSetter fieldSetter = new FieldSetter(configBuilderFactory); TestConfigForIllegalArgumentException testConfigForIllegalArgumentException = new TestConfigForIllegalArgumentException(); expectedException.expect(ConfigBuilderException.class); @@ -86,7 +86,7 @@ public void testSetFields() throws Exception { when(fieldValueExtractor.extractValue(Matchers.any(Field.class), Matchers.any(BuilderConfiguration.class))).thenReturn("stringValue"); when(fieldValueTransformer.transformFieldValue(Matchers.any(Field.class), Matchers.any(String.class))).thenReturn("stringValue"); - FieldSetter fieldSetter = new FieldSetter<>(configBuilderFactory); + FieldSetter fieldSetter = new FieldSetter(configBuilderFactory); TestConfig testConfig = new TestConfig(); fieldSetter.setFields(testConfig, builderConfiguration); @@ -101,7 +101,7 @@ public void testSetFieldsForFieldWithoutValueExtractorAnnotation() throws Except when(fieldValueTransformer.transformFieldValue(Matchers.any(Field.class), Matchers.any(BuilderConfiguration.class))).thenReturn(null); when(annotationHelper.fieldHasAnnotationAnnotatedWith(Matchers.any(Field.class), Matchers.any(Class.class))).thenReturn(false); - FieldSetter fieldSetter = new FieldSetter<>(configBuilderFactory); + FieldSetter fieldSetter = new FieldSetter(configBuilderFactory); TestConfigWithoutAnnotations testConfigWithoutAnnotations = new TestConfigWithoutAnnotations(); fieldSetter.setFields(testConfigWithoutAnnotations, builderConfiguration); From 265fb130bb29f698881efd780ad0496aca799b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Thu, 28 Nov 2013 18:25:12 +0100 Subject: [PATCH 003/448] updated version of property loader used --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0cea10f6..e45a6509 100644 --- a/pom.xml +++ b/pom.xml @@ -120,7 +120,7 @@ com.tngtech.java property-loader - 1.1 + 1.2 From 14b9c6f5b3234bc11cf5a8e09db4a9615c72792c Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Fri, 29 Nov 2013 11:03:52 +0100 Subject: [PATCH 004/448] [maven-release-plugin] prepare release config-builder-1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e45a6509..00bc6924 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.1-SNAPSHOT + 1.1 jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 7d01ccc818dbc992ef728c3569cac3540402933e Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Fri, 29 Nov 2013 11:03:56 +0100 Subject: [PATCH 005/448] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 00bc6924..91828de0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.1 + 1.2-SNAPSHOT jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From ff62aebda589581c9215a385fe47ade92c839e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Wed, 18 Dec 2013 17:41:58 +0100 Subject: [PATCH 006/448] added property filters annotation --- .../PropertyFilters.java | 21 +++++ .../PropertyFiltersProcessor.java | 78 ++++++++++++++++ .../PropertyFiltersProcessorTest.java | 91 +++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessor.java create mode 100644 src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java diff --git a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java new file mode 100644 index 00000000..ef878ccf --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java @@ -0,0 +1,21 @@ +package com.tngtech.configbuilder.annotation.propertyloaderconfiguration; + +import com.tngtech.propertyloader.impl.interfaces.PropertyFilterContainer; +import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation is used to specify the filters which the PropertyLoader applies to the properties files.
+ * Usage: @PropertyFilters({Config.class}) + */ +@PropertyLoaderConfigurationAnnotation(PropertyLocationsProcessor.class) +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface PropertyFilters { + public Class[] value() default {}; + +} diff --git a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessor.java b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessor.java new file mode 100644 index 00000000..92ae5cdb --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessor.java @@ -0,0 +1,78 @@ +package com.tngtech.configbuilder.annotation.propertyloaderconfiguration; + +import com.google.common.collect.Maps; +import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.EnvironmentResolvingFilter; +import com.tngtech.propertyloader.impl.filters.ThrowIfPropertyHasToBeDefined; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; +import com.tngtech.propertyloader.impl.filters.WarnOnSurroundingWhitespace; +import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; + +import java.lang.annotation.Annotation; +import java.util.Map; + +public class PropertyFiltersProcessor implements PropertyLoaderConfigurationProcessor { + + private static interface Action { + void execute(); + } + + public void configurePropertyLoader( Annotation annotation, PropertyLoader propertyLoader ) { + DefaultPropertyFilterContainer filterContainer = propertyLoader.getFilters(); + Map, Action> classActionMap = createFilterMap( filterContainer ); + + filterContainer.clear(); + Class[] filters = ((PropertyFilters) annotation).value(); + for ( Class filter : filters ) { + if ( classActionMap.containsKey( filter ) ) { + classActionMap.get( filter ).execute(); + } else { + throw new IllegalStateException( "unhandled filter class " + filter.getSimpleName() ); + } + } + } + + private Map, Action> createFilterMap( final DefaultPropertyFilterContainer + filterContainer ) { + Map, Action> actionMap = Maps.newHashMap(); + + actionMap.put( VariableResolvingFilter.class, new Action() { + @Override + public void execute() { + filterContainer.withVariableResolvingFilter(); + } + } ); + + actionMap.put( DecryptingFilter.class, new Action() { + @Override + public void execute() { + filterContainer.withDecryptingFilter(); + } + } ); + + actionMap.put( EnvironmentResolvingFilter.class, new Action() { + @Override + public void execute() { + filterContainer.withEnvironmentResolvingFilter(); + } + } ); + + actionMap.put( WarnOnSurroundingWhitespace.class, new Action() { + @Override + public void execute() { + filterContainer.withWarnOnSurroundingWhitespace(); + } + } ); + + actionMap.put( ThrowIfPropertyHasToBeDefined.class, new Action() { + @Override + public void execute() { + filterContainer.withWarnIfPropertyHasToBeDefined(); + } + } ); + + return actionMap; + } +} diff --git a/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java b/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java new file mode 100644 index 00000000..75841e0a --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java @@ -0,0 +1,91 @@ +package com.tngtech.configbuilder.annotation.propertyloaderconfiguration; + +import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.ValueModifyingFilter; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; +import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Properties; + +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class PropertyFiltersProcessorTest extends TestCase { + + private static class TestPropertyFilter extends ValueModifyingFilter { + + @Override + protected String filterValue( String key, String value, Properties properties ) { + return null; + } + } + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Mock + private PropertyFilters propertyFilters; + + @Mock + private DefaultPropertyFilterContainer filterContainer; + + @Mock + private PropertyLoader propertyLoader; + + private PropertyFiltersProcessor propertyFiltersProcessor; + + @Before + public void setUp() + { + propertyFiltersProcessor = new PropertyFiltersProcessor(); + + when(propertyLoader.getFilters()).thenReturn(filterContainer); + } + + @Test + public void testAnnotationWithNoValues() { + @SuppressWarnings("unchecked") Class[] classes = new Class[0]; + when(propertyFilters.value()).thenReturn(classes); + + propertyFiltersProcessor.configurePropertyLoader( propertyFilters, propertyLoader ); + + verify(filterContainer).clear(); + } + + @Test + public void testAnnotationWithSomeValues() { + @SuppressWarnings("unchecked") Class[] classes = new Class[]{VariableResolvingFilter.class, DecryptingFilter.class}; + when(propertyFilters.value()).thenReturn(classes); + + propertyFiltersProcessor.configurePropertyLoader( propertyFilters, propertyLoader ); + + InOrder order = inOrder(filterContainer); + order.verify(filterContainer).clear(); + order.verify(filterContainer).withVariableResolvingFilter(); + order.verify(filterContainer).withDecryptingFilter(); + } + + @Test + public void testAnnotationWithUnknownValuesShouldThrowException() { + @SuppressWarnings("unchecked") Class[] classes = new Class[]{TestPropertyFilter.class}; + when(propertyFilters.value()).thenReturn(classes); + + expectedException.expect( IllegalStateException.class ); + expectedException.expectMessage( "unhandled filter class TestPropertyFilter" ); + propertyFiltersProcessor.configurePropertyLoader( propertyFilters, propertyLoader ); + + } +} From 6b48f0e6ca6ba7addd9d0d343a25b96c25934897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Wed, 18 Dec 2013 18:07:46 +0100 Subject: [PATCH 007/448] fixed configuration annotation class --- .../annotation/propertyloaderconfiguration/PropertyFilters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java index ef878ccf..365c88b0 100644 --- a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java +++ b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java @@ -12,7 +12,7 @@ * This annotation is used to specify the filters which the PropertyLoader applies to the properties files.
* Usage: @PropertyFilters({Config.class}) */ -@PropertyLoaderConfigurationAnnotation(PropertyLocationsProcessor.class) +@PropertyLoaderConfigurationAnnotation(PropertyFiltersProcessor.class) @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface PropertyFilters { From 862d0aed73a6f55a0136996b279cfd3765dad448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Wed, 18 Dec 2013 18:12:09 +0100 Subject: [PATCH 008/448] added new annotation to test class --- .../propertyloaderconfiguration/PropertyFilters.java | 1 - .../com/tngtech/configbuilder/testclasses/TestConfig.java | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java index 365c88b0..718ecb2d 100644 --- a/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java +++ b/src/main/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFilters.java @@ -17,5 +17,4 @@ @Retention(RetentionPolicy.RUNTIME) public @interface PropertyFilters { public Class[] value() default {}; - } diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java index 4226e47c..331db630 100644 --- a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java @@ -4,12 +4,16 @@ import com.tngtech.configbuilder.annotation.configuration.Separator; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertiesFiles; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyExtension; +import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyFilters; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyLocations; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertySuffixes; import com.tngtech.configbuilder.annotation.typetransformer.*; import com.tngtech.configbuilder.annotation.validation.Validation; import com.tngtech.configbuilder.annotation.valueextractor.*; import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.ValueModifyingFilter; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; import java.nio.file.Path; import java.util.*; @@ -17,6 +21,7 @@ @PropertyExtension("testproperties") @PropertySuffixes(extraSuffixes = {"test"}) @PropertyLocations(resourcesForClasses = {PropertyLoader.class}) +@PropertyFilters({VariableResolvingFilter.class, DecryptingFilter.class}) @PropertiesFiles("demoapp-configuration") public class TestConfig { From 85a607dafd5ff91ae6c35c051ed57f7bb20e9bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Thu, 19 Dec 2013 10:21:12 +0100 Subject: [PATCH 009/448] cleanup --- .../configbuilder/testclasses/TestConfig.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java index 331db630..6eedcc76 100644 --- a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java @@ -7,16 +7,25 @@ import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyFilters; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyLocations; import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertySuffixes; -import com.tngtech.configbuilder.annotation.typetransformer.*; +import com.tngtech.configbuilder.annotation.typetransformer.CharacterSeparatedStringToStringListTransformer; +import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformer; +import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformers; import com.tngtech.configbuilder.annotation.validation.Validation; -import com.tngtech.configbuilder.annotation.valueextractor.*; +import com.tngtech.configbuilder.annotation.valueextractor.CommandLineValue; +import com.tngtech.configbuilder.annotation.valueextractor.DefaultValue; +import com.tngtech.configbuilder.annotation.valueextractor.EnvironmentVariableValue; +import com.tngtech.configbuilder.annotation.valueextractor.ImportedValue; +import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue; +import com.tngtech.configbuilder.annotation.valueextractor.SystemPropertyValue; import com.tngtech.propertyloader.PropertyLoader; import com.tngtech.propertyloader.impl.filters.DecryptingFilter; -import com.tngtech.propertyloader.impl.filters.ValueModifyingFilter; import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; @PropertyExtension("testproperties") @PropertySuffixes(extraSuffixes = {"test"}) From 4d8414c85aa04f224af5541e7800ffed7d2a67e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Fri, 21 Feb 2014 08:07:15 +0100 Subject: [PATCH 010/448] reduced/cleaned log output --- .../com/tngtech/configbuilder/util/CommandLineHelper.java | 2 +- .../com/tngtech/configbuilder/util/ConfigValidator.java | 2 +- .../com/tngtech/configbuilder/util/ConstructionHelper.java | 4 ++-- .../java/com/tngtech/configbuilder/util/FieldSetter.java | 6 +++--- .../com/tngtech/configbuilder/util/FieldValueExtractor.java | 4 ++-- .../tngtech/configbuilder/util/FieldValueTransformer.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java index bebffc84..7c126bb0 100644 --- a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java @@ -40,7 +40,7 @@ public Options getOptions(Class configClass) { @SuppressWarnings("AccessStaticViaInstance") private Option getOption(Field field) { CommandLineValue commandLineValue = field.getAnnotation(CommandLineValue.class); - log.debug(String.format("adding command line option %s for field %s", commandLineValue.shortOpt(), field.getName())); + log.debug("adding command line option {} for field {}", commandLineValue.shortOpt(), field.getName()); return OptionBuilder.withLongOpt(commandLineValue.longOpt()) .hasArg() .isRequired(commandLineValue.required()) diff --git a/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java b/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java index a7ebe655..98a4e3f1 100644 --- a/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java +++ b/src/main/java/com/tngtech/configbuilder/util/ConfigValidator.java @@ -27,7 +27,7 @@ public ConfigValidator(ConfigBuilderFactory miscFactory) { } public void validate(T instanceOfConfigClass) { - log.info(String.format("validating instance of %s", instanceOfConfigClass.getClass())); + log.debug("validating instance of {}", instanceOfConfigClass.getClass()); callValidationMethods(instanceOfConfigClass); callJSRValidation(instanceOfConfigClass); } diff --git a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java index 40928e6e..a8facc0d 100644 --- a/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/ConstructionHelper.java @@ -22,7 +22,7 @@ public ConstructionHelper(ConfigBuilderFactory configBuilderFactory) { public T getInstance(Class configClass, Object... objects) { try { Constructor tConstructor = findSuitableConstructor(configClass, objects); - log.info(String.format("found constructor - instantiating %s", configClass.getName())); + log.debug("found constructor - instantiating {}", configClass.getName()); tConstructor.setAccessible(true); return tConstructor.newInstance(objects); } catch (InstantiationException e) { @@ -40,7 +40,7 @@ private ConfigBuilderException createConfigBuilderException(Exception e) { @SuppressWarnings("unchecked") private Constructor findSuitableConstructor(Class configClass, Object... objects) { - log.debug(String.format("trying to find a constructor for %s matching the arguments of build()", configClass.getName())); + log.debug("trying to find a constructor for {} matching the arguments of build()", configClass.getName()); Constructor[] constructors = configClass.getDeclaredConstructors(); for (Constructor constructor : constructors) { if (constructorIsMatching(constructor, objects)) { diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java index e2a3a274..f3930a67 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java @@ -33,7 +33,7 @@ public void setFields(T instanceOfConfigClass, BuilderConfiguration builderConfi value = fieldValueTransformer.transformFieldValue(field, value); setField(instanceOfConfigClass, field, value); } else { - log.debug(String.format("field %s is not annotated with any ValueExtractorAnnotation: skipping field", field.getName())); + log.debug("field {} is not annotated with any ValueExtractorAnnotation: skipping field", field.getName()); } } } @@ -42,11 +42,11 @@ private void setField(T instanceOfConfigClass, Field field, Object value) { try { field.setAccessible(true); if(value == null && field.getType().isPrimitive()) { - log.warn(String.format("no value found for field %s of primitive type %s: field will be initialized to default", field.getName(), field.getType().getName())); + log.warn("no value found for field {} of primitive type {}: field will be initialized to default", field.getName(), field.getType().getName()); } else { field.set(instanceOfConfigClass, value); - log.info(String.format("set field %s of type %s to a value of type %s", field.getName(), field.getType().getName(), value == null ? "null" : value.getClass().getName())); + log.debug("set field {} of type {} to a value of type {}", field.getName(), field.getType().getName(), value == null ? "null" : value.getClass().getName()); } } catch (Exception e) { throw new ConfigBuilderException(errorMessageSetup.getErrorMessage(e, field.getName(), field.getType().getName(), value == null ? "null" : value.toString()), e); diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java b/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java index 569503d6..b60b18f1 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldValueExtractor.java @@ -28,11 +28,11 @@ public Object extractValue(Field field, BuilderConfiguration builderConfiguratio Class processor; for (Annotation annotation : annotationHelper.getAnnotationsInOrder(field, annotationOrderOfField)) { - log.debug(String.format("trying to find a value for field %s with %s annotation", field.getName(), annotation.annotationType())); + log.debug("trying to find a value for field {} with {} annotation", field.getName(), annotation.annotationType()); processor = annotation.annotationType().getAnnotation(ValueExtractorAnnotation.class).value(); value = configBuilderFactory.getInstance(processor).getValue(annotation, configBuilderFactory); if (value != null) { - log.debug(String.format("found value \"%s\" for field %s from %s annotation", value, field.getName(), annotation.annotationType())); + log.debug("found value \"{}\" for field {} from {} annotation", value, field.getName(), annotation.annotationType()); break; } } diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java b/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java index 4f505774..8cfa90cf 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldValueTransformer.java @@ -76,7 +76,7 @@ public Object performNecessaryTransformations(Object sourceValue, Type targetTyp Class sourceClass = genericsAndCastingHelper.getWrapperClassIfPrimitive(sourceValue.getClass()); Class targetClass = genericsAndCastingHelper.castTypeToClass(targetType); - log.info(String.format("Searching for a transformer from %s to %s", sourceClass.getSimpleName(), targetClass.getSimpleName())); + log.debug("Searching for a transformer from {} to {}", sourceClass.getSimpleName(), targetClass.getSimpleName()); TypeTransformer transformer = findApplicableTransformer(sourceClass, targetType); sourceValue = transformer.transform(sourceValue); From 9baadd83913912246a62c6d051177d7f5da97079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Thu, 20 Feb 2014 15:21:31 +0100 Subject: [PATCH 011/448] implemented hierarchical field setter --- .../configbuilder/util/FieldSetter.java | 17 +++++++++- ...ConfigBuilderExtensionIntegrationTest.java | 33 +++++++++++++++++++ .../ConfigBuilderIntegrationTest.java | 6 ++-- .../configbuilder/ConfigBuilderTest.java | 4 ++- .../testclasses/ExtendedTestConfig.java | 27 +++++++++++++++ .../configbuilder/testclasses/TestConfig.java | 6 +++- .../configbuilder/util/FieldSetterTest.java | 24 ++++++++++++-- 7 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/tngtech/configbuilder/ConfigBuilderExtensionIntegrationTest.java create mode 100644 src/test/java/com/tngtech/configbuilder/testclasses/ExtendedTestConfig.java diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java index e2a3a274..040704f6 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java @@ -1,5 +1,7 @@ package com.tngtech.configbuilder.util; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.tngtech.configbuilder.annotation.valueextractor.ValueExtractorAnnotation; import com.tngtech.configbuilder.configuration.BuilderConfiguration; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; @@ -8,6 +10,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.Field; +import java.util.List; public class FieldSetter { @@ -27,7 +30,7 @@ public FieldSetter(ConfigBuilderFactory configBuilderFactory) { public void setFields(T instanceOfConfigClass, BuilderConfiguration builderConfiguration) { - for (Field field : instanceOfConfigClass.getClass().getDeclaredFields()) { + for (Field field : getInheritedPrivateFields(instanceOfConfigClass.getClass())) { if (annotationHelper.fieldHasAnnotationAnnotatedWith(field, ValueExtractorAnnotation.class)) { Object value = fieldValueExtractor.extractValue(field, builderConfiguration); value = fieldValueTransformer.transformFieldValue(field, value); @@ -38,6 +41,18 @@ public void setFields(T instanceOfConfigClass, BuilderConfiguration builderConfi } } + public static List getInheritedPrivateFields(Class type) { + final ImmutableList.Builder listBuilder = ImmutableList.builder(); + + Class currentType = type; + while (currentType != null && currentType != Object.class) { + listBuilder.addAll(Lists.newArrayList(currentType.getDeclaredFields())); + currentType = currentType.getSuperclass(); + } + + return listBuilder.build(); + } + private void setField(T instanceOfConfigClass, Field field, Object value) { try { field.setAccessible(true); diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderExtensionIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderExtensionIntegrationTest.java new file mode 100644 index 00000000..ac210616 --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderExtensionIntegrationTest.java @@ -0,0 +1,33 @@ +package com.tngtech.configbuilder; + +import com.tngtech.configbuilder.testclasses.ExtendedTestConfig; +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class ConfigBuilderExtensionIntegrationTest { + + private ExtendedTestConfig config; + + @Before + public void setUp() { + config = new ConfigBuilder(ExtendedTestConfig.class).build(); + } + + @Test + public void testGetValuePresentInSuperClassAndCurrentClass() { + assertThat(config.getSomeNumber(), is(5)); + } + + @Test + public void testGetValueFromSuperclass() { + assertThat(config.getSuperSomeNumber(), is(3)); + } + + @Test + public void testDirectValue() { + assertThat(config.getAdditionalNumber(), is(4)); + } +} diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java index f9b7b729..057f4a51 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java @@ -12,8 +12,6 @@ import org.junit.runners.Parameterized; import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; import java.io.PrintStream; import java.nio.file.Paths; import java.util.ArrayList; @@ -31,15 +29,17 @@ public class ConfigBuilderIntegrationTest { private Class configClass; private Object configInstance; + private PrintStream originalOutStream; @Before public void setUp() { + originalOutStream = new PrintStream(System.out); System.setOut(new PrintStream(outContent)); } @After public void tearDown() { - System.setOut(null); + System.setOut(originalOutStream); } @Parameterized.Parameters diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java index b5d10d8b..ca5eb3fb 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java @@ -64,10 +64,12 @@ public class ConfigBuilderTest { private Properties properties; @Mock private LoadingOrder loadingOrder; + private PrintStream originalOutStream; @Before public void setUp() throws Exception { + originalOutStream = new PrintStream(System.out); System.setOut(new PrintStream(outContent)); when(configBuilderFactory.getInstance(BuilderConfiguration.class)).thenReturn(builderConfiguration); @@ -85,7 +87,7 @@ public void setUp() throws Exception { @After public void tearDown() { - System.setOut(null); + System.setOut(originalOutStream); } @Test diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/ExtendedTestConfig.java b/src/test/java/com/tngtech/configbuilder/testclasses/ExtendedTestConfig.java new file mode 100644 index 00000000..20bda33e --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/testclasses/ExtendedTestConfig.java @@ -0,0 +1,27 @@ +package com.tngtech.configbuilder.testclasses; + +import com.tngtech.configbuilder.annotation.valueextractor.DefaultValue; +import com.tngtech.configbuilder.annotation.valueextractor.ImportedValue; + +public class ExtendedTestConfig extends TestConfig { + @DefaultValue("4") + @ImportedValue("additionalNumber") + private int additionalNumber; + + @DefaultValue("5") + @ImportedValue("someNumber") + private int someNumber; + + public int getAdditionalNumber() { + return additionalNumber; + } + + @Override + public Integer getSomeNumber() { + return someNumber; + } + + public Integer getSuperSomeNumber() { + return super.getSomeNumber(); + } +} diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java index 6eedcc76..c0f3551c 100644 --- a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java @@ -87,6 +87,10 @@ public TestConfig transform(String input) { public void setSomeNumber(Integer someNumber) { this.someNumber = someNumber; } + + public Integer getSomeNumber() { + return someNumber; + } public void setSomeString(String someString) { this.someString = someString; @@ -137,7 +141,7 @@ public void setCopiedStringCollection(Iterable copiedStringCollection) { } @Validation - private void validate() { + protected void validate() { System.out.println("config validated"); } } diff --git a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java index fcdee792..1ba6b7ae 100644 --- a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java @@ -32,6 +32,11 @@ private static class TestConfig { public String testString = "defaultValue"; } + private static class ExtendedTestConfig extends TestConfig { + @DefaultValue("stringValue") + public String extendedTestString; + } + private static class TestConfigForIllegalArgumentException { @DefaultValue("user") public int testInt; @@ -91,8 +96,8 @@ public void testSetFields() throws Exception { fieldSetter.setFields(testConfig, builderConfiguration); - assertEquals("stringValue",testConfig.testString); - assertEquals("stringValue",testConfig.emptyTestString); + assertEquals("stringValue", testConfig.testString); + assertEquals("stringValue", testConfig.emptyTestString); } @@ -108,4 +113,19 @@ public void testSetFieldsForFieldWithoutValueExtractorAnnotation() throws Except assertEquals("testString", testConfigWithoutAnnotations.testString); } + + @Test + public void testSetFieldsInObjectHierarchy() { + when(fieldValueExtractor.extractValue(Matchers.any(Field.class), Matchers.any(BuilderConfiguration.class))).thenReturn("stringValue"); + when(fieldValueTransformer.transformFieldValue(Matchers.any(Field.class), Matchers.any(String.class))).thenReturn("stringValue"); + + ExtendedTestConfig testConfig = new ExtendedTestConfig(); + + FieldSetter fieldSetter = new FieldSetter(configBuilderFactory); + fieldSetter.setFields(testConfig, builderConfiguration); + + assertEquals("stringValue", testConfig.testString); + assertEquals("stringValue", testConfig.emptyTestString); + assertEquals("stringValue", testConfig.extendedTestString); + } } From 06e0443f21800e3132c0c3c44c02ced7c192e5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Fri, 28 Feb 2014 22:42:19 +0100 Subject: [PATCH 012/448] added builder methods overriding annotations --- .../tngtech/configbuilder/ConfigBuilder.java | 86 ++++++++++- .../configbuilder/ConfigBuilderTest.java | 101 ++++++++++++- ...lderWithoutAnnotationsIntegrationTest.java | 67 +++++++++ .../TestConfigWithoutAnnotations.java | 135 ++++++++++++++++++ 4 files changed, 379 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java create mode 100644 src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java diff --git a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java index 6f2cb89b..eca0db30 100644 --- a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java +++ b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java @@ -7,10 +7,13 @@ import com.tngtech.configbuilder.util.ConfigBuilderFactory; import com.tngtech.configbuilder.util.*; import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertySuffixContainer; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; +import java.util.Arrays; import java.util.List; +import java.util.Properties; /** * Builds a config object. @@ -53,6 +56,7 @@ public class ConfigBuilder { private Class configClass; private Options commandLineOptions; private PropertyLoader propertyLoader; + private Properties additionalProperties; private String[] commandLineArgs = {}; protected ConfigBuilder(Class configClass, ConfigBuilderFactory configBuilderFactory) { @@ -65,6 +69,7 @@ protected ConfigBuilder(Class configClass, ConfigBuilderFactory configBuilder this.fieldSetter = configBuilderFactory.getInstance(FieldSetter.class); this.errorMessageSetup = configBuilderFactory.getInstance(ErrorMessageSetup.class); this.constructionHelper = configBuilderFactory.getInstance(ConstructionHelper.class); + this.additionalProperties = configBuilderFactory.createInstance(Properties.class); propertyLoader = configBuilderFactory.getInstance(PropertyLoaderConfigurator.class).configurePropertyLoader(configClass); commandLineOptions = commandLineHelper.getOptions(configClass); @@ -92,7 +97,7 @@ public ConfigBuilder withCommandLineArgs(String[] args) { /** * Imports the values from the given object according to the field names in the annotations * @param importedConfiguration - * @return + * @return the instance of ConfigBuilder */ public ConfigBuilder withImportedConfiguration(Object importedConfiguration) { builderConfiguration.setImportedConfiguration(importedConfiguration); @@ -103,13 +108,84 @@ public ConfigBuilder withImportedConfiguration(Object importedConfiguration) * Configures the Config Builder to load given properties files instead of those specified in the config class. * * @param baseNames - * @return + * @return the instance of ConfigBuilder */ public ConfigBuilder overridePropertiesFiles(List baseNames) { propertyLoader.withBaseNames(baseNames); return this; } + /** + * Provide additional properties which will overwrite the properties retrieved by the property loader + * + * @param properties to be added to the properties already present (starting from the result of the property loader) + * @return the instance of ConfigBuilder + */ + public ConfigBuilder addProperties(Properties properties) { + additionalProperties.putAll(properties); + return this; + } + + /** + * set the extension to search for property files + * @param propertyExtension property file name extension to use + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertyExtension(String propertyExtension) { + propertyLoader.withExtension(propertyExtension); + return this; + } + + /** + * set property suffix to b + * @param propertySuffix property file name suffix + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertySuffix(String propertySuffix) { + return withPropertySuffixes(propertySuffix); + } + + /** + * replace list of possible property suffixes by given elements + * @param suffixArray one or more property file name suffix + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertySuffixes(String ... suffixArray) { + final DefaultPropertySuffixContainer suffixes = propertyLoader.getSuffixes(); + suffixes.clear(); + suffixes.addSuffixList(Arrays.asList(suffixArray)); + return this; + } + + /** + * add more property file suffixes to the list of possible property suffixes + * @param suffixArray one or more property file name suffix + * @return the instance of ConfigBuilder + */ + public ConfigBuilder addPropertySuffixes(String... suffixArray) { + propertyLoader.getSuffixes().addSuffixList(Arrays.asList(suffixArray)); + return this; + } + + /** + * set file name of property file to read + * @param fileName property file name + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertiesFile(String fileName) { + return withPropertiesFiles(fileName); + } + + /** + * set file names of property files to read + * @param fileNames one or more property file names + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertiesFiles(String ... fileNames) { + propertyLoader.withBaseNames(Arrays.asList(fileNames)); + return this; + } + /** * Prints a help message for all command line options that are configured in the config class. */ @@ -141,7 +217,11 @@ private void setupBuilderConfiguration(PropertyLoader propertyLoader) { if (configClass.isAnnotationPresent(LoadingOrder.class)) { builderConfiguration.setAnnotationOrder(configClass.getAnnotation(LoadingOrder.class).value()); } - builderConfiguration.setProperties(propertyLoader.load()); + + final Properties properties = propertyLoader.load(); + properties.putAll(additionalProperties); + builderConfiguration.setProperties(properties); + builderConfiguration.setCommandLine(commandLineHelper.getCommandLine(configClass, commandLineArgs)); } diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java index ca5eb3fb..5742a782 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java @@ -4,16 +4,19 @@ import com.tngtech.configbuilder.annotation.configuration.LoadingOrder; import com.tngtech.configbuilder.configuration.BuilderConfiguration; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; +import com.tngtech.configbuilder.testclasses.TestConfigWithoutAnnotations; import com.tngtech.configbuilder.util.ConfigBuilderFactory; import com.tngtech.configbuilder.testclasses.TestConfig; import com.tngtech.configbuilder.util.*; import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertySuffixContainer; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InOrder; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @@ -23,17 +26,20 @@ import java.util.List; import java.util.Properties; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class ConfigBuilderTest { private ConfigBuilder configBuilder; + private ConfigBuilder configBuilderWithoutAnnotations; + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); @Mock @@ -50,6 +56,8 @@ public class ConfigBuilderTest { private ErrorMessageSetup errorMessageSetup; @Mock private ConstructionHelper constructionHelper; + @Mock + private Properties additionalProperties; @Mock private PropertyLoaderConfigurator propertyLoaderConfigurator; @@ -57,6 +65,8 @@ public class ConfigBuilderTest { @Mock private PropertyLoader propertyLoader; @Mock + private DefaultPropertySuffixContainer suffixContainer; + @Mock private Options commandLineOptions; @Mock private CommandLine commandLine; @@ -79,10 +89,13 @@ public void setUp() throws Exception { when(configBuilderFactory.getInstance(ErrorMessageSetup.class)).thenReturn(errorMessageSetup); when(configBuilderFactory.getInstance(ConstructionHelper.class)).thenReturn(constructionHelper); when(configBuilderFactory.getInstance(PropertyLoaderConfigurator.class)).thenReturn(propertyLoaderConfigurator); + when(configBuilderFactory.createInstance(Properties.class)).thenReturn(additionalProperties); when(propertyLoaderConfigurator.configurePropertyLoader(TestConfig.class)).thenReturn(propertyLoader); + when(propertyLoader.getSuffixes()).thenReturn(suffixContainer); when(commandLineHelper.getOptions(TestConfig.class)).thenReturn(commandLineOptions); configBuilder = new ConfigBuilder(TestConfig.class, configBuilderFactory); + configBuilderWithoutAnnotations = new ConfigBuilder(TestConfigWithoutAnnotations.class, configBuilderFactory); } @After @@ -93,7 +106,7 @@ public void tearDown() { @Test public void testWithCommandLineArgs() throws Exception { when(commandLineHelper.getCommandLine(TestConfig.class, new String[]{})).thenReturn(commandLine); - assertEquals(configBuilder,configBuilder.withCommandLineArgs(new String[]{})); + assertEquals(configBuilder, configBuilder.withCommandLineArgs(new String[]{})); } @Test @@ -121,16 +134,90 @@ public void testBuild() throws Exception { verify(configValidator).validate(Matchers.any(TestConfig.class)); } -// @Test + // @Test // This test does not work. It needs to be fixed. Urgently. Please do it. Only you can save us! public void testMerge() throws Exception { TestConfig importedConfig = new TestConfig(); when(propertyLoader.load()).thenReturn(properties); - + configBuilder.withImportedConfiguration(importedConfig).build(); - + verify(propertyLoader).load(); verify(builderConfiguration).setProperties(properties); verify(errorMessageSetup).initialize(null, propertyLoader); } + + @Test + public void testAddProperties() { + Properties properties = mock(Properties.class); + assertThat(configBuilder.addProperties(properties), is(sameInstance(configBuilder))); + + verify(additionalProperties).putAll(properties); + verifyNoMoreInteractions(propertyLoader); + } + + @Test + public void testWithExtension() { + final String propertyExtension = ""; + assertThat(configBuilder.withPropertyExtension(propertyExtension), is(sameInstance(configBuilder))); + + verify(propertyLoader).withExtension(propertyExtension); + verifyNoMoreInteractions(propertyLoader); + } + + @Test + public void testWithPropertySuffix() { + final String propertySuffix = ""; + assertThat(configBuilder.withPropertySuffix(propertySuffix), is(sameInstance(configBuilder))); + + InOrder order = inOrder(propertyLoader, suffixContainer); + order.verify(propertyLoader).getSuffixes(); + order.verify(suffixContainer).clear(); + order.verify(suffixContainer).addSuffixList(Lists.newArrayList(propertySuffix)); + order.verifyNoMoreInteractions(); + } + + @Test + public void testWithPropertySuffixes() { + final String propertySuffix1 = ""; + final String propertySuffix2 = ""; + assertThat(configBuilder.withPropertySuffixes(propertySuffix1, propertySuffix2), is(sameInstance(configBuilder))); + + InOrder order = inOrder(propertyLoader, suffixContainer); + order.verify(propertyLoader).getSuffixes(); + order.verify(suffixContainer).clear(); + order.verify(suffixContainer).addSuffixList(Lists.newArrayList(propertySuffix1, propertySuffix2)); + order.verifyNoMoreInteractions(); + } + + @Test + public void testAddPropertySuffixes() { + final String propertySuffix1 = ""; + final String propertySuffix2 = ""; + assertThat(configBuilder.addPropertySuffixes(propertySuffix1, propertySuffix2), is(sameInstance(configBuilder))); + + InOrder order = inOrder(propertyLoader, suffixContainer); + order.verify(propertyLoader).getSuffixes(); + order.verify(suffixContainer).addSuffixList(Lists.newArrayList(propertySuffix1, propertySuffix2)); + order.verifyNoMoreInteractions(); + } + + @Test + public void testWithPropertiesFile() { + final String propertyFile = ""; + assertThat(configBuilder.withPropertiesFile(propertyFile), is(sameInstance(configBuilder))); + + verify(propertyLoader).withBaseNames(Lists.newArrayList(propertyFile)); + verifyNoMoreInteractions(propertyLoader); + } + + @Test + public void testWithPropertiesFiles() { + final String propertiesFile1 = ""; + final String propertiesFile2 = ""; + assertThat(configBuilder.withPropertiesFiles(propertiesFile1, propertiesFile2), is(sameInstance(configBuilder))); + + verify(propertyLoader).withBaseNames(Lists.newArrayList(propertiesFile1, propertiesFile2)); + verifyNoMoreInteractions(propertyLoader); + } } diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java new file mode 100644 index 00000000..78f2cdf1 --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java @@ -0,0 +1,67 @@ +package com.tngtech.configbuilder; + + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.tngtech.configbuilder.testclasses.TestConfigWithoutAnnotations; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.file.Paths; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals; + +public class ConfigBuilderWithoutAnnotationsIntegrationTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + + private PrintStream originalOutStream; + + private ConfigBuilder configBuilder; + private TestConfigWithoutAnnotations expectedConfig; + + @Before + public void setUp() { + originalOutStream = new PrintStream(System.out); + System.setOut(new PrintStream(outContent)); + + configBuilder = new ConfigBuilder(TestConfigWithoutAnnotations.class); + + expectedConfig = new TestConfigWithoutAnnotations(); + expectedConfig.setSomeString("Hello, Galaxy!"); + expectedConfig.setSomeNumber(3); + expectedConfig.setBoolean(true); + expectedConfig.setStringCollection(Lists.newArrayList("first entry", "second entry")); + expectedConfig.setIntegerList(Lists.newArrayList(1, 2, 3, 4, 5)); + expectedConfig.setPathCollection(Sets.newHashSet(Paths.get("/etc"), Paths.get("/usr"))); + expectedConfig.setHomeDir(Paths.get(System.getenv("HOME"))); + expectedConfig.setSystemProperty(System.getProperty("user.language")); + } + + @After + public void tearDown() { + System.setOut(originalOutStream); + } + + @Test + public void testConfigBuilderWithParameters() { + final Properties additionalProperties = new Properties(); + additionalProperties.put("a", "Hello, Galaxy!"); + String[] args = new String[]{"-u", "--collection", "first entry,second entry"}; + Object result = configBuilder + .withPropertyExtension("testproperties") + .withPropertySuffix("test") + .withPropertiesFile("demoapp-configuration") + .withCommandLineArgs(args) + .addProperties(additionalProperties) + .build(); + assertReflectionEquals(expectedConfig, result); + assertTrue(outContent.toString().contains("config validated")); + } +} diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java new file mode 100644 index 00000000..4dabbf12 --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java @@ -0,0 +1,135 @@ +package com.tngtech.configbuilder.testclasses; + +import com.tngtech.configbuilder.annotation.configuration.LoadingOrder; +import com.tngtech.configbuilder.annotation.configuration.Separator; +import com.tngtech.configbuilder.annotation.propertyloaderconfiguration.*; +import com.tngtech.configbuilder.annotation.typetransformer.CharacterSeparatedStringToStringListTransformer; +import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformer; +import com.tngtech.configbuilder.annotation.typetransformer.TypeTransformers; +import com.tngtech.configbuilder.annotation.validation.Validation; +import com.tngtech.configbuilder.annotation.valueextractor.*; +import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +@PropertyLocations(resourcesForClasses = {PropertyLoader.class}) +@PropertyFilters({VariableResolvingFilter.class, DecryptingFilter.class}) +public class TestConfigWithoutAnnotations { + + public TestConfigWithoutAnnotations() { + + } + + public class TestConfigFactory extends TypeTransformer { + public TestConfigWithoutAnnotations transform(String input) { + TestConfigWithoutAnnotations testConfig = new TestConfigWithoutAnnotations(); + testConfig.setSomeString(input); + return testConfig; + } + } + + @DefaultValue("3") + @ImportedValue("someNumber") + private int someNumber; + + @PropertyValue("keyThatDoesNotExist") + private int shouldBeZero; + + @PropertyValue("a") + private String someString; + + @CommandLineValue(shortOpt = "u", longOpt = "user") + private boolean aBoolean; + + @LoadingOrder(value = {CommandLineValue.class}) + @CommandLineValue(shortOpt = "c", longOpt = "collection", hasArg = true, description = "command line option description") + @TypeTransformers({CharacterSeparatedStringToStringListTransformer.class}) + private Collection stringCollection; + + @DefaultValue("/etc,/usr") + @ImportedValue("stringCollection") + private HashSet pathCollection; + + @ImportedValue("stringCollection") + private Iterable copiedStringCollection; + + @Separator(";") + @DefaultValue("1;2;3;4;5") + private List integerList; + + @TypeTransformers(TestConfigFactory.class) + private ArrayList testConfigList; + + @EnvironmentVariableValue("HOME") + private Path homeDir; + + @SystemPropertyValue("user.language") + private String systemProperty; + + public void setSomeNumber(Integer someNumber) { + this.someNumber = someNumber; + } + + public Integer getSomeNumber() { + return someNumber; + } + + public void setSomeString(String someString) { + this.someString = someString; + } + + public void setBoolean(boolean aBoolean) { + this.aBoolean = aBoolean; + } + + public void setStringCollection(Collection stringCollection) { + this.stringCollection = stringCollection; + } + + public void setHomeDir(Path homeDir) { + this.homeDir = homeDir; + } + + public void setSystemProperty(String systemProperty) { + this.systemProperty = systemProperty; + } + + public Collection getPathCollection() { + return pathCollection; + } + + public void setPathCollection(HashSet pathCollection) { + this.pathCollection = pathCollection; + } + + public List getIntegerList() { + return integerList; + } + + public void setIntegerList(List integerList) { + this.integerList = integerList; + } + + public ArrayList getTestConfigList() { + return testConfigList; + } + + public Collection getStringCollection() { + return stringCollection; + } + + public void setCopiedStringCollection(Iterable copiedStringCollection) { + this.copiedStringCollection = copiedStringCollection; + } + + @Validation + protected void validate() { + System.out.println("config validated"); + } +} From 7b9a72724d293aebb2b15c11c66085a8867ccb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Fri, 28 Feb 2014 23:39:47 +0100 Subject: [PATCH 013/448] added more annotation overriding methods --- .../tngtech/configbuilder/ConfigBuilder.java | 58 ++++++++++++++++++- .../configbuilder/ConfigBuilderTest.java | 48 ++++++++++++++- ...lderWithoutAnnotationsIntegrationTest.java | 6 ++ .../TestConfigWithoutAnnotations.java | 14 ++++- 4 files changed, 121 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java index eca0db30..11d54f81 100644 --- a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java +++ b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java @@ -7,9 +7,14 @@ import com.tngtech.configbuilder.util.ConfigBuilderFactory; import com.tngtech.configbuilder.util.*; import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; +import com.tngtech.propertyloader.impl.DefaultPropertyLocationContainer; import com.tngtech.propertyloader.impl.DefaultPropertySuffixContainer; +import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; @@ -45,7 +50,9 @@ * @version 0.1-SNAPSHOT */ public class ConfigBuilder { - + private final static Logger LOGGER = LoggerFactory.getLogger(CommandLineHelper.class); + public static final Object AT_CONTEXT_CLASS_PATH = new Object(); + private final BuilderConfiguration builderConfiguration; private final CommandLineHelper commandLineHelper; private final FieldSetter fieldSetter; @@ -58,6 +65,7 @@ public class ConfigBuilder { private PropertyLoader propertyLoader; private Properties additionalProperties; private String[] commandLineArgs = {}; + protected ConfigBuilder(Class configClass, ConfigBuilderFactory configBuilderFactory) { @@ -184,7 +192,53 @@ public ConfigBuilder withPropertiesFile(String fileName) { public ConfigBuilder withPropertiesFiles(String ... fileNames) { propertyLoader.withBaseNames(Arrays.asList(fileNames)); return this; - } + } + + /** + * set property locations + * @param propertyLocations lists of property locations which can be + * Strings: use as Directory + * Classes: use as Class Resource Location + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertyLocations(Object ... propertyLocations) { + final DefaultPropertyLocationContainer locations = propertyLoader.getLocations(); + locations.clear(); + for (Object propertyLocation : propertyLocations) { + if (propertyLocation instanceof String) { + locations.atDirectory((String)propertyLocation); + } else if (propertyLocation instanceof Class) { + locations.atRelativeToClass((Class)propertyLocation); + } else if (propertyLocation == AT_CONTEXT_CLASS_PATH) { + locations.atContextClassPath(); + } else { + LOGGER.warn("unhandled property location '{}'", propertyLocation); + } + } + return this; + } + + /** + * set property filters in use + * @param propertyFilters property filters which should be applied after loading properties + * @return the instance of ConfigBuilder + */ + public ConfigBuilder withPropertyFilters(Class ... propertyFilters) { + final DefaultPropertyFilterContainer filterContainer = propertyLoader.getFilters(); + final List filters = filterContainer.getFilters(); + filters.clear(); + + for (Class propertyFilter : propertyFilters) { + try { + filters.add(propertyFilter.newInstance()); + } catch (InstantiationException e) { + LOGGER.error("could not create filter '{}'", propertyFilter.getSimpleName(), e); + } catch (IllegalAccessException e) { + LOGGER.error("could not create filter '{}'", propertyFilter.getSimpleName(), e); + } + } + return this; + } /** * Prints a help message for all command line options that are configured in the config class. diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java index 5742a782..7c3fd1e8 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java @@ -9,13 +9,19 @@ import com.tngtech.configbuilder.testclasses.TestConfig; import com.tngtech.configbuilder.util.*; import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; +import com.tngtech.propertyloader.impl.DefaultPropertyLocationContainer; import com.tngtech.propertyloader.impl.DefaultPropertySuffixContainer; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; +import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Matchers; import org.mockito.Mock; @@ -67,6 +73,12 @@ public class ConfigBuilderTest { @Mock private DefaultPropertySuffixContainer suffixContainer; @Mock + private DefaultPropertyLocationContainer locationContainer; + @Mock + private DefaultPropertyFilterContainer filterContainer; + @Mock + private List filters; + @Mock private Options commandLineOptions; @Mock private CommandLine commandLine; @@ -92,6 +104,9 @@ public void setUp() throws Exception { when(configBuilderFactory.createInstance(Properties.class)).thenReturn(additionalProperties); when(propertyLoaderConfigurator.configurePropertyLoader(TestConfig.class)).thenReturn(propertyLoader); when(propertyLoader.getSuffixes()).thenReturn(suffixContainer); + when(propertyLoader.getLocations()).thenReturn(locationContainer); + when(propertyLoader.getFilters()).thenReturn(filterContainer); + when(filterContainer.getFilters()).thenReturn(filters); when(commandLineHelper.getOptions(TestConfig.class)).thenReturn(commandLineOptions); configBuilder = new ConfigBuilder(TestConfig.class, configBuilderFactory); @@ -210,7 +225,7 @@ public void testWithPropertiesFile() { verify(propertyLoader).withBaseNames(Lists.newArrayList(propertyFile)); verifyNoMoreInteractions(propertyLoader); } - + @Test public void testWithPropertiesFiles() { final String propertiesFile1 = ""; @@ -220,4 +235,35 @@ public void testWithPropertiesFiles() { verify(propertyLoader).withBaseNames(Lists.newArrayList(propertiesFile1, propertiesFile2)); verifyNoMoreInteractions(propertyLoader); } + + @Test + public void testWithPropertyLocations() { + final String propertyLocation1 = ""; + final Class propertyLocation2 = PropertyLoader.class; + assertThat(configBuilder.withPropertyLocations(propertyLocation1, propertyLocation2), + is(sameInstance(configBuilder))); + + InOrder order = inOrder(propertyLoader, locationContainer); + order.verify(propertyLoader).getLocations(); + order.verify(locationContainer).clear(); + order.verify(locationContainer).atDirectory(propertyLocation1); + order.verify(locationContainer).atRelativeToClass(propertyLocation2); + order.verifyNoMoreInteractions(); + } + + @Test + public void testWithPropertyFilters() { + + assertThat(configBuilder.withPropertyFilters( + VariableResolvingFilter.class, DecryptingFilter.class), + is(sameInstance(configBuilder))); + + InOrder order = inOrder(propertyLoader, filterContainer, filters); + order.verify(propertyLoader).getFilters(); + order.verify(filterContainer).getFilters(); + order.verify(filters).clear(); + order.verify(filters).add(isA(VariableResolvingFilter.class)); + order.verify(filters).add(isA(DecryptingFilter.class)); + order.verifyNoMoreInteractions(); + } } diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java index 78f2cdf1..0c416382 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderWithoutAnnotationsIntegrationTest.java @@ -4,6 +4,9 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.tngtech.configbuilder.testclasses.TestConfigWithoutAnnotations; +import com.tngtech.propertyloader.PropertyLoader; +import com.tngtech.propertyloader.impl.filters.DecryptingFilter; +import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -35,6 +38,7 @@ public void setUp() { expectedConfig = new TestConfigWithoutAnnotations(); expectedConfig.setSomeString("Hello, Galaxy!"); + expectedConfig.setOtherString("${a}"); expectedConfig.setSomeNumber(3); expectedConfig.setBoolean(true); expectedConfig.setStringCollection(Lists.newArrayList("first entry", "second entry")); @@ -55,6 +59,8 @@ public void testConfigBuilderWithParameters() { additionalProperties.put("a", "Hello, Galaxy!"); String[] args = new String[]{"-u", "--collection", "first entry,second entry"}; Object result = configBuilder + .withPropertyLocations(PropertyLoader.class) + .withPropertyFilters(DecryptingFilter.class) .withPropertyExtension("testproperties") .withPropertySuffix("test") .withPropertiesFile("demoapp-configuration") diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java index 4dabbf12..e58d9187 100644 --- a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfigWithoutAnnotations.java @@ -18,8 +18,6 @@ import java.util.HashSet; import java.util.List; -@PropertyLocations(resourcesForClasses = {PropertyLoader.class}) -@PropertyFilters({VariableResolvingFilter.class, DecryptingFilter.class}) public class TestConfigWithoutAnnotations { public TestConfigWithoutAnnotations() { @@ -43,6 +41,9 @@ public TestConfigWithoutAnnotations transform(String input) { @PropertyValue("a") private String someString; + + @PropertyValue("b") + private String otherString; @CommandLineValue(shortOpt = "u", longOpt = "user") private boolean aBoolean; @@ -84,6 +85,15 @@ public void setSomeString(String someString) { this.someString = someString; } + public String getOtherString() { + return otherString; + } + + public void setOtherString(String otherString) { + this.otherString = otherString; + } + + public void setBoolean(boolean aBoolean) { this.aBoolean = aBoolean; } From 6e41b4f85f0279b5746c538553b26bfb841107b1 Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Fri, 14 Mar 2014 13:37:36 +0100 Subject: [PATCH 014/448] [maven-release-plugin] prepare release config-builder-1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 91828de0..4b1feeec 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.2-SNAPSHOT + 1.2 jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 10543ebd0d792d8752923059778f08634749a5f4 Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Fri, 14 Mar 2014 13:37:40 +0100 Subject: [PATCH 015/448] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4b1feeec..e50773c0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.2 + 1.3-SNAPSHOT jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 60122d57b0200344bbf66331b4c3a6584c079c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Tue, 17 Jun 2014 17:55:21 +0200 Subject: [PATCH 016/448] syntactic sugar for config builder creation --- .../tngtech/configbuilder/ConfigBuilder.java | 6 +++++- .../configbuilder/ConfigBuilderTest.java | 20 +++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java index 11d54f81..ece3183a 100644 --- a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java +++ b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java @@ -87,7 +87,7 @@ protected ConfigBuilder(Class configClass, ConfigBuilderFactory configBuilder * @param configClass The config class of which an instance shall be built. */ public ConfigBuilder(Class configClass) { - this(configClass,new ConfigBuilderFactory()); + this(configClass, new ConfigBuilderFactory()); } /** @@ -283,4 +283,8 @@ private void initializeErrorMessageSetup(PropertyLoader propertyLoader) { String errorMessageFile = configClass.isAnnotationPresent(ErrorMessageFile.class) ? configClass.getAnnotation(ErrorMessageFile.class).value() : null; errorMessageSetup.initialize(errorMessageFile, propertyLoader); } + + public static ConfigBuilder on(Class clazz) { + return new ConfigBuilder(clazz); + } } \ No newline at end of file diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java index 7c3fd1e8..a838e456 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderTest.java @@ -4,9 +4,8 @@ import com.tngtech.configbuilder.annotation.configuration.LoadingOrder; import com.tngtech.configbuilder.configuration.BuilderConfiguration; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; -import com.tngtech.configbuilder.testclasses.TestConfigWithoutAnnotations; -import com.tngtech.configbuilder.util.ConfigBuilderFactory; import com.tngtech.configbuilder.testclasses.TestConfig; +import com.tngtech.configbuilder.testclasses.TestConfigWithoutAnnotations; import com.tngtech.configbuilder.util.*; import com.tngtech.propertyloader.PropertyLoader; import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; @@ -21,7 +20,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Matchers; import org.mockito.Mock; @@ -32,12 +30,11 @@ import java.util.List; import java.util.Properties; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.sameInstance; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.*; import static org.mockito.Mockito.*; +import static org.mockito.Mockito.isA; @RunWith(MockitoJUnitRunner.class) public class ConfigBuilderTest { @@ -266,4 +263,11 @@ public void testWithPropertyFilters() { order.verify(filters).add(isA(DecryptingFilter.class)); order.verifyNoMoreInteractions(); } + + @Test + public void testStaticBuilderFactoryMethod() { + configBuilder = ConfigBuilder.on(TestConfig.class); + + assertThat(configBuilder, is(not(nullValue()))); + } } From c436ea45016204dc82270dfdfcc1851a9138ca27 Mon Sep 17 00:00:00 2001 From: bmatthias Date: Mon, 23 Jun 2014 08:54:14 +0200 Subject: [PATCH 017/448] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b1a9be4..25f1729e 100644 --- a/README.md +++ b/README.md @@ -178,11 +178,11 @@ public class Config { @NotEmpty("username.notEmpty") // JSR-303 validation (Field should not be empty) private String userName; - @TypeTransformer(StringToPidFixTransformer.class) + @TypeTransformers(StringToPidFixTransformer.class) @CommandLineValue(shortOpt="pc", longOpt="pidFixCollection", hasArg=true) private Collection pidFixCollection; - @TypeTransformer(StringToPidFixTransformer.class) + @TypeTransformers(StringToPidFixTransformer.class) @CommandLineValue(shortOpt="p", longOpt="pidFix", hasArg=true) private PidFix pidFix; From ed10c770c1937cbbc2e3830b392f51addb706e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Mon, 23 Jun 2014 10:56:38 +0200 Subject: [PATCH 018/448] updated/removed dependencies --- pom.xml | 9 ++------- .../typetransformer/StringToColorTransformer.java | 11 +++++++++++ .../typetransformer/StringToLocaleTransformer.java | 10 ++++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToColorTransformer.java create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToLocaleTransformer.java diff --git a/pom.xml b/pom.xml index e50773c0..e705378f 100644 --- a/pom.xml +++ b/pom.xml @@ -144,18 +144,13 @@ com.google.guava guava - 15.0 + 17.0 org.reflections reflections 0.9.8 - - cglib - cglib - 2.2.2 - commons-cli commons-cli @@ -185,7 +180,7 @@ - 1.7.5 + 1.7.7 diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToColorTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToColorTransformer.java new file mode 100644 index 00000000..3610df67 --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToColorTransformer.java @@ -0,0 +1,11 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import java.awt.*; + +public class StringToColorTransformer extends TypeTransformer { + + @Override + public Color transform(String colorTextValue) { + return Color.decode(colorTextValue); + } +} diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToLocaleTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToLocaleTransformer.java new file mode 100644 index 00000000..c31558b2 --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToLocaleTransformer.java @@ -0,0 +1,10 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import java.util.Locale; + +public class StringToLocaleTransformer extends TypeTransformer { + @Override + public Locale transform(String localeText) { + return Locale.forLanguageTag(localeText); + } +} From bf7178be13fdb82f7021cab9e66c9bc8b49e1397 Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Tue, 15 Jul 2014 16:49:23 +0200 Subject: [PATCH 019/448] [maven-release-plugin] prepare release config-builder-1.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e705378f..27346c75 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.3-SNAPSHOT + 1.3 jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 9897a1951a6786ce12861821b4af520f350e3b7f Mon Sep 17 00:00:00 2001 From: Andreas Schmid Date: Tue, 15 Jul 2014 16:49:27 +0200 Subject: [PATCH 020/448] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 27346c75..b2b6b22a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.3 + 1.4-SNAPSHOT jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 366f7766570e1f3e351907f86865633301d1011f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Wallat?= Date: Wed, 27 Aug 2014 10:58:38 +0200 Subject: [PATCH 021/448] - support for Java8 when using together with PowerMock (javassist version from 3.18.2-GA is needed) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b2b6b22a..71888e09 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ org.reflections reflections - 0.9.8 + 0.9.9-RC2 commons-cli From 29b5e759fec746a65686cf1729c06ebb9c041c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Wed, 10 Dec 2014 19:44:10 +0100 Subject: [PATCH 022/448] fixed #27 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25f1729e..f4953979 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ Say you have a config that looks like this: @PropertySuffixes(extraSuffixes = {"tngtech","myname"}, hostNames = true) public class Config { - public static class StringToPidFixTransformer implements TypeTransformer { + public static class StringToPidFixTransformer extends TypeTransformer { @Override public PidFix transform(String input) { <...> From 0c1048540d6519c655910ea5a0ab2f16c4054e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Thu, 30 Oct 2014 15:33:33 +0100 Subject: [PATCH 023/448] fixed transformer type recognition and added string to enum transformer --- .../StringToEnumTypeTransformer.java | 15 +++ .../typetransformer/TypeTransformer.java | 57 +++++++-- .../StringToEnumTypeTransformerTest.java | 58 +++++++++ .../typetransformer/TypeTransformerTest.java | 121 ++++++++++++++++++ 4 files changed, 239 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformer.java create mode 100644 src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformerTest.java create mode 100644 src/test/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformerTest.java diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformer.java new file mode 100644 index 00000000..d4210741 --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformer.java @@ -0,0 +1,15 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +public class StringToEnumTypeTransformer> extends TypeTransformer { + + private final Class enumClass; + + public StringToEnumTypeTransformer(Class enumClass) { + this.enumClass = enumClass; + } + + @Override + public E transform(final String value) { + return E.valueOf(enumClass, value.trim().replace(' ', '_').toUpperCase()); + } +} diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformer.java index f9099ab0..ba7c680a 100644 --- a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformer.java +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformer.java @@ -5,13 +5,15 @@ import com.tngtech.configbuilder.util.ConfigBuilderFactory; import com.tngtech.configbuilder.util.FieldValueTransformer; -import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.ArrayList; +import java.lang.reflect.TypeVariable; +import java.util.HashMap; +import java.util.Map; /** * Implementations of this interface transform an object into a different type of object + * * @param the type of the parameter before the transformation * @param return type */ @@ -33,26 +35,57 @@ public void initialize(FieldValueTransformer fieldValueTransformer, ConfigBuilde } public boolean isMatching(Class sourceClass, Class targetClass) { - Class transformerSourceClass = getTransformerSourceClass(); - Class transformerTargetClass = getTransformerTargetClass(); - if(transformerSourceClass.isAssignableFrom(sourceClass) && targetClass.isAssignableFrom(transformerTargetClass)) { - return true; - } - return false; + return getTransformerSourceClass().isAssignableFrom(sourceClass) && + targetClass.isAssignableFrom(getTransformerTargetClass()); } protected Class getTransformerSourceClass() { - Type typeOfInterface = this.getClass().getGenericSuperclass(); - Type[] genericTypes = ((ParameterizedType) typeOfInterface).getActualTypeArguments(); + Type[] genericTypes = determineTypeArguments(); return genericsAndCastingHelper.castTypeToClass(genericTypes[0]); } protected Class getTransformerTargetClass() { - Type typeOfInterface = this.getClass().getGenericSuperclass(); - Type[] genericTypes = ((ParameterizedType) typeOfInterface).getActualTypeArguments(); + Type[] genericTypes = determineTypeArguments(); return genericsAndCastingHelper.castTypeToClass(genericTypes[1]); } + private Type[] determineTypeArguments() { + Class clazz = getClass(); + Type[] typeArguments = new Type[]{}; + + while (!clazz.equals(TypeTransformer.class)) { + TypeVariable[] typeParameters = clazz.getTypeParameters(); + + Map typeVariableMap = buildTypeNameMap(typeArguments, typeParameters); + + typeArguments = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments(); + + replaceKnownTypes(typeArguments, typeVariableMap); + + clazz = clazz.getSuperclass(); + } + return typeArguments; + } + + private Map buildTypeNameMap(Type[] typeArguments, TypeVariable[] typeParameters) { + Map typeVariableMap = new HashMap(); + for (int i = 0; i < typeParameters.length; i++) { + typeVariableMap.put(typeParameters[i], typeArguments[i]); + } + return typeVariableMap; + } + + private void replaceKnownTypes(Type[] typeArguments, Map typeVariableMap) { + for (int i = 0; i < typeArguments.length; i++) { + if (typeArguments[i] instanceof TypeVariable) { + TypeVariable typeVariable = (TypeVariable) typeArguments[i]; + if (typeVariableMap.containsKey(typeVariable)) { + typeArguments[i] = typeVariableMap.get(typeVariable); + } + } + } + } + public void setTargetType(Type targetType) { this.targetType = targetType; } diff --git a/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformerTest.java b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformerTest.java new file mode 100644 index 00000000..ff853cb4 --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToEnumTypeTransformerTest.java @@ -0,0 +1,58 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import com.tngtech.configbuilder.configuration.ErrorMessageSetup; +import com.tngtech.configbuilder.util.ConfigBuilderFactory; +import com.tngtech.configbuilder.util.FieldValueTransformer; +import com.tngtech.configbuilder.util.GenericsAndCastingHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class StringToEnumTypeTransformerTest { + + private StringToTestEnumTransformer transformer; + + enum TestEnum { + ONE + } + + public static class StringToTestEnumTransformer extends StringToEnumTypeTransformer { + public StringToTestEnumTransformer() { + super(TestEnum.class); + } + } + + @Mock + private ConfigBuilderFactory configBuilderFactory; + + @Before + public void setUp() { + initializeFactoryMocks(); + transformer = new StringToTestEnumTransformer(); + transformer.initialize(new FieldValueTransformer(configBuilderFactory), configBuilderFactory); + } + + private void initializeFactoryMocks() { + when(configBuilderFactory.getInstance(ErrorMessageSetup.class)).thenReturn(new ErrorMessageSetup()); + when(configBuilderFactory.getInstance(GenericsAndCastingHelper.class)).thenReturn(new GenericsAndCastingHelper()); + } + + @Test + public void testTransform() throws Exception { + assertThat(transformer.transform(TestEnum.ONE.name()), is(TestEnum.ONE)); + } + + @Test + public void testIsMatching() throws Exception { + assertTrue(transformer.isMatching(String.class, TestEnum.class)); + assertFalse(transformer.isMatching(String.class, Integer.class)); + assertTrue(transformer.isMatching(String.class, Enum.class)); + } +} \ No newline at end of file diff --git a/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformerTest.java b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformerTest.java new file mode 100644 index 00000000..8ee1254c --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/TypeTransformerTest.java @@ -0,0 +1,121 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import com.tngtech.configbuilder.util.ConfigBuilderFactory; +import com.tngtech.configbuilder.util.FieldValueTransformer; +import com.tngtech.configbuilder.util.GenericsAndCastingHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class TypeTransformerTest { + + private static class TestTypeTransformer extends TypeTransformer { + @Override + public Integer transform(String argument) { + return Integer.getInteger(argument); + } + } + + private static class TestIntermediateTypeTransformer extends TypeTransformer { + @Override + public T transform(String argument) { + return null; + } + } + + private static class TestInheritedTypeTransformer extends TestIntermediateTypeTransformer { + } + + private static class TestUntypedIntermediateTypeTransformer extends TypeTransformer { + @Override + public V transform(U argument) { + return null; + } + } + + private static class TestUntypedInheritedTypeTransformer extends TestUntypedIntermediateTypeTransformer { + } + + private static class TestUntypedRevertedIntermediateTypeTransformer extends TypeTransformer { + @Override + public V transform(U argument) { + return null; + } + } + + private static class TestUntypedRevertedInheritedTypeTransformer extends TestUntypedRevertedIntermediateTypeTransformer { + } + + @Mock + private FieldValueTransformer fieldValueTransformer; + + @Mock + private ConfigBuilderFactory configBuilderFactory; + + @Before + public void setUp() { + when(configBuilderFactory.getInstance(GenericsAndCastingHelper.class)).thenReturn(new GenericsAndCastingHelper()); + } + + private TypeTransformer createSimpleTypeTransformer() { + TypeTransformer typeTransformer = new TestTypeTransformer(); + typeTransformer.initialize(fieldValueTransformer, configBuilderFactory); + return typeTransformer; + } + + private TypeTransformer createInheritedTypeTransformer() { + TypeTransformer typeTransformer = new TestInheritedTypeTransformer(); + typeTransformer.initialize(fieldValueTransformer, configBuilderFactory); + return typeTransformer; + } + + private TypeTransformer createUntypedInheritedTypeTransformer() { + TypeTransformer typeTransformer = new TestUntypedInheritedTypeTransformer(); + typeTransformer.initialize(fieldValueTransformer, configBuilderFactory); + return typeTransformer; + } + + private TypeTransformer createUntypedRevertedInheritedTypeTransformer() { + TypeTransformer typeTransformer = new TestUntypedRevertedInheritedTypeTransformer(); + typeTransformer.initialize(fieldValueTransformer, configBuilderFactory); + return typeTransformer; + } + + @Test + public void testSimpleTypeTransformer() { + final TypeTransformer typeTransformer = createSimpleTypeTransformer(); + + //noinspection unchecked + assertTrue(typeTransformer.isMatching(String.class, Integer.class)); + } + + @Test + public void testInheritedTypeTransformerMatch() { + final TypeTransformer typeTransformer = createInheritedTypeTransformer(); + + //noinspection unchecked + assertTrue(typeTransformer.isMatching(String.class, Integer.class)); + } + + @Test + public void testUntypedInheritedTypeTransformerMatch() { + final TypeTransformer typeTransformer = createUntypedInheritedTypeTransformer(); + + //noinspection unchecked + assertTrue(typeTransformer.isMatching(String.class, Integer.class)); + } + + @Test + public void testUntypedRevertedInheritedTypeTransformerMatch() { + final TypeTransformer typeTransformer = createUntypedRevertedInheritedTypeTransformer(); + + //noinspection unchecked + assertTrue(typeTransformer.isMatching(String.class, Integer.class)); + } +} \ No newline at end of file From 22efd43ed5afda9d9286270aa2cad1bdd982d166 Mon Sep 17 00:00:00 2001 From: Andreas Wuerl Date: Tue, 24 Mar 2015 23:36:42 +0100 Subject: [PATCH 024/448] updated javadoc and readme for config builder factory method --- README.md | 2 +- src/main/java/com/tngtech/configbuilder/ConfigBuilder.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f4953979..ee19d1de 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ public class Config { ``` To build a configured instance, simply call ```java -Config myConfig = new ConfigBuilder(Config.class).withCommandLineArgs(args).build(); +Config myConfig = ConfigBuilder.on(Config.class).withCommandLineArgs(args).build(); ``` Presentation diff --git a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java index ece3183a..4a4544f1 100644 --- a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java +++ b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java @@ -284,6 +284,12 @@ private void initializeErrorMessageSetup(PropertyLoader propertyLoader) { errorMessageSetup.initialize(errorMessageFile, propertyLoader); } + /** + * Gets an instance of the ConfigBuilder for a given config class + * + * @param clazz config class for which the config builder is instantiated. + * @return ConfigBuilder instance for config class + */ public static ConfigBuilder on(Class clazz) { return new ConfigBuilder(clazz); } From d338ae765c884e68c1b62df0c58dfd7d2a70f646 Mon Sep 17 00:00:00 2001 From: Andreas Wuerl Date: Tue, 24 Mar 2015 23:47:25 +0100 Subject: [PATCH 025/448] improved property filters processor test --- .../PropertyFiltersProcessorTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java b/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java index 75841e0a..c5ec87a2 100644 --- a/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java +++ b/src/test/java/com/tngtech/configbuilder/annotation/propertyloaderconfiguration/PropertyFiltersProcessorTest.java @@ -2,9 +2,7 @@ import com.tngtech.propertyloader.PropertyLoader; import com.tngtech.propertyloader.impl.DefaultPropertyFilterContainer; -import com.tngtech.propertyloader.impl.filters.DecryptingFilter; -import com.tngtech.propertyloader.impl.filters.ValueModifyingFilter; -import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; +import com.tngtech.propertyloader.impl.filters.*; import com.tngtech.propertyloader.impl.interfaces.PropertyLoaderFilter; import junit.framework.TestCase; import org.junit.Before; @@ -67,7 +65,13 @@ public void testAnnotationWithNoValues() { @Test public void testAnnotationWithSomeValues() { - @SuppressWarnings("unchecked") Class[] classes = new Class[]{VariableResolvingFilter.class, DecryptingFilter.class}; + @SuppressWarnings("unchecked") Class[] classes = new Class[]{ + VariableResolvingFilter.class, + DecryptingFilter.class, + EnvironmentResolvingFilter.class, + WarnOnSurroundingWhitespace.class, + ThrowIfPropertyHasToBeDefined.class + }; when(propertyFilters.value()).thenReturn(classes); propertyFiltersProcessor.configurePropertyLoader( propertyFilters, propertyLoader ); @@ -76,6 +80,10 @@ public void testAnnotationWithSomeValues() { order.verify(filterContainer).clear(); order.verify(filterContainer).withVariableResolvingFilter(); order.verify(filterContainer).withDecryptingFilter(); + order.verify(filterContainer).withEnvironmentResolvingFilter(); + order.verify(filterContainer).withWarnOnSurroundingWhitespace(); + order.verify(filterContainer).withWarnIfPropertyHasToBeDefined(); + order.verifyNoMoreInteractions(); } @Test From 0fa0153ba205252bf2a3018217b2bf29edabc0da Mon Sep 17 00:00:00 2001 From: Matthias Bollwein Date: Sat, 4 Jul 2015 19:50:56 +0200 Subject: [PATCH 026/448] added trim() to StringToPrimitiveTransformer --- .../StringOrPrimitiveToPrimitiveTransformer.java | 2 +- .../StringToPrimitiveTransformerTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringOrPrimitiveToPrimitiveTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringOrPrimitiveToPrimitiveTransformer.java index ec760c1d..a1ec003e 100644 --- a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringOrPrimitiveToPrimitiveTransformer.java +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringOrPrimitiveToPrimitiveTransformer.java @@ -14,7 +14,7 @@ public class StringOrPrimitiveToPrimitiveTransformer extends TypeTransformer Date: Sat, 4 Jul 2015 22:52:14 +0200 Subject: [PATCH 027/448] fixed misplaced whitespace character in test --- .../typetransformer/StringToPrimitiveTransformerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToPrimitiveTransformerTest.java b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToPrimitiveTransformerTest.java index 1ffee626..d4babb84 100644 --- a/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToPrimitiveTransformerTest.java +++ b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToPrimitiveTransformerTest.java @@ -68,7 +68,7 @@ public void testThatSurroundingWhiteSpaceIsIgnored() throws Exception { stringOrPrimitiveToPrimitiveTransformer.initialize(fieldValueTransformer, configBuilderFactory); stringOrPrimitiveToPrimitiveTransformer.setTargetType(boolean.class); - assertEquals(true, stringOrPrimitiveToPrimitiveTransformer.transform(" true")); + assertEquals(true, stringOrPrimitiveToPrimitiveTransformer.transform("true ")); assertEquals(true, stringOrPrimitiveToPrimitiveTransformer.transform(" true ")); assertEquals(true, stringOrPrimitiveToPrimitiveTransformer.transform(" true")); From 8cb50e5f348cebdfc83629cffbdb086c80a54ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=A4fer?= Date: Fri, 10 Jul 2015 16:53:49 +0200 Subject: [PATCH 028/448] [maven-release-plugin] prepare release config-builder-1.3.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 71888e09..ed24bdc9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.4-SNAPSHOT + 1.3.1 jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 7aadc6f2af95d243259120dcabbe74b542dc6a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=A4fer?= Date: Fri, 10 Jul 2015 16:53:53 +0200 Subject: [PATCH 029/448] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed24bdc9..71888e09 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.tngtech.java config-builder - 1.3.1 + 1.4-SNAPSHOT jar Config-Builder The Config Builder creates fully configured instances of config classes, using values from various sources like properties files, command line arguments etc. From 551f0f6ef77f1e34031f86a34f9004fc99c4b294 Mon Sep 17 00:00:00 2001 From: Fabian Winter Date: Fri, 14 Aug 2015 11:14:44 +0200 Subject: [PATCH 030/448] Add StringToFileTransformer --- .../StringToFileTransformer.java | 10 ++++ .../StringToFileTransformerTest.java | 56 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformer.java create mode 100644 src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformerTest.java diff --git a/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformer.java b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformer.java new file mode 100644 index 00000000..e55bb1b1 --- /dev/null +++ b/src/main/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformer.java @@ -0,0 +1,10 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import java.io.File; + +public class StringToFileTransformer extends TypeTransformer { + @Override + public File transform(String argument) { + return new File(argument); + } +} diff --git a/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformerTest.java b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformerTest.java new file mode 100644 index 00000000..ff76aab3 --- /dev/null +++ b/src/test/java/com/tngtech/configbuilder/annotation/typetransformer/StringToFileTransformerTest.java @@ -0,0 +1,56 @@ +package com.tngtech.configbuilder.annotation.typetransformer; + +import com.tngtech.configbuilder.util.ConfigBuilderFactory; +import com.tngtech.configbuilder.util.FieldValueTransformer; +import com.tngtech.configbuilder.util.GenericsAndCastingHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.io.File; +import java.lang.reflect.ParameterizedType; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class StringToFileTransformerTest { + + private StringToFileTransformer transformer; + + @Mock + private FieldValueTransformer fieldValueTransformer; + @Mock + private ConfigBuilderFactory configBuilderFactory; + @Mock + private GenericsAndCastingHelper genericsAndCastingHelper; + + @Before + public void setUp() throws Exception { + transformer = new StringToFileTransformer(); + } + + @Test + public void testTransform() throws Exception { + assertEquals(new File("."), transformer.transform(".")); + } + + @Test + public void testIsMatching() throws Exception { + initializeFactoryAndHelperMocks(); + transformer.initialize(fieldValueTransformer, configBuilderFactory); + + assertTrue(transformer.isMatching(String.class, File.class)); + assertFalse(transformer.isMatching(Object.class, File.class)); + } + + private void initializeFactoryAndHelperMocks(){ + when(configBuilderFactory.getInstance(GenericsAndCastingHelper.class)).thenReturn(genericsAndCastingHelper); + + when(genericsAndCastingHelper.castTypeToClass(String.class)).thenReturn((Class)String.class); + when(genericsAndCastingHelper.castTypeToClass(Object.class)).thenReturn((Class)Object.class); + when(genericsAndCastingHelper.castTypeToClass(((ParameterizedType)(transformer.getClass().getGenericSuperclass())).getActualTypeArguments()[1])).thenReturn((Class)File.class); + } +} \ No newline at end of file From b4192507cd960859b2196bbd8f3278680ce0e11b Mon Sep 17 00:00:00 2001 From: Fabian Winter Date: Fri, 14 Aug 2015 12:48:46 +0200 Subject: [PATCH 031/448] Update many dependencies excluding Hibernate, because there are incompatible changes --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 71888e09..16038e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -126,40 +126,40 @@ junit junit - 4.11 + 4.12 test org.mockito - mockito-all - 1.9.5 + mockito-core + 1.10.19 test org.unitils unitils-core - 3.3 + 3.4.2 test com.google.guava guava - 17.0 + 18.0 org.reflections reflections - 0.9.9-RC2 + 0.9.10 commons-cli commons-cli - 1.2 + 1.3.1 javax.validation validation-api - 1.0.0.GA + 1.1.0.Final org.hibernate From a5a5d1c5e3104f41527a45c6e1f6613c004b3a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Thu, 24 Sep 2015 00:49:11 +0200 Subject: [PATCH 032/448] support coveralls --- .travis.yml | 5 ++++- README.md | 2 +- pom.xml | 18 ++++++++++++++++++ .../tngtech/configbuilder/ConfigBuilder.java | 16 ++++++++-------- .../configbuilder/util/CommandLineHelper.java | 3 +++ .../configbuilder/util/FieldSetter.java | 4 ++++ .../ConfigBuilderIntegrationTest.java | 16 ++++++++++------ .../configbuilder/testclasses/TestConfig.java | 9 +++------ .../configbuilder/util/FieldSetterTest.java | 1 - 9 files changed, 51 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0206b6fd..016d2386 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: java install: "mvn install -DskipTests=true" -script: "mvn test -e" +script: "mvn -e clean test jacoco:report coveralls:report" jdk: - oraclejdk7 + - oraclejdk8 + - openjdk7 + diff --git a/README.md b/README.md index ee19d1de..2ff482fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.png?branch=master)](https://travis-ci.org/TNG/config-builder) +Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=coveralls_support)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/wuan/config-builder/badge.svg?branch=coveralls_support&service=github)](https://coveralls.io/github/wuan/config-builder?branch=coveralls_support) ================== #### Table of Contents diff --git a/pom.xml b/pom.xml index 16038e8f..c87bd0df 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,24 @@
+ + org.jacoco + jacoco-maven-plugin + 0.7.5.201505241946 + + + prepare-agent + + prepare-agent + + + + + + org.eluder.coveralls + coveralls-maven-plugin + 4.0.0 + diff --git a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java index 4a4544f1..78faab52 100644 --- a/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java +++ b/src/main/java/com/tngtech/configbuilder/ConfigBuilder.java @@ -24,26 +24,26 @@ * Builds a config object. * ConfigBuilder instantiates a class and sets fields of the instance by parsing annotations and * loading values from properties files or the command line. It validates the instance by parsing JSR303 constraint annotations.

- *

+ * * Fields of the config class can have the following annotations:
* {@link com.tngtech.configbuilder.annotation.valueextractor.DefaultValue}
* {@link com.tngtech.configbuilder.annotation.valueextractor.PropertyValue}
* {@link com.tngtech.configbuilder.annotation.valueextractor.CommandLineValue}
* {@link com.tngtech.configbuilder.annotation.valueextractor.SystemPropertyValue}
* {@link com.tngtech.configbuilder.annotation.valueextractor.EnvironmentVariableValue}
- * {@link LoadingOrder}

- *

+ * {@link LoadingOrder}
+ * * Properties files are loaded with a PropertyLoader using its default config. In order to change settings for the PropertyLoader, the config class may be annotated with
* {@link com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertiesFiles}
* {@link com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyLocations}
* {@link com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertySuffixes}
- * {@link com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyExtension}

- *

+ * {@link com.tngtech.configbuilder.annotation.propertyloaderconfiguration.PropertyExtension}
+ * * To specify a global order for parsing {@link com.tngtech.configbuilder.annotation.valueextractor.ValueExtractorAnnotation} annotations, annotate the class with
- * {@link LoadingOrder}

- *

+ * {@link LoadingOrder}
+ * * To specify your own error messages file (which is loaded by the PropertyLoader with the same settings as other the properties files), annotate the class with
- * {@link ErrorMessageFile}

+ * {@link ErrorMessageFile}
* * @param The type of the config class which shall be instantiated. * @author Matthias Bollwein diff --git a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java index 7c126bb0..00a326e6 100644 --- a/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java +++ b/src/main/java/com/tngtech/configbuilder/util/CommandLineHelper.java @@ -32,6 +32,9 @@ public CommandLine getCommandLine(Class configClass, String[] args) { public Options getOptions(Class configClass) { Options options = configBuilderFactory.createInstance(Options.class); for (Field field : annotationHelper.getFieldsAnnotatedWith(configClass, CommandLineValue.class)) { + if (field.isSynthetic()) { + continue; + } options.addOption(getOption(field)); } return options; diff --git a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java index 75e4d514..9252f332 100644 --- a/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java +++ b/src/main/java/com/tngtech/configbuilder/util/FieldSetter.java @@ -31,6 +31,10 @@ public FieldSetter(ConfigBuilderFactory configBuilderFactory) { public void setFields(T instanceOfConfigClass, BuilderConfiguration builderConfiguration) { for (Field field : getInheritedPrivateFields(instanceOfConfigClass.getClass())) { + if (field.isSynthetic()) { + continue; + } + if (annotationHelper.fieldHasAnnotationAnnotatedWith(field, ValueExtractorAnnotation.class)) { Object value = fieldValueExtractor.extractValue(field, builderConfiguration); value = fieldValueTransformer.transformFieldValue(field, value); diff --git a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java index 057f4a51..f5537263 100644 --- a/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java +++ b/src/test/java/com/tngtech/configbuilder/ConfigBuilderIntegrationTest.java @@ -1,6 +1,7 @@ package com.tngtech.configbuilder; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.tngtech.configbuilder.testclasses.TestConfig; @@ -13,14 +14,17 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals; +import static org.unitils.reflectionassert.ReflectionAssert.assertLenientEquals; @RunWith(Parameterized.class) public class ConfigBuilderIntegrationTest { @@ -64,7 +68,7 @@ public ConfigBuilderIntegrationTest(Class configClass, Object configInstance) { @Test public void testConfigBuilderWithParameters() { - ConfigBuilder configBuilder = new ConfigBuilder(configClass); + ConfigBuilder configBuilder = ConfigBuilder.on(configClass); String[] args = new String[]{"-u", "--collection", "first entry,second entry"}; Object result = configBuilder.withCommandLineArgs(args).build(); assertReflectionEquals(configInstance, result); @@ -86,11 +90,12 @@ public void testWithImportedConfig() { TestConfig importedTestConfig = new TestConfig(); importedTestConfig.setSomeNumber(5); - importedTestConfig.setStringCollection(Lists.newArrayList("/mnt","/home")); + importedTestConfig.setStringCollection(Lists.newArrayList("/mnt", "/home")); TestConfig expectedTestConfig = new TestConfig(); expectedTestConfig.setSomeNumber(5); - expectedTestConfig.setPathCollection(Sets.newHashSet(Paths.get("/mnt"), Paths.get("/home"))); + List paths = Arrays.asList(Paths.get("/mnt"), Paths.get("/home")); + expectedTestConfig.setPathCollection(Sets.newLinkedHashSet(paths)); expectedTestConfig.setCopiedStringCollection(importedTestConfig.getStringCollection()); expectedTestConfig.setSomeString("Hello, World!"); expectedTestConfig.setBoolean(true); @@ -100,12 +105,11 @@ public void testWithImportedConfig() { expectedTestConfig.setHomeDir(Paths.get(home)); expectedTestConfig.setSystemProperty(userLanguage); - - ConfigBuilder configBuilder = new ConfigBuilder(configClass); + ConfigBuilder configBuilder = ConfigBuilder.on(configClass); String[] args = new String[]{"-u", "--collection", "collection,two"}; Object result = configBuilder.withCommandLineArgs(args).withImportedConfiguration(importedTestConfig).build(); - assertReflectionEquals(expectedTestConfig, result); + assertLenientEquals(expectedTestConfig, result); assertTrue(outContent.toString().contains("config validated")); } } diff --git a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java index c0f3551c..f9387fd5 100644 --- a/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java +++ b/src/test/java/com/tngtech/configbuilder/testclasses/TestConfig.java @@ -22,10 +22,7 @@ import com.tngtech.propertyloader.impl.filters.VariableResolvingFilter; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; +import java.util.*; @PropertyExtension("testproperties") @PropertySuffixes(extraSuffixes = {"test"}) @@ -66,7 +63,7 @@ public TestConfig transform(String input) { @DefaultValue("/etc,/usr") @ImportedValue("stringCollection") - private HashSet pathCollection; + private Set pathCollection; @ImportedValue("stringCollection") private Iterable copiedStringCollection; @@ -116,7 +113,7 @@ public Collection getPathCollection() { return pathCollection; } - public void setPathCollection(HashSet pathCollection) { + public void setPathCollection(Set pathCollection) { this.pathCollection = pathCollection; } diff --git a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java index 1ba6b7ae..933b0d34 100644 --- a/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/FieldSetterTest.java @@ -43,7 +43,6 @@ private static class TestConfigForIllegalArgumentException { } private static class TestConfigWithoutAnnotations { - public String testString = "testString"; } From 0628773f70ada3af0a32f68d1fc15b67cca3bd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Wed, 2 Dec 2015 00:54:24 +0100 Subject: [PATCH 033/448] fixed coveralls badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ff482fd..3994c674 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=coveralls_support)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/wuan/config-builder/badge.svg?branch=coveralls_support&service=github)](https://coveralls.io/github/wuan/config-builder?branch=coveralls_support) +Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=coveralls_support)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/TNG/config-builder/badge.svg?branch=master&service=github)](https://coveralls.io/github/TNG/config-builder?branch=master) ================== #### Table of Contents From cc807c1ed44c9dacbf9ed1b1bc1ee41113e41e64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20W=C3=BCrl?= Date: Wed, 2 Dec 2015 00:55:02 +0100 Subject: [PATCH 034/448] fixed build status badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3994c674..72cbca9f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=coveralls_support)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/TNG/config-builder/badge.svg?branch=master&service=github)](https://coveralls.io/github/TNG/config-builder?branch=master) +Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=master)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/TNG/config-builder/badge.svg?branch=master&service=github)](https://coveralls.io/github/TNG/config-builder?branch=master) ================== #### Table of Contents From 93810b0fc3a5095597f7c17881dde34be03c05b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Wu=CC=88rl?= Date: Fri, 15 Jan 2016 08:15:28 +0100 Subject: [PATCH 035/448] updated badges and versions --- README.md | 2 +- pom.xml | 14 +++++----- .../util/CommandLineHelperTest.java | 28 ++++++++++++++++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 72cbca9f..8e59d044 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=master)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/TNG/config-builder/badge.svg?branch=master&service=github)](https://coveralls.io/github/TNG/config-builder?branch=master) +Java Config-Builder [![Build Status](https://travis-ci.org/TNG/config-builder.svg?branch=master)](https://travis-ci.org/TNG/config-builder) [![Coverage Status](https://coveralls.io/repos/TNG/config-builder/badge.svg?branch=master&service=github)](https://coveralls.io/github/TNG/config-builder?branch=master) [![Dependency Status](https://www.versioneye.com/user/projects/56989a13af789b002e000b72/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56989a13af789b002e000b72) [![MavenCentral](https://img.shields.io/maven-central/v/com.tngtech.java/config-builder.svg)](http://search.maven.org/#artifactdetails|com.tngtech.java|config-builder|1.3.1|jar) ================== #### Table of Contents diff --git a/pom.xml b/pom.xml index c87bd0df..0babf3ff 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.3 1.6 1.6 @@ -64,7 +64,7 @@ org.apache.maven.plugins maven-source-plugin - 2.2.1 + 2.4 attach-sources @@ -78,7 +78,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 2.10.3 attach-javadocs @@ -104,7 +104,7 @@ org.eluder.coveralls coveralls-maven-plugin - 4.0.0 + 4.1.0 @@ -117,7 +117,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.4 + 1.6 sign-artifacts @@ -162,7 +162,7 @@ com.google.guava guava - 18.0 + 19.0 org.reflections @@ -198,7 +198,7 @@ - 1.7.7 + 1.7.13 diff --git a/src/test/java/com/tngtech/configbuilder/util/CommandLineHelperTest.java b/src/test/java/com/tngtech/configbuilder/util/CommandLineHelperTest.java index bfa0cb32..2ec99545 100644 --- a/src/test/java/com/tngtech/configbuilder/util/CommandLineHelperTest.java +++ b/src/test/java/com/tngtech/configbuilder/util/CommandLineHelperTest.java @@ -1,5 +1,8 @@ package com.tngtech.configbuilder.util; +import com.google.common.base.Predicate; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.tngtech.configbuilder.annotation.valueextractor.CommandLineValue; import com.tngtech.configbuilder.configuration.ErrorMessageSetup; @@ -15,7 +18,10 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import javax.annotation.Nullable; import java.lang.reflect.Field; +import java.util.Comparator; +import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; @@ -69,10 +75,24 @@ public void testGetCommandLine() throws Exception { assertEquals(commandLine, commandLineHelper.getCommandLine(TestConfig.class, args)); verify(options, times(2)).addOption(captor.capture()); verify(parser).parse(options, args); - Option option = captor.getValue(); - assertEquals("user", option.getLongOpt()); - assertEquals("u", option.getOpt()); - assertEquals(true, option.isRequired()); + List