You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/10/20 12:00:50 UTC
svn commit: r1709560 - in
/sling/trunk/tooling/support/provisioning-model/src:
main/java/org/apache/sling/provisioning/model/
main/java/org/apache/sling/provisioning/model/io/
test/java/org/apache/sling/provisioning/model/ test/resources/
test/resource...
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