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/11/22 12:45:52 UTC

[sling-ide-tooling] 01/01: SLING-11694 Embed new Tooling Support Install/Source bundles

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

kwin pushed a commit to branch feature/new-tooling-support-bundles
in repository https://gitbox.apache.org/repos/asf/sling-ide-tooling.git

commit 4e4d670ff25fdca25391f203437615e337cdd4ba
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Tue Nov 22 13:45:45 2022 +0100

    SLING-11694 Embed new Tooling Support Install/Source bundles
    
    WIP
---
 .../core/internal/SlingLaunchpadBehaviour.java     |  8 ++--
 shared/api/pom.xml                                 |  5 ++-
 .../java/org/apache/sling/ide/osgi/OsgiClient.java | 29 ++++++-------
 .../apache/sling/ide/osgi/impl/HttpOsgiClient.java | 34 ++++-----------
 .../sling/ide/osgi/impl/HttpOsgiClientIT.java      |  5 +--
 shared/artifacts/pom.xml                           | 20 ++++++++-
 .../ide/artifacts/EmbeddedArtifactLocator.java     |  2 +-
 .../ide/artifacts/impl/ArtifactsLocatorImpl.java   |  2 +-
 .../artifacts/impl/ArtifactsLocatorImplTest.java   | 48 ++++++++++++++++++++++
 9 files changed, 100 insertions(+), 53 deletions(-)

diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
index 81dd8928..974bd67d 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
@@ -110,7 +110,7 @@ public class SlingLaunchpadBehaviour extends ServerBehaviourDelegateWithModulePu
 	            EmbeddedArtifactLocator artifactLocator = Activator.getDefault().getArtifactLocator();
 	
 	            installBundle(monitor,client, artifactLocator.loadSourceSupportBundle(), SUPPORT_SOURCE_BUNDLE_SYMBOLIC_NAME); // 15/50 done
