You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2019/07/04 10:05:25 UTC
[sling-whiteboard] 02/04: Using Sling OSGi mocks
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 <bd...@apache.org>
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