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:23 UTC

[sling-whiteboard] branch master updated (67ba734 -> 98e3f5d)

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

bdelacretaz pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git.


    from 67ba734  removed promoted whitebeard bundles
     new d82c48b  Initial Quarkus.io skeleton
     new 051fd4f  Using Sling OSGi mocks
     new 6fcdce0  Using SlingRequestProcessor
     new 98e3f5d  Remove Mockito + quarkus-resteasy-jsonb which prevented native build

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 graalvm/README.md                                  |  34 ++++
 graalvm/pom.xml                                    | 177 ++++++++++++++++++++
 graalvm/src/main/docker/Dockerfile.jvm             |  22 +++
 graalvm/src/main/docker/Dockerfile.native          |  22 +++
 .../engine/impl/SlingRequestProcessorWrapper.java  |  19 +++
 .../sling/graalvm/http/JsonMessageBodyWriter.java  |  33 ++++
 .../apache/sling/graalvm/http/SlingResource.java   |  44 +++++
 .../apache/sling/graalvm/osgi/SlingContext.java    |  35 ++++
 .../sling/graalvm/sling/MockErrorHandler.java      |  23 +++
 .../sling/graalvm/sling/MockFilterManager.java     |  15 ++
 .../apache/sling/graalvm/sling/MockResource.java   |  54 ++++++
 .../sling/graalvm/sling/MockResourceProvider.java  |  27 +++
 .../sling/graalvm/sling/MockResourceResolver.java  | 184 +++++++++++++++++++++
 .../sling/graalvm/sling/MockServletResolver.java   |  41 +++++
 .../main/resources/META-INF/resources/index.html   | 152 +++++++++++++++++
 graalvm/src/main/resources/application.properties  |   2 +
 .../sling/graalvm/http/NativeSlingResourceIT.java  |   8 +
 .../sling/graalvm/http/SlingResourceTest.java      |  28 ++++
 18 files changed, 920 insertions(+)
 create mode 100644 graalvm/README.md
 create mode 100644 graalvm/pom.xml
 create mode 100644 graalvm/src/main/docker/Dockerfile.jvm
 create mode 100644 graalvm/src/main/docker/Dockerfile.native
 create mode 100644 graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/http/JsonMessageBodyWriter.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockErrorHandler.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResource.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceProvider.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceResolver.java
 create mode 100644 graalvm/src/main/java/org/apache/sling/graalvm/sling/MockServletResolver.java
 create mode 100644 graalvm/src/main/resources/META-INF/resources/index.html
 create mode 100644 graalvm/src/main/resources/application.properties
 create mode 100644 graalvm/src/test/java/org/apache/sling/graalvm/http/NativeSlingResourceIT.java
 create mode 100644 graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java


[sling-whiteboard] 01/04: Initial Quarkus.io skeleton

Posted by bd...@apache.org.
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 d82c48b4f0eefd19fb479fbdc12ac0b8c4599810
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 4 11:56:18 2019 +0200

    Initial Quarkus.io skeleton
---
 graalvm/README.md                                  |   2 +
 graalvm/pom.xml                                    | 114 ++++++++++++++++
 graalvm/src/main/docker/Dockerfile.jvm             |  22 +++
 graalvm/src/main/docker/Dockerfile.native          |  22 +++
 .../org/apache/sling/serverless/HelloResource.java |  17 +++
 .../main/resources/META-INF/resources/index.html   | 152 +++++++++++++++++++++
 graalvm/src/main/resources/application.properties  |   2 +
 .../apache/sling/serverless/HelloResourceTest.java |  21 +++
 .../sling/serverless/NativeHelloResourceIT.java    |   9 ++
 9 files changed, 361 insertions(+)

