This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.provisioning.model-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-provisioning-model.git
commit fdc1ccfbdb313e85d643cd6120cebee3e6dda6f7 Author: Carsten Ziegeler <[email protected]> AuthorDate: Wed Sep 24 07:14:02 2014 +0000 Fully support Apach Felix config file format. Move from properties to getter and setter methods git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/tooling/support/slingstart-model@1627238 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 16 +++ .../sling/slingstart/model/SSMConfiguration.java | 35 +++-- .../sling/slingstart/model/SSMDeliverable.java | 59 +++----- .../apache/sling/slingstart/model/SSMFeature.java | 159 +++++++++++++-------- .../sling/slingstart/model/SSMStartLevel.java | 22 ++- .../slingstart/model/txt/TXTSSMModelReader.java | 60 ++++++-- .../slingstart/model/xml/XMLSSMModelReader.java | 39 +++-- .../slingstart/model/xml/XMLSSMModelWriter.java | 46 +++--- 8 files changed, 292 insertions(+), 144 deletions(-) diff --git a/pom.xml b/pom.xml index 01b9346..96bca0b 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,23 @@ <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> + <configuration> + <instructions> + <Embed-Dependency> + org.apache.felix.configadmin;inline="org/apache/felix/cm/file/ConfigurationHandler.*" + </Embed-Dependency> + </instructions> + </configuration> </plugin> </plugins> </build> + <dependencies> + <!-- We use a class from the config admin implementation to read config files --> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.configadmin</artifactId> + <version>1.2.8</version> + <scope>provided</scope> + </dependency> + </dependencies> </project> diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMConfiguration.java b/src/main/java/org/apache/sling/slingstart/model/SSMConfiguration.java index fed5e88..1539c35 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMConfiguration.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMConfiguration.java @@ -16,17 +16,33 @@ */ package org.apache.sling.slingstart.model; +import java.util.Dictionary; +import java.util.Hashtable; + /** * Configuration */ public class SSMConfiguration { - public String pid; + private final String pid; + + private final String factoryPid; + + private final Dictionary<String, Object> properties = new Hashtable<String, Object>(); - public String factoryPid; + public SSMConfiguration(final String pid, final String factoryPid) { + this.pid = (pid != null ? pid.trim() : null); + this.factoryPid = (factoryPid != null ? factoryPid.trim() : null); + } + + public String getPid() { + return this.pid; + } - public String properties; + public String getFactoryPid() { + return this.factoryPid; + } /** * validates the object and throws an IllegalStateException @@ -38,11 +54,6 @@ public class SSMConfiguration { * @throws IllegalStateException */ public void validate() { - // trim values first - if ( pid != null ) pid = pid.trim(); - if ( factoryPid != null ) factoryPid = factoryPid.trim(); - if ( properties != null ) properties = properties.trim(); - // check/correct values if ( pid == null || pid.isEmpty() ) { throw new IllegalStateException("pid"); @@ -59,6 +70,14 @@ public class SSMConfiguration { return false; } + public Dictionary<String, Object> getProperties() { + return this.properties; + } + + public void addProperty(final String key, final Object value) { + this.properties.put(key, value); + } + @Override public String toString() { return "SSMConfiguration [pid=" + pid + ", factoryPid=" + factoryPid diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java b/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java index 1ff8a9d..e7b28bc 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java @@ -19,7 +19,6 @@ package org.apache.sling.slingstart.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,12 +33,12 @@ import java.util.Map; */ public class SSMDeliverable { - public final List<SSMFeature> features = new ArrayList<SSMFeature>(); + private final List<SSMFeature> features = new ArrayList<SSMFeature>(); - public Map<String, String> properties = new HashMap<String, String>(); + private Map<String, String> properties = new HashMap<String, String>(); public SSMDeliverable() { - this.features.add(new SSMFeature()); // global features + this.features.add(new SSMFeature(null)); // global features } /** @@ -48,22 +47,13 @@ public class SSMDeliverable { * @return The feature or null. */ private SSMFeature findFeature(final String[] runModes) { + final String[] sortedRunModes = SSMFeature.getSortedRunModesArray(runModes); SSMFeature result = null; for(final SSMFeature current : this.features) { - if ( runModes == null && current.runModes == null ) { + if ( Arrays.equals(sortedRunModes, current.getRunModes()) ) { result = current; break; } - if ( runModes != null && current.runModes != null ) { - final List<String> a = new ArrayList<String>(Arrays.asList(runModes)); - final List<String> b = new ArrayList<String>(Arrays.asList(current.runModes)); - Collections.sort(a); - Collections.sort(b); - if ( a.equals(b) ) { - result = current; - break; - } - } } return result; } @@ -82,34 +72,17 @@ public class SSMDeliverable { public SSMFeature getOrCreateFeature(final String[] runModes) { SSMFeature result = findFeature(runModes); if ( result == null ) { - result = new SSMFeature(); - result.runModes = runModes; + result = new SSMFeature(runModes); this.features.add(result); - Collections.sort(this.features, new Comparator<SSMFeature>() { - - @Override - public int compare(final SSMFeature o1, final SSMFeature o2) { - if ( o1.runModes == null ) { - if ( o2.runModes == null ) { - return 0; - } - return -1; - } - if ( o2.runModes == null ) { - return 1; - } - final List<String> a = new ArrayList<String>(Arrays.asList(o1.runModes)); - final List<String> b = new ArrayList<String>(Arrays.asList(o2.runModes)); - Collections.sort(a); - Collections.sort(b); - - return a.toString().compareTo(b.toString()); - } - }); + Collections.sort(this.features); } return result; } + public List<SSMFeature> getFeatures() { + return this.features; + } + /** * validates the object and throws an IllegalStateException * @@ -156,12 +129,20 @@ public class SSMDeliverable { */ public void merge(final SSMDeliverable other) { for(final SSMFeature mode : other.features) { - final SSMFeature mergeFeature = this.getOrCreateFeature(mode.runModes); + final SSMFeature mergeFeature = this.getOrCreateFeature(mode.getRunModes()); mergeFeature.merge(mode); } this.properties.putAll(other.properties); } + public Map<String, String> getProperties() { + return this.properties; + } + + public void addProperty(final String key, final String value) { + this.properties.put(key, value); + } + @Override public String toString() { return "SSMDeliverable [features=" + features + ", properties=" diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMFeature.java b/src/main/java/org/apache/sling/slingstart/model/SSMFeature.java index 671ec19..26f0bcb 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMFeature.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMFeature.java @@ -19,7 +19,7 @@ package org.apache.sling.slingstart.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; +import java.util.Enumeration; import java.util.List; import java.util.Set; @@ -34,7 +34,7 @@ import java.util.Set; * In addition to custom, user defined run modes, special run modes exists. * A special run mode name starts with a colon. */ -public class SSMFeature { +public class SSMFeature implements Comparable<SSMFeature> { public static final String RUN_MODE_BASE = ":base"; @@ -44,13 +44,40 @@ public class SSMFeature { public static final String RUN_MODE_STANDALONE = ":standalone"; - public String[] runModes; + private final String[] runModes; - public final List<SSMStartLevel> startLevels = new ArrayList<SSMStartLevel>(); + private final List<SSMStartLevel> startLevels = new ArrayList<SSMStartLevel>(); - public final List<SSMConfiguration> configurations = new ArrayList<SSMConfiguration>(); + private final List<SSMConfiguration> configurations = new ArrayList<SSMConfiguration>(); - public SSMSettings settings; + private SSMSettings settings; + + public SSMFeature(final String[] runModes) { + this.runModes = getSortedRunModesArray(runModes); + } + + public static String[] getSortedRunModesArray(final String[] runModes) { + // sort run modes + if ( runModes != null ) { + final List<String> list = new ArrayList<String>(); + for(final String m : runModes) { + if ( m != null ) { + if ( !m.trim().isEmpty() ) { + list.add(m.trim()); + } + } + } + if ( list.size() > 0 ) { + Collections.sort(list); + return list.toArray(new String[list.size()]); + } + } + return null; + } + + public String[] getRunModes() { + return this.runModes; + } /** * validates the object and throws an IllegalStateException @@ -60,24 +87,14 @@ public class SSMFeature { public void validate() { if ( this.runModes != null ) { boolean hasSpecial = false; - final List<String> modes = new ArrayList<String>(); for(String m : this.runModes) { - if ( m != null ) m = m.trim(); - if ( m != null && !m.isEmpty()) { - modes.add(m); - if ( m.startsWith(":") ) { - if ( hasSpecial ) { - throw new IllegalStateException("Invalid modes " + Arrays.toString(this.runModes)); - } - hasSpecial = true; + if ( m.startsWith(":") ) { + if ( hasSpecial ) { + throw new IllegalStateException("Invalid modes " + Arrays.toString(this.runModes)); } + hasSpecial = true; } } - if ( modes.size() == 0 ) { - this.runModes = null; - } else { - this.runModes = modes.toArray(new String[modes.size()]); - } } for(final SSMStartLevel sl : this.startLevels) { sl.validate(); @@ -140,25 +157,13 @@ public class SSMFeature { */ public SSMStartLevel getOrCreateStartLevel(final int startLevel) { for(final SSMStartLevel sl : this.startLevels) { - if ( sl.level == startLevel ) { + if ( sl.getLevel() == startLevel ) { return sl; } } - final SSMStartLevel sl = new SSMStartLevel(); - sl.level = startLevel; + final SSMStartLevel sl = new SSMStartLevel(startLevel); this.startLevels.add(sl); - Collections.sort(this.startLevels, new Comparator<SSMStartLevel>() { - - @Override - public int compare(SSMStartLevel o1, SSMStartLevel o2) { - if ( o1.level < o2.level ) { - return -1; - } else if ( o1.level > o2.level ) { - return 1; - } - return 0; - } - }); + Collections.sort(this.startLevels); return sl; } @@ -170,7 +175,7 @@ public class SSMFeature { // search for duplicates in other start levels for(final SSMArtifact artifact : sl.artifacts) { for(final SSMStartLevel mySL : this.startLevels) { - if ( mySL.level == sl.level ) { + if ( mySL.getLevel() == sl.getLevel() ) { continue; } final SSMArtifact myArtifact = mySL.search(artifact); @@ -180,28 +185,15 @@ public class SSMFeature { } } - final SSMStartLevel mergeSL = this.getOrCreateStartLevel(sl.level); + final SSMStartLevel mergeSL = this.getOrCreateStartLevel(sl.getLevel()); mergeSL.merge(sl); } for(final SSMConfiguration config : mode.configurations) { - SSMConfiguration found = null; - for(final SSMConfiguration current : this.configurations) { - if ( config.factoryPid == null ) { - if ( current.factoryPid == null && current.pid.equals(config.pid) ) { - found = current; - break; - } - } else { - if ( config.factoryPid.equals(current.factoryPid) && current.pid.equals(config.pid) ) { - found = current; - break; - } - } - } - if ( found != null ) { - found.properties = config.properties; - } else { - this.configurations.add(config); + final SSMConfiguration found = getOrCreateConfiguration(config.getPid(), config.getFactoryPid()); + final Enumeration<String> e = config.getProperties().keys(); + while ( e.hasMoreElements() ) { + final String key = e.nextElement(); + found.addProperty(key, config.getProperties().get(key)); } } if ( this.settings == null && mode.settings != null ) { @@ -217,17 +209,72 @@ public class SSMFeature { */ public SSMConfiguration getConfiguration(final String pid) { for(final SSMConfiguration c : this.configurations) { - if ( pid.equals(c.pid) ) { + if ( pid.equals(c.getPid()) ) { return c; } } return null; } + public SSMConfiguration getOrCreateConfiguration(final String pid, final String factoryPid) { + SSMConfiguration found = null; + for(final SSMConfiguration current : this.configurations) { + if ( factoryPid == null ) { + if ( current.getFactoryPid() == null && current.getPid().equals(pid) ) { + found = current; + break; + } + } else { + if ( factoryPid.equals(current.getFactoryPid()) && current.getPid().equals(pid) ) { + found = current; + break; + } + } + } + if ( found == null ) { + found = new SSMConfiguration(pid, factoryPid); + this.configurations.add(found); + } + return found; + } + + public List<SSMStartLevel> getStartLevels() { + return this.startLevels; + } + + public List<SSMConfiguration> getConfigurations() { + return this.configurations; + } + + public SSMSettings getSettings() { + return this.settings; + } + + /** + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo( SSMFeature o2) { + if ( this.runModes == null ) { + if ( o2.runModes == null ) { + return 0; + } + return -1; + } + if ( o2.runModes == null ) { + return 1; + } + return Arrays.toString(this.runModes).compareTo(Arrays.toString(o2.runModes)); + } + @Override public String toString() { return "SSMFeature [runModes=" + Arrays.toString(runModes) + ", startLevels=" + startLevels + ", configurations=" + configurations + ", settings=" + settings + "]"; } + + public void setSettings(final SSMSettings ssmSettings) { + this.settings = ssmSettings; + } } diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java b/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java index a254d0b..98899a9 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java @@ -23,12 +23,20 @@ import java.util.List; * A start level holds a set of artifacts. * A valid start level is positive, start level 0 means the default OSGi start level. */ -public class SSMStartLevel { +public class SSMStartLevel implements Comparable<SSMStartLevel> { - public int level; + private final int level; public final List<SSMArtifact> artifacts = new ArrayList<SSMArtifact>(); + public SSMStartLevel(final int level) { + this.level = level; + } + + public int getLevel() { + return this.level; + } + /** * validates the object and throws an IllegalStateException * @@ -73,6 +81,16 @@ public class SSMStartLevel { } @Override + public int compareTo(final SSMStartLevel o) { + if ( this.level < o.level ) { + return -1; + } else if ( this.level > o.level ) { + return 1; + } + return 0; + } + + @Override public String toString() { return "SSMStartLevel [level=" + level + ", artifacts=" + artifacts + "]"; diff --git a/src/main/java/org/apache/sling/slingstart/model/txt/TXTSSMModelReader.java b/src/main/java/org/apache/sling/slingstart/model/txt/TXTSSMModelReader.java index 6c73c22..fa0f3f4 100644 --- a/src/main/java/org/apache/sling/slingstart/model/txt/TXTSSMModelReader.java +++ b/src/main/java/org/apache/sling/slingstart/model/txt/TXTSSMModelReader.java @@ -16,11 +16,16 @@ */ package org.apache.sling.slingstart.model.txt; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.LineNumberReader; import java.io.Reader; +import java.io.StringReader; +import java.util.Dictionary; +import java.util.Enumeration; import java.util.UUID; +import org.apache.felix.cm.file.ConfigurationHandler; import org.apache.sling.slingstart.model.SSMArtifact; import org.apache.sling.slingstart.model.SSMConfiguration; import org.apache.sling.slingstart.model.SSMDeliverable; @@ -87,41 +92,72 @@ public class TXTSSMModelReader { feature.getOrCreateStartLevel(0).artifacts.add(artifact); } else if ( "config".equals(verb) ) { final SSMFeature feature = model.getOrCreateFeature(null); - final SSMConfiguration config = new SSMConfiguration(); boolean felixFormat = false; + final String pid; if (qualifier.endsWith(FELIX_FORMAT_SUFFIX)) { felixFormat = true; - config.pid = qualifier.split(" ")[0].trim(); + pid = qualifier.split(" ")[0].trim(); } else { - config.pid = qualifier; + pid = qualifier; } + final SSMConfiguration config = feature.getOrCreateConfiguration(pid, null); if ( props != null ) { - config.properties = props.toString(); + processConfigurationProperties(config, props.toString(), felixFormat); } - feature.configurations.add(config); } else if ( "config.factory".equals(verb) ) { final SSMFeature feature = model.getOrCreateFeature(null); - final SSMConfiguration config = new SSMConfiguration(); boolean felixFormat = false; + final String factoryPid; if (qualifier.endsWith(FELIX_FORMAT_SUFFIX)) { felixFormat = true; - config.factoryPid = qualifier.split(" ")[0].trim(); + factoryPid = qualifier.split(" ")[0].trim(); } else { - config.factoryPid = qualifier; + factoryPid = qualifier; } // create unique alias - config.pid = UUID.randomUUID().toString(); - + final SSMConfiguration config = feature.getOrCreateConfiguration(UUID.randomUUID().toString(), factoryPid); if ( props != null ) { - config.properties = props.toString(); + processConfigurationProperties(config, props.toString(), felixFormat); } - feature.configurations.add(config); } } return model; } + private static void processConfigurationProperties(final SSMConfiguration config, final String textValue, + final boolean felixFormat) + throws IOException { + if ( felixFormat ) { + ByteArrayInputStream bais = null; + try { + bais = new ByteArrayInputStream(textValue.getBytes("UTF-8")); + @SuppressWarnings("unchecked") + final Dictionary<String, Object> props = ConfigurationHandler.read(bais); + final Enumeration<String> e = props.keys(); + while ( e.hasMoreElements() ) { + final String key = e.nextElement(); + config.addProperty(key, props.get(key)); + } + } finally { + if ( bais != null ) { + try { + bais.close(); + } catch ( final IOException ignore ) { + // ignore + } + } + } + } else { + final LineNumberReader lnr = new LineNumberReader(new StringReader(textValue)); + String line; + while ( (line = lnr.readLine()) != null ) { + final int pos = line.indexOf('='); + config.addProperty(line.substring(0, pos), line.substring(pos + 1)); + } + } + } + private static boolean ignore(final String line) { return line.trim().length() == 0 || line.startsWith("#"); } diff --git a/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelReader.java b/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelReader.java index cc45c0e..c923044 100644 --- a/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelReader.java +++ b/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelReader.java @@ -16,16 +16,20 @@ */ package org.apache.sling.slingstart.model.xml; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.LineNumberReader; import java.io.Reader; import java.io.StringReader; +import java.util.Dictionary; +import java.util.Enumeration; import java.util.Stack; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import org.apache.felix.cm.file.ConfigurationHandler; import org.apache.sling.slingstart.model.SSMArtifact; import org.apache.sling.slingstart.model.SSMConfiguration; import org.apache.sling.slingstart.model.SSMDeliverable; @@ -156,16 +160,13 @@ public class XMLSSMModelReader { artifact.type = atts.getValue("type"); artifact.classifier = atts.getValue("classifier"); } else if ( this.mode == MODE.CONFIGURATION || this.mode == MODE.FEATURE_CONFIGURATION) { - this.configuration = new SSMConfiguration(); - this.configuration.pid = atts.getValue("pid"); - this.configuration.factoryPid = atts.getValue("factory"); - this.feature.configurations.add(this.configuration); + this.configuration = this.feature.getOrCreateConfiguration(atts.getValue("pid"), atts.getValue("factory")); this.text = new StringBuilder(); } else if ( this.mode == MODE.SETTINGS || this.mode == MODE.FEATURE_SETTINGS) { - if ( this.feature.settings != null ) { + if ( this.feature.getSettings() != null ) { throw new SAXException("Duplicate settings section"); } - this.feature.settings = new SSMSettings(); + this.feature.setSettings(new SSMSettings()); this.text = new StringBuilder(); } else if ( this.mode == MODE.FEATURE ) { @@ -215,10 +216,30 @@ public class XMLSSMModelReader { if ( prevMode == MODE.STARTLEVEL || prevMode == MODE.FEATURE_STARTLEVEL ) { this.startLevel = 0; } else if ( prevMode == MODE.CONFIGURATION || prevMode == MODE.FEATURE_CONFIGURATION ) { - this.configuration.properties = textValue; + ByteArrayInputStream bais = null; + try { + bais = new ByteArrayInputStream(textValue.getBytes("UTF-8")); + @SuppressWarnings("unchecked") + final Dictionary<String, Object> props = ConfigurationHandler.read(bais); + final Enumeration<String> e = props.keys(); + while ( e.hasMoreElements() ) { + final String key = e.nextElement(); + this.configuration.addProperty(key, props.get(key)); + } + } catch ( final IOException ioe ) { + throw new SAXException(ioe); + } finally { + if ( bais != null ) { + try { + bais.close(); + } catch ( final IOException ignore ) { + // ignore + } + } + } this.configuration = null; } else if ( prevMode == MODE.SETTINGS || prevMode == MODE.FEATURE_SETTINGS) { - this.feature.settings.properties = textValue; + this.feature.getSettings().properties = textValue; } else if ( prevMode == MODE.FEATURE ) { this.feature = result.getOrCreateFeature(null); this.startLevel = 0; @@ -231,7 +252,7 @@ public class XMLSSMModelReader { if ( pos == -1 || line.indexOf("=", pos + 1 ) != -1 ) { throw new SAXException("Invalid property definition: " + line); } - result.properties.put(line.substring(0, pos), line.substring(pos + 1)); + result.addProperty(line.substring(0, pos), line.substring(pos + 1)); } } catch (final IOException io) { throw new SAXException(io); diff --git a/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelWriter.java b/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelWriter.java index 1b73e7a..510cdb7 100644 --- a/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelWriter.java +++ b/src/main/java/org/apache/sling/slingstart/model/xml/XMLSSMModelWriter.java @@ -16,11 +16,13 @@ */ package org.apache.sling.slingstart.model.xml; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.Map; +import org.apache.felix.cm.file.ConfigurationHandler; import org.apache.sling.slingstart.model.SSMArtifact; import org.apache.sling.slingstart.model.SSMConfiguration; import org.apache.sling.slingstart.model.SSMDeliverable; @@ -33,10 +35,10 @@ import org.apache.sling.slingstart.model.SSMStartLevel; public class XMLSSMModelWriter { private static void printRunModeAttribute(final PrintWriter pw, final SSMFeature rmd) { - if ( rmd.runModes != null && rmd.runModes.length > 0 ) { + if ( rmd.getRunModes() != null && rmd.getRunModes().length > 0 ) { pw.print(" modes=\""); boolean first = true; - for(final String mode : rmd.runModes) { + for(final String mode : rmd.getRunModes()) { if ( first ) { first = false; } else { @@ -66,10 +68,10 @@ public class XMLSSMModelWriter { pw.println("<deliverable>"); // properties - if ( subsystem.properties.size() > 0 ) { + if ( subsystem.getProperties().size() > 0 ) { pw.print(INDENT); pw.println("<properties><![CDATA["); - for(final Map.Entry<String, String> entry : subsystem.properties.entrySet()) { + for(final Map.Entry<String, String> entry : subsystem.getProperties().entrySet()) { pw.print(INDENT); pw.print(INDENT); pw.print(entry.getKey()); @@ -79,10 +81,10 @@ public class XMLSSMModelWriter { pw.print(INDENT); pw.println("]]></properties>"); } - for(final SSMFeature feature : subsystem.features) { + for(final SSMFeature feature : subsystem.getFeatures()) { // TODO - don't write out empty features String indent = INDENT; - if ( feature.runModes != null ) { + if ( feature.getRunModes() != null ) { pw.print(indent); pw.print("<feature"); printRunModeAttribute(pw, feature); @@ -90,15 +92,15 @@ public class XMLSSMModelWriter { indent = indent + INDENT; } - for(final SSMStartLevel startLevel : feature.startLevels) { + for(final SSMStartLevel startLevel : feature.getStartLevels()) { if ( startLevel.artifacts.size() == 0 ) { continue; } - if ( startLevel.level != 0 ) { + if ( startLevel.getLevel() != 0 ) { pw.print(indent); pw.print("<startLevel"); pw.print(" level=\""); - pw.print(String.valueOf(startLevel.level)); + pw.print(String.valueOf(startLevel.getLevel())); pw.print("\""); pw.println(">"); indent += INDENT; @@ -124,38 +126,46 @@ public class XMLSSMModelWriter { } pw.println("/>"); } - if ( startLevel.level != 0 ) { + if ( startLevel.getLevel() != 0 ) { indent = indent.substring(0, indent.length() - INDENT.length()); pw.print(indent); pw.println("</startLevel>"); } } - for(final SSMConfiguration config : feature.configurations) { + for(final SSMConfiguration config : feature.getConfigurations()) { pw.print(indent); pw.print("<configuration "); - if ( config.factoryPid != null ) { + if ( config.getFactoryPid() != null ) { pw.print("factory=\""); - pw.print(escapeXml(config.factoryPid)); + pw.print(escapeXml(config.getFactoryPid())); pw.print("\" "); } pw.print("pid=\""); - pw.print(escapeXml(config.pid)); + pw.print(escapeXml(config.getPid())); pw.println("\"><![CDATA["); - pw.println(config.properties); + final ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + ConfigurationHandler.write(os , config.getProperties()); + } finally { + os.close(); + } + final String configString = new String(os.toByteArray(), "UTF-8"); + pw.println(configString); + pw.println(config.getProperties()); pw.print(indent); pw.println("]]></configuration>"); } - if ( feature.settings != null ) { + if ( feature.getSettings() != null ) { pw.print(indent); pw.println("<settings><![CDATA["); - pw.println(feature.settings.properties); + pw.println(feature.getSettings().properties); pw.print(indent); pw.println("]]></settings>"); } - if ( feature.runModes != null ) { + if ( feature.getRunModes() != null ) { indent = indent.substring(0, indent.length() - INDENT.length()); pw.print(indent); pw.println("</feature>"); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
