public <C> C buildConfig(Class<C> configClass, Properties properties) throws ConfigBuilderException { Map<String, HandlerConfigProperty> configPropertiesByName = configPropertyParser.getConfigPropertiesByName(configClass); C configInstance; try { configInstance = configClass.newInstance(); } catch (Exception e) { throw new ConfigBuilderException("Failed to instantiate config class " + configClass.getSimpleName() + " - " + e.getClass().getSimpleName(), e); } //iterate sorted by field name for consistent/deterministic behaviour List<String> props = configPropertiesByName.keySet().stream().sorted().collect(Collectors.toList()); for ( String configPropertyName : props) { log.debug("Processing config property " + configPropertyName); HandlerConfigPropertyImpl configProperty = (HandlerConfigPropertyImpl)configPropertiesByName.get(configPropertyName); String propertyValue = properties.getProperty(configPropertyName); setValueForConfigProperty(configInstance, configPropertyName, configProperty, propertyValue); } warnOnUnusedProperties(properties, configPropertiesByName); runClassLevelValidation(configClass, configInstance); return configInstance; }
@Test public void primitiveTypedPropertiesGetDefaultValidation() throws ConfigBuilderException { Map<String, HandlerConfigProperty> m = configPropertyParser.getConfigPropertiesByName(ConfigBeanWithPrimitiveTypedProperties.class); assertEquals("^[-+]?\\d+$", m.get("integerProperty").getValidationPattern().get().pattern()); assertEquals("^[-+]?\\d+$", m.get("longProperty").getValidationPattern().get().pattern()); assertEquals("^[-+]?\\d+$", m.get("shortProperty").getValidationPattern().get().pattern()); assertEquals("^[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?$", m.get("floatProperty").getValidationPattern().get().pattern()); assertEquals("^[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?$", m.get("doubleProperty").getValidationPattern().get().pattern()); assertEquals("(?i)^true|false$", m.get("booleanProperty").getValidationPattern().get().pattern()); assertEquals("^\\S$", m.get("charProperty").getValidationPattern().get().pattern()); }
@Test public void defaultValuesCanBeConvertedToSimpleTypes() throws ConfigBuilderException { Map<String, HandlerConfigProperty> m = configPropertyParser.getConfigPropertiesByName(ConfigBeanWithPrimitiveTypedProperties.class); assertEquals(7, m.size()); assertEquals(1, m.get("integerProperty").getDefaultValue().get()); assertEquals(1000000L, m.get("longProperty").getDefaultValue().get()); assertEquals(1.23d, m.get("doubleProperty").getDefaultValue().get()); assertEquals(2.34f, m.get("floatProperty").getDefaultValue().get()); assertEquals(true, m.get("booleanProperty").getDefaultValue().get()); assertEquals('C', m.get("charProperty").getDefaultValue().get()); assertEquals((short)9, m.get("shortProperty").getDefaultValue().get()); }