diff --git a/graalvm/README.md b/graalvm/README.md
new file mode 100644
index 0000000..bec2eb0
--- /dev/null
+++ b/graalvm/README.md
@@ -0,0 +1,2 @@
+# sling-graalvm
+Experimenting with GraalVM to run Apache Sling modules
diff --git a/graalvm/pom.xml b/graalvm/pom.xml
new file mode 100644
index 0000000..3146161
--- /dev/null
+++ b/graalvm/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    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>
+  <version>1.0-SNAPSHOT</version>
+  <properties>
+    <surefire-plugin.version>2.22.0</surefire-plugin.version>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <quarkus.version>0.18.0</quarkus.version>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+  </properties>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>io.quarkus</groupId>
+        <artifactId>quarkus-bom</artifactId>
+        <version>${quarkus.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <dependencies>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-resteasy</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-junit5</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.rest-assured</groupId>
+      <artifactId>rest-assured</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>io.quarkus</groupId>
+        <artifactId>quarkus-maven-plugin</artifactId>
+        <version>${quarkus.version}</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>build</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefire-plugin.version}</version>
+        <configuration>
+          <systemProperties>
+            <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+          </systemProperties>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <profiles>
+    <profile>
+      <id>native</id>
+      <activation>
+        <property>
+          <name>native</name>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-maven-plugin</artifactId>
+            <version>${quarkus.version}</version>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>native-image</goal>
+                </goals>
+                <configuration>
+                  <enableHttpUrlHandler>true</enableHttpUrlHandler>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <artifactId>maven-failsafe-plugin</artifactId>
+            <version>${surefire-plugin.version}</version>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>integration-test</goal>
+                  <goal>verify</goal>
+                </goals>
+                <configuration>
+                  <systemProperties>
+                    <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
+                  </systemProperties>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>
diff --git a/graalvm/src/main/docker/Dockerfile.jvm b/graalvm/src/main/docker/Dockerfile.jvm
new file mode 100644
index 0000000..9aee95d
--- /dev/null
+++ b/graalvm/src/main/docker/Dockerfile.jvm
@@ -0,0 +1,22 @@
+####
+# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode
+#
+# Before building the docker image run:
+#
+# mvn package
+#
+# Then, build the image with:
+#
+# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/org.apache.sling.serverless.osgimocks-jvm .
+#
+# Then run the container using:
+#
+# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks-jvm
+#
+###
+FROM fabric8/java-alpine-openjdk8-jre
+ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
+ENV AB_ENABLED=jmx_exporter
+COPY target/lib/* /deployments/lib/
+COPY target/*-runner.jar /deployments/app.jar
+ENTRYPOINT [ "/deployments/run-java.sh" ]
\ No newline at end of file
diff --git a/graalvm/src/main/docker/Dockerfile.native b/graalvm/src/main/docker/Dockerfile.native
new file mode 100644
index 0000000..cac18ad
--- /dev/null
+++ b/graalvm/src/main/docker/Dockerfile.native
@@ -0,0 +1,22 @@
+####
+# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode
+#
+# Before building the docker image run:
+#
+# mvn package -Pnative -Dnative-image.docker-build=true
+#
+# Then, build the image with:
+#
+# docker build -f src/main/docker/Dockerfile.native -t quarkus/org.apache.sling.serverless.osgimocks .
+#
+# Then run the container using:
+#
+# docker run -i --rm -p 8080:8080 quarkus/org.apache.sling.serverless.osgimocks
+#
+###
+FROM registry.access.redhat.com/ubi8/ubi-minimal
+WORKDIR /work/
+COPY target/*-runner /work/application
+RUN chmod 775 /work
+EXPOSE 8080
+CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java b/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java
new file mode 100644
index 0000000..790193b
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java
@@ -0,0 +1,17 @@
+package org.apache.sling.serverless;
+
+import java.util.Date;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/hello")
+public class HelloResource {
+
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String hello() {
+        return "hello, at " + new Date();
+    }
+}
\ 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
new file mode 100644
index 0000000..60a4320
--- /dev/null
+++ b/graalvm/src/main/resources/META-INF/resources/index.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>org.apache.sling.serverless.osgimocks - 1.0-SNAPSHOT</title>
+    <style>
+        h1, h2, h3, h4, h5, h6 {
+            margin-bottom: 0.5rem;
+            font-weight: 400;
+            line-height: 1.5;
+        }
+
+        h1 {
+            font-size: 2.5rem;
+        }
+
+        h2 {
+            font-size: 2rem
+        }
+
+        h3 {
+            font-size: 1.75rem
+        }
+
+        h4 {
+            font-size: 1.5rem
+        }
+
+        h5 {
+            font-size: 1.25rem
+        }
+
+        h6 {
+            font-size: 1rem
+        }
+
+        .lead {
+            font-weight: 300;
+            font-size: 2rem;
+        }
+
+        .banner {
+            font-size: 2.7rem;
+            margin: 0;
+            padding: 2rem 1rem;
+            background-color: #00A1E2;
+            color: white;
+        }
+
+        body {
+            margin: 0;
+            font-family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+        }
+
+        code {
+            font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+            font-size: 87.5%;
+            color: #e83e8c;
+            word-break: break-word;
+        }
+
+        .left-column {
+            padding: .75rem;
+            max-width: 75%;
+            min-width: 55%;
+        }
+
+        .right-column {
+            padding: .75rem;
+            max-width: 25%;
+        }
+
+        .container {
+            display: flex;
+            width: 100%;
+        }
+
+        li {
+            margin: 0.75rem;
+        }
+
+        .right-section {
+            margin-left: 1rem;
+            padding-left: 0.5rem;
+        }
+
+        .right-section h3 {
+            padding-top: 0;
+            font-weight: 200;
+        }
+
+        .right-section ul {
+            border-left: 0.3rem solid #00A1E2;
+            list-style-type: none;
+            padding-left: 0;
+        }
+
+    </style>
+</head>
+<body>
+
+<div class="banner lead">
+    Your new Cloud-Native application is ready!
+</div>
+
+<div class="container">
+    <div class="left-column">
+        <p class="lead"> Congratulations, you have created a new Quarkus application.</p>
+
+        <h2>Why do you see this?</h2>
+
+        <p>This page is served by Quarkus. The source is in
+            <code>src/main/resources/META-INF/resources/index.html</code>.</p>
+
+        <h2>What can I do from here?</h2>
+
+        <p>If not already done, run the application in <em>dev mode</em> using: <code>mvn compile quarkus:dev</code>.
+        </p>
+        <ul>
+            <li>Add REST resources, Servlets, functions and other services in <code>src/main/java</code>.</li>
+            <li>Your static assets are located in <code>src/main/resources/META-INF/resources</code>.</li>
+            <li>Configure your application in <code>src/main/resources/application.properties</code>.
+            </li>
+        </ul>
+
+        <h2>How do I get rid of this page?</h2>
+        <p>Just delete the <code>src/main/resources/META-INF/resources/index.html</code> file.</p>
+    </div>
+    <div class="right-column">
+        <div class="right-section">
+            <h3>Application</h3>
+            <ul>
+                <li>GroupId: org.apache.sling</li>
+                <li>ArtifactId: org.apache.sling.serverless.osgimocks</li>
+                <li>Version: 1.0-SNAPSHOT</li>
+                <li>Quarkus Version: 0.18.0</li>
+            </ul>
+        </div>
+        <div class="right-section">
+            <h3>Next steps</h3>
+            <ul>
+                <li><a href="https://quarkus.io/guides/maven-tooling.html">Setup your IDE</a></li>
+                <li><a href="https://quarkus.io/guides/getting-started-guide.html">Getting started</a></li>
+                <li><a href="https://quarkus.io">Quarkus Web Site</a></li>
+            </ul>
+        </div>
+    </div>
+</div>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/graalvm/src/main/resources/application.properties b/graalvm/src/main/resources/application.properties
new file mode 100644
index 0000000..3c1ac56
--- /dev/null
+++ b/graalvm/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+# Configuration file
+# key = value
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java b/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java
new file mode 100644
index 0000000..9f4ac22
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java
@@ -0,0 +1,21 @@
+package org.apache.sling.serverless;
+
+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 HelloResourceTest {
+
+    @Test
+    public void testHelloEndpoint() {
+        given()
+          .when().get("/hello")
+          .then()
+             .statusCode(200)
+             .body(containsString("hello, at"));
+    }
+
+}
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java b/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java
new file mode 100644
index 0000000..7bfae1b
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java
@@ -0,0 +1,9 @@
+package org.apache.sling.serverless;
+
+import io.quarkus.test.junit.SubstrateTest;
+
+@SubstrateTest
+public class NativeHelloResourceIT extends HelloResourceTest {
+
+    // Execute the same tests but in native mode.
+}
\ No newline at end of file


[sling-whiteboard] 03/04: Using SlingRequestProcessor

Posted by bd...@apache.org.
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 6fcdce023922b81869a1ff72a84f077e41a351cf
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 4 11:59:23 2019 +0200

    Using SlingRequestProcessor
---
 graalvm/README.md                                  |  11 +-
 graalvm/pom.xml                                    |  34 +++-
 .../engine/impl/SlingRequestProcessorWrapper.java  |  18 ++
 .../apache/sling/graalvm/http/SlingResource.java   |  55 ++++++
 .../apache/sling/graalvm/osgi/SlingContext.java    |  35 ++++
 .../sling/graalvm/sling/MockErrorHandler.java      |  23 +++
 .../sling/graalvm/sling/MockFilterManager.java     |  12 ++
 .../apache/sling/graalvm/sling/MockResource.java   |  54 ++++++
 .../sling/graalvm/sling/MockResourceProvider.java  |  27 +++
 .../sling/graalvm/sling/MockResourceResolver.java  | 184 +++++++++++++++++++++
 .../sling/graalvm/sling/MockServletResolver.java   |  41 +++++
 .../sling/graalvm/http/NativeSlingResourceIT.java  |   8 +
 .../sling/graalvm/http/SlingResourceTest.java      |  30 ++++
 13 files changed, 526 insertions(+), 6 deletions(-)

diff --git a/graalvm/README.md b/graalvm/README.md
index e9bf7ff..d71ea46 100644
--- a/graalvm/README.md
+++ b/graalvm/README.md
@@ -22,4 +22,13 @@ 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
+To run as a Docker container see `src/main/docker/Dockerfile.native`
+
+## TODO
+Running in **quarkus:dev mode fails so far** ("no SCR metadata found"), even if 
+using 
+
+    mvn clean compile bnd:bnd-process quarkus:dev
+
+The **native startup time** is about 5 seconds on my box, but just a few
+milliseconds when runnning in a Docker image.
\ No newline at end of file
diff --git a/graalvm/pom.xml b/graalvm/pom.xml
index 23f1270..89fee09 100644
--- a/graalvm/pom.xml
+++ b/graalvm/pom.xml
@@ -32,6 +32,10 @@
     </dependency>
     <dependency>
       <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-resteasy-jsonb</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.quarkus</groupId>
       <artifactId>quarkus-junit5</artifactId>
       <scope>test</scope>
     </dependency>
@@ -41,11 +45,6 @@
       <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>
@@ -60,6 +59,31 @@
       <artifactId>org.osgi.service.component.annotations</artifactId>
       <version>1.3.0</version>
     </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.apache.sling</groupId>
+      <artifactId>org.apache.sling.api</artifactId>
+      <version>2.20.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.engine</artifactId>
+      <version>2.6.20</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-fileupload</groupId>
+      <artifactId>commons-fileupload</artifactId>
+      <version>1.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <version>1.10.19</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java b/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
new file mode 100644
index 0000000..0f2d901
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
@@ -0,0 +1,18 @@
+package org.apache.sling.engine.impl;
+
+import org.apache.sling.engine.SlingRequestProcessor;
+import org.apache.sling.engine.impl.SlingRequestProcessorImpl;
+import org.apache.sling.graalvm.sling.MockErrorHandler;
+import org.apache.sling.graalvm.sling.MockFilterManager;
+import org.apache.sling.graalvm.sling.MockServletResolver;
+import org.osgi.service.component.annotations.Component;
+
+/** TODO hack: using the engine.impl package to access package private methods... */
+@Component(service=SlingRequestProcessor.class)
+public class SlingRequestProcessorWrapper extends SlingRequestProcessorImpl {
+    public SlingRequestProcessorWrapper() {
+        this.setServletResolver(new MockServletResolver());
+        this.setErrorHandler(new MockErrorHandler());
+        this.setFilterManager(new MockFilterManager());
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java b/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
new file mode 100644
index 0000000..566d8f8
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
@@ -0,0 +1,55 @@
+package org.apache.sling.graalvm.http;
+
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.doReturn;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.sling.graalvm.osgi.SlingContext;
+import org.apache.sling.graalvm.sling.MockServletResolver;
+import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.mockito.Mockito;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.engine.SlingRequestProcessor;
+
+@Path("/sling/{resourcePath: [^/][a-zA-Z/_0-9\\.]*}")
+@Produces(MediaType.APPLICATION_JSON)
+public class SlingResource {
+
+    @Context
+    private HttpServletRequest request;
+
+    @GET
+    public Response sling(@PathParam("resourcePath") String resourcePath) throws IOException {
+        final SlingRequestProcessor p = SlingContext.get().getService(SlingRequestProcessor.class);
+        assert (p != null);
+        final ResourceResolver resolver = SlingContext.get().getService(ResourceResolver.class);
+        assert (resolver != null);
+
+        final StringWriter sw = new StringWriter();
+        final HttpServletResponse resp = Mockito.mock(HttpServletResponse.class);
+        when(resp.getWriter()).thenReturn(new PrintWriter(sw));
+        
+        try {
+            p.processRequest(request, resp, resolver);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        final Resource r = (Resource)request.getAttribute(MockServletResolver.RESOURCE_ATTR);
+        return Response.ok(r).build();
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java b/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
new file mode 100644
index 0000000..bf9e27b
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
@@ -0,0 +1,35 @@
+package org.apache.sling.graalvm.osgi;
+
+import org.apache.sling.engine.impl.SlingRequestProcessorWrapper;
+import org.apache.sling.graalvm.sling.MockResourceProvider;
+import org.apache.sling.graalvm.sling.MockResourceResolver;
+import org.apache.sling.testing.mock.osgi.junit5.OsgiContext;
+
+public class SlingContext {
+    private static OsgiContext context;
+    
+    public static OsgiContext get() {
+        if(context != null) {
+            return context;
+        }
+
+        synchronized(SlingContext.class) {
+            context = initialize();
+        }
+
+        return context;
+    }
+
+    /** This is where we wire the system, like the OSGi framework
+     *  would do. As it seems hard to run that framework in a GraalVM
+     *  environment for now, we wire things statically.
+     */
+    private static OsgiContext initialize() {
+        final OsgiContext result = new OsgiContext();
+        final MockResourceProvider mrp = new MockResourceProvider();
+        result.registerInjectActivateService(new MockResourceResolver(mrp));
+        result.registerInjectActivateService(mrp);
+        result.registerInjectActivateService(new SlingRequestProcessorWrapper());
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockErrorHandler.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockErrorHandler.java
new file mode 100644
index 0000000..e933d09
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockErrorHandler.java
@@ -0,0 +1,23 @@
+package org.apache.sling.graalvm.sling;
+
+import java.io.IOException;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.engine.servlets.ErrorHandler;
+
+public class MockErrorHandler implements ErrorHandler {
+
+    @Override
+    public void handleError(int status, String message, SlingHttpServletRequest request,
+            SlingHttpServletResponse response) throws IOException {
+        response.getWriter().write(getClass().getSimpleName() + ':' + status + ':' + message);
+    }
+
+    @Override
+    public void handleError(Throwable throwable, SlingHttpServletRequest request, SlingHttpServletResponse response)
+            throws IOException {
+        response.getWriter().write(getClass().getSimpleName() + ':' + throwable.toString());
+    }
+    
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
new file mode 100644
index 0000000..ee07726
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
@@ -0,0 +1,12 @@
+package org.apache.sling.graalvm.sling;
+
+import org.apache.sling.engine.impl.filter.ServletFilterManager;
+import org.apache.sling.engine.impl.helper.SlingServletContext;
+import org.mockito.Mockito;
+import org.osgi.framework.BundleContext;
+
+public class MockFilterManager extends ServletFilterManager {
+    public MockFilterManager() {
+        super(Mockito.mock(BundleContext.class), Mockito.mock(SlingServletContext.class));
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResource.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResource.java
new file mode 100644
index 0000000..b5c73cb
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResource.java
@@ -0,0 +1,54 @@
+package org.apache.sling.graalvm.sling;
+
+import org.apache.sling.api.resource.AbstractResource;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
+
+@RegisterForReflection
+public class MockResource extends AbstractResource {
+
+    private final String path;
+    private final ResourceResolver resolver;
+    private final ResourceMetadata metadata;
+
+    public MockResource(ResourceResolver resolver, String path) {
+        this.resolver = resolver;
+        this.path = path;
+        this.metadata = new ResourceMetadata();
+        metadata.put(ResourceMetadata.RESOLUTION_PATH, path);
+        metadata.put(ResourceMetadata.RESOLUTION_PATH_INFO, path);
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+
+    @Override
+    public String getResourceType() {
+        return "mock/resource";
+    }
+
+    @Override
+    public String getResourceSuperType() {
+        return null;
+    }
+
+    @Override
+    public ResourceMetadata getResourceMetadata() {
+        return metadata;
+    }
+
+    @Override
+    public ResourceResolver getResourceResolver() {
+        return resolver;
+    }
+
+    @Override
+    public Resource getParent() {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceProvider.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceProvider.java
new file mode 100644
index 0000000..555ad85
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceProvider.java
@@ -0,0 +1,27 @@
+package org.apache.sling.graalvm.sling;
+
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.spi.resource.provider.ResolveContext;
+import org.apache.sling.spi.resource.provider.ResourceContext;
+import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.osgi.service.component.annotations.Component;
+
+@Component(service=ResourceProvider.class)
+public class MockResourceProvider extends ResourceProvider<MockResource> {
+
+    private static final String MAGIC = "chouc";
+
+    @Override
+    public Resource getResource(ResolveContext<MockResource> ctx, String path, ResourceContext resourceContext,
+            Resource parent) {
+        return path.contains(MAGIC) ? new MockResource(null, path) : null;
+    }
+
+    @Override
+    public Iterator<Resource> listChildren(ResolveContext<MockResource> ctx, Resource parent) {
+        return null;
+    }
+   
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceResolver.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceResolver.java
new file mode 100644
index 0000000..2ac4af7
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockResourceResolver.java
@@ -0,0 +1,184 @@
+package org.apache.sling.graalvm.sling;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.osgi.service.component.annotations.Component;
+
+@Component(service=ResourceResolver.class)
+public class MockResourceResolver implements ResourceResolver {
+
+    private final ResourceProvider<?> provider;
+
+    public MockResourceResolver(MockResourceProvider provider) {
+        this.provider = provider;
+    }
+
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+        return null;
+    }
+
+    @Override
+    public Resource resolve(HttpServletRequest request, String absPath) {
+        return provider.getResource(null, absPath, null, null);
+    }
+
+    @Override
+    public Resource resolve(String absPath) {
+        return null;
+    }
+
+    @Override
+    public Resource resolve(HttpServletRequest request) {
+        return null;
+    }
+
+    @Override
+    public String map(String resourcePath) {
+        return null;
+    }
+
+    @Override
+    public String map(HttpServletRequest request, String resourcePath) {
+        return null;
+    }
+
+    @Override
+    public Resource getResource(String path) {
+        return null;
+    }
+
+    @Override
+    public Resource getResource(Resource base, String path) {
+        return null;
+    }
+
+    @Override
+    public String[] getSearchPath() {
+        return null;
+    }
+
+    @Override
+    public Iterator<Resource> listChildren(Resource parent) {
+        return null;
+    }
+
+    @Override
+    public Resource getParent(Resource child) {
+        return null;
+    }
+
+    @Override
+    public Iterable<Resource> getChildren(Resource parent) {
+        return null;
+    }
+
+    @Override
+    public Iterator<Resource> findResources(String query, String language) {
+        return null;
+    }
+
+    @Override
+    public Iterator<Map<String, Object>> queryResources(String query, String language) {
+        return null;
+    }
+
+    @Override
+    public boolean hasChildren(Resource resource) {
+        return false;
+    }
+
+    @Override
+    public ResourceResolver clone(Map<String, Object> authenticationInfo) throws LoginException {
+        return null;
+    }
+
+    @Override
+    public boolean isLive() {
+        return false;
+    }
+
+    @Override
+    public void close() {
+
+    }
+
+    @Override
+    public String getUserID() {
+        return null;
+    }
+
+    @Override
+    public Iterator<String> getAttributeNames() {
+        return null;
+    }
+
+    @Override
+    public Object getAttribute(String name) {
+        return null;
+    }
+
+    @Override
+    public void delete(Resource resource) throws PersistenceException {
+
+    }
+
+    @Override
+    public Resource create(Resource parent, String name, Map<String, Object> properties) throws PersistenceException {
+        return null;
+    }
+
+    @Override
+    public void revert() {
+
+    }
+
+    @Override
+    public void commit() throws PersistenceException {
+
+    }
+
+    @Override
+    public boolean hasChanges() {
+        return false;
+    }
+
+    @Override
+    public String getParentResourceType(Resource resource) {
+        return null;
+    }
+
+    @Override
+    public String getParentResourceType(String resourceType) {
+        return null;
+    }
+
+    @Override
+    public boolean isResourceType(Resource resource, String resourceType) {
+        return false;
+    }
+
+    @Override
+    public void refresh() {
+
+    }
+
+    @Override
+    public Resource copy(String srcAbsPath, String destAbsPath) throws PersistenceException {
+        return null;
+    }
+
+    @Override
+    public Resource move(String srcAbsPath, String destAbsPath) throws PersistenceException {
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockServletResolver.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockServletResolver.java
new file mode 100644
index 0000000..f0bf437
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockServletResolver.java
@@ -0,0 +1,41 @@
+package org.apache.sling.graalvm.sling;
+
+import java.io.IOException;
+
+import javax.servlet.Servlet;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.servlets.ServletResolver;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
+
+public class MockServletResolver implements ServletResolver {
+
+    public static final String RESOURCE_ATTR = MockServletResolver.class.getName();
+
+    static class DummyServlet extends SlingSafeMethodsServlet {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
+            request.setAttribute(RESOURCE_ATTR, request.getResource());
+        }
+    }
+
+    @Override
+    public Servlet resolveServlet(SlingHttpServletRequest request) {
+        return new DummyServlet();
+    }
+
+    @Override
+    public Servlet resolveServlet(Resource resource, String scriptName) {
+        return new DummyServlet();
+    }
+
+    @Override
+    public Servlet resolveServlet(ResourceResolver resolver, String scriptName) {
+        return new DummyServlet();
+    }
+}
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/http/NativeSlingResourceIT.java b/graalvm/src/test/java/org/apache/sling/graalvm/http/NativeSlingResourceIT.java
new file mode 100644
index 0000000..9e7bcca
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/graalvm/http/NativeSlingResourceIT.java
@@ -0,0 +1,8 @@
+package org.apache.sling.graalvm.http;
+
+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/http/SlingResourceTest.java b/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java
new file mode 100644
index 0000000..d401d16
--- /dev/null
+++ b/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java
@@ -0,0 +1,30 @@
+package org.apache.sling.graalvm.http;
+
+import io.quarkus.test.junit.QuarkusTest;
+
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.equalTo;
+
+import javax.ws.rs.core.MediaType;
+
+@QuarkusTest
+public class SlingResourceTest {
+
+    @Test
+    public void testSlingResourceEndpoint() {
+        final String prefix = "/sling/";
+        final String path = "chouc/route";
+        final String resourceType = "mock/resource";
+
+        given()
+          .when().get(prefix + path)
+          .then()
+             .statusCode(200)
+             .contentType(MediaType.APPLICATION_JSON)
+             .body("path", equalTo(prefix + path))
+             .body("resourceType", equalTo(resourceType));
+    }
+
+}
\ No newline at end of file


[sling-whiteboard] 04/04: Remove Mockito + quarkus-resteasy-jsonb which prevented native build

Posted by bd...@apache.org.
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 98e3f5dd8cd5012b9887dad300e51afd2d14157b
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Thu Jul 4 12:00:43 2019 +0200

    Remove Mockito + quarkus-resteasy-jsonb which prevented native build
---
 graalvm/pom.xml                                    | 20 ++++++++-----
 .../engine/impl/SlingRequestProcessorWrapper.java  |  5 ++--
 .../java/org/apache/sling/graalvm/MsgProvider.java |  5 ----
 .../org/apache/sling/graalvm/MsgProviderImpl.java  | 17 -----------
 .../org/apache/sling/graalvm/SlingResource.java    | 29 -------------------
 .../sling/graalvm/http/JsonMessageBodyWriter.java  | 33 ++++++++++++++++++++++
 .../apache/sling/graalvm/http/SlingResource.java   | 15 ++--------
 .../apache/sling/graalvm/osgi/SlingContext.java    |  2 +-
 .../sling/graalvm/sling/MockFilterManager.java     |  9 ++++--
 .../org/apache/sling/serverless/HelloResource.java | 17 -----------
 .../sling/graalvm/NativeSlingResourceIT.java       |  8 ------
 .../apache/sling/graalvm/SlingResourceTest.java    | 21 --------------
 .../sling/graalvm/http/SlingResourceTest.java      |  4 +--
 .../apache/sling/serverless/HelloResourceTest.java | 21 --------------
 .../sling/serverless/NativeHelloResourceIT.java    |  9 ------
 15 files changed, 59 insertions(+), 156 deletions(-)

diff --git a/graalvm/pom.xml b/graalvm/pom.xml
index 89fee09..1a941c8 100644
--- a/graalvm/pom.xml
+++ b/graalvm/pom.xml
@@ -32,10 +32,6 @@
     </dependency>
     <dependency>
       <groupId>io.quarkus</groupId>
-      <artifactId>quarkus-resteasy-jsonb</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.quarkus</groupId>
       <artifactId>quarkus-junit5</artifactId>
       <scope>test</scope>
     </dependency>
@@ -56,6 +52,11 @@
     </dependency>
     <dependency>
       <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.http.whiteboard</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
       <artifactId>org.osgi.service.component.annotations</artifactId>
       <version>1.3.0</version>
     </dependency>
@@ -75,14 +76,19 @@
       <version>2.6.20</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.testing</artifactId>
+      <version>2.1.2</version>
+    </dependency>
+    <dependency>
       <groupId>commons-fileupload</groupId>
       <artifactId>commons-fileupload</artifactId>
       <version>1.4</version>
     </dependency>
     <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-all</artifactId>
-      <version>1.10.19</version>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.5</version>
     </dependency>
   </dependencies>
   <build>
diff --git a/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java b/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
index 0f2d901..0b57f45 100644
--- a/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
+++ b/graalvm/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorWrapper.java
@@ -5,14 +5,15 @@ import org.apache.sling.engine.impl.SlingRequestProcessorImpl;
 import org.apache.sling.graalvm.sling.MockErrorHandler;
 import org.apache.sling.graalvm.sling.MockFilterManager;
 import org.apache.sling.graalvm.sling.MockServletResolver;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.component.annotations.Component;
 
 /** TODO hack: using the engine.impl package to access package private methods... */
 @Component(service=SlingRequestProcessor.class)
 public class SlingRequestProcessorWrapper extends SlingRequestProcessorImpl {
-    public SlingRequestProcessorWrapper() {
+    public SlingRequestProcessorWrapper(BundleContext bc) {
         this.setServletResolver(new MockServletResolver());
         this.setErrorHandler(new MockErrorHandler());
-        this.setFilterManager(new MockFilterManager());
+        this.setFilterManager(new MockFilterManager(bc));
     }
 }
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java b/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java
deleted file mode 100644
index bac6c06..0000000
--- a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProvider.java
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index d2c2ec5..0000000
--- a/graalvm/src/main/java/org/apache/sling/graalvm/MsgProviderImpl.java
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index c652dbf..0000000
--- a/graalvm/src/main/java/org/apache/sling/graalvm/SlingResource.java
+++ /dev/null
@@ -1,29 +0,0 @@
-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/java/org/apache/sling/graalvm/http/JsonMessageBodyWriter.java b/graalvm/src/main/java/org/apache/sling/graalvm/http/JsonMessageBodyWriter.java
new file mode 100644
index 0000000..59cfa69
--- /dev/null
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/http/JsonMessageBodyWriter.java
@@ -0,0 +1,33 @@
+package org.apache.sling.graalvm.http;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
+import com.google.gson.Gson;
+
+@Provider
+@Produces(MediaType.APPLICATION_JSON)
+public class JsonMessageBodyWriter implements MessageBodyWriter<Object> {
+
+    @Override
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+        return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
+    }
+
+    @Override
+    public void writeTo(Object data, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
+            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
+            throws IOException, WebApplicationException {
+        entityStream.write(new Gson().toJson(data).getBytes("UTF-8"));
+    }
+
+}
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java b/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
index 566d8f8..6d97215 100644
--- a/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/http/SlingResource.java
@@ -1,14 +1,8 @@
 package org.apache.sling.graalvm.http;
 
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.doReturn;
-
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -19,10 +13,9 @@ import javax.ws.rs.core.Response;
 
 import org.apache.sling.graalvm.osgi.SlingContext;
 import org.apache.sling.graalvm.sling.MockServletResolver;
-import org.apache.sling.spi.resource.provider.ResourceProvider;
-import org.mockito.Mockito;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse;
 import org.apache.sling.engine.SlingRequestProcessor;
 
 @Path("/sling/{resourcePath: [^/][a-zA-Z/_0-9\\.]*}")
@@ -39,12 +32,8 @@ public class SlingResource {
         final ResourceResolver resolver = SlingContext.get().getService(ResourceResolver.class);
         assert (resolver != null);
 
-        final StringWriter sw = new StringWriter();
-        final HttpServletResponse resp = Mockito.mock(HttpServletResponse.class);
-        when(resp.getWriter()).thenReturn(new PrintWriter(sw));
-        
         try {
-            p.processRequest(request, resp, resolver);
+            p.processRequest(request, new MockSlingHttpServletResponse(), resolver);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java b/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
index bf9e27b..bbbf028 100644
--- a/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/osgi/SlingContext.java
@@ -29,7 +29,7 @@ public class SlingContext {
         final MockResourceProvider mrp = new MockResourceProvider();
         result.registerInjectActivateService(new MockResourceResolver(mrp));
         result.registerInjectActivateService(mrp);
-        result.registerInjectActivateService(new SlingRequestProcessorWrapper());
+        result.registerInjectActivateService(new SlingRequestProcessorWrapper(result.bundleContext()));
         return result;
     }
 }
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
index ee07726..dfc3b2a 100644
--- a/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
+++ b/graalvm/src/main/java/org/apache/sling/graalvm/sling/MockFilterManager.java
@@ -1,12 +1,15 @@
 package org.apache.sling.graalvm.sling;
 
+import org.apache.sling.engine.impl.SlingMainServlet;
 import org.apache.sling.engine.impl.filter.ServletFilterManager;
 import org.apache.sling.engine.impl.helper.SlingServletContext;
-import org.mockito.Mockito;
 import org.osgi.framework.BundleContext;
 
 public class MockFilterManager extends ServletFilterManager {
-    public MockFilterManager() {
-        super(Mockito.mock(BundleContext.class), Mockito.mock(SlingServletContext.class));
+    public MockFilterManager(BundleContext bc) {
+        super(
+            bc, 
+            new SlingServletContext(bc, new SlingMainServlet())
+        );
     }
 }
\ No newline at end of file
diff --git a/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java b/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java
deleted file mode 100644
index 790193b..0000000
--- a/graalvm/src/main/java/org/apache/sling/serverless/HelloResource.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.apache.sling.serverless;
-
-import java.util.Date;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/hello")
-public class HelloResource {
-
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String hello() {
-        return "hello, at " + new Date();
-    }
-}
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java b/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java
deleted file mode 100644
index d88ff6c..0000000
--- a/graalvm/src/test/java/org/apache/sling/graalvm/NativeSlingResourceIT.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 91a0f13..0000000
--- a/graalvm/src/test/java/org/apache/sling/graalvm/SlingResourceTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-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
diff --git a/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java b/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java
index d401d16..6168210 100644
--- a/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java
+++ b/graalvm/src/test/java/org/apache/sling/graalvm/http/SlingResourceTest.java
@@ -16,15 +16,13 @@ public class SlingResourceTest {
     public void testSlingResourceEndpoint() {
         final String prefix = "/sling/";
         final String path = "chouc/route";
-        final String resourceType = "mock/resource";
 
         given()
           .when().get(prefix + path)
           .then()
              .statusCode(200)
              .contentType(MediaType.APPLICATION_JSON)
-             .body("path", equalTo(prefix + path))
-             .body("resourceType", equalTo(resourceType));
+             .body("path", equalTo(prefix + path));
     }
 
 }
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java b/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java
deleted file mode 100644
index 9f4ac22..0000000
--- a/graalvm/src/test/java/org/apache/sling/serverless/HelloResourceTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.apache.sling.serverless;
-
-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 HelloResourceTest {
-
-    @Test
-    public void testHelloEndpoint() {
-        given()
-          .when().get("/hello")
-          .then()
-             .statusCode(200)
-             .body(containsString("hello, at"));
-    }
-
-}
\ No newline at end of file
diff --git a/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java b/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java
deleted file mode 100644
index 7bfae1b..0000000
--- a/graalvm/src/test/java/org/apache/sling/serverless/NativeHelloResourceIT.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.sling.serverless;
-
-import io.quarkus.test.junit.SubstrateTest;
-
-@SubstrateTest
-public class NativeHelloResourceIT extends HelloResourceTest {
-
-    // Execute the same tests but in native mode.
-}
\ No newline at end of file


[sling-whiteboard] 02/04: Using Sling OSGi mocks

Posted by bd...@apache.org.
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