-	            installBundle(monitor,client, artifactLocator.loadToolingSupportBundle(), SUPPORT_BUNDLE_SYMBOLIC_NAME); // 20/50 done
+	            installBundle(monitor,client, artifactLocator.loadInstallSupportBundle(), SUPPORT_BUNDLE_SYMBOLIC_NAME); // 20/50 done
 	            
 	        } catch ( IOException | OsgiClientException e) {
 	            Activator.getDefault().getPluginLogger()
@@ -355,8 +355,8 @@ public class SlingLaunchpadBehaviour extends ServerBehaviourDelegateWithModulePu
 
             //TODO SLING-3767:
             //osgiClient must have a timeout!!!
-            if ( installLocally ) {
-                osgiClient.installLocalBundle(outputLocation.toFile().toPath());
+            if (installLocally) {
+                osgiClient.installBundle(outputLocation.toFile().toPath());
                 monitor.worked(3);
             } else {
 
@@ -364,7 +364,7 @@ public class SlingLaunchpadBehaviour extends ServerBehaviourDelegateWithModulePu
                 InputStream bundle = builder.buildJar(outputFolder);
                 monitor.worked(1);
                 
-                osgiClient.installLocalBundle(bundle, outputFolder.getLocation().toOSString());
+                osgiClient.installBundle(bundle, outputFolder.getLocation().toOSString());
                 monitor.worked(2);
             }
 
diff --git a/shared/api/pom.xml b/shared/api/pom.xml
index 9fc914c5..af3e3187 100644
--- a/shared/api/pom.xml
+++ b/shared/api/pom.xml
@@ -46,12 +46,12 @@
 								<artifactItem>
 									<groupId>org.apache.sling</groupId>
 									<artifactId>org.apache.sling.tooling.support.install</artifactId>
-									<version>1.0.6</version>
+									<version>1.0.7-SNAPSHOT</version>
 								</artifactItem>
 								<artifactItem>
 									<groupId>org.apache.sling</groupId>
 									<artifactId>org.apache.sling.tooling.support.source</artifactId>
-									<version>1.0.4</version>
+									<version>1.0.5-SNAPSHOT</version>
 								</artifactItem>
 								<artifactItem>
 									<groupId>org.apache.sling</groupId>
@@ -126,6 +126,7 @@
 							<startTimeoutSeconds>${startTimeoutSeconds}</startTimeoutSeconds>
 						</launch>
 					</launches>
+					
 				</configuration>
 				<executions>
 					<execution>
diff --git a/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
index 00b58b88..bfb0861d 100644
--- a/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
@@ -37,33 +37,33 @@ public interface OsgiClient extends AutoCloseable {
 
     Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException;
 
-    void installBundle(InputStream in, String fileName) throws OsgiClientException;
-
     /**
-     * Installs a bundle from a local directory
-     * 
+     * Installs a bundle from a JAR.
      * <p>
-     * The Sling launchpad instance must have filesystem access to the specified <tt>explodedBundleLocation</tt>
-     * </p>
+     * Leverages the <a href="https://felix.apache.org/documentation/subprojects/apache-felix-web-console/web-console-restful-api.html">Felix Web Console ReST endpoint</a>.
+     * @param in the contents of the jarred bundle
+     * @param sourceLocation the source location, for informative purposes only
      * 
-     * @param explodedBundleLocation
      * @throws OsgiClientException
      */
-    void installLocalBundle(Path explodedBundleLocation) throws OsgiClientException;
+    void installBundle(InputStream in, String sourceLocation) throws OsgiClientException;
 
     /**
-     * Installs a local bundle from an already-built jar file
+     * Installs a bundle from a local filesystem directory.
      * 
-     * @param jarredBundle the contents of the jarred bundle
-     * @param sourceLocation the source location, for informative purposes only
+     * <strong>The Sling launchpad instance must have filesystem access to the specified <tt>explodedBundleLocation</tt></strong>
+     * <p>
+     * Leverages the <a href="https://github.com/apache/sling-org-apache-sling-tooling-support-install">Sling Tooling Support Install bundle</a>.
      * 
+     * @param explodedBundleLocation the local path of the directory containing the exploded bundle
      * @throws OsgiClientException
      */
-    void installLocalBundle(InputStream jarredBundle, String sourceLocation) throws OsgiClientException;
+    void installBundle(Path explodedBundleLocation) throws OsgiClientException;
     
     /**
      * Finds source references for all bundles deployed in the Sling instance
-     * 
+     * <p>
+     * Leverages the <a href="https://github.com/apache/sling-org-apache-sling-tooling-support-source">Sling Tooling Support Source bundle</a>.
      * @return the source references, possibly empty
      * @throws OsgiClientException
      */
@@ -71,7 +71,8 @@ public interface OsgiClient extends AutoCloseable {
     
     /**
      * Uninstalls the bundle with the specified Bundle-SymbolicName, if present
-     * 
+     * <p>
+     * Leverages the <a href="https://felix.apache.org/documentation/subprojects/apache-felix-web-console/web-console-restful-api.html">Felix Web Console ReST endpoint</a>.
      * @param bundleSymbolicName The Bundle-SymbolicName
      * @return true in case a bundle with that BSN was found and uninstalled, false in case the BSN was not found
      * @throws OsgiClientException error when trying to uninstall the bundle
diff --git a/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
index 16375121..10cc40e1 100644
--- a/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
@@ -296,7 +296,7 @@ public class HttpOsgiClient implements OsgiClient, AutoCloseable {
 	}
 
 	@Override
-	public void installLocalBundle(final Path explodedBundleLocation) throws OsgiClientException {
+	public void installBundle(final Path explodedBundleLocation) throws OsgiClientException {
 
 		if (explodedBundleLocation == null) {
 			throw new IllegalArgumentException("explodedBundleLocation may not be null");
@@ -305,24 +305,19 @@ public class HttpOsgiClient implements OsgiClient, AutoCloseable {
 		List<? extends NameValuePair> parameters = Collections
 				.singletonList(new BasicNameValuePair("dir", explodedBundleLocation.toString()));
 		try {
-			installLocalBundle(new UrlEncodedFormEntity(parameters), explodedBundleLocation.toString());
+			HttpPost request = new HttpPost(repositoryInfo.getUrl().resolve("system/sling/tooling/install"));
+			request.setEntity(new UrlEncodedFormEntity(parameters));
+			BundleInstallerResult result = executeJsonRequest(request, BundleInstallerResult.class, "install local bundle from " + explodedBundleLocation.toString());
+			if (!result.isSuccessful()) {
+				String errorMessage = !result.hasMessage() ? "Bundle deployment failed, please check the Sling logs"
+						: result.getMessage();
+				throw new OsgiClientException(errorMessage);
+			}
 		} catch (UnsupportedEncodingException e) {
 			throw new OsgiClientException("Cannot install local bundle due to unsupported encoding", e);
 		}
 	}
 
-	@Override
-	public void installLocalBundle(final InputStream jarredBundle, String sourceLocation) throws OsgiClientException {
-
-		if (jarredBundle == null) {
-			throw new IllegalArgumentException("jarredBundle may not be null");
-		}
-
-		MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
-		entityBuilder.addBinaryBody("bundle", jarredBundle, ContentType.DEFAULT_BINARY, "bundle.jar");
-		installLocalBundle(entityBuilder.build(), sourceLocation);
-	}
-
 	@Override
 	public List<SourceReference> findSourceReferences() throws OsgiClientException {
 		SourceBundleData[] sourceBundleData = executeJsonGetRequest("system/sling/tooling/sourceReferences.json", SourceBundleData[].class, "find source references");
@@ -449,17 +444,6 @@ public class HttpOsgiClient implements OsgiClient, AutoCloseable {
 
 	}
 
-	void installLocalBundle(HttpEntity httpEntity, String bundleSource) throws OsgiClientException {
-		HttpPost request = new HttpPost(repositoryInfo.getUrl().resolve("system/sling/tooling/install"));
-		request.setEntity(httpEntity);
-		BundleInstallerResult result = executeJsonRequest(request, BundleInstallerResult.class, "install local bundle from " + bundleSource);
-		if (!result.isSuccessful()) {
-			String errorMessage = !result.hasMessage() ? "Bundle deployment failed, please check the Sling logs"
-					: result.getMessage();
-			throw new OsgiClientException(errorMessage);
-		}
-	}
-
 	private <T> T executeJsonGetRequest(String relativePath, Class<T> jsonObjectClass, String requestLabel) throws OsgiClientException {
 		HttpGet request = new HttpGet(repositoryInfo.getUrl().resolve(relativePath));
 		return executeJsonRequest(request, jsonObjectClass, requestLabel);
diff --git a/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java
index d5466263..131ca5b9 100644
--- a/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java
+++ b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java
@@ -88,11 +88,8 @@ public class HttpOsgiClientIT {
     		osgiClient.installBundle(input, "org.apache.sling.api");
     	}
     	osgiClient.waitForComponentRegistered("org.apache.sling.tooling.support.install.impl.InstallServlet", 20000, 500);
-    	try (InputStream input = Objects.requireNonNull(this.getClass().getResourceAsStream("/org.apache.sling.commons.messaging.jar"))) {
-    		osgiClient.installLocalBundle(input, "commons-messaging.jar");
-    	}
     	
-    	osgiClient.installLocalBundle(explodedJarFolder);
+    	osgiClient.installBundle(explodedJarFolder);
         osgiClient.uninstallBundle("org.apache.sling.tooling.support.install");
     }
     
diff --git a/shared/artifacts/pom.xml b/shared/artifacts/pom.xml
index 667caef4..82da4f6c 100644
--- a/shared/artifacts/pom.xml
+++ b/shared/artifacts/pom.xml
@@ -48,19 +48,35 @@
             <scope>provided</scope>
         </dependency>
 
-        <!-- will be embedded -->
+        <!-- embedded via Bnd-->
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.tooling.support.install</artifactId>
             <version>1.0.6</version>
             <scope>provided</scope>
         </dependency>
-        <!-- will be embedded -->
+        <!-- embedded via Bnd-->
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.tooling.support.source</artifactId>
             <version>1.0.4</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.11.0</version>
+			<scope>test</scope>
+		</dependency>
     </dependencies>
 </project>
diff --git a/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
index 6982de98..b8001f84 100644
--- a/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
+++ b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
@@ -22,7 +22,7 @@ public interface EmbeddedArtifactLocator {
     
     public static final String SUPPORT_SOURCE_BUNDLE_SYMBOLIC_NAME = "org.apache.sling.tooling.support.source";
 
-    EmbeddedArtifact loadToolingSupportBundle();
+    EmbeddedArtifact loadInstallSupportBundle();
     
     EmbeddedArtifact loadSourceSupportBundle();
 }
diff --git a/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
index 3dc74968..7677cfb0 100644
--- a/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
+++ b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
@@ -30,7 +30,7 @@ public class ArtifactsLocatorImpl implements EmbeddedArtifactLocator {
 	}
 
     @Override
-    public EmbeddedArtifact loadToolingSupportBundle() {
+    public EmbeddedArtifact loadInstallSupportBundle() {
 
         String version = "1.0.6"; // TODO - remove version hardcoding
         String artifactId = "org.apache.sling.tooling.support.install";
diff --git a/shared/artifacts/src/test/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImplTest.java b/shared/artifacts/src/test/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImplTest.java
new file mode 100644
index 00000000..a1cc8c17
--- /dev/null
+++ b/shared/artifacts/src/test/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImplTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.ide.artifacts.impl;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.sling.ide.artifacts.EmbeddedArtifact;
+import org.junit.Test;
+
+public class ArtifactsLocatorImplTest {
+
+	@Test
+	public void testLoadSourceSupportBundle() throws IOException {
+		ArtifactsLocatorImpl artifactsLocator = new ArtifactsLocatorImpl();
+		assertEmbeddedArtifact(artifactsLocator.loadSourceSupportBundle(), "org.apache.sling.tooling.support.source-1.0.4.jar");
+	}
+
+	@Test
+	public void testLoadInstallSupportBundle() throws IOException {
+		ArtifactsLocatorImpl artifactsLocator = new ArtifactsLocatorImpl();
+		assertEmbeddedArtifact(artifactsLocator.loadInstallSupportBundle(), "org.apache.sling.tooling.support.install-1.0.6.jar");
+	}
+
+	private void assertEmbeddedArtifact(EmbeddedArtifact embeddedArtifact, String expectedInputResourceName) throws IOException {
+		try (InputStream expectedInput = this.getClass().getClassLoader().getResourceAsStream(expectedInputResourceName);
+			InputStream actualInput = embeddedArtifact.openInputStream()) {
+			assertTrue(IOUtils.contentEquals(expectedInput, actualInput));
+		}
+	}
+}