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 2020/08/30 20:05:26 UTC

[sling-org-apache-sling-clam] branch master updated (965952c -> 0b913c1)

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 965952c  SLING-9699 Enable code coverage with JaCoCo
     new 7af8572  improve Truth setup
     new f421420  SLING-9709 Update to Sling Bundle Parent 39
     new 9670194  SLING-9710 Provide a Mail Sending Scan Result Handler
     new 4e91dc2  adjust result count (new Starter Content version from Testing PaxExam snapshot)
     new 9715060  style
     new f0fc849  SLING-9711 Make Resource Persisting Scan Result Handler a factory component
     new 0b913c1  add javadoc and missing ProviderType annotation

The 7 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:
 bnd.bnd                                            |  13 ++
 pom.xml                                            |  78 +++++++-
 .../clam/jcr/NodeDescendingJcrPropertyDigger.java  |  10 ++
 .../org/apache/sling/clam/jcr/package-info.java    |   2 +-
 .../internal/MailSendingScanResultHandler.java     | 196 +++++++++++++++++++++
 .../MailSendingScanResultHandlerConfiguration.java | 105 +++++++++++
 .../ResourcePersistingScanResultHandler.java       |   3 +-
 ...cePersistingScanResultHandlerConfiguration.java |   2 +
 .../sling/clam/it/tests/ClamEventsServletIT.java   |   8 +-
 .../sling/clam/it/tests/ClamJcrScanServletIT.java  |   2 +-
 .../sling/clam/it/tests/ClamTestSupport.java       |   6 +-
 .../it/tests/MailSendingScanResultHandlerIT.java   | 174 ++++++++++++++++++
 .../ResourcePersistingScanResultHandlerIT.java     |   2 +-
 src/test/resources/password                        |   1 +
 14 files changed, 585 insertions(+), 17 deletions(-)
 create mode 100644 src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandler.java
 create mode 100644 src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java
 create mode 100644 src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java
 create mode 100644 src/test/resources/password


[sling-org-apache-sling-clam] 01/07: improve Truth setup

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 7af85726d01c86053dc26ff3f773fb71dbc3f318
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Thu Aug 27 20:13:58 2020 +0200

    improve Truth setup
---
 pom.xml                                            | 31 +++++++++++++++++-----
 .../sling/clam/it/tests/ClamTestSupport.java       |  6 ++++-
 2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/pom.xml b/pom.xml
index be9ad83..a09dd58 100644
--- a/pom.xml
+++ b/pom.xml
@@ -300,12 +300,6 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>com.google.truth</groupId>
-      <artifactId>truth</artifactId>
-      <version>1.0.1</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.testcontainers</groupId>
       <artifactId>testcontainers</artifactId>
       <version>1.13.0</version>
@@ -347,6 +341,31 @@
       <version>2.6.2</version>
       <scope>test</scope>
     </dependency>
