This is an automated email from the ASF dual-hosted git repository. bdelacretaz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit 051fd4fbd4446c5ca8cec20b7c242557ef092096 Author: Bertrand Delacretaz <[email protected]> AuthorDate: Thu Jul 4 11:57:46 2019 +0200 Using Sling OSGi mocks --- graalvm/README.md | 23 ++++++++++++++ graalvm/pom.xml | 35 +++++++++++++++++++++- graalvm/src/main/docker/Dockerfile.jvm | 4 +-- graalvm/src/main/docker/Dockerfile.native | 4 +-- .../java/org/apache/sling/graalvm/MsgProvider.java | 5 ++++ .../org/apache/sling/graalvm/MsgProviderImpl.java | 17 +++++++++++ .../org/apache/sling/graalvm/SlingResource.java | 29 ++++++++++++++++++ .../main/resources/META-INF/resources/index.html | 4 +-- .../sling/graalvm/NativeSlingResourceIT.java | 8 +++++ .../apache/sling/graalvm/SlingResourceTest.java | 21 +++++++++++++ 10 files changed, 143 insertions(+), 7 deletions(-) diff --git a/graalvm/README.md b/graalvm/README.md index bec2eb0..e9bf7ff 100644 --- a/graalvm/README.md +++ b/graalvm/README.md @@ -1,2 +1,25 @@ # sling-graalvm Experimenting with GraalVM to run Apache Sling modules + +To build and run the native version, setup GraalVM to get something like this: + + java -version + openjdk version "1.8.0_212" + OpenJDK Runtime Environment (build 1.8.0_212-20190523183630.graal2.jdk8u-src-tar-gz-b03) + OpenJDK 64-Bit GraalVM CE 19.0.2 (build 25.212-b03-jvmci-19-b04, mixed mode) + +Then build with + + export GRAALVM_HOME=$JAVA_HOME + mvn clean install -Pnative + +And run with + + ./target/org.apache.sling.graalvm.experiments-1.0-SNAPSHOT-runner + +At which point the `/hello` path works: + + curl http://localhost:8080/hello + Hello, at Mon Jul 01 17:38:00 CEST 2019 + +To run as a Docker container see `src/main/docker/Dockerfile.native` \ No newline at end of file diff --git a/graalvm/pom.xml b/graalvm/pom.xml index 3146161..23f1270 100644 --- a/graalvm/pom.xml +++ b/graalvm/pom.xml @@ -3,7 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.serverless.osgimocks</artifactId> + <artifactId>org.apache.sling.graalvm.experiments</artifactId> + <description>Experiment with GraalVM for running Sling modules as native code</description> <version>1.0-SNAPSHOT</version> <properties> <surefire-plugin.version>2.22.0</surefire-plugin.version> @@ -39,10 +40,42 @@ <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.testing.osgi-mock.junit5</artifactId> + <version>2.4.8</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <version>6.0.0</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <version>5.0.0</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.component.annotations</artifactId> + <version>1.3.0</version> + </dependency> </dependencies> <build> <plugins> <plugin> + <groupId>biz.aQute.bnd</groupId> + <artifactId>bnd-maven-plugin</artifactId> + <version>4.2.0</version> + <executions> + <execution> + <goals> + <goal>bnd-process</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> diff --git a/graalvm/src/main/docker/Dockerfile.jvm b/graalvm/src/main/docker/Dockerfile.jvm index 9aee95d..c5eec53 100644 --- a/graalvm/src/main/docker/Dockerfile.jvm +++ b/graalvm/src/main/docker/Dockerfile.jvm @@ -7,11 +7,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/org.apache.sling.serverless.osgimocks-jvm . +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/org.apache.sling.graalvm.experiments-jvm . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks-jvm +# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.graalvm.experiments-jvm # ### FROM fabric8/java-alpine-openjdk8-jre diff --git a/graalvm/src/main/docker/Dockerfile.native b/graalvm/src/main/docker/Dockerfile.native index cac18ad..4ec89c4 100644 --- a/graalvm/src/main/docker/Dockerfile.native +++ b/graalvm/src/main/docker/Dockerfile.native @@ -7,11 +7,11 @@ # # Then, build the image with: # -# docker build -f src/main/docker/Dockerfile.native -t quarkus/org.apache.sling.serverless.osgimocks . +# docker build -f src/main/docker/Dockerfile.native -t quarkus/org.apache.sling.graalvm.experiments . # # Then run the container using: # -# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks +# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.graalvm.experiments # ### FROM registry.access.redhat.com/ubi8/ubi-minimal diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java new file mode 100644 index 0000000..bac6c06 --- /dev/null +++ b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java @@ -0,0 +1,5 @@ +package org.apache.sling.graalvm; + +public interface MsgProvider { + String getMsg(); +} \ No newline at end of file diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java new file mode 100644 index 0000000..d2c2ec5 --- /dev/null +++ b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java @@ -0,0 +1,17 @@ +package org.apache.sling.graalvm; + +import org.osgi.service.component.annotations.Component; +import java.util.Date; + +@Component(service=MsgProvider.class) +public class MsgProviderImpl implements MsgProvider { + private final String msg; + + MsgProviderImpl(String msg) { + this.msg = msg; + } + + public String getMsg() { + return msg + ", at " + new Date(); + } +} \ No newline at end of file diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java b/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java new file mode 100644 index 0000000..c652dbf --- /dev/null +++ b/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java @@ -0,0 +1,29 @@ +package org.apache.sling.graalvm; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.apache.sling.testing.mock.osgi.junit5.OsgiContext; + +@Path("/sling") +public class SlingResource { + + private String getMessage() { + // Yes this is funky, the goal is to verify that + // the Sling OSGi mocks context works in a + // native executable + final OsgiContext ctx = new OsgiContext(); + ctx.registerInjectActivateService(new MsgProviderImpl("Hello")); + final MsgProvider svc = ctx.getService(MsgProvider.class); + return svc.getMsg(); + } + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + final String msg = getMessage(); + return msg; + } +} \ No newline at end of file diff --git a/graalvm/src/main/resources/META-INF/resources/index.html b/graalvm/src/main/resources/META-INF/resources/index.html index 60a4320..75f0700 100644 --- a/graalvm/src/main/resources/META-INF/resources/index.html +++ b/graalvm/src/main/resources/META-INF/resources/index.html @@ -2,7 +2,7 @@ <html lang="en"> <head> <meta charset="UTF-8"> - <title>org.apache.sling.serverless.osgimocks - 1.0-SNAPSHOT</title> + <title>org.apache.sling.graalvm.experiments - 1.0-SNAPSHOT</title> <style> h1, h2, h3, h4, h5, h6 { margin-bottom: 0.5rem; @@ -131,7 +131,7 @@ <h3>Application</h3> <ul> <li>GroupId: org.apache.sling</li> - <li>ArtifactId: org.apache.sling.serverless.osgimocks</li> + <li>ArtifactId: org.apache.sling.graalvm.experiments</li> <li>Version: 1.0-SNAPSHOT</li> <li>Quarkus Version: 0.18.0</li> </ul> diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java b/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java new file mode 100644 index 0000000..d88ff6c --- /dev/null +++ b/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java @@ -0,0 +1,8 @@ +package org.apache.sling.graalvm; + +import io.quarkus.test.junit.SubstrateTest; + +@SubstrateTest +public class NativeSlingResourceIT extends SlingResourceTest { + // Execute the same tests but in native mode. +} \ No newline at end of file diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java b/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java new file mode 100644 index 0000000..91a0f13 --- /dev/null +++ b/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java @@ -0,0 +1,21 @@ +package org.apache.sling.graalvm; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.containsString; + +@QuarkusTest +public class SlingResourceTest { + + @Test + public void testHelloEndpoint() { + given() + .when().get("/sling") + .then() + .statusCode(200) + .body(containsString("Hello, at")); + } + +} \ No newline at end of file
