SLING-8631 : Introduce state for extensions
diff --git a/pom.xml b/pom.xml
index 3c437d2..c6e1971 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,7 +146,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature</artifactId>
-            <version>1.0.6</version>
+            <version>1.0.7-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
index 5c7988a..1d113e3 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
@@ -52,6 +52,7 @@
 import org.apache.sling.feature.Configuration;
 import org.apache.sling.feature.Configurations;
 import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionState;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Extensions;
 import org.apache.sling.feature.MatchingRequirement;
@@ -342,24 +343,24 @@
             final int sep = (postfix == null ? key.indexOf('|') : postfix.indexOf('|'));
             final String name;
             final String type;
-            final String optional;
+            final String state;
             if ( pos == -1 ) {
                 type = ExtensionType.ARTIFACTS.name();
                 if ( sep == -1 ) {
                     name = key;
-                    optional = Boolean.FALSE.toString();
+                    state = ExtensionState.OPTIONAL.name();
                 } else {
                     name = key.substring(0, sep);
-                    optional = key.substring(sep + 1);
+                    state = key.substring(sep + 1);
                 }
             } else {
                 name = key.substring(0, pos);
                 if ( sep == -1 ) {
                     type = postfix;
-                    optional = Boolean.FALSE.toString();
+                    state = ExtensionState.OPTIONAL.name();
                 } else {
                     type = postfix.substring(0, sep);
-                    optional = postfix.substring(sep + 1);
+                    state = postfix.substring(sep + 1);
                 }
             }
             if ( JSONConstants.FEATURE_KNOWN_PROPERTIES.contains(name) ) {
@@ -370,9 +371,19 @@
             }
 
             final ExtensionType extType = ExtensionType.valueOf(type);
-            final boolean opt = Boolean.valueOf(optional).booleanValue();
+            final ExtensionState extState;
+            if (ExtensionState.OPTIONAL.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.OPTIONAL;
+            } else if (ExtensionState.REQUIRED.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.REQUIRED;
+            } else if (ExtensionState.TRANSIENT.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.TRANSIENT;
+            } else {
+                final boolean opt = Boolean.valueOf(state).booleanValue();
+                extState = opt ? ExtensionState.REQUIRED : ExtensionState.OPTIONAL;
+            }
 
-            final Extension ext = new Extension(extType, name, opt);
+            final Extension ext = new Extension(extType, name, extState);
             final Object value = map.get(key);
             switch ( extType ) {
                 case ARTIFACTS : final List<Artifact> list = new ArrayList<>();
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
index b32da05..c41ddff 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
@@ -212,7 +212,18 @@
             final List<Extension> extensions,
             final Configurations allConfigs) {
         for(final Extension ext : extensions) {
-            final String key = ext.getName() + ":" + ext.getType().name() + "|" + ext.isRequired();
+            final String state;
+            switch (ext.getState()) {
+            case OPTIONAL:
+                state = "false";
+                break;
+            case REQUIRED:
+                state = "true";
+                break;
+            default:
+                state = ext.getState().name();
+            }
+            final String key = ext.getName().concat(":").concat(ext.getType().name()).concat("|").concat(state);
             if ( ext.getType() == ExtensionType.JSON ) {
                 final JsonStructure struct;
                 try ( final StringReader reader = new StringReader(ext.getJSON()) ) {
diff --git a/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java b/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
index bdd34f1..e2ecc54 100644
--- a/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
+++ b/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
@@ -1,13 +1,14 @@
 package org.apache.sling.feature.io.json;
 
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Extensions;
-import org.apache.sling.feature.Feature;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionState;
+import org.apache.sling.feature.Extensions;
+import org.apache.sling.feature.Feature;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -34,7 +35,7 @@
         Extension extension1 = extensions.getByName("my-extension1");
         assertNotNull(extension1);
         assertEquals(extension1.getName(), "my-extension1");
-        assertEquals(extension1.isRequired(), false);
+        assertEquals(extension1.getState(), ExtensionState.OPTIONAL);
         assertEquals(1, extension1.getArtifacts().size());
 
         ArtifactId artifactId1 = extension1.getArtifacts().get(0).getId();
@@ -45,7 +46,7 @@
         Extension extension2 = extensions.getByName("my-extension2");
         assertNotNull(extension2);
         assertEquals(extension2.getName(), "my-extension2");
-        assertEquals(extension2.isRequired(), true);
+        assertEquals(extension2.getState(), ExtensionState.REQUIRED);
         assertEquals(1, extension2.getArtifacts().size());
 
         ArtifactId artifactId2 = extension2.getArtifacts().get(0).getId();