You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by si...@apache.org on 2018/11/09 23:33:24 UTC

[sling-slingfeature-maven-plugin] branch SLING-8003_rebased created (now ba47de6)

This is an automated email from the ASF dual-hosted git repository.

simonetripodi pushed a change to branch SLING-8003_rebased
in repository https://gitbox.apache.org/repos/asf/sling-slingfeature-maven-plugin.git.


      at ba47de6  SLING-8003 - Interpolate Maven variables using the Maven Interpolator APIs rather that iterate string replacing operations

This branch includes the following new commits:

     new ba47de6  SLING-8003 - Interpolate Maven variables using the Maven Interpolator APIs rather that iterate string replacing operations

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[sling-slingfeature-maven-plugin] 01/01: SLING-8003 - Interpolate Maven variables using the Maven Interpolator APIs rather that iterate string replacing operations

Posted by si...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

simonetripodi pushed a commit to branch SLING-8003_rebased
in repository https://gitbox.apache.org/repos/asf/sling-slingfeature-maven-plugin.git

commit ba47de6ab8c688afd4f38067d64fb16a87b98149
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Sat Nov 10 00:33:11 2018 +0100

    SLING-8003 - Interpolate Maven variables using the Maven Interpolator
    APIs rather that iterate string replacing operations
---
 src/it/variables-interpolator/invoker.properties   | 16 +++++
 src/it/variables-interpolator/pom.xml              | 82 ++++++++++++++++++++++
 .../src/main/features/interpolated-variables.json  | 21 ++++++
 src/it/variables-interpolator/verify.bsh           | 60 ++++++++++++++++
 .../apache/sling/feature/maven/Substitution.java   | 40 ++++++-----
 5 files changed, 203 insertions(+), 16 deletions(-)

