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 11:54:24 UTC
[sling-org-apache-sling-tooling-support-install] 01/01: SLING-11693 Remove the jar installation feature
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch feature/remove-jar-install
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tooling-support-install.git
commit bedd7a1fdc6d04eb9770c60e551dbd9cd26f590f
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Tue Nov 22 12:54:16 2022 +0100
SLING-11693 Remove the jar installation feature
This is provided by the Felix Web Console ReST endpoint already and
should require authentication
---
pom.xml | 25 +------
.../support/install/impl/InstallServlet.java | 86 ++--------------------
.../support/install/impl/InstallServletTest.java | 13 +---
3 files changed, 7 insertions(+), 117 deletions(-)
diff --git a/pom.xml b/pom.xml
index 432c468..ade3ed3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
<version>1.0.7-SNAPSHOT</version>
<name>Apache Sling Tooling Support Install</name>
- <description>ReST endpoint for installing/updating a bundle from a directory or a JAR</description>
+ <description>ReST endpoint for installing/updating a bundle from a directory</description>
<scm>
<connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tooling-support-install.git</connection>
<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tooling-support-install.git</developerConnection>
@@ -108,29 +108,6 @@
</excludes>
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-test-bundle</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.commons.messaging</artifactId>
- <version>1.0.0</version>
- </artifactItem>
- </artifactItems>
- <outputDirectory>${project.build.testOutputDirectory}</outputDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
</plugins>
</build>
</project>
diff --git a/src/main/java/org/apache/sling/tooling/support/install/impl/InstallServlet.java b/src/main/java/org/apache/sling/tooling/support/install/impl/InstallServlet.java
index e9f8fff..b17f8a1 100644
--- a/src/main/java/org/apache/sling/tooling/support/install/impl/InstallServlet.java
+++ b/src/main/java/org/apache/sling/tooling/support/install/impl/InstallServlet.java
@@ -16,17 +16,14 @@
*/
package org.apache.sling.tooling.support.install.impl;
-import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Collection;
import java.util.Collections;
import java.util.jar.JarFile;
-import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.stream.Stream;
@@ -39,11 +36,8 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.Part;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.input.BoundedInputStream;
-import org.apache.commons.io.input.CloseShieldInputStream;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
@@ -53,17 +47,15 @@ import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
import org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardContextSelect;
-import org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletMultipart;
import org.osgi.service.http.whiteboard.propertytypes.HttpWhiteboardServletPattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * ReST endpoint for installing/updating a bundle from a directory or a JAR
+ * ReST endpoint for installing/updating a bundle from a directory
*/
@Component(service = Servlet.class)
@HttpWhiteboardServletPattern("/system/sling/tooling/install")
-@HttpWhiteboardServletMultipart(enabled = true, fileSizeThreshold = InstallServlet.UPLOAD_IN_MEMORY_SIZE_THRESHOLD)
//choose another servlet context with a higher ranking than the Sling one (https://issues.apache.org/jira/browse/SLING-11677)
@HttpWhiteboardContextSelect("(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=org.osgi.service.http)")
public class InstallServlet extends HttpServlet {
@@ -89,89 +81,21 @@ public class InstallServlet extends HttpServlet {
throws ServletException, IOException {
final String dirPath = req.getParameter(DIR);
final boolean refreshPackages = Boolean.parseBoolean(req.getParameter(dirPath));
- boolean isMultipart = req.getContentType() != null && req.getContentType().toLowerCase().indexOf("multipart/form-data") > -1;
try {
- if (dirPath == null && !isMultipart) {
- logger.error("No dir parameter specified : {} and no multipart content found", req.getParameterMap());
+ if (dirPath == null) {
+ logger.error("No dir parameter specified : {}", req.getParameterMap());
resp.setStatus(500);
InstallationResult result = new InstallationResult(false, "No dir parameter specified: "
- + req.getParameterMap() + " and no multipart content found");
+ + req.getParameterMap());
result.render(resp.getWriter());
return;
}
- if (isMultipart) {
- installBundleFromJar(req, resp, refreshPackages);
- } else {
- installBundleFromDirectory(resp, Paths.get(dirPath), refreshPackages);
- }
+ installBundleFromDirectory(resp, Paths.get(dirPath), refreshPackages);
} catch (IOException e) {
throw new ServletException(e);
}
}
- private void installBundleFromJar(HttpServletRequest req, HttpServletResponse resp, boolean refreshPackages) throws IOException, ServletException {
-
- Collection<Part> parts = req.getParts();
- if (parts.size() != 1) {
- logAndWriteError("Found " + parts.size() + " items to process, but only updating 1 bundle is supported", resp);
- return;
- }
-
- Part part = parts.iterator().next();
-
- try (InputStream input = part.getInputStream()) {
- installBundleFromJar(input, refreshPackages);
- InstallationResult result = new InstallationResult(true, null);
- resp.setStatus(200);
- result.render(resp.getWriter());
- } catch (IllegalArgumentException e) {
- logAndWriteError(e, resp);
- }
- }
-
- /**
- *
- * @param inputStream
- * @param refreshPackages
- * @throws IOException
- * @throws IllegalArgumentException if the provided input stream does not contain a valid OSGi bundle
- */
- Bundle installBundleFromJar(InputStream inputStream, boolean refreshPackages) throws IOException {
- try (InputStream input = new BufferedInputStream(new CloseShieldInputStream(inputStream), MANIFEST_SIZE_IN_INPUTSTREAM)) {
- input.mark(MANIFEST_SIZE_IN_INPUTSTREAM);
- final String version;
- final String symbolicName;
- try (JarInputStream jar = new JarInputStream(new BoundedInputStream(new CloseShieldInputStream(input), MANIFEST_SIZE_IN_INPUTSTREAM))) {
-
- Manifest manifest = jar.getManifest();
- if (manifest == null) {
- throw new IllegalArgumentException("Uploaded jar file does not contain a manifest");
- }
- symbolicName = manifest.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
- if (symbolicName == null) {
- throw new IllegalArgumentException("Manifest does not have a " + Constants.BUNDLE_SYMBOLICNAME);
- }
- version = manifest.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
- }
- // go back to beginning of input stream
- // the JarInputStream is used only for validation, we need a fresh input stream for updating
- input.reset();
-
- Bundle found = getBundle(symbolicName);
- try {
- return installOrUpdateBundle(found, input, "inputstream:" + symbolicName + "-" + version + ".jar", refreshPackages);
- } catch (BundleException e) {
- throw new IllegalArgumentException("Unable to install/update bundle " + symbolicName, e);
- }
- }
- }
-
- private void logAndWriteError(String message, HttpServletResponse resp) throws IOException {
- logger.info(message);
- resp.setStatus(500);
- new InstallationResult(false, message).render(resp.getWriter());
- }
-
private void logAndWriteError(Exception e, HttpServletResponse resp) throws IOException {
logger.info(e.getMessage(), e);
resp.setStatus(500);
diff --git a/src/test/java/org/apache/sling/tooling/support/install/impl/InstallServletTest.java b/src/test/java/org/apache/sling/tooling/support/install/impl/InstallServletTest.java
index 72cc577..c430a1a 100644
--- a/src/test/java/org/apache/sling/tooling/support/install/impl/InstallServletTest.java
+++ b/src/test/java/org/apache/sling/tooling/support/install/impl/InstallServletTest.java
@@ -17,6 +17,7 @@
package org.apache.sling.tooling.support.install.impl;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.AdditionalAnswers.answer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -25,7 +26,6 @@ import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Objects;
import java.util.jar.JarInputStream;
import org.apache.commons.io.IOUtils;
@@ -38,8 +38,6 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
-import static org.mockito.AdditionalAnswers.answer;
-
class InstallServletTest {
private InstallServlet servlet;
@@ -62,15 +60,6 @@ class InstallServletTest {
servlet = new InstallServlet(bundleContext);
}
- @Test
- void testInstallJar() throws IOException, BundleException {
- try (InputStream input = Objects.requireNonNull(getClass().getResourceAsStream("/org.apache.sling.commons.messaging-1.0.0.jar"))) {
- servlet.installBundleFromJar(input, false);
- }
- Mockito.verify(bundleContext).installBundle(Mockito.eq("inputstream:org.apache.sling.commons.messaging-1.0.0.jar"), Mockito.any(InputStream.class));
- assertBundle(output.toByteArray(), 17, "org.apache.sling.commons.messaging");
- }
-
@Test
void testInstallDirectory() throws IOException, URISyntaxException, BundleException {
Path sourceDir = Paths.get(getClass().getResource("/exploded-bundle1").toURI());