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));
+ }
+ }
+}