SLING-8419 refactor method to serialize OSGi configs as JSON
This allows reuse in the OSGi installer
diff --git a/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONWriter.java b/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONWriter.java
index 3732a5e..fa309ae 100644
--- a/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONWriter.java
+++ b/src/main/java/org/apache/sling/feature/io/json/ConfigurationJSONWriter.java
@@ -18,9 +18,13 @@
import java.io.IOException;
import java.io.Writer;
+import java.lang.reflect.Array;
+import java.util.Dictionary;
+import java.util.Enumeration;
import javax.json.stream.JsonGenerator;
+import org.apache.sling.feature.Configuration;
import org.apache.sling.feature.Configurations;
@@ -45,12 +49,84 @@
private void writeConfigurations(final Writer writer, final Configurations configs)
throws IOException {
JsonGenerator generator = newGenerator(writer);
-
- // TODO is this correct?
- generator.writeStartObject(JSONConstants.FEATURE_CONFIGURATIONS);
writeConfigurations(generator, configs);
- generator.writeEnd();
-
generator.close();
}
+
+ /**
+ * Write the OSGi configuration to a JSON structure as defined in <a href="https://osgi.org/specification/osgi.cmpn/7.0.0/service.configurator.html#d0e131765">OSGi Configurator Specification 1.0</a>
+ * @param generator The json generator
+ * @param props The configuration properties to write
+ */
+ public static void writeConfiguration(final JsonGenerator generator, final Dictionary<String, Object> props) {
+ final Enumeration<String> e = props.keys();
+ while ( e.hasMoreElements() ) {
+ final String name = e.nextElement();
+ if ( Configuration.PROP_ARTIFACT_ID.equals(name) ) {
+ continue;
+ }
+ final Object val = props.get(name);
+ writeConfigurationProperty(generator, name, val);
+ }
+ }
+
+ public static void writeConfigurationProperty(JsonGenerator generator, String name, Object val) {
+ String typePostFix = null;
+ final Object typeCheck;
+ if ( val.getClass().isArray() ) {
+ if ( Array.getLength(val) > 0 ) {
+ typeCheck = Array.get(val, 0);
+ } else {
+ typeCheck = null;
+ }
+ } else {
+ typeCheck = val;
+ }
+
+ if ( typeCheck instanceof Integer ) {
+ typePostFix = ":Integer";
+ } else if ( typeCheck instanceof Byte ) {
+ typePostFix = ":Byte";
+ } else if ( typeCheck instanceof Character ) {
+ typePostFix = ":Character";
+ } else if ( typeCheck instanceof Float ) {
+ typePostFix = ":Float";
+ }
+
+ if ( val.getClass().isArray() ) {
+ generator.writeStartArray(name);
+ for(int i=0; i<Array.getLength(val);i++ ) {
+ final Object obj = Array.get(val, i);
+ if ( typePostFix == null ) {
+ if ( obj instanceof String ) {
+ generator.write((String)obj);
+ } else if ( obj instanceof Boolean ) {
+ generator.write((Boolean)obj);
+ } else if ( obj instanceof Long ) {
+ generator.write((Long)obj);
+ } else if ( obj instanceof Double ) {
+ generator.write((Double)obj);
+ }
+ } else {
+ generator.write(obj.toString());
+ }
+ }
+
+ generator.writeEnd();
+ } else {
+ if ( typePostFix == null ) {
+ if ( val instanceof String ) {
+ generator.write(name, (String)val);
+ } else if ( val instanceof Boolean ) {
+ generator.write(name, (Boolean)val);
+ } else if ( val instanceof Long ) {
+ generator.write(name, (Long)val);
+ } else if ( val instanceof Double ) {
+ generator.write(name, (Double)val);
+ }
+ } else {
+ generator.write(name + typePostFix, val.toString());
+ }
+ }
+ }
}
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 66b6ed2..cd8deb8 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
@@ -17,10 +17,8 @@
package org.apache.sling.feature.io.json;
import java.io.Writer;
-import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
-import java.util.Enumeration;
import java.util.List;
import java.util.Map;
@@ -104,75 +102,7 @@
for(final Configuration cfg : cfgs) {
generator.writeStartObject(cfg.getPid());
-
- final Enumeration<String> e = cfg.getProperties().keys();
- while ( e.hasMoreElements() ) {
- final String name = e.nextElement();
- if ( Configuration.PROP_ARTIFACT_ID.equals(name) ) {
- continue;
- }
-
- final Object val = cfg.getProperties().get(name);
-
- String typePostFix = null;
- final Object typeCheck;
- if ( val.getClass().isArray() ) {
- if ( Array.getLength(val) > 0 ) {
- typeCheck = Array.get(val, 0);
- } else {
- typeCheck = null;
- }
- } else {
- typeCheck = val;
- }
-
- if ( typeCheck instanceof Integer ) {
- typePostFix = ":Integer";
- } else if ( typeCheck instanceof Byte ) {
- typePostFix = ":Byte";
- } else if ( typeCheck instanceof Character ) {
- typePostFix = ":Character";
- } else if ( typeCheck instanceof Float ) {
- typePostFix = ":Float";
- }
-
- if ( val.getClass().isArray() ) {
- generator.writeStartArray(name);
- for(int i=0; i<Array.getLength(val);i++ ) {
- final Object obj = Array.get(val, i);
- if ( typePostFix == null ) {
- if ( obj instanceof String ) {
- generator.write((String)obj);
- } else if ( obj instanceof Boolean ) {
- generator.write((Boolean)obj);
- } else if ( obj instanceof Long ) {
- generator.write((Long)obj);
- } else if ( obj instanceof Double ) {
- generator.write((Double)obj);
- }
- } else {
- generator.write(obj.toString());
- }
- }
-
- generator.writeEnd();
- } else {
- if ( typePostFix == null ) {
- if ( val instanceof String ) {
- generator.write(name, (String)val);
- } else if ( val instanceof Boolean ) {
- generator.write(name, (Boolean)val);
- } else if ( val instanceof Long ) {
- generator.write(name, (Long)val);
- } else if ( val instanceof Double ) {
- generator.write(name, (Double)val);
- }
- } else {
- generator.write(name + typePostFix, val.toString());
- }
- }
- }
-
+ ConfigurationJSONWriter.writeConfiguration(generator, cfg.getConfigurationProperties());
generator.writeEnd();
}
diff --git a/src/main/java/org/apache/sling/feature/io/json/package-info.java b/src/main/java/org/apache/sling/feature/io/json/package-info.java
index 6b84931..54ecf2e 100644
--- a/src/main/java/org/apache/sling/feature/io/json/package-info.java
+++ b/src/main/java/org/apache/sling/feature/io/json/package-info.java
@@ -17,7 +17,7 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("1.0.0")
+@org.osgi.annotation.versioning.Version("1.1.0")
package org.apache.sling.feature.io.json;