diff --git a/src/it/variables-interpolator/invoker.properties b/src/it/variables-interpolator/invoker.properties
new file mode 100644
index 0000000..8151568
--- /dev/null
+++ b/src/it/variables-interpolator/invoker.properties
@@ -0,0 +1,16 @@
+# 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.
+ invoker.goals = clean package
+invoker.debug = true
diff --git a/src/it/variables-interpolator/pom.xml b/src/it/variables-interpolator/pom.xml
new file mode 100644
index 0000000..80bd852
--- /dev/null
+++ b/src/it/variables-interpolator/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.sling</groupId>
+  <artifactId>slingfeature-maven-plugin-test</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <name>Apache Sling Features Maven plugin test</name>
+  <description>This is just an Apache Sling Features Maven plugin test to verify variables interpolation</description>
+
+  <organization>
+    <name>The Apache Software Foundation</name>
+    <url>https://www.apache.org/</url>
+  </organization>
+
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <properties>
+    <interpolated_variable>true</interpolated_variable>
+    <osgi.framework.version>1.9.0</osgi.framework.version>
+    <sling.framework.install.incremental>true</sling.framework.install.incremental>
+    <sling.framework.install.startlevel>1</sling.framework.install.startlevel>
+    <sling.ignoreSystemProperties>true</sling.ignoreSystemProperties>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <extensions>true</extensions>
+        <executions>
+          <execution>
+            <id>aggregate</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>aggregate-features</goal>
+            </goals>
+            <configuration>
+              <aggregateClassifier>interpolator-test</aggregateClassifier>
+              <aggregates>
+                <aggregate>
+                  <includes>
+                    <include>interpolated-variables.json</include>
+                  </includes>
+                </aggregate>
+              </aggregates>
+            </configuration>
+          </execution>
+          <execution>
+            <id>attach</id>
+            <phase>package</phase>
+            <goals>
+              <goal>attach-features</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/variables-interpolator/src/main/features/interpolated-variables.json b/src/it/variables-interpolator/src/main/features/interpolated-variables.json
new file mode 100644
index 0000000..46e2702
--- /dev/null
+++ b/src/it/variables-interpolator/src/main/features/interpolated-variables.json
@@ -0,0 +1,21 @@
+{
+  "id": "${project.groupId}:${project.artifactId}:slingfeature:slingtest:${project.version}",
+  "title": "${project.name}",
+  "description": "${project.description}",
+  "vendor": "${project.organization.name}",
+  "variables": {
+    "interpolated_variable": "${interpolated_variable}",
+    "osgi_version": "${project.osgiVersion}"
+  },
+  "framework-properties": {
+    "sling.framework.install.incremental": "${sling.framework.install.incremental}",
+    "sling.framework.install.startlevel": "${sling.framework.install.startlevel}",
+    "sling.ignoreSystemProperties": "${sling.ignoreSystemProperties}"
+  },
+  "bundles":[
+    {
+      "id":"org.osgi:org.osgi.framework:${osgi.framework.version}",
+      "start-level":"20"
+    }
+  ]
+}
diff --git a/src/it/variables-interpolator/verify.bsh b/src/it/variables-interpolator/verify.bsh
new file mode 100644
index 0000000..a5a9568
--- /dev/null
+++ b/src/it/variables-interpolator/verify.bsh
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+
+import java.io.*;
+import java.util.*;
+
+import org.codehaus.plexus.util.*;
+
+    boolean check() {
+        File file = new File(basedir, "target/slingfeature-tmp/feature-slingtest.json");
+        String log = FileUtils.fileRead(file);
+
+        String[] values = {
+            "\"id\":\"org.apache.sling:slingfeature-maven-plugin-test:slingfeature:slingtest:1.0.0-SNAPSHOT\"",
+            "\"title\":\"Apache Sling Features Maven plugin test\"",
+            "\"description\":\"This is just an Apache Sling Features Maven plugin test to verify variables interpolation\"",
+            "\"vendor\":\"The Apache Software Foundation\"",
+            // TODO re-enable verification once license interpolation is fixed
+            // "\"license\":\"Apache License, Version 2.0\"",
+            "\"interpolated_variable\":\"true\"",
+            "\"sling.framework.install.incremental\":\"true\"",
+            "\"sling.framework.install.startlevel\":\"1\"",
+            "\"sling.ignoreSystemProperties\":\"true\"",
+            "\"id\":\"org.osgi:org.osgi.framework:1.9.0\""
+        };
+
+        for (String value : values) {
+            if (log.indexOf(value) < 0) {
+                System.out.println("FAILED!");
+                System.out.println("String '" + value + "' not found in file " + file);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    try {
+      return check();
+    }
+    catch(Throwable t) {
+      t.printStackTrace();
+      return false;
+    }
+
+    return true;
diff --git a/src/main/java/org/apache/sling/feature/maven/Substitution.java b/src/main/java/org/apache/sling/feature/maven/Substitution.java
index 6092c1d..0d052bf 100644
--- a/src/main/java/org/apache/sling/feature/maven/Substitution.java
+++ b/src/main/java/org/apache/sling/feature/maven/Substitution.java
@@ -16,34 +16,42 @@
  */
 package org.apache.sling.feature.maven;
 
-import java.util.Properties;
+import java.util.Collections;
+import java.util.List;
 
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.osgi.DefaultMaven2OsgiConverter;
 import org.apache.maven.shared.osgi.Maven2OsgiConverter;
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.ObjectBasedValueSource;
+import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
+import org.codehaus.plexus.interpolation.PrefixedValueSourceWrapper;
+import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
+import org.codehaus.plexus.interpolation.RecursionInterceptor;
+import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
 
 public class Substitution {
     public static String replaceMavenVars(MavenProject project, String s) {
-        // There must be a better way than enumerating all these?
-        s = replaceAll(s, "project.groupId", project.getGroupId());
-        s = replaceAll(s, "project.artifactId", project.getArtifactId());
-        s = replaceAll(s, "project.version", project.getVersion());
-        s = replaceAll(s, "project.osgiVersion", getOSGiVersion(project.getVersion()));
+        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
+        project.getProperties().setProperty("project.osgiVersion", getOSGiVersion(project.getVersion()));
+        interpolator.addValueSource(new PropertiesBasedValueSource(project.getProperties()));
 
+        List<String> synonymPrefixes = Collections.singletonList("project.");
 
-        Properties props = project.getProperties();
-        if (props != null) {
-            for (String key : props.stringPropertyNames()) {
-                s = replaceAll(s, key, props.getProperty(key));
-            }
-        }
+        PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper(
+                new ObjectBasedValueSource(project.getModel()),
+                synonymPrefixes,
+                true);
+        interpolator.addValueSource( modelWrapper );
 
-        return s;
-    }
+        RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor(synonymPrefixes, true);
 
-    private static String replaceAll(String s, String key, String value) {
-        return s.replaceAll("\\Q${" + key + "}\\E", value);
+        try {
+            return interpolator.interpolate(s, recursionInterceptor);
+        } catch (InterpolationException e) {
+            throw new RuntimeException("An error occurred while interpolating variables to JSON:\n" + s, e);
+        }
     }
 
     /**