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 7bee16aa0a2e668f17a6929c57d4d3ffab3da905 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Sep 26 16:49:06 2014 +0000 Add merger utility and variable replacement git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/tooling/support/slingstart-model@1627825 13f79535-47bb-0310-9956-ffa450edef68 --- .../sling/slingstart/model/SSMDeliverable.java | 54 +++------- .../apache/sling/slingstart/model/SSMFeature.java | 33 ------ .../apache/sling/slingstart/model/SSMMerger.java | 82 +++++++++++++++ .../sling/slingstart/model/SSMStartLevel.java | 10 -- .../org/apache/sling/slingstart/model/SSMUtil.java | 115 +++++++++++++++++++++ .../sling/slingstart/model/SSMValidator.java | 4 +- .../slingstart/model/txt/TXTSSMModelReader.java | 5 + .../slingstart/model/xml/XMLSSMModelReader.java | 6 -- 8 files changed, 217 insertions(+), 92 deletions(-) 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 a931981..472c40b 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMDeliverable.java @@ -33,10 +33,15 @@ import java.util.Map; */ public class SSMDeliverable extends SSMTraceable { + /** All features. */ private final List<SSMFeature> features = new ArrayList<SSMFeature>(); + /** Variables. */ private final Map<String, String> variables = new HashMap<String, String>(); + /** + * Construct a new deliverable. + */ public SSMDeliverable() { this.features.add(new SSMFeature(null)); // global features } @@ -60,6 +65,7 @@ public class SSMDeliverable extends SSMTraceable { /** * Get the feature if available + * @param runmode The single run mode. * @return The feature or null */ public SSMFeature getRunMode(final String runMode) { @@ -68,6 +74,8 @@ public class SSMDeliverable extends SSMTraceable { /** * Get or create the feature. + * @param runModes The run modes. + * @return The feature for the given run modes. */ public SSMFeature getOrCreateFeature(final String[] runModes) { SSMFeature result = findFeature(runModes); @@ -79,49 +87,13 @@ public class SSMDeliverable extends SSMTraceable { return result; } - public List<SSMFeature> getFeatures() { - return this.features; - } - /** - * Replace properties in the string. - * - * @throws IllegalArgumentException + * Return all features. + * The returned list is modifiable and directly modifies the model. + * @return The list of features. */ - public String getValue(final String v) { - String msg = v; - // check for variables - int pos = -1; - int start = 0; - while ( ( pos = msg.indexOf('$', start) ) != -1 ) { - if ( msg.length() > pos && msg.charAt(pos + 1) == '{' ) { - final int endPos = msg.indexOf('}', pos); - if ( endPos == -1 ) { - start = pos + 1; - } else { - final String name = msg.substring(pos + 2, endPos); - final String value = this.variables.get(name); - if ( value == null ) { - throw new IllegalArgumentException("Unknown variable: " + name); - } - msg = msg.substring(0, pos) + value + msg.substring(endPos + 1); - } - } else { - start = pos + 1; - } - } - return msg; - } - - /** - * Merge two deliverables. - */ - public void merge(final SSMDeliverable other) { - for(final SSMFeature mode : other.features) { - final SSMFeature mergeFeature = this.getOrCreateFeature(mode.getRunModes()); - mergeFeature.merge(mode); - } - this.variables.putAll(other.variables); + public List<SSMFeature> getFeatures() { + return this.features; } /** 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 0a8e175..d81cd6c 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,6 @@ package org.apache.sling.slingstart.model; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -133,38 +132,6 @@ public class SSMFeature } /** - * Merge another feature with this one. - */ - public void merge(final SSMFeature mode) { - for(final SSMStartLevel sl : mode.startLevels) { - // search for duplicates in other start levels - for(final SSMArtifact artifact : sl.getArtifacts()) { - for(final SSMStartLevel mySL : this.startLevels) { - if ( mySL.getLevel() == sl.getLevel() ) { - continue; - } - final SSMArtifact myArtifact = mySL.search(artifact); - if ( myArtifact != null ) { - mySL.getArtifacts().remove(myArtifact); - } - } - } - - final SSMStartLevel mergeSL = this.getOrCreateStartLevel(sl.getLevel()); - mergeSL.merge(sl); - } - for(final SSMConfiguration config : mode.configurations) { - final SSMConfiguration found = getOrCreateConfiguration(config.getPid(), config.getFactoryPid()); - final Enumeration<String> e = config.getProperties().keys(); - while ( e.hasMoreElements() ) { - final String key = e.nextElement(); - found.getProperties().put(key, config.getProperties().get(key)); - } - } - this.settings.putAll(mode.settings); - } - - /** * Search a configuration with a pid */ public SSMConfiguration getConfiguration(final String pid) { diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMMerger.java b/src/main/java/org/apache/sling/slingstart/model/SSMMerger.java new file mode 100644 index 0000000..09e9ad8 --- /dev/null +++ b/src/main/java/org/apache/sling/slingstart/model/SSMMerger.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.sling.slingstart.model; + +import java.util.Enumeration; + + +/** + * Merge two models + */ +public abstract class SSMMerger { + + /** + * Merge the additional model into the base model. + * @param base The base model. + * @param additional The additional model. + */ + public static void merge(final SSMDeliverable base, final SSMDeliverable additional) { + // features + for(final SSMFeature additionlFeature : additional.getFeatures()) { + final SSMFeature baseFeature = base.getOrCreateFeature(additionlFeature.getRunModes()); + + // start levels + for(final SSMStartLevel additionalStartLevel : additionlFeature.getStartLevels()) { + // search for duplicates in other start levels + for(final SSMArtifact artifact : additionalStartLevel.getArtifacts()) { + for(final SSMStartLevel mySL : baseFeature.getStartLevels()) { + if ( mySL.getLevel() == additionalStartLevel.getLevel() ) { + continue; + } + final SSMArtifact myArtifact = mySL.search(artifact); + if ( myArtifact != null ) { + mySL.getArtifacts().remove(myArtifact); + } + } + } + + // now merge current level + final SSMStartLevel baseStartLevel = baseFeature.getOrCreateStartLevel(additionalStartLevel.getLevel()); + + // artifacts + for(final SSMArtifact a : additionalStartLevel.getArtifacts()) { + final SSMArtifact found = baseStartLevel.search(a); + if ( found != null ) { + baseStartLevel.getArtifacts().remove(found); + } + baseStartLevel.getArtifacts().add(a); + } + } + + // configurations + for(final SSMConfiguration config : additionlFeature.getConfigurations()) { + final SSMConfiguration found = baseFeature.getOrCreateConfiguration(config.getPid(), config.getFactoryPid()); + final Enumeration<String> e = config.getProperties().keys(); + while ( e.hasMoreElements() ) { + final String key = e.nextElement(); + found.getProperties().put(key, config.getProperties().get(key)); + } + } + + // settings + baseFeature.getSettings().putAll(additionlFeature.getSettings()); + } + + // variables + base.getVariables().putAll(additional.getVariables()); + } +} 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 572bab0..dbad45e 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMStartLevel.java @@ -60,16 +60,6 @@ public class SSMStartLevel extends SSMTraceable return found; } - public void merge(final SSMStartLevel other) { - for(final SSMArtifact a : other.artifacts) { - final SSMArtifact found = this.search(a); - if ( found != null ) { - this.artifacts.remove(found); - } - this.artifacts.add(a); - } - } - @Override public int compareTo(final SSMStartLevel o) { if ( this.level < o.level ) { diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMUtil.java b/src/main/java/org/apache/sling/slingstart/model/SSMUtil.java new file mode 100644 index 0000000..e600690 --- /dev/null +++ b/src/main/java/org/apache/sling/slingstart/model/SSMUtil.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.sling.slingstart.model; + +import java.util.Enumeration; +import java.util.Map; + +/** + * Utility methods + */ +public abstract class SSMUtil { + + /** + * Replace all variables in the model and return a new model with the replaced values. + * @param base The base model. + * @return The model with replaced variables. + * @throws IllegalArgumentException If a variable can't be replaced. + */ + public static SSMDeliverable getEffectiveModel(final SSMDeliverable base) { + final SSMDeliverable result = new SSMDeliverable(); + result.setComment(base.getComment()); + result.setLocation(base.getLocation()); + result.getVariables().putAll(base.getVariables()); + + for(final SSMFeature feature : base.getFeatures()) { + final SSMFeature newFeature = result.getOrCreateFeature(feature.getRunModes()); + newFeature.setComment(feature.getComment()); + newFeature.setLocation(feature.getLocation()); + + for(final SSMStartLevel startLevel : feature.getStartLevels()) { + final SSMStartLevel newStartLevel = newFeature.getOrCreateStartLevel(startLevel.getLevel()); + newStartLevel.setComment(startLevel.getComment()); + newStartLevel.setLocation(startLevel.getLocation()); + + for(final SSMArtifact artifact : startLevel.getArtifacts()) { + final SSMArtifact newArtifact = new SSMArtifact(replace(base, artifact.getGroupId()), + replace(base, artifact.getArtifactId()), + replace(base, artifact.getVersion()), + replace(base, artifact.getClassifier()), + replace(base, artifact.getType())); + newArtifact.setComment(artifact.getComment()); + newArtifact.setLocation(artifact.getLocation()); + + newStartLevel.getArtifacts().add(newArtifact); + } + } + + for(final SSMConfiguration config : feature.getConfigurations()) { + final SSMConfiguration newConfig = new SSMConfiguration(config.getPid(), config.getFactoryPid()); + newConfig.setComment(config.getComment()); + newConfig.setLocation(config.getLocation()); + + final Enumeration<String> i = config.getProperties().keys(); + while ( i.hasMoreElements() ) { + final String key = i.nextElement(); + newConfig.getProperties().put(key, config.getProperties().get(key)); + } + + newFeature.getConfigurations().add(newConfig); + } + + for(final Map.Entry<String, String> entry : feature.getSettings().entrySet() ) { + newFeature.getSettings().put(entry.getKey(), replace(base, entry.getValue())); + } + } + return result; + } + + /** + * Replace properties in the string. + * + * @throws IllegalArgumentException + */ + private static String replace(final SSMDeliverable base, final String v) { + if ( v == null ) { + return null; + } + String msg = v; + // check for variables + int pos = -1; + int start = 0; + while ( ( pos = msg.indexOf('$', start) ) != -1 ) { + if ( msg.length() > pos && msg.charAt(pos + 1) == '{' ) { + final int endPos = msg.indexOf('}', pos); + if ( endPos == -1 ) { + start = pos + 1; + } else { + final String name = msg.substring(pos + 2, endPos); + final String value = base.getVariables().get(name); + if ( value == null ) { + throw new IllegalArgumentException("Unknown variable: " + name); + } + msg = msg.substring(0, pos) + value + msg.substring(endPos + 1); + } + } else { + start = pos + 1; + } + } + return msg; + } +} diff --git a/src/main/java/org/apache/sling/slingstart/model/SSMValidator.java b/src/main/java/org/apache/sling/slingstart/model/SSMValidator.java index 1ccb94f..b5ee003 100644 --- a/src/main/java/org/apache/sling/slingstart/model/SSMValidator.java +++ b/src/main/java/org/apache/sling/slingstart/model/SSMValidator.java @@ -23,14 +23,14 @@ import java.util.Map; /** * Validate a complete model. */ -public class SSMValidator { +public abstract class SSMValidator { /** * Validates the model. * @param model * @return */ - public Map<SSMTraceable, String> validate(final SSMDeliverable model) { + public static Map<SSMTraceable, String> validate(final SSMDeliverable model) { final Map<SSMTraceable, String> errors = new HashMap<SSMTraceable, String>(); for(final SSMFeature feature : model.getFeatures() ) { 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 c41262d..bd439bd 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 @@ -142,6 +142,10 @@ public class TXTSSMModelReader { } else if ( trimmedLine.startsWith("config:FELIX ") || trimmedLine.startsWith("config: ") ) { checkConfig(); + if ( feature == null ) { + throw new IOException("configuration outside of feature in line " + this.lineNumberReader.getLineNumber()); + } + mode = MODE.CONFIGURATION; final int factoryPos = params.indexOf('-'); if ( factoryPos == -1 ) { @@ -150,6 +154,7 @@ public class TXTSSMModelReader { config = new SSMConfiguration(params.substring(pos + 1), params.substring(0, pos)); } this.init(config); + feature.getConfigurations().add(config); configBuilder = new StringBuilder(); configFelixFormat = trimmedLine.startsWith("config:FELIX "); 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 bec89cc..a95665a 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 @@ -36,8 +36,6 @@ import org.apache.sling.slingstart.model.SSMArtifact; import org.apache.sling.slingstart.model.SSMConfiguration; import org.apache.sling.slingstart.model.SSMDeliverable; import org.apache.sling.slingstart.model.SSMFeature; -import org.apache.sling.slingstart.model.SSMTraceable; -import org.apache.sling.slingstart.model.SSMValidator; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; @@ -348,10 +346,6 @@ public class XMLSSMModelReader { }); xmlReader.parse(new InputSource(reader)); - final Map<SSMTraceable, String> errors = new SSMValidator().validate(result); - if ( errors != null ) { - throw new IOException("Invalid model definition: " + errors); - } return result; } catch ( final SAXException se) { throw new IOException(se); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
