TAMAYA-158: Aligned metadata format for model extension with defaults.

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

Branch: refs/heads/master
Commit: c742739a1e4a8d9545961085230f78f84d9359c2
Parents: 12261be
Author: anatole <anat...@apache.org>
Authored: Sun May 1 20:36:30 2016 +0200
Committer: anatole <anat...@apache.org>
Committed: Sun May 1 21:02:06 2016 +0200

----------------------------------------------------------------------
 .../model/internal/ConfigDocumentationBean.java |  4 +-
 .../ConfiguredInlineModelProviderSpi.java       |  3 +-
 .../ConfiguredResourcesModelProviderSpi.java    |  2 +-
 .../tamaya/model/spi/ConfigModelReader.java     | 82 ++++++--------------
 .../apache/tamaya/model/spi/SectionModel.java   |  3 +
 .../resources/META-INF/configmodel.properties   | 32 ++++----
 .../internal/ConfigDocumentationBeanTest.java   | 20 ++---
 .../resources/META-INF/configmodel.properties   | 78 +++++++++----------
 8 files changed, 95 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/java/org/apache/tamaya/model/internal/ConfigDocumentationBean.java
----------------------------------------------------------------------
diff --git 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfigDocumentationBean.java
 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfigDocumentationBean.java
index 2d40ac0..3298025 100644
--- 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfigDocumentationBean.java
+++ 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfigDocumentationBean.java
@@ -161,7 +161,7 @@ public class ConfigDocumentationBean implements 
ConfigDocumentationMBean{
 
 
     private JsonObject toJsonObject(ConfigModel val) {
-        JsonObjectBuilder valJson = Json.createObjectBuilder().add("type", 
val.getType().toString())
+        JsonObjectBuilder valJson = Json.createObjectBuilder().add("target", 
val.getType().toString())
                 .add("name", val.getName());
         if(val.getDescription()!=null) {
             valJson.add("description", val.getDescription());
@@ -173,7 +173,7 @@ public class ConfigDocumentationBean implements 
ConfigDocumentationMBean{
     }
 
     private JsonObject toJsonObject(Validation val) {
-        JsonObjectBuilder valJson = Json.createObjectBuilder().add("type", 
val.getConfigModel().getType().toString())
+        JsonObjectBuilder valJson = Json.createObjectBuilder().add("target", 
val.getConfigModel().getType().toString())
                 .add("name", val.getConfigModel().getName());
         if(val.getConfigModel().isRequired()){
             valJson.add("required",true);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredInlineModelProviderSpi.java
----------------------------------------------------------------------
diff --git 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredInlineModelProviderSpi.java
 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredInlineModelProviderSpi.java
index a15ce05..8111491 100644
--- 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredInlineModelProviderSpi.java
+++ 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredInlineModelProviderSpi.java
@@ -53,8 +53,7 @@ public class ConfiguredInlineModelProviderSpi implements 
ModelProviderSpi {
         if (enabled) {
             LOG.info("Reading model configuration from config...");
             Map<String,String> config = 
ConfigurationProvider.getConfiguration().getProperties();
-            configModels.addAll(ConfigModelReader.loadValidations(config,
-                    "<Inline Configuration Model>"));
+            configModels.addAll(ConfigModelReader.loadValidations(config));
         }
         configModels = Collections.unmodifiableList(configModels);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredResourcesModelProviderSpi.java
----------------------------------------------------------------------
diff --git 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredResourcesModelProviderSpi.java
 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredResourcesModelProviderSpi.java
index 2a136aa..7c5836e 100644
--- 
a/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredResourcesModelProviderSpi.java
+++ 
b/model/src/main/java/org/apache/tamaya/model/internal/ConfiguredResourcesModelProviderSpi.java
@@ -141,7 +141,7 @@ public class ConfiguredResourcesModelProviderSpi implements 
ModelProviderSpi {
             for (final URL config : urls) {
                 try (InputStream is = config.openStream()) {
                     final ConfigurationData data = 
ConfigurationFormats.readConfigurationData(config);
-                    
configModels.addAll(ConfigModelReader.loadValidations(data.getCombinedProperties(),
 config.toString()));
+                    
configModels.addAll(ConfigModelReader.loadValidations(data.getCombinedProperties()));
                 } catch (final Exception e) {
                     Logger.getLogger(getClass().getName()).log(Level.SEVERE,
                             "Error loading config model data from " + config, 
e);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/java/org/apache/tamaya/model/spi/ConfigModelReader.java
----------------------------------------------------------------------
diff --git 
a/model/src/main/java/org/apache/tamaya/model/spi/ConfigModelReader.java 
b/model/src/main/java/org/apache/tamaya/model/spi/ConfigModelReader.java
index b380051..b8d95d0 100644
--- a/model/src/main/java/org/apache/tamaya/model/spi/ConfigModelReader.java
+++ b/model/src/main/java/org/apache/tamaya/model/spi/ConfigModelReader.java
@@ -35,7 +35,7 @@ import org.apache.tamaya.model.ConfigModel;
 public final class ConfigModelReader {
 
     /** The default model entries selector. */
-    private static final String DEFAULT_META_INFO_SELECTOR = "{model}";
+    private static final String DEFAULT_META_INFO_SELECTOR = ".model";
     /** parameter to change the selector to be used for filtering out the 
target values to be used. */
     private static final String META_INFO_SELECTOR_PARAM = 
"org.apache.tamaya.model.integrated.selector";
 
@@ -43,84 +43,48 @@ public final class ConfigModelReader {
      * Utility class only.
      */
     private ConfigModelReader(){}
-///*
-//    *//**
-//     * Loads validations as configured in the given properties.
-//     * @param props the properties to be read
-//     * @param selector
-//     * @return a collection of config validations.
-//     *//*
-//    public static Collection<ConfigModel> loadValidations(Map<String,String> 
props, String selector) {
-//        Map<String,String> map = new HashMap<>();
-//        for(Map.Entry<String, String> en: props.entrySet()){
-//            if(!selector.matches(en.getKey())){
-//                map.put(en.getKey().toString(), 
props.get(en.getKey().toString()));
-//            }
-//        }
-//        return loadValidations(map);
-//    }*/
 
-    /**
-     * Loads validations as configured in the given properties.
-     * @param props the properties to be read
-     * @return a collection of config validations.
-     */
-    public static Collection<ConfigModel> loadValidations(Map<String,String> 
props) {
-        return loadValidations(props, getSelector(props));
-    }
-
-    /**
-     * Evaluates the correct selector.
-     * @param props
-     * @return
-     */
-    private static String getSelector(Map<String,String> props){
-        String selector = props.get(META_INFO_SELECTOR_PARAM);
-        if(selector==null){
-            selector = DEFAULT_META_INFO_SELECTOR;
-        }
-        return selector;
-    }
 
     /**
      * Loads validations as configured in the given properties.
      * @param props the properties to be read
-     * @param selector the selector (default is {model}), that identifies the 
model entries.
      * @return a collection of config validations.
      */
-    public static Collection<ConfigModel> loadValidations(Map<String,String> 
props, String selector) {
+    public static Collection<ConfigModel> loadValidations(Map<String,String> 
props) {
         List<ConfigModel> result = new ArrayList<>();
         Set<String> itemKeys = new HashSet<>();
         for (Object key : props.keySet()) {
-            if (key.toString().endsWith(".class")) {
-                itemKeys.add(key.toString().substring(0, 
key.toString().length() - ".class".length()));
+            if (key.toString().startsWith("_") &&
+                    key.toString().endsWith(DEFAULT_META_INFO_SELECTOR + 
".target")) {
+                itemKeys.add(key.toString().substring(0, 
key.toString().length() - ".model.target".length()));
             }
         }
         for (String baseKey : itemKeys) {
-            String clazz = props.get(baseKey + ".class");
-            String type = props.get(baseKey + ".type");
+            String target = props.get(baseKey + ".model.target");
+            String type = props.get(baseKey + ".model.type");
             if (type == null) {
                 type = String.class.getName();
             }
-            String value = props.get(baseKey + ".transitive");
+            String value = props.get(baseKey + ".model.transitive");
             boolean transitive = false;
             if(value!=null) {
                 transitive = Boolean.parseBoolean(value);
             }
-            String description = props.get(baseKey + ".description");
-            String regEx = props.get(baseKey + ".expression");
-            String validations = props.get(baseKey + ".validations");
-            String requiredVal = props.get(baseKey + ".required");
-            if ("Parameter".equalsIgnoreCase(clazz)) {
-                
result.add(createParameterValidation(baseKey.substring(selector.length() + 1), 
description, type,
-                            requiredVal, regEx, validations));
-            } else if ("Section".equalsIgnoreCase(clazz)) {
+            String description = props.get(baseKey + ".model.description");
+            String regEx = props.get(baseKey + ".model.expression");
+            String validations = props.get(baseKey + ".model.validations");
+            String requiredVal = props.get(baseKey + ".model.required");
+            String targetKey = baseKey.substring(1);
+            if ("Parameter".equalsIgnoreCase(target)) {
+                result.add(createParameterValidation(targetKey,
+                        description, type, requiredVal, regEx, validations));
+            } else if ("Section".equalsIgnoreCase(target)) {
                 if(transitive){
-                    
result.add(createSectionValidation(baseKey.substring(selector.length() + 
1)+".*", description, requiredVal,
-                            validations));
+                    result.add(createSectionValidation(targetKey+".*",
+                            description, requiredVal, validations));
                 } else {
-                    
result.add(createSectionValidation(baseKey.substring(selector.length() + 1), 
description, requiredVal,
-                            validations));
+                    result.add(createSectionValidation(targetKey,
+                            description, requiredVal, validations));
                 }
             }
         }
@@ -144,7 +108,7 @@ public final class ConfigModelReader {
                 
.setDescription(description).setExpression(regEx).setType(type);
 //        if (validations != null) {
 //            try {
-//                // TODO defined validator API
+//                // TODO define validator API
 ////                builder.addValidations(loadValidations(validations));
 //            } catch (Exception e) {
 //                LOGGER.log(Level.WARNING, "Failed to load validations for " 
+ paramName, e);
@@ -168,7 +132,7 @@ public final class ConfigModelReader {
                 .setDescription(description);
 //        if (validations != null) {
 //            try {
-//                // TODO defined validator API
+//                // TODO define validator API
 ////                builder.addValidations(loadValidations(valiadtions));
 //            } catch (Exception e) {
 //                LOGGER.log(Level.WARNING, "Failed to load validations for " 
+ sectionName, e);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/java/org/apache/tamaya/model/spi/SectionModel.java
----------------------------------------------------------------------
diff --git a/model/src/main/java/org/apache/tamaya/model/spi/SectionModel.java 
b/model/src/main/java/org/apache/tamaya/model/spi/SectionModel.java
index 9f55a2b..31eaa51 100644
--- a/model/src/main/java/org/apache/tamaya/model/spi/SectionModel.java
+++ b/model/src/main/java/org/apache/tamaya/model/spi/SectionModel.java
@@ -84,6 +84,9 @@ public class SectionModel extends GroupModel {
         String lookupKey = getName() + '.';
         boolean present = false;
         for(String key:map.keySet()){
+            if(key.startsWith("_")){
+                continue;
+            }
             if(key.startsWith(lookupKey)){
                 present = true;
                 break;

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/main/resources/META-INF/configmodel.properties
----------------------------------------------------------------------
diff --git a/model/src/main/resources/META-INF/configmodel.properties 
b/model/src/main/resources/META-INF/configmodel.properties
index 7861c9e..3381a09 100644
--- a/model/src/main/resources/META-INF/configmodel.properties
+++ b/model/src/main/resources/META-INF/configmodel.properties
@@ -17,19 +17,19 @@
 # under the License.
 #
 # Contains definitions for default system property areas.
-{model}.awt.class=Section
-{model}.awt.transitive=true
-{model}.file.class=Section
-{model}.file.transitive=true
-{model}.java.class=Section
-{model}.java.transitive=true
-{model}.line.class=Section
-{model}.line.transitive=true
-{model}.os.class=Section
-{model}.os.transitive=true
-{model}.path.class=Section
-{model}.path.transitive=true
-{model}.sun.class=Section
-{model}.sun.transitive=true
-{model}.user.class=Section
-{model}.user.transitive=true
+_awt.model.target=Section
+_awt.model.transitive=true
+_file.model.target=Section
+_file.model.transitive=true
+_java.model.target=Section
+_java.model.transitive=true
+_line.model.target=Section
+_line.model.transitive=true
+_os.model.target=Section
+_os.model.transitive=true
+_path.model.target=Section
+_path.model.transitive=true
+_sun.model.target=Section
+_sun.model.transitive=true
+_user.model.target=Section
+_user.model.transitive=true

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/test/java/org/apache/tamaya/model/internal/ConfigDocumentationBeanTest.java
----------------------------------------------------------------------
diff --git 
a/model/src/test/java/org/apache/tamaya/model/internal/ConfigDocumentationBeanTest.java
 
b/model/src/test/java/org/apache/tamaya/model/internal/ConfigDocumentationBeanTest.java
index d60e902..e791417 100644
--- 
a/model/src/test/java/org/apache/tamaya/model/internal/ConfigDocumentationBeanTest.java
+++ 
b/model/src/test/java/org/apache/tamaya/model/internal/ConfigDocumentationBeanTest.java
@@ -37,7 +37,7 @@ public class ConfigDocumentationBeanTest {
         String results = mbean.validate(false);
         assertNotNull(results);
         assertFalse(results.trim().isEmpty());
-        assertTrue(results.contains("\"type\":\"Parameter\""));
+        assertTrue(results.contains("\"target\":\"Parameter\""));
         assertTrue(results.contains("\"result\":\"MISSING\""));
         assertFalse(results.contains("\"description\":\"Undefined key: "));
         assertFalse(results.contains(" \"result\":\"UNDEFINED\""));
@@ -53,8 +53,8 @@ public class ConfigDocumentationBeanTest {
         assertFalse(results.contains("\"name\":\"sun."));
         assertFalse(results.contains("\"name\":\"file."));
         // test others
-        assertTrue(results.contains("\"type\":\"Parameter\""));
-        assertTrue(results.contains("\"type\":\"Section\""));
+        assertTrue(results.contains("\"target\":\"Parameter\""));
+        assertTrue(results.contains("\"target\":\"Section\""));
         assertTrue(results.contains("\"result\":\"MISSING\""));
         assertTrue(results.contains("\"description\":\"Undefined key: "));
         assertTrue(results.contains(" \"result\":\"UNDEFINED\""));
@@ -65,7 +65,7 @@ public class ConfigDocumentationBeanTest {
         String results = mbean.getConfigurationModel();
         assertNotNull(results);
         assertFalse(results.trim().isEmpty());
-        assertTrue(results.contains("\"type\":\"Parameter\""));
+        assertTrue(results.contains("\"target\":\"Parameter\""));
         assertTrue(results.contains("\"name\":\"MyNumber\""));
         assertTrue(results.contains("\"name\":\"a.b.c\""));
         assertTrue(results.contains("\"required\":true"));
@@ -76,8 +76,8 @@ public class ConfigDocumentationBeanTest {
         String results = mbean.getConfigurationModel(ModelTarget.Parameter);
         assertNotNull(results);
         assertFalse(results.trim().isEmpty());
-        assertTrue(results.contains("\"type\":\"Parameter\""));
-        assertFalse(results.contains("\"type\":\"Section\""));
+        assertTrue(results.contains("\"target\":\"Parameter\""));
+        assertFalse(results.contains("\"target\":\"Section\""));
         assertTrue(results.contains("\"required\":true"));
     }
 
@@ -86,8 +86,8 @@ public class ConfigDocumentationBeanTest {
         String results = mbean.findConfigurationModels("a");
         assertNotNull(results);
         assertFalse(results.trim().isEmpty());
-        assertFalse(results.contains("\"type\":\"Parameter\""));
-        assertTrue(results.contains("\"type\":\"Section\""));
+        assertFalse(results.contains("\"target\":\"Parameter\""));
+        assertTrue(results.contains("\"target\":\"Section\""));
     }
 
     @Test
@@ -95,8 +95,8 @@ public class ConfigDocumentationBeanTest {
         String results = mbean.findValidationModels("a", ModelTarget.Section);
         assertNotNull(results);
         assertFalse(results.trim().isEmpty());
-        assertFalse(results.contains("\"type\":\"Parameter\""));
-        assertTrue(results.contains("\"type\":\"Section\""));
+        assertFalse(results.contains("\"target\":\"Parameter\""));
+        assertTrue(results.contains("\"target\":\"Section\""));
         System.out.println(results);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/c742739a/model/src/test/resources/META-INF/configmodel.properties
----------------------------------------------------------------------
diff --git a/model/src/test/resources/META-INF/configmodel.properties 
b/model/src/test/resources/META-INF/configmodel.properties
index 4561f3f..a7956dc 100644
--- a/model/src/test/resources/META-INF/configmodel.properties
+++ b/model/src/test/resources/META-INF/configmodel.properties
@@ -22,12 +22,12 @@
 
####################################################################################
 
 # Metamodel information
-{model}.provider=ConfigModel Extension
+_model.provider=ConfigModel Extension
 
 # reusable parameter definition, referenceable as MyNumber
-{model}.MyNumber.class=Parameter
-{model}.MyNumber.type=Integer
-{model}.MyNumber.description=a (reusable) number type parameter (optional)
+_MyNumber.model.target=Parameter
+_MyNumber.model.type=Integer
+_MyNumber.model.description=a (reusable) number type parameter (optional)
 
 
####################################################################################
 # Description of Configuration Sections (minimal, can be extended by other 
modules).
@@ -35,61 +35,61 @@
 
####################################################################################
 
 # a (section)
-{model}.a.class=Section
-{model}.a.params2.class=Parameter
-{model}.a.params2.type=String
-{model}.a.params2.required=true
-{model}.a.params2.description=a required parameter
+_a.model.target=Section
+_a.params2.model.target=Parameter
+_a.params2.model.type=String
+_a.params2.model.required=true
+_a.params2.model.description=a required parameter
 
-{model}.a.paramInt.class=Parameter
-{model}.a.paramInt.type=ref:MyNumber
-{model}.a.paramInt.description=an optional parameter (default)
+_a.paramInt.model.target=Parameter
+_a.paramInt.model.type=ref:MyNumber
+_a.paramInt.model.description=an optional parameter (default)
 
-{model}.a._number.class=Parameter
-{model}.a._number.type=Integer
-{model}.a._number.deprecated=true
-{model}.a._number.mappedTo=a.paramInt
+_a._number.model.target=Parameter
+_a._number.model.type=Integer
+_a._number.model.deprecated=true
+_a._number.model.mappedTo=a.paramInt
 
 # a.b.c (section)
-{model}.a.b.c.class=Section
-{model}.a.b.c.description=Just a test section
+_a.b.c.model.target=Section
+_a.b.c.model.description=Just a test section
 
 # a.b.c.aRequiredSection (section)
-{model}.a.b.c.aRequiredSection.class=Section
-{model}.a.b.c.aRequiredSection.required=true
-{model}.a.b.c.aRequiredSection.description=A section containing required 
parameters is called a required section.\
+_a.b.c.aRequiredSection.model.target=Section
+_a.b.c.aRequiredSection.model.required=true
+_a.b.c.aRequiredSection.model.description=A section containing required 
parameters is called a required section.\
          Sections can also explicitly be defined to be required, but without\
          specifying the paramteres to be contained.,
 
 # a.b.c.aRequiredSection.subsection (section)
-{model}.a.b.c.aRequiredSection.subsection.class=Section
+_a.b.c.aRequiredSection.subsection.model.target=Section
 
-{model}.a.b.c.aRequiredSection.subsection.param0.class=Parameter
-{model}.a.b.c.aRequiredSection.subsection.param0.type=String
-{model}.a.b.c.aRequiredSection.subsection.param0.description=a minmally 
documented String parameter
+_a.b.c.aRequiredSection.subsection.param0.model.model.target=Parameter
+_a.b.c.aRequiredSection.subsection.param0.type=String
+_a.b.c.aRequiredSection.subsection.param0.model.description=a minmally 
documented String parameter
 # A minmal String parameter
-{model}.a.b.c.aRequiredSection.subsection.param00.class=Parameter
-{model}.a.b.c.aRequiredSection.subsection.param00.type=String
+_a.b.c.aRequiredSection.subsection.param00.model.target=Parameter
+_a.b.c.aRequiredSection.subsection.param00.model.type=String
 
 # a.b.c.aRequiredSection.subsection (section)
-{model}.a.b.c.aRequiredSection.subsection.param1.class=Parameter
-{model}.a.b.c.aRequiredSection.subsection.param1.type = String
-{model}.a.b.c.aRequiredSection.subsection.param1.required = true
-{model}.a.b.c.aRequiredSection.subsection.intParam.class=Parameter
-{model}.a.b.c.aRequiredSection.subsection.intParam.type = Integer
-{model}.a.b.c.aRequiredSection.subsection.intParam.description=an optional 
parameter (default)
+_a.b.c.aRequiredSection.subsection.param1.model.target=Parameter
+_a.b.c.aRequiredSection.subsection.param1.model.type = String
+_a.b.c.aRequiredSection.subsection.param1.model.required = true
+_a.b.c.aRequiredSection.subsection.intParam.model.target=Parameter
+_a.b.c.aRequiredSection.subsection.intParam.model.type = Integer
+_a.b.c.aRequiredSection.subsection.intParam.model.description=an optional 
parameter (default)
 
 # a.b.c.aRequiredSection.nonempty-subsection (section)
-{model}.a.b.c.aRequiredSection.nonempty-subsection.class=Section
-{model}.a.b.c.aRequiredSection.nonempty-subsection.required=true
+_a.b.c.aRequiredSection.nonempty-subsection.model.target=Section
+_a.b.c.aRequiredSection.nonempty-subsection.model.required=true
 
 # a.b.c.aRequiredSection.optional-subsection (section)
-{model}.a.b.c.aRequiredSection.optional-subsection.class=Section
+_a.b.c.aRequiredSection.optional-subsection.model.target=Section
 
 # a.b.c.aValidatedSection (section)
-{model}.a.b.c.aValidatedSection.class=Section
-{model}.a.b.c.aValidatedSection.description=A validated section.
-{model}.a.b.c.aValidatedSection.configModels=org.apache.tamaya.model.TestValidator
+_a.b.c.aValidatedSection.model.target=Section
+_a.b.c.aValidatedSection.model.description=A validated section.
+_a.b.c.aValidatedSection.model.validator=org.apache.tamaya.model.TestValidator
 
 
 

Reply via email to