You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2022/08/12 13:57:52 UTC

[sling-maven-plugin] branch feature/uninstall-via-bsn-parameter created (now 5138eab)

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

kwin pushed a change to branch feature/uninstall-via-bsn-parameter
in repository https://gitbox.apache.org/repos/asf/sling-maven-plugin.git


      at 5138eab  SLING-11534 allow to parameterize "uninstall" with BSN or file/resource name directly

This branch includes the following new commits:

     new 5138eab  SLING-11534 allow to parameterize "uninstall" with BSN or file/resource name directly

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-maven-plugin] 01/01: SLING-11534 allow to parameterize "uninstall" with BSN or file/resource name directly

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

kwin pushed a commit to branch feature/uninstall-via-bsn-parameter
in repository https://gitbox.apache.org/repos/asf/sling-maven-plugin.git

commit 5138eab6707abc4c531daf49658ba06907517c36
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Aug 12 10:14:28 2022 +0200

    SLING-11534 allow to parameterize "uninstall" with BSN or file/resource
    name directly
    
    add ITs for "install-file" and "uninstall"
    fix uninstall with WebDAV
---
 pom.xml                                            |  1 +
 src/it/install-file-test/invoker.properties        | 23 ++++++
 src/it/install-file-test/pom.xml                   | 85 ++++++++++++++++++++++
 .../bundlesupport/AbstractBundleInstallMojo.java   |  7 +-
 .../maven/bundlesupport/BundleUninstallMojo.java   | 45 +++++++++---
 .../sling/maven/bundlesupport/FsUnMountMojo.java   |  2 +-
 .../maven/bundlesupport/deploy/DeployMethod.java   |  7 +-
 .../deploy/method/FelixPostDeployMethod.java       |  4 +-
 .../deploy/method/SlingPostDeployMethod.java       |  4 +-
 .../deploy/method/WebDavPutDeployMethod.java       | 14 ++--
 .../fsresource/SlingInitialContentMounter.java     |  3 +-
 11 files changed, 168 insertions(+), 27 deletions(-)

diff --git a/pom.xml b/pom.xml
index b5cda59..8d3d7d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,7 @@
         <mavenVersion>3.3.1</mavenVersion><!-- minimum target Maven version this plugin is compatible with -->
         <maven.compiler.target>${sling.java.version}</maven.compiler.target><!-- also set target next to release due to https://issues.apache.org/jira/browse/MPLUGIN-404 -->
         <starter-its.startTimeoutSeconds>60</starter-its.startTimeoutSeconds><!-- the time in seconds to wait for Sling Starter Feature to be started for the ITs -->
+        <project.build.outputTimestamp>10</project.build.outputTimestamp>
     </properties>
 
     <build>
