You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2019/08/17 07:49:06 UTC

[sling-org-apache-sling-clam] branch master updated (6785f3b -> 88ea175)

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

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


    from 6785f3b  SLING-8575 Update Felix Framework to 6.0.3
     new 5a0eca2  style
     new bc0821d  move integration tests to profile
     new 2e6edc8  SLING-8258 Provide HTTP API for Sling Clam
     new 4af6d2a  improve integration tests
     new aec04ab  start Docker container on demand
     new 72293dd  make iteration of clients thread-safe
     new ee4c9e6  readd default HTTP and AUTH properties
     new 65da182  set osgi.http.whiteboard.context.name to org.apache.sling
     new cd04327  make tests depend on ClamService
     new ffa206a  SLING-8258 Provide HTTP API for Sling Clam
     new cd630f6  SLING-8258 Provide HTTP API for Sling Clam
     new 88ea175  add sections for HTTP API, patterns and integration tests

The 12 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:
 README.md                                          |  40 +++++
 pom.xml                                            | 115 ++++++++++---
 .../clam/http/internal/ClamEventsServlet.java      |  14 +-
 .../internal/ClamEventsServletConfiguration.java}  |  20 ++-
 .../clam/http/internal/ClamJcrScanServlet.java     |   6 +-
 .../internal/ClamJcrScanServletConfiguration.java  |  14 +-
 .../job/internal/JcrPropertyScanJobConsumer.java   |   2 +-
 .../clam/it/support/ClamContainerFactory.java}     |  21 ++-
 .../RecordingJcrPropertyScanResultHandler.java     |  50 ++++++
 .../sling/clam/it/tests/ClamEventsServletIT.java   | 181 +++++++++++++++++++++
 .../sling/clam/it/tests/ClamJcrScanServletIT.java  | 100 ++++++++++++
 .../sling/clam/it/tests/ClamTestSupport.java       |  87 +++++++++-
 .../it/tests/JcrPropertyScanJobConsumerIT.java     |   9 +-
 .../ResourcePersistingScanResultHandlerIT.java     |  67 +++++++-
 14 files changed, 659 insertions(+), 67 deletions(-)
 copy src/main/java/org/apache/sling/clam/{result/internal/EventPublishingScanResultHandlerConfiguration.java => http/internal/ClamEventsServletConfiguration.java} (68%)
 copy src/{main/java/org/apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java => test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java} (59%)
 create mode 100644 src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java
 create mode 100644 src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
 create mode 100644 src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java


[sling-org-apache-sling-clam] 11/12: SLING-8258 Provide HTTP API for Sling Clam

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit cd630f65b8c4efba7a1d82e9ef908b219aff5d03
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:36:20 2019 +0200

    SLING-8258 Provide HTTP API for Sling Clam
    
    * Add integration tests for ClamJcrScanServlet
---
 .../sling/clam/it/tests/ClamJcrScanServletIT.java  | 100 +++++++++++++++++++++
 1 file changed, 100 insertions(+)

diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java b/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
new file mode 100644
index 0000000..183ae30
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.clam.it.tests;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+
+import org.apache.sling.clam.it.support.RecordingJcrPropertyScanResultHandler;
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.resource.presence.ResourcePresence;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.exam.util.Filter;
+
+import static io.restassured.RestAssured.given;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
+import static org.awaitility.Awaitility.with;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class ClamJcrScanServletIT extends ClamTestSupport {
+
+    @Inject
+    @Filter(value = "(path=/content/starter)")
+    private ResourcePresence resourcePresence;
+
+    private static final String URL_TEMPLATE = "http://localhost:%s/system/clam-jcr-scan";
+
+    @Configuration
+    public Option[] configuration() {
+        return options(
+            baseConfiguration(),
+            clamdConfiguration(),
+            slingResourcePresence(),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", "/content/starter")
+                .asOption(),
+            slingStarterContent()
+        );
+    }
+
+    @Test
+    public void testAuthentication() throws Exception {
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        given()
+            .when()
+            .post(url)
+            .then().statusCode(401);
+    }
+
+    @Test
+    public void test() throws IOException {
+        final RecordingJcrPropertyScanResultHandler scanResultHandler = new RecordingJcrPropertyScanResultHandler();
+        bundleContext.registerService(JcrPropertyScanResultHandler.class, scanResultHandler, null);
+
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        given()
+            .auth().basic("admin", "admin")
+            .param("path", "/content/starter")
+            .when()
+            .post(url)
+            .then().statusCode(200);
+
+        with()
+            .pollInterval(10, SECONDS)
+            .then()
+            .await()
+            .alias("counting results")
+            .atMost(1, MINUTES)
+            .until(() -> scanResultHandler.getResults().size() == 12);
+    }
+
+}


