SLING-10090 : Add default value to property description
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/InternalConstants.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/InternalConstants.java
index f742eb6..e126581 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/InternalConstants.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/InternalConstants.java
@@ -72,4 +72,6 @@
     static final String KEY_REGION = "region";
 
     static final String KEY_REGION_CACHE = "region-cache";
+
+    static final String KEY_DEFAULT = "default";
 }
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
index 93b9e19..56bb7e1 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescription.java
@@ -28,6 +28,8 @@
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
 
+import org.apache.felix.cm.json.Configurations;
+
 /**
  * Instances of this class represent a single configuration property
  * This class is not thread safe.
@@ -61,6 +63,12 @@
 	/** Required? */
 	private boolean required;
     
+    /** 
+     * The optional default value 
+     * @since 1.2
+     */
+    private Object defaultValue;
+
     /**
      * Create a new description
      */
@@ -87,6 +95,7 @@
 		this.setExcludes(null);
 		this.setOptions(null);
 		this.setRegex(null);
+        this.setDefaultValue(null);
     }
 
 	/**
@@ -140,6 +149,10 @@
 				this.setOptions(list);
 			}
 			this.setRegex(this.getString(InternalConstants.KEY_REGEX));
+            final JsonValue dv = this.getAttributes().remove(InternalConstants.KEY_DEFAULT);
+            if ( dv != null ) {
+                this.setDefaultValue(Configurations.convertToObject(dv));
+            }
  		} catch (final JsonException | IllegalArgumentException e) {
             throw new IOException(e);
         }
@@ -166,32 +179,34 @@
 		}
 	    this.setString(objectBuilder, InternalConstants.KEY_VARIABLE, this.getVariable());
 		
-		if ( this.range != null ) {
-			objectBuilder.add(InternalConstants.KEY_RANGE, this.range.toJSONObject());
+		if ( this.getRange() != null ) {
+			objectBuilder.add(InternalConstants.KEY_RANGE, this.getRange().toJSONObject());
 		}
-		if ( this.includes != null && this.includes.length > 0 ) {
+		if ( this.getIncludes() != null && this.getIncludes().length > 0 ) {
 			final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
-			for(final String v : this.includes) {
+			for(final String v : this.getIncludes()) {
 				arrayBuilder.add(v);
 			}
 			objectBuilder.add(InternalConstants.KEY_INCLUDES, arrayBuilder);
 		}
-		if ( this.excludes != null && this.excludes.length > 0 ) {
+		if ( this.getExcludes() != null && this.getExcludes().length > 0 ) {
 			final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
-			for(final String v : this.excludes) {
+			for(final String v : this.getExcludes()) {
 				arrayBuilder.add(v);
 			}
 			objectBuilder.add(InternalConstants.KEY_EXCLUDES, arrayBuilder);
 		}
-		if ( this.options != null && !this.options.isEmpty()) {
+		if ( this.getOptions() != null && !this.getOptions().isEmpty()) {
 			final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
-            for(final Option o : this.options) {
+            for(final Option o : this.getOptions()) {
 				arrayBuilder.add(o.toJSONObject());
 			}
 			objectBuilder.add(InternalConstants.KEY_OPTIONS, arrayBuilder);
 		}
 		this.setString(objectBuilder, InternalConstants.KEY_REGEX, this.getRegex());
-		
+		if ( this.getDefaultValue() != null ) {
+            objectBuilder.add(InternalConstants.KEY_DEFAULT, Configurations.convertToJsonValue(this.getDefaultValue()));
+        }
 		return objectBuilder;
 	}
 
@@ -359,4 +374,22 @@
 	public void setRequired(final boolean flag) {
 		this.required = flag;
 	}
+
+    /**
+     * Get the optional default value.
+     * @return The default value or {@code null}
+     * @since 1.2
+     */
+    public Object getDefaultValue() {
+        return this.defaultValue;
+    }
+    
+    /**
+     * Set the optional default value.
+     * @param val The default value
+     * @since 1.2
+     */
+    public void setDefaultValue(final Object val) {
+        this.defaultValue = val;
+    }
 }
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
index b788a51..6ac6f43 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/config/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.1.0")
+@org.osgi.annotation.versioning.Version("1.2.0")
 package org.apache.sling.feature.extension.apiregions.api.config;
 
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescriptionTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescriptionTest.java
index 5e64e62..4fa0583 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescriptionTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/api/config/PropertyDescriptionTest.java
@@ -51,6 +51,7 @@
         entity.setRequired(true);
         entity.setVariable("var");
         entity.setType(PropertyType.BYTE);        
+        entity.setDefaultValue("default");
         entity.clear();
         assertTrue(entity.getAttributes().isEmpty());
         assertNull(entity.getDeprecated());
@@ -66,12 +67,14 @@
         assertNull(entity.getVariable());
         assertFalse(entity.isRequired());
         assertEquals(PropertyType.STRING, entity.getType());
+        assertNull(entity.getDefaultValue());
     }
 
     @Test public void testFromJSONObject() throws IOException {
         final Extension ext = new Extension(ExtensionType.JSON, "a", ExtensionState.OPTIONAL);
         ext.setJSON("{ \"type\" : \"BYTE\", \"cardinality\": 5, \"required\" : true, \"variable\" : \"var\"," +
-        "\"range\" : {}, \"includes\" : [\"in\"], \"excludes\" : [\"ex\"] , \"options\": [{}], \"regex\": \".\"}");
+        "\"range\" : {}, \"includes\" : [\"in\"], \"excludes\" : [\"ex\"] , \"options\": [{}], \"regex\": \".\"," +
+        "\"default\" : \"def\"}");
 
         final PropertyDescription entity = new PropertyDescription();
         entity.fromJSONObject(ext.getJSONStructure().asJsonObject());
@@ -86,6 +89,7 @@
         assertEquals(1, entity.getOptions().size());
         assertEquals(".", entity.getRegex());
         assertNotNull(entity.getRegexPattern());
+        assertEquals("def", entity.getDefaultValue());
 
         // test defaults and empty values
         ext.setJSON("{ \"variable\" : \"var\", \"regex\": \".\"}");
@@ -114,10 +118,12 @@
         entity.setRequired(true);
         entity.setVariable("var");
         entity.setType(PropertyType.BYTE);
+        entity.setDefaultValue("def");
 
         final Extension ext = new Extension(ExtensionType.JSON, "a", ExtensionState.OPTIONAL);
         ext.setJSON("{ \"type\" : \"BYTE\", \"cardinality\": 5, \"required\" : true, \"variable\" : \"var\"," +
-            "\"range\" : {}, \"includes\" : [\"in\"], \"excludes\" : [\"ex\"] , \"options\": [{}], \"regex\": \".\"}");
+            "\"range\" : {}, \"includes\" : [\"in\"], \"excludes\" : [\"ex\"] , \"options\": [{}], \"regex\": \".\"," +
+            "\"default\" : \"def\"}");
 
         assertEquals(ext.getJSONStructure().asJsonObject(), entity.toJSONObject());
 
@@ -129,7 +135,8 @@
         entity.setOptions(null);
         entity.setExcludes(null);
         entity.setIncludes(null);
-
+        entity.setDefaultValue(null);
+        
         ext.setJSON("{ \"variable\" : \"var\", \"regex\": \".\"}");
 
         assertEquals(ext.getJSONStructure().asJsonObject(), entity.toJSONObject());