diff --git a/src/it/install-file-test/invoker.properties b/src/it/install-file-test/invoker.properties
new file mode 100644
index 0000000..44fca57
--- /dev/null
+++ b/src/it/install-file-test/invoker.properties
@@ -0,0 +1,23 @@
+# 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=install -Dsling.urlSuffix=/system/console -Dsling.bundle.name=org.apache.sling.commons.messaging
+invoker.goals.2=install -Dsling.deploy.method=WebDAV -Dsling.urlSuffix=/dav/default/apps/sling-it
+invoker.goals.3=install -Dsling.deploy.method=SlingPostServlet -Dsling.urlSuffix=/apps/sling-it
+# invalid URL must lead to build failure
+invoker.goals.4=install -Dsling.urlSuffix=/system/console2
+invoker.buildResult.4=failure
\ No newline at end of file
diff --git a/src/it/install-file-test/pom.xml b/src/it/install-file-test/pom.xml
new file mode 100644
index 0000000..645157c
--- /dev/null
+++ b/src/it/install-file-test/pom.xml
@@ -0,0 +1,85 @@
+<?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>example-pom</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    
+    <properties>
+        <!-- this is either file name or BSN, for BSN overwrite via CLI params -->
+        <sling.bundle.name>org.apache.sling.commons.messaging-1.0.2.jar</sling.bundle.name>
+    </properties>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>3.3.0</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.10.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.22.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-install-plugin</artifactId>
+                    <version>3.0.1</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>@project.groupId@</groupId>
+                <artifactId>@project.artifactId@</artifactId>
+                <version>@project.version@</version>
+                <executions>
+                    <execution>
+                        <id>bundle-install</id>
+                        <goals>
+                            <goal>install-file</goal>
+                        </goals>
+                        <phase>install</phase>
+                        <configuration>
+                            <artifactId>org.apache.sling.commons.messaging</artifactId>
+                            <groupId>org.apache.sling</groupId>
+                            <version>1.0.2</version>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>bundle-uninstall</id>
+                        <goals>
+                            <goal>uninstall</goal>
+                        </goals>
+                        <phase>install</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/AbstractBundleInstallMojo.java b/src/main/java/org/apache/sling/maven/bundlesupport/AbstractBundleInstallMojo.java
index 40ea058..cf92954 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/AbstractBundleInstallMojo.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/AbstractBundleInstallMojo.java
@@ -91,11 +91,12 @@ abstract class AbstractBundleInstallMojo extends AbstractBundleRequestMojo {
     private boolean refreshPackages;
 
     /**
-     * Whether to add the mapping for the
-     * <a href="https://sling.apache.org/documentation/bundles/accessing-filesystem-resources-extensions-fsresource.html">Apache Sling File System Resource Provider</a>.
+     * Whether to add (for install)/remove (for uninstall) the mapping for the
+     * <a href="https://sling.apache.org/documentation/bundles/accessing-filesystem-resources-extensions-fsresource.html">Apache Sling File System Resource Provider</a>
+     * for the <a href="https://sling.apache.org/documentation/bundles/content-loading-jcr-contentloader.html#initial-content-loading">bundle's initial content</a>.
      */
     @Parameter(property="sling.mountByFS", defaultValue = "false", required = true)
-    private boolean mountByFS;
+    boolean mountByFS;
 
     /**
      * The Maven project.
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/BundleUninstallMojo.java b/src/main/java/org/apache/sling/maven/bundlesupport/BundleUninstallMojo.java
index f550e5d..e27ccbc 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/BundleUninstallMojo.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/BundleUninstallMojo.java
@@ -43,11 +43,23 @@ import org.apache.sling.maven.bundlesupport.fsresource.SlingInitialContentMounte
 public class BundleUninstallMojo extends AbstractBundleInstallMojo {
 
     /**
-     * The name of the generated JAR file.
+     * The path of bundle file to uninstall.
+     * The file is only used to determine the file name or bundle symbolic name.
+     * This parameter is only effective if {@link #bundleName} is not set.
+     * @deprecated Use {@link #bundleName} instead
      */
+    @Deprecated
     @Parameter(property = "sling.file", defaultValue = "${project.build.directory}/${project.build.finalName}.jar")
     private File bundleFileName;
 
+    /**
+     * The bundles's file/resource name without path (for all {@link #deploymentMethod}s except for {@code WebConsole}) or
+     * its symbolic name.
+     * If this parameter is set, it takes precedence over {@link #bundleFileName}.
+     */
+    @Parameter(property = "sling.bundle.name")
+    private String bundleName;
+
     @Override
     protected File getBundleFileName() {
         return bundleFileName;
@@ -58,25 +70,36 @@ public class BundleUninstallMojo extends AbstractBundleInstallMojo {
      */
     @Override
     public void execute() throws MojoExecutionException {
-        // only uninstall if packaging as an osgi-bundle
-        final File bundleFile = getBundleFileName();
-        final String bundleName = getBundleSymbolicName(bundleFile);
-        if (bundleName == null) {
-            getLog().info(bundleFile + " is not an OSGi Bundle, not uploading");
-            return;
+        final String bundleName;
+        if (this.bundleName == null) {
+            // only uninstall if file is really an OSGi bundle
+            final File bundleFile = getBundleFileName();
+            String bundleSymbolicName = getBundleSymbolicName(bundleFile);
+            if (bundleSymbolicName == null) {
+                getLog().info(bundleFile + " is not an OSGi Bundle, not uploading");
+                return;
+            }
+            if (getDeploymentMethod() != BundleDeploymentMethod.WebConsole) {
+                bundleName = bundleFile.getName();
+            } else {
+                bundleName = bundleSymbolicName;
+            }
+        } else {
+            bundleName = this.bundleName;
         }
 
         URI targetURL = getTargetURL();
 
         BundleDeploymentMethod deployMethod = getDeploymentMethod();
 
-
         try (CloseableHttpClient httpClient = getHttpClient()){
-            configure(httpClient, targetURL, bundleFile);
+            if (mountByFS) {
+                configure(httpClient, targetURL, null);
+            }
             getLog().info(
                     "Uninstalling Bundle " + bundleName + " from "
                             + targetURL + " via " + deployMethod + "...");
-            deployMethod.execute().undeploy(targetURL, bundleFile, bundleName, new DeployContext()
+            deployMethod.execute().undeploy(targetURL, bundleName, new DeployContext()
                     .log(getLog())
                     .httpClient(httpClient)
                     .failOnError(failOnError)
@@ -95,7 +118,7 @@ public class BundleUninstallMojo extends AbstractBundleInstallMojo {
 
     @Override
     protected void configure(CloseableHttpClient httpClient, final URI targetURL, final File file) throws MojoExecutionException {
-        new SlingInitialContentMounter(getLog(), httpClient, project).unmount(targetURL, file);
+        new SlingInitialContentMounter(getLog(), httpClient, project).unmount(targetURL);
     }
     
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/FsUnMountMojo.java b/src/main/java/org/apache/sling/maven/bundlesupport/FsUnMountMojo.java
index 0e7ee0c..51d1a86 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/FsUnMountMojo.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/FsUnMountMojo.java
@@ -36,7 +36,7 @@ public class FsUnMountMojo extends AbstractFsMountMojo {
 
     @Override
     protected void configureSlingInitialContent(CloseableHttpClient httpClient, final URI targetUrl, final File bundleFile) throws MojoExecutionException {
-        new SlingInitialContentMounter(getLog(), httpClient, project).unmount(targetUrl, bundleFile);
+        new SlingInitialContentMounter(getLog(), httpClient, project).unmount(targetUrl);
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/DeployMethod.java b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/DeployMethod.java
index 36329ba..bf98ac9 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/DeployMethod.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/DeployMethod.java
@@ -22,6 +22,8 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 
+import org.apache.sling.maven.bundlesupport.deploy.method.FelixPostDeployMethod;
+
 /**
  * Deploys/installs and undeploys/uninstalls bundles on a Sling instance.
  */
@@ -40,11 +42,10 @@ public interface DeployMethod {
     /**
      * Undeploy/uninstall a bundle on a Sling instance.
      * @param targetURL Target URL
-     * @param file Bundle file
-     * @param bundleSymbolicName Bundle symbolic name
+     * @param bundleName Bundle symbolic name or file name (for all methods except for {@link FelixPostDeployMethod})
      * @param context Deploy context parameters
      * @throws IOException in case of failure
      */
-    void undeploy(URI targetURL, File file, String bundleSymbolicName, DeployContext context) throws IOException;
+    void undeploy(URI targetURL, String bundleName, DeployContext context) throws IOException;
     
 }
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/FelixPostDeployMethod.java b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/FelixPostDeployMethod.java
index bda2b89..daf6920 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/FelixPostDeployMethod.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/FelixPostDeployMethod.java
@@ -50,6 +50,7 @@ public class FelixPostDeployMethod implements DeployMethod {
         // append pseudo path after root URL to not get redirected
         // https://github.com/apache/felix-dev/blob/8e35c940a95c91f3fee09c537dbaf9665e5d027e/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java#L338
         URI postUrl = targetURL.resolve("install");
+        context.getLog().debug("Installing via POST to " + postUrl);
         final HttpPost filePost = new HttpPost(postUrl);
 
         // set referrer
@@ -75,8 +76,9 @@ public class FelixPostDeployMethod implements DeployMethod {
     }
 
     @Override
-    public void undeploy(URI targetURL, File file, String bundleSymbolicName, DeployContext context) throws IOException {
+    public void undeploy(URI targetURL, String bundleSymbolicName, DeployContext context) throws IOException {
         URI postUrl = targetURL.resolve("bundles/" + bundleSymbolicName);
+        context.getLog().debug("Uninstalling via POST to " + postUrl);
         final HttpPost post = new HttpPost(postUrl);
         List<NameValuePair> params = new ArrayList<>();
         params.add(new BasicNameValuePair("action", "uninstall"));
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/SlingPostDeployMethod.java b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/SlingPostDeployMethod.java
index d60ed9f..8d14cec 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/SlingPostDeployMethod.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/SlingPostDeployMethod.java
@@ -61,8 +61,8 @@ public class SlingPostDeployMethod implements DeployMethod {
     }
 
     @Override
-    public void undeploy(URI targetURL, File file, String bundleSymbolicName, DeployContext context) throws IOException {
-        final HttpPost post = new HttpPost(getURLWithFilename(targetURL, file.getName()));
+    public void undeploy(URI targetURL, String bundleName, DeployContext context) throws IOException {
+        final HttpPost post = new HttpPost(getURLWithFilename(targetURL, bundleName));
 
         List<NameValuePair> params = new ArrayList<>();
         // Request JSON response from Sling instead of standard HTML
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/WebDavPutDeployMethod.java b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/WebDavPutDeployMethod.java
index 0c82476..0e96a94 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/WebDavPutDeployMethod.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/deploy/method/WebDavPutDeployMethod.java
@@ -58,8 +58,8 @@ public class WebDavPutDeployMethod implements DeployMethod {
     }
 
     @Override
-    public void undeploy(URI targetURL, File file, String bundleSymbolicName, DeployContext context) throws IOException {
-        final HttpDelete delete = new HttpDelete(SlingPostDeployMethod.getURLWithFilename(targetURL, file.getName()));
+    public void undeploy(URI targetURL, String bundleName, DeployContext context) throws IOException {
+        final HttpDelete delete = new HttpDelete(SlingPostDeployMethod.getURLWithFilename(targetURL, bundleName));
         // sanity check on response
         // must answer 204 (no content)
         // https://github.com/apache/jackrabbit/blob/88490006e6bdba0b0ad52d209b1bfa040477c2ec/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java#L763
@@ -83,6 +83,11 @@ public class WebDavPutDeployMethod implements DeployMethod {
         // this never returns a body
     }
 
+    /**
+     * Throws {@link HttpResponseException} for all response codes except for the accepted ones.
+     * Returns the response code otherwise.
+     *
+     */
     private static final class ResponseCodeEnforcingResponseHandler implements HttpClientResponseHandler<Integer> {
 
         private final List<Integer> allowedCodes;
@@ -94,12 +99,11 @@ public class WebDavPutDeployMethod implements DeployMethod {
         public Integer handleResponse(ClassicHttpResponse response) throws HttpException, IOException {
             final HttpEntity entity = response.getEntity();
             EntityUtils.consume(entity);
-            if (allowedCodes.contains(response.getCode())) {
-                throw new HttpResponseException(response.getCode(), response.getReasonPhrase());
+            if (!allowedCodes.contains(response.getCode())) {
+                throw new HttpResponseException(response.getCode(), "Unexpected response code " + response.getCode() + ": " + response.getReasonPhrase());
             }
             return null;
         }
-        
     }
 
     private void performMkCol(URI uri, DeployContext context) throws IOException {
diff --git a/src/main/java/org/apache/sling/maven/bundlesupport/fsresource/SlingInitialContentMounter.java b/src/main/java/org/apache/sling/maven/bundlesupport/fsresource/SlingInitialContentMounter.java
index 8963146..4757307 100644
--- a/src/main/java/org/apache/sling/maven/bundlesupport/fsresource/SlingInitialContentMounter.java
+++ b/src/main/java/org/apache/sling/maven/bundlesupport/fsresource/SlingInitialContentMounter.java
@@ -164,10 +164,11 @@ public final class SlingInitialContentMounter {
      * @param bundleFile The artifact (bundle)
      * @throws MojoExecutionException Exception
      */
-    public void unmount(final URI targetUrl, final File bundleFile) throws MojoExecutionException {
+    public void unmount(final URI targetUrl) throws MojoExecutionException {
         log.info("Removing file system provider configurations...");
 
         // remove all current configs for this project
+        // TODO: something is weird here, as target URL only contains the base URL but not the actual bundle name
         final Map<String,FsResourceConfiguration> oldConfigs = helper.getCurrentConfigurations(targetUrl);
         helper.removeConfigurations(targetUrl, oldConfigs);
     }