Author: cziegeler Date: Tue Oct 20 10:00:50 2015 New Revision: 1709560 URL: http://svn.apache.org/viewvc?rev=1709560&view=rev Log: SLING-5148 : Support OSGi Subsystems in the Sling Provisioning model. Apply patch from David Bosschaert
Added: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java (with props) Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/Feature.java sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelProcessor.java sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelReader.java sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelWriter.java sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/package-info.java sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelProcessorTest.java sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/U.java sling/trunk/tooling/support/provisioning-model/src/test/resources/example.txt sling/trunk/tooling/support/provisioning-model/src/test/resources/merge/artifact-merge.txt Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/Feature.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/Feature.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/Feature.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/Feature.java Tue Oct 20 10:00:50 2015 @@ -32,9 +32,40 @@ public class Feature extends Commentable implements Comparable<Feature> { + public enum Type { + PLAIN("plain"), + SUBSYSTEM_FEATURE("osgi.subsystem.feature"), + SUBSYSTEM_APPLICATION("osgi.subsystem.application"), + SUBSYSTEM_COMPOSITE("osgi.subsystem.composite"); + + private final String textRepresentation; + + private Type(final String textRep) { + textRepresentation = textRep; + } + + public String getTextRepresentation() { + return textRepresentation; + } + + public static Type fromTextRepresentation(final String textRep) { + if (textRep == null) + return PLAIN; + + for (final Type t : values()) { + if (t.getTextRepresentation().equals(textRep)) + return t; + } + return null; + } + } + /** All run modes. */ private final List<RunMode> runModes = new ArrayList<RunMode>(); + /** The type of feature */ + private volatile Type type = Type.PLAIN; + /** Variables. */ private final KeyValueMap<String> variables = new KeyValueMap<String>(); @@ -113,6 +144,14 @@ public class Feature return result; } + public Type getType() { + return type; + } + + public void setType(Type t) { + type = t; + } + @Override public int compareTo(final Feature o) { if ( this.name == null ) { @@ -131,8 +170,8 @@ public class Feature public String toString() { return "Feature [runModes=" + runModes + ", variables=" + variables + ", name=" + name + + ( type != Type.PLAIN ? ", type=" + type : "" ) + ( this.getLocation() != null ? ", location=" + this.getLocation() : "") + "]"; } - } Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelProcessor.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelProcessor.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelProcessor.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelProcessor.java Tue Oct 20 10:00:50 2015 @@ -39,6 +39,7 @@ class ModelProcessor { for(final Feature feature : model.getFeatures()) { final Feature newFeature = result.getOrCreateFeature(feature.getName()); + newFeature.setType(feature.getType()); newFeature.setComment(feature.getComment()); newFeature.setLocation(feature.getLocation()); Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java Tue Oct 20 10:00:50 2015 @@ -51,6 +51,7 @@ public abstract class ModelUtility { // features for(final Feature feature : additional.getFeatures()) { final Feature baseFeature = base.getOrCreateFeature(feature.getName()); + baseFeature.setType(feature.getType()); // variables baseFeature.getVariables().putAll(feature.getVariables()); Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelReader.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelReader.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelReader.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelReader.java Tue Oct 20 10:00:50 2015 @@ -39,7 +39,7 @@ public class ModelReader { private enum CATEGORY { NONE(null, null), - FEATURE("feature", new String[] {"name"}), + FEATURE("feature", new String[] {"name", "type"}), VARIABLES("variables", null), ARTIFACTS("artifacts", new String[] {"runModes", "startLevel"}), SETTINGS("settings", new String[] {"runModes"}), @@ -174,6 +174,7 @@ public class ModelReader { throw new IOException(exceptionPrefix + "Duplicate feature in line " + this.lineNumberReader.getLineNumber() + ": " + line); } this.feature = model.getOrCreateFeature(name); + this.feature.setType(Feature.Type.fromTextRepresentation(parameters.get("type"))); this.init(this.feature); this.runMode = null; this.artifactGroup = null; Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelWriter.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelWriter.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelWriter.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/io/ModelWriter.java Tue Oct 20 10:00:50 2015 @@ -87,6 +87,10 @@ public class ModelWriter { writeComment(pw, feature); pw.print("[feature name="); pw.print(feature.getName()); + if (feature.getType() != Feature.Type.PLAIN) { + pw.print(" type="); + pw.print(feature.getType().getTextRepresentation()); + } pw.println("]"); pw.println(); Modified: sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/package-info.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/package-info.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/main/java/org/apache/sling/provisioning/model/package-info.java Tue Oct 20 10:00:50 2015 @@ -17,7 +17,7 @@ * under the License. */ -@Version("1.3.0") +@Version("1.4.0") package org.apache.sling.provisioning.model; import aQute.bnd.annotation.Version; Added: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java?rev=1709560&view=auto ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java (added) +++ sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java Tue Oct 20 10:00:50 2015 @@ -0,0 +1,50 @@ +/* + * 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.provisioning.model; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class FeatureTest { + @Test + public void testTypeEnum() { + assertEquals(Feature.Type.SUBSYSTEM_APPLICATION, + Feature.Type.fromTextRepresentation("osgi.subsystem.application")); + assertEquals(Feature.Type.SUBSYSTEM_COMPOSITE, + Feature.Type.fromTextRepresentation("osgi.subsystem.composite")); + assertEquals(Feature.Type.SUBSYSTEM_FEATURE, + Feature.Type.fromTextRepresentation("osgi.subsystem.feature")); + assertEquals(Feature.Type.PLAIN, Feature.Type.fromTextRepresentation(null)); + + assertEquals("osgi.subsystem.application", + Feature.Type.SUBSYSTEM_APPLICATION.getTextRepresentation()); + assertEquals("osgi.subsystem.composite", + Feature.Type.SUBSYSTEM_COMPOSITE.getTextRepresentation()); + assertEquals("osgi.subsystem.feature", + Feature.Type.SUBSYSTEM_FEATURE.getTextRepresentation()); + } + + @Test + public void testFeatureType() { + Feature f = new Feature("blah"); + assertEquals(Feature.Type.PLAIN, f.getType()); + + f.setType(Feature.Type.SUBSYSTEM_APPLICATION); + assertEquals(Feature.Type.SUBSYSTEM_APPLICATION, f.getType()); + } +} Propchange: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/FeatureTest.java ------------------------------------------------------------------------------ svn:keywords = author date id revision rev url Modified: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelProcessorTest.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelProcessorTest.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelProcessorTest.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelProcessorTest.java Tue Oct 20 10:00:50 2015 @@ -18,33 +18,34 @@ */ package org.apache.sling.provisioning.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - import java.util.Enumeration; import java.util.Map.Entry; import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + public class ModelProcessorTest { - + private Model testModel; private ModelProcessor underTest; - + @Before public void setUp() { testModel = new Model(); testModel.setLocation("LocM1"); - + Feature feature1 = testModel.getOrCreateFeature("feature1"); feature1.setLocation("LocF1"); feature1.setComment("ComF1"); + feature1.setType(Feature.Type.SUBSYSTEM_COMPOSITE); feature1.getVariables().setLocation("LocFV1"); feature1.getVariables().setComment("ComFV1"); feature1.getVariables().put("k1", "v1"); feature1.getVariables().put("k2", "v2"); - + RunMode runMode11 = feature1.getOrCreateRunMode(new String[] { "rm1", "rm2"}); runMode11.setLocation("LocRM11"); @@ -52,19 +53,19 @@ public class ModelProcessorTest { ArtifactGroup group12 = runMode12.getOrCreateArtifactGroup(10); group12.setLocation("LocRMG11"); group12.setComment("ComRMG11"); - + group12.add(new Artifact("g1", "a1", "v1", "c1", "t1")); group12.add(new Artifact("g2", "a2", "v2", null, null)); - + runMode12.getConfigurations().setLocation("LocConf12"); runMode12.getConfigurations().setComment("ComConf12"); - + Configuration conf121 = runMode12.getOrCreateConfiguration("pid1", null); conf121.setLocation("LocConf121"); conf121.setComment("ComConf121"); conf121.getProperties().put("conf1", "v1"); conf121.getProperties().put("conf2", "v2"); - + Configuration conf122 = runMode12.getOrCreateConfiguration("pid2", "fac2"); conf122.setLocation("LocConf122"); conf122.setComment("ComConf122"); @@ -72,16 +73,16 @@ public class ModelProcessorTest { runMode12.getSettings().setLocation("LocSet12"); runMode12.getSettings().setComment("ComSet12"); - + runMode12.getSettings().put("set1", "v1"); runMode12.getSettings().put("set2", "v2"); - + Feature feature2 = testModel.getOrCreateFeature("feature1"); RunMode runMode21 = feature2.getOrCreateRunMode(new String[0]); ArtifactGroup group21 = runMode21.getOrCreateArtifactGroup(20); group21.add(new Artifact("g3", "a3", null, null, null)); - + underTest = new TestModelProcessor(); } @@ -90,11 +91,12 @@ public class ModelProcessorTest { Model model = underTest.process(testModel); assertEquals("LocM1", model.getLocation()); - + Feature feature1 = model.getFeature("feature1"); assertNotNull(feature1); assertEquals("LocF1", feature1.getLocation()); assertEquals("ComF1", feature1.getComment()); + assertEquals(Feature.Type.SUBSYSTEM_COMPOSITE, feature1.getType()); assertEquals("LocFV1", feature1.getVariables().getLocation()); assertEquals("ComFV1", feature1.getVariables().getComment()); assertEquals("#v1", feature1.getVariables().get("k1")); @@ -111,20 +113,20 @@ public class ModelProcessorTest { assertNotNull(group12); assertEquals("LocRMG11", group12.getLocation()); assertEquals("ComRMG11", group12.getComment()); - + U.assertArtifactsInGroup(group12, 2); U.assertArtifact(group12, "mvn:#g1/#a1/#v1/#t1/#c1"); U.assertArtifact(group12, "mvn:#g2/#a2/#v2/#jar"); assertEquals("LocConf12", runMode12.getConfigurations().getLocation()); assertEquals("ComConf12", runMode12.getConfigurations().getComment()); - + Configuration conf121 = runMode12.getConfiguration("pid1", null); assertEquals("LocConf121", conf121.getLocation()); assertEquals("ComConf121", conf121.getComment()); assertEquals("#v1", conf121.getProperties().get("conf1")); assertEquals("#v2", conf121.getProperties().get("conf2")); - + Configuration conf122 = runMode12.getConfiguration("pid2", "fac2"); assertEquals("LocConf122", conf122.getLocation()); assertEquals("ComConf122", conf122.getComment()); @@ -143,12 +145,12 @@ public class ModelProcessorTest { ArtifactGroup group21 = runMode21.getArtifactGroup(20); assertNotNull(group21); - + U.assertArtifactsInGroup(group21, 1); U.assertArtifact(group21, "mvn:#g3/#a3/#LATEST/#jar"); } - - + + static final class TestModelProcessor extends ModelProcessor { @Override Modified: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java Tue Oct 20 10:00:50 2015 @@ -16,16 +16,16 @@ */ package org.apache.sling.provisioning.model; +import java.util.List; + +import org.junit.Test; + import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.util.List; - -import org.junit.Test; - public class ModelUtilityTest { @Test public void mergeArtifactsTest() throws Exception { @@ -41,6 +41,7 @@ public class ModelUtilityTest { final List<Artifact> list = U.assertArtifactsInGroup(model.getFeature("f").getRunMode().getArtifactGroup(3), 1); U.assertArtifact(list.get(0), "g", "a", "2.0.0", "jar", null); + assertEquals(Feature.Type.SUBSYSTEM_COMPOSITE, model.getFeature("f").getType()); } @Test public void removeTest() throws Exception { @@ -51,6 +52,7 @@ public class ModelUtilityTest { assertNotNull(model.getFeature("f").getRunMode()); assertNotNull(model.getFeature("f").getRunMode().getArtifactGroup(5)); assertNotNull(model.getFeature("f").getRunMode().getArtifactGroup(7)); + assertEquals(Feature.Type.PLAIN, model.getFeature("f").getType()); final List<Artifact> group5 = U.assertArtifactsInGroup(model.getFeature("f").getRunMode().getArtifactGroup(5), 1); U.assertArtifact(group5.get(0), "g", "a", "1.0.0", "jar", null); Modified: sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/U.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/U.java?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/U.java (original) +++ sling/trunk/tooling/support/provisioning-model/src/test/java/org/apache/sling/provisioning/model/U.java Tue Oct 20 10:00:50 2015 @@ -16,14 +16,6 @@ */ package org.apache.sling.provisioning.model; -import static org.apache.sling.provisioning.model.ModelConstants.DEFAULT_RUN_MODE; -import static org.apache.sling.provisioning.model.ModelConstants.DEFAULT_START_LEVEL; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; @@ -32,6 +24,14 @@ import java.util.Map; import org.apache.sling.provisioning.model.io.ModelReader; +import static org.apache.sling.provisioning.model.ModelConstants.DEFAULT_RUN_MODE; +import static org.apache.sling.provisioning.model.ModelConstants.DEFAULT_START_LEVEL; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + /** Test utilities */ public class U { @@ -120,6 +120,7 @@ public class U { final Feature exampleFeature = m.getFeature("example"); final RunMode defaultExampleRM = exampleFeature.getRunMode(); final List<Configuration> configs = assertConfigurationsInRunMode(defaultExampleRM, 3); + assertEquals(Feature.Type.SUBSYSTEM_FEATURE, exampleFeature.getType()); final Configuration cfg = assertConfiguration(configs, "org.apache.sling.another.config"); } Modified: sling/trunk/tooling/support/provisioning-model/src/test/resources/example.txt URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/resources/example.txt?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/resources/example.txt (original) +++ sling/trunk/tooling/support/provisioning-model/src/test/resources/example.txt Tue Oct 20 10:00:50 2015 @@ -20,7 +20,7 @@ # # A feature consists of variables and run mode dependent artifacts. # -[feature name=example] +[feature name=example type=osgi.subsystem.feature] # The variables are global and can be used within artifact definitions, configurations, # and settings. # Modified: sling/trunk/tooling/support/provisioning-model/src/test/resources/merge/artifact-merge.txt URL: http://svn.apache.org/viewvc/sling/trunk/tooling/support/provisioning-model/src/test/resources/merge/artifact-merge.txt?rev=1709560&r1=1709559&r2=1709560&view=diff ============================================================================== --- sling/trunk/tooling/support/provisioning-model/src/test/resources/merge/artifact-merge.txt (original) +++ sling/trunk/tooling/support/provisioning-model/src/test/resources/merge/artifact-merge.txt Tue Oct 20 10:00:50 2015 @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. # -[feature name=f] +[feature name=f type=osgi.subsystem.composite] [artifacts startLevel=3] g/a/2.0.0 \ No newline at end of file