+    <!-- testing – truth and dependencies -->
+    <dependency>
+      <groupId>com.google.truth</groupId>
+      <artifactId>truth</artifactId>
+      <version>1.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>28.1-jre</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>failureaccess</artifactId>
+      <version>1.0.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.googlecode.java-diff-utils</groupId>
+      <artifactId>diffutils</artifactId>
+      <version>1.3.0</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
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 bcd903e..3ca1ce9 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
@@ -71,6 +71,11 @@ public abstract class ClamTestSupport extends TestSupport {
 
     protected ModifiableCompositeOption baseConfiguration() {
         return composite(
+            // Truth first to prevent version issues with Guava
+            wrappedBundle(mavenBundle().groupId("com.google.truth").artifactId("truth").versionAsInProject()),
+            mavenBundle().groupId("com.google.guava").artifactId("guava").versionAsInProject(),
+            mavenBundle().groupId("com.google.guava").artifactId("failureaccess").versionAsInProject(),
+            mavenBundle().groupId("com.googlecode.java-diff-utils").artifactId("diffutils").versionAsInProject(),
             super.baseConfiguration(),
             quickstart(),
             // Sling Clam
@@ -91,7 +96,6 @@ public abstract class ClamTestSupport extends TestSupport {
             awaitility(),
             restassured(),
             testcontainers(),
-            wrappedBundle(mavenBundle().groupId("com.google.truth").artifactId("truth").versionAsInProject()),
             vmOption(System.getProperty("jacoco.command"))
         );
     }


[sling-org-apache-sling-clam] 04/07: adjust result count (new Starter Content version from Testing PaxExam snapshot)

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 4e91dc235dfca5a3b8462ef8057ec69644f756f3
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 21:54:09 2020 +0200

    adjust result count (new Starter Content version from Testing PaxExam snapshot)
---
 src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java   | 2 +-
 src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java  | 2 +-
 .../sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

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
index fafc82f..230477e 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
@@ -134,7 +134,7 @@ public class ClamEventsServletIT extends ClamTestSupport {
             await().
             alias("counting results").
             atMost(1, MINUTES).
-            until(() -> recordingEventHandler.countEvents() == 12);
+            until(() -> recordingEventHandler.countEvents() == 8);
     }
 
     class BasicAuthInterceptor implements Interceptor {
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
index 1a27e50..38f3942 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
@@ -97,7 +97,7 @@ public class ClamJcrScanServletIT extends ClamTestSupport {
             .await()
             .alias("counting results")
             .atMost(1, MINUTES)
-            .until(() -> scanResultHandler.getResults().size() == 12);
+            .until(() -> scanResultHandler.getResults().size() == 8);
     }
 
 }
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 37135a9..5ea8e35 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
@@ -92,7 +92,7 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
             await().
             alias("counting results").
             atMost(1, MINUTES).
-            until(() -> countResult() == 12);
+            until(() -> countResult() == 8);
     }
 
     protected QueryResult queryJcrResults(final Session session) throws RepositoryException {


[sling-org-apache-sling-clam] 02/07: SLING-9709 Update to Sling Bundle Parent 39

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 f421420282f32a263765d3c6fa52b0d32649cc25
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 21:46:59 2020 +0200

    SLING-9709 Update to Sling Bundle Parent 39
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index a09dd58..52c552a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.sling</groupId>
     <artifactId>sling-bundle-parent</artifactId>
-    <version>38</version>
+    <version>39</version>
     <relativePath />
   </parent>
 


[sling-org-apache-sling-clam] 03/07: SLING-9710 Provide a Mail Sending Scan Result Handler

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 96701940c35f6a4270ee3b6119f72a04155ed132
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 21:52:07 2020 +0200

    SLING-9710 Provide a Mail Sending Scan Result Handler
---
 bnd.bnd                                            |  13 ++
 pom.xml                                            |  45 ++++-
 .../internal/MailSendingScanResultHandler.java     | 196 +++++++++++++++++++++
 .../MailSendingScanResultHandlerConfiguration.java | 105 +++++++++++
 .../it/tests/MailSendingScanResultHandlerIT.java   | 174 ++++++++++++++++++
 src/test/resources/password                        |   1 +
 6 files changed, 533 insertions(+), 1 deletion(-)

diff --git a/bnd.bnd b/bnd.bnd
index e36a0d6..aecb1cd 100644
--- a/bnd.bnd
+++ b/bnd.bnd
@@ -1,3 +1,16 @@
+DynamicImport-Package:\
+  javax.mail.*,\
+  org.apache.commons.lang3.*,\
+  org.apache.sling.commons.messaging.*,\
+  org.thymeleaf.*
+
+Import-Package:\
+  javax.mail.*;resolution:=optional,\
+  org.apache.commons.lang3.*;resolution:=optional,\
+  org.apache.sling.commons.messaging.*;resolution:=optional,\
+  org.thymeleaf.*;resolution:=optional,\
+  *
+
 -removeheaders:\
   Include-Resource,\
   Private-Package
diff --git a/pom.xml b/pom.xml
index 52c552a..eb13797 100644
--- a/pom.xml
+++ b/pom.xml
@@ -136,6 +136,12 @@
       <artifactId>javax.servlet-api</artifactId>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>jakarta.mail</groupId>
+      <artifactId>jakarta.mail-api</artifactId>
+      <version>1.6.5</version>
+      <scope>provided</scope>
+    </dependency>
     <!-- ok io/http -->
     <dependency>
       <groupId>org.apache.servicemix.bundles</groupId>
@@ -188,6 +194,18 @@
       <version>2.5</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-email</artifactId>
+      <version>1.5</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.9</version>
+      <scope>provided</scope>
+    </dependency>
     <!-- Apache Felix -->
     <dependency>
       <groupId>org.apache.felix</groupId>
@@ -241,6 +259,18 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.messaging</artifactId>
+      <version>1.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.messaging.mail</artifactId>
+      <version>1.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.commons.threads</artifactId>
       <version>3.2.18</version>
       <scope>provided</scope>
@@ -266,9 +296,16 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.paxexam</artifactId>
-      <version>3.1.0</version>
+      <version>3.1.1-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
+    <!-- Thymeleaf -->
+    <dependency>
+      <groupId>org.thymeleaf</groupId>
+      <artifactId>thymeleaf</artifactId>
+      <version>3.0.11.RELEASE</version>
+      <scope>provided</scope>
+    </dependency>
     <!-- nullability -->
     <dependency>
       <groupId>org.jetbrains</groupId>
@@ -306,6 +343,12 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>com.icegreen</groupId>
+      <artifactId>greenmail</artifactId>
+      <version>1.5.11</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.ops4j.pax.exam</groupId>
       <artifactId>pax-exam</artifactId>
       <version>${org.ops4j.pax.exam.version}</version>
diff --git a/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandler.java b/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandler.java
new file mode 100644
index 0000000..e9070cb
--- /dev/null
+++ b/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandler.java
@@ -0,0 +1,196 @@
+/*
+ * 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.result.internal;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.commons.clam.ScanResult;
+import org.apache.sling.commons.messaging.mail.MailService;
+import org.apache.sling.commons.messaging.mail.MessageBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.thymeleaf.ITemplateEngine;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.TemplateSpec;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.context.IContext;
+import org.thymeleaf.templatemode.TemplateMode;
+
+import static org.apache.sling.clam.internal.ClamUtil.properties;
+
+@Component(
+    configurationPolicy = ConfigurationPolicy.REQUIRE,
+    property = {
+        Constants.SERVICE_DESCRIPTION + "=Apache Sling Clam Mail Sending Scan Result Handler",
+        Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
+    }
+)
+@Designate(
+    ocd = MailSendingScanResultHandlerConfiguration.class,
+    factory = true
+)
+public class MailSendingScanResultHandler implements JcrPropertyScanResultHandler {
+
+    @Reference(
+        policy = ReferencePolicy.DYNAMIC,
+        policyOption = ReferencePolicyOption.GREEDY
+    )
+    private volatile MailService mailService;
+
+    private MailSendingScanResultHandlerConfiguration configuration;
+
+    private final ITemplateEngine templateEngine = new TemplateEngine();
+
+    private final Logger logger = LoggerFactory.getLogger(MailSendingScanResultHandler.class);
+
+    public MailSendingScanResultHandler() {
+    }
+
+    @Activate
+    private void activate(final MailSendingScanResultHandlerConfiguration configuration) {
+        logger.debug("activating");
+        this.configuration = configuration;
+    }
+
+    @Modified
+    private void modified(final MailSendingScanResultHandlerConfiguration configuration) {
+        logger.debug("modifying");
+        this.configuration = configuration;
+    }
+
+    @Deactivate
+    private void deactivate() {
+        logger.debug("deactivating");
+        this.configuration = null;
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int propertyType, @Nullable String userId) {
+        if (checkPublish(scanResult)) {
+            final Map<String, Object> properties = properties(path, userId, scanResult);
+            try {
+                sendMail(properties);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int index, int propertyType, @Nullable String userId) {
+        if (checkPublish(scanResult)) {
+            final Map<String, Object> properties = properties(path, index, userId, scanResult);
+            try {
+                sendMail(properties);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private boolean checkPublish(final ScanResult scanResult) {
+        return !scanResult.isOk() || configuration.result_status_ok_send();
+    }
+
+    private void sendMail(final Map<String, Object> properties) throws Exception {
+        final MailService mailService = this.mailService;
+        final MessageBuilder builder = mailService.getMessageBuilder();
+
+        final String from = configuration.mail_from();
+        final String[] to = configuration.mail_to();
+        final String[] cc = configuration.mail_cc();
+        final String[] bcc = configuration.mail_bcc();
+        final String[] replyTo = configuration.mail_replyTo();
+        final String subject = configuration.mail_subject();
+        final String text = configuration.mail_text();
+        final String html = configuration.mail_html();
+
+        if (StringUtils.isNotBlank(from)) {
+            builder.from(from);
+        }
+        for (final String address : to) {
+            if (StringUtils.isNotBlank(address)) {
+                builder.to(address);
+            }
+        }
+        for (final String address : cc) {
+            if (StringUtils.isNotBlank(address)) {
+                builder.cc(address);
+            }
+        }
+        for (final String address : bcc) {
+            if (StringUtils.isNotBlank(address)) {
+                builder.bcc(address);
+            }
+        }
+        for (final String address : replyTo) {
+            if (StringUtils.isNotBlank(address)) {
+                builder.replyTo(address);
+            }
+        }
+        if (StringUtils.isNotBlank(subject)) {
+            final IContext context = new Context(Locale.ENGLISH, properties);
+            final TemplateSpec templateSpec = new TemplateSpec(subject, TemplateMode.TEXT);
+            final String s = templateEngine.process(templateSpec, context);
+            builder.subject(s);
+        }
+        if (StringUtils.isNotBlank(text)) {
+            final IContext context = new Context(Locale.ENGLISH, properties);
+            final TemplateSpec templateSpec = new TemplateSpec(text, TemplateMode.TEXT);
+            final String t = templateEngine.process(templateSpec, context);
+            builder.text(t);
+        }
+        if (StringUtils.isNotBlank(html)) {
+            final IContext context = new Context(Locale.ENGLISH, properties);
+            final TemplateSpec templateSpec = new TemplateSpec(html, TemplateMode.HTML);
+            final String h = templateEngine.process(templateSpec, context);
+            builder.html(h);
+        }
+        final MimeMessage message = builder.build();
+        logger.debug("sending scan result mail: {}", properties);
+        final CompletableFuture<Void> future = mailService.sendMessage(message);
+        future.whenComplete((v, e) -> {
+            if (Objects.nonNull(e)) {
+                logger.error("sending scan result mail failed", e);
+            } else {
+                logger.debug("sending scan result mail succeeded");
+            }
+        });
+    }
+
+}
diff --git a/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java b/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java
new file mode 100644
index 0000000..f319285
--- /dev/null
+++ b/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java
@@ -0,0 +1,105 @@
+/*
+ * 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.result.internal;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(
+    name = "Apache Sling Clam Mail Sending Scan Result Handler",
+    description = "Sends JCR property scan results via mail"
+)
+@SuppressWarnings("java:S100")
+@interface MailSendingScanResultHandlerConfiguration {
+
+    @AttributeDefinition(
+        name = "Mail From",
+        description = "Mail From address",
+        required = false
+    )
+    String mail_from();
+
+    @AttributeDefinition(
+        name = "Mail To",
+        description = "Mail To addresses"
+    )
+    String[] mail_to() default {};
+
+    @AttributeDefinition(
+        name = "Mail CC",
+        description = "Mail CC addresses"
+    )
+    String[] mail_cc() default {};
+
+    @AttributeDefinition(
+        name = "Mail BCC",
+        description = "Mail BCC addresses"
+    )
+    String[] mail_bcc() default {};
+
+    @AttributeDefinition(
+        name = "Mail Reply-To",
+        description = "Mail Reply-To addresses"
+    )
+    String[] mail_replyTo() default {};
+
+    @AttributeDefinition(
+        name = "Mail Subject",
+        description = "Mail Subject template (available variables: path, index, message, status, userId, started, size, timestamp)",
+        required = false
+    )
+    String mail_subject() default "Clam scan result: [(${status})] for [(${path})][# th:if=\"${index}\"] [(${index})][/]";
+
+    @AttributeDefinition(
+        name = "Mail Text",
+        description = "Mail Text template (available variables: path, index, message, status, userId, started, size, timestamp)",
+        required = false
+    ) // newlines get lost in scr and metatype XML
+    String mail_text() default "status: [(${status})]\n" +
+        "message: [(${message})]\n" +
+        "path: [(${path})]\n" +
+        "[# th:if=\"${index}\"]index: [(${index})][/]\n" +
+        "size: [(${size})]\n" +
+        "[# th:if=\"${userId}\"]userId: [(${userId})][/]\n" +
+        "started: [(${#dates.formatISO(new java.util.Date(started))})]\n" +
+        "timestamp: [(${#dates.formatISO(new java.util.Date(timestamp))})]\n";
+
+    @AttributeDefinition(
+        name = "Mail HTML",
+        description = "Mail HTML template (available variables: path, index, message, status, userId, started, size, timestamp)",
+        required = false
+    )
+    String mail_html();
+
+    @AttributeDefinition(
+        name = "send status ok",
+        description = "Send scan results with status OK also"
+    )
+    boolean result_status_ok_send() default false;
+
+    @AttributeDefinition(
+        name = "Mail Service target",
+        description = "Filter expression to target a Mail Service",
+        required = false
+    )
+    String mailService_target();
+
+    String webconsole_configurationFactory_nameHint() default "{mail.to}:{result.status.ok.send}:{mail.subject}";
+
+}
diff --git a/src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java b/src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java
new file mode 100644
index 0000000..8111932
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java
@@ -0,0 +1,174 @@
+/*
+ * 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.security.Security;
+import java.util.Objects;
+
+import javax.inject.Inject;
+import javax.mail.internet.MimeMessage;
+
+import com.icegreen.greenmail.util.DummySSLSocketFactory;
+import com.icegreen.greenmail.util.GreenMail;
+import com.icegreen.greenmail.util.ServerSetup;
+import org.apache.commons.mail.util.MimeMessageParser;
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.resource.presence.ResourcePresence;
+import org.junit.After;
+import org.junit.Before;
+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 org.ops4j.pax.exam.util.PathUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.apache.sling.testing.paxexam.SlingOptions.greenmail;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingCommonsMessagingMail;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
+import static org.apache.sling.testing.paxexam.SlingOptions.thymeleaf;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+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)
+@ExamReactorStrategy(PerClass.class)
+public class MailSendingScanResultHandlerIT extends ClamTestSupport {
+
+    @Inject
+    @Filter("(service.pid=org.apache.sling.clam.result.internal.MailSendingScanResultHandler)")
+    private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
+
+    @Inject
+    @Filter(value = "(path=/content/starter)", timeout = 300000)
+    private ResourcePresence resourcePresence;
+
+    @Inject
+    private NodeDescendingJcrPropertyDigger nodeDescendingJcrPropertyDigger;
+
+    private GreenMail greenMail;
+
+    private final Logger logger = LoggerFactory.getLogger(MailSendingScanResultHandlerIT.class);
+
+    @Configuration
+    public Option[] configuration() {
+        final int port = findFreePort();
+        final String path = String.format("%s/src/test/resources/password", PathUtils.getBaseDir());
+        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.MailSendingScanResultHandler")
+                .put("mail.from", "from@example.org")
+                .put("mail.to", "to@example.org")
+                .put("mail.cc", "cc@example.org")
+                .put("mail.bcc", "bcc@example.org")
+                .put("mail.replyTo", "reply-to@example.org")
+                .put("result.status.ok.send", true)
+                .asOption(),
+            slingStarterContent(),
+            // Commons Messaging Mail
+            factoryConfiguration("org.apache.sling.commons.messaging.mail.internal.SimpleMessageIdProvider")
+                .put("host", "localhost")
+                .asOption(),
+            factoryConfiguration("org.apache.sling.commons.messaging.mail.internal.SimpleMailService")
+                .put("mail.smtps.from", "envelope-from@example.org")
+                .put("mail.smtps.host", "localhost")
+                .put("mail.smtps.port", port)
+                .put("username", "username")
+                .put("password", "OEKPFL5cVJRqVjh4QaDZhvBiqv8wgWBMJ8PGbYHTqev046oV6888mna9w1mIGCXK")
+                .asOption(),
+            slingCommonsMessagingMail(),
+            // Commons Crypto
+            factoryConfiguration("org.apache.sling.commons.crypto.jasypt.internal.JasyptStandardPBEStringCryptoService")
+                .put("algorithm", "PBEWITHHMACSHA512ANDAES_256")
+                .asOption(),
+            factoryConfiguration("org.apache.sling.commons.crypto.jasypt.internal.JasyptRandomIvGeneratorRegistrar")
+                .put("algorithm", "SHA1PRNG")
+                .asOption(),
+            factoryConfiguration("org.apache.sling.commons.crypto.internal.FilePasswordProvider")
+                .put("path", path)
+                .asOption(),
+            // Thymeleaf
+            thymeleaf(),
+            // testing – mail
+            greenmail(),
+            mavenBundle().groupId("org.apache.commons").artifactId("commons-email").versionAsInProject()
+        );
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        if (Objects.isNull(greenMail)) {
+            // set up GreenMail server
+            Security.setProperty("ssl.SocketFactory.provider", DummySSLSocketFactory.class.getName());
+            final org.osgi.service.cm.Configuration[] configurations = configurationAdmin.listConfigurations("(service.factoryPid=org.apache.sling.commons.messaging.mail.internal.SimpleMailService)");
+            final org.osgi.service.cm.Configuration configuration = configurations[0];
+            final int port = (int) configuration.getProperties().get("mail.smtps.port");
+            final ServerSetup serverSetup = new ServerSetup(port, "127.0.0.1", "smtps");
+            greenMail = new GreenMail(serverSetup);
+            greenMail.setUser("username", "password");
+            greenMail.start();
+        }
+    }
+
+    @After
+    public void tearDown() {
+        if (Objects.nonNull(greenMail)) {
+            greenMail.stop();
+            greenMail = null;
+        }
+    }
+
+    @Test
+    public void testJcrPropertyScanResultHandler() {
+        assertThat(jcrPropertyScanResultHandler).isNotNull();
+    }
+
+    @Test
+    public void testSentResults() throws Exception {
+        digBinaries(nodeDescendingJcrPropertyDigger, "/content/starter");
+        greenMail.waitForIncomingEmail(360000, 24);
+        final MimeMessage[] messages = greenMail.getReceivedMessages();
+        assertThat(messages.length).isEqualTo(24);
+        for (final MimeMessage message : messages) {
+            assertThat(message.getSubject()).startsWith("Clam scan result: OK for /content/starter/");
+            final MimeMessageParser parser = new MimeMessageParser(message).parse();
+            final String text = parser.getPlainContent();
+            assertThat(text).contains("status: OK");
+            assertThat(text).contains("message: ");
+            assertThat(text).contains("path: /content/starter/");
+            assertThat(text).contains("started: ");
+            assertThat(text).contains("timestamp: ");
+        }
+    }
+
+}
diff --git a/src/test/resources/password b/src/test/resources/password
new file mode 100644
index 0000000..ad66ce8
--- /dev/null
+++ b/src/test/resources/password
@@ -0,0 +1 @@
++AQ?aDes!'DBMkrCi:FE6q\sOn=Pbmn=PK8n=PK?
\ No newline at end of file


[sling-org-apache-sling-clam] 06/07: SLING-9711 Make Resource Persisting Scan Result Handler a factory component

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 f0fc8491063317247e893214a0152cf2f34c84a3
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 22:01:50 2020 +0200

    SLING-9711 Make Resource Persisting Scan Result Handler a factory component
---
 .../clam/result/internal/ResourcePersistingScanResultHandler.java      | 3 ++-
 .../internal/ResourcePersistingScanResultHandlerConfiguration.java     | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandler.java b/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandler.java
index 40b06d8..30e2db0 100644
--- a/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandler.java
+++ b/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandler.java
@@ -64,7 +64,8 @@ import static org.apache.sling.clam.internal.ClamUtil.properties;
     }
 )
 @Designate(
-    ocd = ResourcePersistingScanResultHandlerConfiguration.class
+    ocd = ResourcePersistingScanResultHandlerConfiguration.class,
+    factory = true
 )
 public class ResourcePersistingScanResultHandler implements JcrPropertyScanResultHandler {
 
diff --git a/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandlerConfiguration.java b/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandlerConfiguration.java
index e095e8a..eedb2b9 100644
--- a/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandlerConfiguration.java
+++ b/src/main/java/org/apache/sling/clam/result/internal/ResourcePersistingScanResultHandlerConfiguration.java
@@ -40,4 +40,6 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
     )
     String result_root_path() default "/var/clam/results";
 
+    String webconsole_configurationFactory_nameHint() default "{result.status.ok.persist}:{result.root.path}";
+
 }


[sling-org-apache-sling-clam] 07/07: add javadoc and missing ProviderType annotation

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 0b913c11aedeff7820cc4c8df2b57a0420a1344a
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 22:04:54 2020 +0200

    add javadoc and missing ProviderType annotation
---
 .../apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java | 10 ++++++++++
 src/main/java/org/apache/sling/clam/jcr/package-info.java      |  2 +-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java b/src/main/java/org/apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java
index f9174d9..472bcb8 100644
--- a/src/main/java/org/apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java
+++ b/src/main/java/org/apache/sling/clam/jcr/NodeDescendingJcrPropertyDigger.java
@@ -24,9 +24,19 @@ import java.util.regex.Pattern;
 import javax.jcr.Node;
 
 import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
 
+@ProviderType
 public interface NodeDescendingJcrPropertyDigger {
 
+    /**
+     * @param node          The entry node for digging
+     * @param pattern       The pattern a property path has to match
+     * @param propertyTypes The property types to take into account
+     * @param maxLength     The maximum length of a property value
+     * @param maxDepth      The maximum depth from entry node for digging
+     * @throws Exception if digging in JCR fails
+     */
     void dig(@NotNull final Node node, @NotNull final Pattern pattern, @NotNull final Set<Integer> propertyTypes, final long maxLength, final int maxDepth) throws Exception;
 
 }
diff --git a/src/main/java/org/apache/sling/clam/jcr/package-info.java b/src/main/java/org/apache/sling/clam/jcr/package-info.java
index b8dcc8b..9806d85 100644
--- a/src/main/java/org/apache/sling/clam/jcr/package-info.java
+++ b/src/main/java/org/apache/sling/clam/jcr/package-info.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-@Version("1.0.0")
+@Version("1.0.1")
 package org.apache.sling.clam.jcr;
 
 import org.osgi.annotation.versioning.Version;


[sling-org-apache-sling-clam] 05/07: 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 97150604d0e49131d8e977091bffd9243e28a9f9
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Aug 30 21:54:35 2020 +0200

    style
---
 .../java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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
index 230477e..b166078 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
@@ -137,9 +137,9 @@ public class ClamEventsServletIT extends ClamTestSupport {
             until(() -> recordingEventHandler.countEvents() == 8);
     }
 
-    class BasicAuthInterceptor implements Interceptor {
+    static class BasicAuthInterceptor implements Interceptor {
 
-        private String credentials;
+        private final String credentials;
 
         BasicAuthInterceptor(final String user, final String password) {
             this.credentials = Credentials.basic(user, password);
@@ -156,7 +156,7 @@ public class ClamEventsServletIT extends ClamTestSupport {
 
     }
 
-    class RecordingEventHandler implements EventHandler {
+    static class RecordingEventHandler implements EventHandler {
 
         private final List<String> events = new ArrayList<>();