[sling-org-apache-sling-clam] 09/12: make tests depend on ClamService

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit cd04327bbab14edef4b09288ee1ce94bb1337259
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:24:01 2019 +0200

    make tests depend on ClamService
---
 src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
index c2bcfa5..8a09bc1 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
@@ -29,6 +29,7 @@ import javax.jcr.Session;
 
 import org.apache.sling.clam.it.support.ClamContainerFactory;
 import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
+import org.apache.sling.commons.clam.ClamService;
 import org.apache.sling.event.jobs.JobManager;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.testing.paxexam.TestSupport;
@@ -58,6 +59,9 @@ public abstract class ClamTestSupport extends TestSupport {
     protected SlingRepository slingRepository;
 
     @Inject
+    protected ClamService clamService;
+
+    @Inject
     protected JobManager jobManager;
 
     protected ModifiableCompositeOption baseConfiguration() {


[sling-org-apache-sling-clam] 08/12: set osgi.http.whiteboard.context.name to org.apache.sling

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 65da182c2039f77e36960d0a203a6d40109ff067
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:22:49 2019 +0200

    set osgi.http.whiteboard.context.name to org.apache.sling
---
 .../java/org/apache/sling/clam/http/internal/ClamEventsServlet.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
index dd740b2..9577c96 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
@@ -60,8 +60,8 @@ import static org.apache.sling.clam.http.internal.ResponseUtil.json;
     property = {
         Constants.SERVICE_DESCRIPTION + "=Apache Sling Clam Events Servlet",
         Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
-        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(osgi.http.whiteboard.context.name=org.osgi.service.http)",
-        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED + "=true"
+        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(osgi.http.whiteboard.context.name=org.apache.sling)", // org.osgi.service.http
+        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED + "=true",
         HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN + "=/system/clam-events",
         AuthConstants.AUTH_REQUIREMENTS + "=/system/clam-events"
     }


[sling-org-apache-sling-clam] 02/12: move integration tests to profile

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit bc0821de02b6ce8007c8c3cf68f9dfa193eb79f3
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Tue Jul 23 12:47:19 2019 +0200

    move integration tests to profile
---
 pom.xml | 53 ++++++++++++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 21 deletions(-)

diff --git a/pom.xml b/pom.xml
index 4f7ca05..8c8c290 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,33 +59,44 @@
         <artifactId>bnd-baseline-maven-plugin</artifactId>
       </plugin>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>integration-test</goal>
-              <goal>verify</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
-          <systemProperties>
-            <property>
-              <name>bundle.filename</name>
-              <value>${basedir}/target/${project.build.finalName}.jar</value>
-            </property>
-          </systemProperties>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.apache.servicemix.tooling</groupId>
         <artifactId>depends-maven-plugin</artifactId>
       </plugin>
     </plugins>
   </build>
 
+  <profiles>
+    <profile>
+      <!-- integration tests require a running clam daemon -->
+      <id>it</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-failsafe-plugin</artifactId>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>integration-test</goal>
+                  <goal>verify</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <redirectTestOutputToFile>true</redirectTestOutputToFile>
+              <systemProperties>
+                <property>
+                  <name>bundle.filename</name>
+                  <value>${basedir}/target/${project.build.finalName}.jar</value>
+                </property>
+              </systemProperties>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
   <dependencies>
     <!-- javax -->
     <dependency>


[sling-org-apache-sling-clam] 01/12: style

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 5a0eca26279e3d472c67d0927d4c7dd381b9077b
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Tue Jul 23 12:44:07 2019 +0200

    style
---
 .../apache/sling/clam/job/internal/JcrPropertyScanJobConsumer.java   | 2 +-
 .../org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/sling/clam/job/internal/JcrPropertyScanJobConsumer.java b/src/main/java/org/apache/sling/clam/job/internal/JcrPropertyScanJobConsumer.java
index 3ca666a..2427546 100644
--- a/src/main/java/org/apache/sling/clam/job/internal/JcrPropertyScanJobConsumer.java
+++ b/src/main/java/org/apache/sling/clam/job/internal/JcrPropertyScanJobConsumer.java
@@ -30,8 +30,8 @@ import javax.jcr.Value;
 import org.apache.commons.io.IOUtils;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
 import org.apache.sling.clam.internal.ClamUtil;
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
 import org.apache.sling.commons.clam.ClamService;
 import org.apache.sling.commons.clam.ScanResult;
 import org.apache.sling.event.jobs.Job;
diff --git a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
index c538eda..53890b0 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
@@ -31,6 +31,7 @@ import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 
 import static org.junit.Assert.assertNotNull;
+import static org.ops4j.pax.exam.CoreOptions.options;
 
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
@@ -42,7 +43,9 @@ public class JcrPropertyScanJobConsumerIT extends ClamTestSupport {
 
     @Configuration
     public Option[] configuration() {
-        return super.configuration();
+        return options(
+            baseConfiguration()
+        );
     }
 
     @Test


[sling-org-apache-sling-clam] 03/12: SLING-8258 Provide HTTP API for Sling Clam

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 2e6edc8935d078f54564b87a5485e28a5425ac5c
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sat Jul 27 09:40:51 2019 +0200

    SLING-8258 Provide HTTP API for Sling Clam
    
    * Make servlet paths and auth configurable
---
 pom.xml                                            | 11 ------
 .../clam/http/internal/ClamEventsServlet.java      |  9 ++---
 .../internal/ClamEventsServletConfiguration.java   | 42 ++++++++++++++++++++++
 .../clam/http/internal/ClamJcrScanServlet.java     |  6 +---
 .../internal/ClamJcrScanServletConfiguration.java  | 14 +++++++-
 5 files changed, 61 insertions(+), 21 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8c8c290..fdf19c2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -188,12 +188,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
-      <artifactId>org.apache.sling.auth.core</artifactId>
-      <version>1.2.0</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.event</artifactId>
       <version>4.2.10</version>
       <scope>provided</scope>
@@ -212,11 +206,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
-      <artifactId>org.apache.sling.servlets.resolver</artifactId>
-      <version>2.1.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.serviceusermapper</artifactId>
       <version>1.3.0</version>
       <scope>provided</scope>
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
index 6d36c5e..d62d2b8 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
@@ -38,7 +38,6 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.sling.auth.core.AuthConstants;
 import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
 import org.apache.sling.commons.clam.ScanResult;
 import org.jetbrains.annotations.NotNull;
@@ -46,6 +45,7 @@ import org.jetbrains.annotations.Nullable;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+import org.osgi.service.metatype.annotations.Designate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,11 +60,12 @@ import static org.apache.sling.clam.http.internal.ResponseUtil.json;
         Constants.SERVICE_DESCRIPTION + "=Apache Sling Clam Events Servlet",
         Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
         HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(osgi.http.whiteboard.context.name=org.osgi.service.http)",
-        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN + "=/system/clam-events",
-        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED + "=true",
-        AuthConstants.AUTH_REQUIREMENTS + "=/system/clam-events"
+        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED + "=true"
     }
 )
+@Designate(
+    ocd = ClamEventsServletConfiguration.class
+)
 public class ClamEventsServlet extends HttpServlet implements JcrPropertyScanResultHandler {
 
     private List<Client> clients = Collections.synchronizedList(new ArrayList<>());
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServletConfiguration.java b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServletConfiguration.java
new file mode 100644
index 0000000..1e57ded
--- /dev/null
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServletConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.clam.http.internal;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(
+    name = "Apache Sling Clam Events Servlet",
+    description = "TODO"
+)
+@interface ClamEventsServletConfiguration {
+
+    @AttributeDefinition(
+        name = "TODO",
+        description = "TODO"
+    )
+    String[] osgi_http_whiteboard_servlet_pattern() default {"/system/clam-events"};
+
+    @AttributeDefinition(
+        name = "TODO",
+        description = "TODO"
+    )
+    String[] sling_auth_requirements() default {"/system/clam-events"};
+
+}
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
index 0da7131..bebdb7e 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
@@ -33,9 +33,7 @@ import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.servlets.SlingAllMethodsServlet;
-import org.apache.sling.auth.core.AuthConstants;
 import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
-import org.apache.sling.servlets.resolver.internal.ServletResolverConstants;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Activate;
@@ -62,9 +60,7 @@ import static org.apache.sling.clam.internal.ClamUtil.propertyTypesFromNames;
     service = Servlet.class,
     property = {
         Constants.SERVICE_DESCRIPTION + "=Apache Sling Clam JCR Scan Servlet",
-        Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
-        ServletResolverConstants.SLING_SERVLET_PATHS + "=/system/clam-jcr-scan",
-        AuthConstants.AUTH_REQUIREMENTS + "=/system/clam-jcr-scan"
+        Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
     }
 )
 @Designate(
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
index 348580f..77b0e06 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
@@ -24,11 +24,23 @@ import org.osgi.service.metatype.annotations.Option;
 
 @ObjectClassDefinition(
     name = "Apache Sling Clam JCR Scan Servlet",
-    description = "..."
+    description = "TODO"
 )
 @interface ClamJcrScanServletConfiguration {
 
     @AttributeDefinition(
+        name = "TODO",
+        description = "TODO"
+    )
+    String[] sling_servlet_paths() default {"/system/clam-jcr-scan"};
+
+    @AttributeDefinition(
+        name = "TODO",
+        description = "TODO"
+    )
+    String[] sling_auth_requirements() default {"/system/clam-jcr-scan"};
+
+    @AttributeDefinition(
         name = "scan authorized groups",
         description = "User groups authorized for scanning"
     )


[sling-org-apache-sling-clam] 06/12: make iteration of clients thread-safe

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 72293dd1436faba76e392e3b2ce701cb04e7c410
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:14:55 2019 +0200

    make iteration of clients thread-safe
---
 .../java/org/apache/sling/clam/http/internal/ClamEventsServlet.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
index d62d2b8..377ecd6 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
@@ -68,7 +68,7 @@ import static org.apache.sling.clam.http.internal.ResponseUtil.json;
 )
 public class ClamEventsServlet extends HttpServlet implements JcrPropertyScanResultHandler {
 
-    private List<Client> clients = Collections.synchronizedList(new ArrayList<>());
+    private final List<Client> clients = Collections.synchronizedList(new ArrayList<>());
 
     private final AtomicLong counter = new AtomicLong(0);
 
@@ -102,7 +102,9 @@ public class ClamEventsServlet extends HttpServlet implements JcrPropertyScanRes
 
     private void addEvent(final String type, final String data) {
         final Event event = new Event(type, data);
-        clients.iterator().forEachRemaining(client -> client.addEvent(event));
+        synchronized (clients) {
+            clients.iterator().forEachRemaining(client -> client.addEvent(event));
+        }
     }
 
     private class Event {


[sling-org-apache-sling-clam] 10/12: SLING-8258 Provide HTTP API for Sling Clam

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit ffa206ad66f9f2e67729492af3be748284178079
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:31:36 2019 +0200

    SLING-8258 Provide HTTP API for Sling Clam
    
    * Add integration tests for ClamEventsServlet
---
 pom.xml                                            |  19 +++
 .../sling/clam/it/tests/ClamEventsServletIT.java   | 181 +++++++++++++++++++++
 2 files changed, 200 insertions(+)

diff --git a/pom.xml b/pom.xml
index f2584bc..f381ad1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -120,6 +120,25 @@
       <artifactId>javax.servlet-api</artifactId>
       <scope>provided</scope>
     </dependency>
+    <!-- ok io/http -->
+    <dependency>
+      <groupId>org.apache.servicemix.bundles</groupId>
+      <artifactId>org.apache.servicemix.bundles.okio</artifactId>
+      <version>1.15.0_1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicemix.bundles</groupId>
+      <artifactId>org.apache.servicemix.bundles.okhttp</artifactId>
+      <version>3.11.0_1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.launchdarkly</groupId>
+      <artifactId>okhttp-eventsource</artifactId>
+      <version>1.10.0</version>
+      <scope>test</scope>
+    </dependency>
     <!-- OSGi -->
     <dependency>
       <groupId>org.osgi</groupId>
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java b/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
new file mode 100644
index 0000000..20f85eb
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.clam.it.tests;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import com.launchdarkly.eventsource.EventHandler;
+import com.launchdarkly.eventsource.EventSource;
+import com.launchdarkly.eventsource.MessageEvent;
+import okhttp3.Credentials;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.resource.presence.ResourcePresence;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.exam.util.Filter;
+
+import static io.restassured.RestAssured.given;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
+import static org.awaitility.Awaitility.with;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class ClamEventsServletIT extends ClamTestSupport {
+
+    @Inject
+    @Filter(value = "(path=/content/starter)")
+    private ResourcePresence resourcePresence;
+
+    @Inject
+    @Filter(value = "(service.description=Apache Sling Clam Events Servlet)")
+    private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
+
+    @Inject
+    private NodeDescendingJcrPropertyDigger nodeDescendingJcrPropertyDigger;
+
+    private static final String URL_TEMPLATE = "http://localhost:%s/system/clam-events";
+
+    @Configuration
+    public Option[] configuration() {
+        return options(
+            baseConfiguration(),
+            clamdConfiguration(),
+            slingResourcePresence(),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", "/content/starter")
+                .asOption(),
+            slingStarterContent(),
+            // ok io/http/eventsource
+            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.okio").versionAsInProject(),
+            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.okhttp").versionAsInProject(),
+            wrappedBundle(mavenBundle().groupId("com.launchdarkly").artifactId("okhttp-eventsource").versionAsInProject())
+        );
+    }
+
+    @Test
+    public void testAuthentication() throws Exception {
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        given()
+            .when()
+            .get(url)
+            .then().statusCode(401);
+    }
+
+    @Test
+    public void testEvents() throws Exception {
+        final RecordingEventHandler recordingEventHandler = new RecordingEventHandler();
+
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        final OkHttpClient client = new OkHttpClient.Builder()
+            .addInterceptor(new BasicAuthInterceptor("admin", "admin"))
+            .build();
+        final EventSource eventSource = new EventSource.Builder(recordingEventHandler, URI.create(url))
+            .client(client)
+            .maxReconnectTimeMs(0)
+            .reconnectTimeMs(0)
+            .build();
+        eventSource.start();
+
+        digBinaries(nodeDescendingJcrPropertyDigger, "/content/starter");
+        with().
+            pollInterval(10, SECONDS).
+            then().
+            await().
+            alias("counting results").
+            atMost(1, MINUTES).
+            until(() -> recordingEventHandler.countEvents() == 12);
+    }
+
+    class BasicAuthInterceptor implements Interceptor {
+
+        private String credentials;
+
+        BasicAuthInterceptor(final String user, final String password) {
+            this.credentials = Credentials.basic(user, password);
+        }
+
+        @Override
+        public Response intercept(final Chain chain) throws IOException {
+            final Request request = chain.request()
+                .newBuilder()
+                .header("Authorization", credentials)
+                .build();
+            return chain.proceed(request);
+        }
+
+    }
+
+    class RecordingEventHandler implements EventHandler {
+
+        private final List<String> events = new ArrayList<>();
+
+        List<String> getEvents() {
+            return events;
+        }
+
+        int countEvents() {
+            return events.size();
+        }
+
+        @Override
+        public void onOpen() throws Exception {
+        }
+
+        @Override
+        public void onClosed() throws Exception {
+        }
+
+        @Override
+        public void onMessage(final String event, final MessageEvent messageEvent) throws Exception {
+            events.add(messageEvent.getData());
+        }
+
+        @Override
+        public void onComment(final String comment) throws Exception {
+        }
+
+        @Override
+        public void onError(final Throwable throwable) {
+        }
+
+    }
+
+}


[sling-org-apache-sling-clam] 04/12: improve integration tests

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 4af6d2a82e3deceaea295b5caca24b47dcbfc6fb
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Jul 28 11:13:47 2019 +0200

    improve integration tests
---
 pom.xml                                            | 44 ++++++++++--
 .../clam/it/support/ClamContainerFactory.java      | 37 ++++++++++
 .../RecordingJcrPropertyScanResultHandler.java     | 50 +++++++++++++
 .../sling/clam/it/tests/ClamTestSupport.java       | 82 ++++++++++++++++++++--
 .../it/tests/JcrPropertyScanJobConsumerIT.java     |  4 +-
 .../ResourcePersistingScanResultHandlerIT.java     | 67 ++++++++++++++++--
 6 files changed, 266 insertions(+), 18 deletions(-)

diff --git a/pom.xml b/pom.xml
index fdf19c2..57d8275 100644
--- a/pom.xml
+++ b/pom.xml
@@ -206,6 +206,18 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.jcr.api</artifactId>
+      <version>2.4.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.resource.presence</artifactId>
+      <version>0.0.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.serviceusermapper</artifactId>
       <version>1.3.0</version>
       <scope>provided</scope>
@@ -213,7 +225,7 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.paxexam</artifactId>
-      <version>3.0.0</version>
+      <version>3.1.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
     <!-- nullability -->
@@ -235,9 +247,27 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicemix.bundles</groupId>
-      <artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
-      <version>1.3_1</version>
+      <groupId>io.rest-assured</groupId>
+      <artifactId>rest-assured</artifactId>
+      <version>4.0.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.awaitility</groupId>
+      <artifactId>awaitility</artifactId>
+      <version>4.0.0-rc1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.truth</groupId>
+      <artifactId>truth</artifactId>
+      <version>1.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>testcontainers</artifactId>
+      <version>1.11.3</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -270,6 +300,12 @@
       <version>${org.ops4j.pax.exam.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.ops4j.pax.url</groupId>
+      <artifactId>pax-url-wrap</artifactId>
+      <version>2.6.1</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
new file mode 100644
index 0000000..fb259d2
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.clam.it.support;
+
+import java.time.Duration;
+
+import org.testcontainers.containers.GenericContainer;
+
+public class ClamContainerFactory {
+
+    private static final String CLAM_CONTAINER_IMAGE_NAME = "mk0x/docker-clamav:alpine";
+
+    public static GenericContainer container = new GenericContainer<>(CLAM_CONTAINER_IMAGE_NAME)
+        .withExposedPorts(3310)
+        .withStartupTimeout(Duration.ofMinutes(3));
+
+    static {
+        container.start();
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java b/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java
new file mode 100644
index 0000000..16e0200
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.clam.it.support;
+
+import java.util.HashMap;
+
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.commons.clam.ScanResult;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class RecordingJcrPropertyScanResultHandler implements JcrPropertyScanResultHandler {
+
+    private final HashMap<String, ScanResult> results = new HashMap<>();
+
+    public RecordingJcrPropertyScanResultHandler() {
+    }
+
+    public HashMap<String, ScanResult> getResults() {
+        return results;
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int propertyType, @Nullable String userId) {
+        results.put(path, scanResult);
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int index, int propertyType, @Nullable String userId) {
+        final String key = String.format("%s[%s]", path, index);
+        results.put(key, scanResult);
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
index 100edc0..bcc855f 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
@@ -18,22 +18,51 @@
  */
 package org.apache.sling.clam.it.tests;
 
+import java.util.Collections;
+import java.util.regex.Pattern;
+
+import javax.inject.Inject;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.sling.clam.it.support.ClamContainerFactory;
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
+import org.apache.sling.event.jobs.JobManager;
+import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.testing.paxexam.TestSupport;
 import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.options.ModifiableCompositeOption;
+import org.osgi.framework.BundleContext;
 
+import static org.apache.sling.testing.paxexam.SlingOptions.awaitility;
+import static org.apache.sling.testing.paxexam.SlingOptions.restassured;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingEvent;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
+import static org.apache.sling.testing.paxexam.SlingOptions.testcontainers;
 import static org.apache.sling.testing.paxexam.SlingVersionResolver.SLING_GROUP_ID;
 import static org.ops4j.pax.exam.CoreOptions.composite;
 import static org.ops4j.pax.exam.CoreOptions.junitBundles;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
 
 public abstract class ClamTestSupport extends TestSupport {
 
-    public Option[] configuration() {
-        return new Option[]{
-            baseConfiguration(),
+    @Inject
+    protected BundleContext bundleContext;
+
+    @Inject
+    protected SlingRepository slingRepository;
+
+    @Inject
+    protected JobManager jobManager;
+
+    protected ModifiableCompositeOption baseConfiguration() {
+        return composite(
+            super.baseConfiguration(),
             quickstart(),
             // Sling Clam
             testBundle("bundle.filename"),
@@ -46,9 +75,15 @@ public abstract class ClamTestSupport extends TestSupport {
             // Sling Commons Clam
             mavenBundle().groupId(SLING_GROUP_ID).artifactId("org.apache.sling.commons.clam").versionAsInProject(),
             // testing
-            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(),
-            junitBundles()
-        };
+            newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist")
+                .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*")
+                .asOption(),
+            junitBundles(),
+            awaitility(),
+            restassured(),
+            testcontainers(),
+            wrappedBundle(mavenBundle().groupId("com.google.truth").artifactId("truth").versionAsInProject())
+        );
     }
 
     protected Option quickstart() {
@@ -60,4 +95,39 @@ public abstract class ClamTestSupport extends TestSupport {
         );
     }
 
+    protected Option clamdConfiguration() {
+        final boolean testcontainer = Boolean.parseBoolean(System.getProperty("clamd.testcontainer", "true"));
+        final String host;
+        final Integer port;
+        if (testcontainer) {
+            host = ClamContainerFactory.container.getContainerIpAddress();
+            port = ClamContainerFactory.container.getFirstMappedPort();
+        } else {
+            host = System.getProperty("clamd.host", "localhost");
+            port = Integer.parseInt(System.getProperty("clamd.port", "3310"));
+        }
+        return newConfiguration("org.apache.sling.commons.clam.internal.ClamdService")
+            .put("clamd.host", host)
+            .put("clamd.port", port)
+            .asOption();
+    }
+
+    protected Session session() throws RepositoryException {
+        return slingRepository.loginAdministrative(null);
+    }
+
+    protected void digBinaries(final NodeDescendingJcrPropertyDigger digger, final String path) throws Exception {
+        Session session = null;
+        try {
+            session = session();
+            final Node starter = session.getNode(path);
+            final Pattern pattern = Pattern.compile("^/.*$");
+            digger.dig(starter, pattern, Collections.singleton(PropertyType.BINARY), -1, -1);
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
index 53890b0..9028683 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
@@ -30,7 +30,7 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertThat;
 import static org.ops4j.pax.exam.CoreOptions.options;
 
 @RunWith(PaxExam.class)
@@ -50,7 +50,7 @@ public class JcrPropertyScanJobConsumerIT extends ClamTestSupport {
 
     @Test
     public void testJobConsumer() {
-        assertNotNull(jobConsumer);
+        assertThat(jobConsumer).isNotNull();
     }
 
 }
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java b/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
index ae87309..7346925 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
@@ -19,8 +19,14 @@
 package org.apache.sling.clam.it.tests;
 
 import javax.inject.Inject;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
 
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
 import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.resource.presence.ResourcePresence;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -30,8 +36,14 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 
-import static org.junit.Assert.assertNotNull;
-import static org.ops4j.pax.exam.OptionUtils.combine;
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
+import static org.awaitility.Awaitility.with;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
 
 @RunWith(PaxExam.class)
@@ -42,20 +54,63 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
     @Filter("(service.pid=org.apache.sling.clam.result.internal.ResourcePersistingScanResultHandler)")
     private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
 
+    @Inject
+    @Filter(value = "(path=/content/starter)")
+    private ResourcePresence resourcePresence;
+
+    @Inject
+    private NodeDescendingJcrPropertyDigger nodeDescendingJcrPropertyDigger;
+
     @Configuration
     public Option[] configuration() {
-        return combine(
-            super.configuration(),
+        return options(
+            baseConfiguration(),
+            clamdConfiguration(),
+            slingResourcePresence(),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", "/content/starter")
+                .asOption(),
             newConfiguration("org.apache.sling.clam.result.internal.ResourcePersistingScanResultHandler")
                 .put("result.status.ok.persist", true)
                 .put("result.root.path", "/var/clam/results")
-                .asOption()
+                .asOption(),
+            slingStarterContent()
         );
     }
 
     @Test
     public void testJcrPropertyScanResultHandler() {
-        assertNotNull(jcrPropertyScanResultHandler);
+        assertThat(jcrPropertyScanResultHandler).isNotNull();
+    }
+
+    @Test
+    public void testPersistedResults() throws Exception {
+        digBinaries(nodeDescendingJcrPropertyDigger, "/content/starter");
+        with().
+            pollInterval(10, SECONDS).
+            then().
+            await().
+            alias("counting results").
+            atMost(1, MINUTES).
+            until(() -> countResult() == 12);
+    }
+
+    protected QueryResult queryJcrResults(final Session session) throws RepositoryException {
+        final String query = "SELECT * FROM [nt:unstructured] AS result WHERE ISDESCENDANTNODE(result, \"/var/clam/results\") AND [sling:resourceType] = \"sling/clam/jcr/result\"";
+        return session.getWorkspace().getQueryManager().createQuery(query, Query.JCR_SQL2).execute();
+    }
+
+    private long countResult() throws RepositoryException {
+        Session session = null;
+        try {
+            session = session();
+            final QueryResult result = queryJcrResults(session);
+            return result.getNodes().getSize();
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
     }
 
 }


[sling-org-apache-sling-clam] 05/12: start Docker container on demand

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit aec04aba74bb1ab1e107cd6436a579c312864f83
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:10:06 2019 +0200

    start Docker container on demand
---
 .../java/org/apache/sling/clam/it/support/ClamContainerFactory.java | 6 ++++--
 src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java   | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
index fb259d2..26dab1a 100644
--- a/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
+++ b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
@@ -30,8 +30,10 @@ public class ClamContainerFactory {
         .withExposedPorts(3310)
         .withStartupTimeout(Duration.ofMinutes(3));
 
-    static {
-        container.start();
+    public static void startContainer() {
+        if (!container.isRunning()) {
+            container.start();
+        }
     }
 
 }
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
index bcc855f..c2bcfa5 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
@@ -100,6 +100,7 @@ public abstract class ClamTestSupport extends TestSupport {
         final String host;
         final Integer port;
         if (testcontainer) {
+            ClamContainerFactory.startContainer();
             host = ClamContainerFactory.container.getContainerIpAddress();
             port = ClamContainerFactory.container.getFirstMappedPort();
         } else {


[sling-org-apache-sling-clam] 07/12: readd default HTTP and AUTH properties

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit ee4c9e6e2a3e4edcb47c22ae1f551149aa25b45f
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Aug 16 18:18:16 2019 +0200

    readd default HTTP and AUTH properties
---
 pom.xml                                                             | 6 ++++++
 .../java/org/apache/sling/clam/http/internal/ClamEventsServlet.java | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/pom.xml b/pom.xml
index 57d8275..f2584bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -188,6 +188,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.auth.core</artifactId>
+      <version>1.2.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.event</artifactId>
       <version>4.2.10</version>
       <scope>provided</scope>
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
index 377ecd6..dd740b2 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamEventsServlet.java
@@ -38,6 +38,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.sling.auth.core.AuthConstants;
 import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
 import org.apache.sling.commons.clam.ScanResult;
 import org.jetbrains.annotations.NotNull;
@@ -61,6 +62,8 @@ import static org.apache.sling.clam.http.internal.ResponseUtil.json;
         Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
         HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(osgi.http.whiteboard.context.name=org.osgi.service.http)",
         HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED + "=true"
+        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN + "=/system/clam-events",
+        AuthConstants.AUTH_REQUIREMENTS + "=/system/clam-events"
     }
 )
 @Designate(


[sling-org-apache-sling-clam] 12/12: add sections for HTTP API, patterns and integration tests

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 88ea1752e45638799721852260d69acbfc155bf8
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sat Aug 17 09:41:44 2019 +0200

    add sections for HTTP API, patterns and integration tests
---
 README.md | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/README.md b/README.md
index 5d20fa9..84ed74c 100644
--- a/README.md
+++ b/README.md
@@ -30,3 +30,43 @@ The service requires read-only access to all paths to be scanned which can be al
 `EventPublishingScanResultHandler` publishes scan results via OSGi Event Admin Service.
 
 `ResourcePersistingScanResultHandler` persists scan results via ResourceResolver in JCR. The result handler requires write access to a configurable root path for subservice `result-writer`.
+
+
+## HTTP API
+
+Scanning all binaries and strings in AEM Assets:
+
+    curl -v -u username:password -F path=/content/dam -F pattern=^/.*$ -F propertyTypes[]=Binary -F propertyTypes[]=String http://localhost:4502/system/clam-jcr-scan
+
+Observing Sling Clam events:
+
+    curl -v -u username:password http://localhost:4502/system/clam-events
+
+
+## Useful Patterns
+
+    ^\/(?!.*\/rep:principalName)(.*)$
+
+
+## Integration Tests
+
+Integration tests require a running Clam daemon and are not enabled by default.
+
+
+### Use [Testcontainers](https://www.testcontainers.org/) and local [Docker](https://www.docker.com/) Engine
+
+Enable the `it` profile to run integration tests with Docker container:
+
+    mvn clean install -Pit
+
+
+### Use external Clam daemon
+
+To disable *Testcontainers* and use an external Clam daemon set `clamd.testcontainer` to `false`:
+
+    mvn clean install -Pit -Dclamd.testcontainer=false
+
+To override default Clam daemon host `localhost` and port `3310` set `clamd.host` and `clamd.port`:
+
+    mvn clean install -Pit -Dclamd.testcontainer=false -Dclamd.host=localhost -Dclamd.port=3310
+