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 2022/09/13 21:15:39 UTC

[sling-org-apache-sling-clam] branch master updated (f6d1982 -> 75ea1d8)

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 f6d1982  suppress warnings for rule java:S1989
     new 6854be6  SLING-9710 Provide a Mail Sending Scan Result Handler
     new 75ea1d8  SLING-11478 Update Testing PaxExam to 4.0.0

The 2 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:
 pom.xml                                            | 39 ++++++----------------
 .../MailSendingScanResultHandlerConfiguration.java |  4 +--
 .../sling/clam/it/tests/ClamEventsServletIT.java   |  4 +--
 .../sling/clam/it/tests/ClamJcrScanServletIT.java  |  8 +++--
 .../sling/clam/it/tests/ClamTestSupport.java       | 31 +++--------------
 .../it/tests/JcrPropertyScanJobConsumerIT.java     |  5 +--
 .../it/tests/MailSendingScanResultHandlerIT.java   | 26 +++++++++------
 .../ResourcePersistingScanResultHandlerIT.java     |  9 ++---
 8 files changed, 46 insertions(+), 80 deletions(-)


[sling-org-apache-sling-clam] 02/02: SLING-11478 Update Testing PaxExam to 4.0.0

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 75ea1d8e14f845f4f7c4643f5669ae158eabb153
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Tue Sep 13 23:15:19 2022 +0200

    SLING-11478 Update Testing PaxExam to 4.0.0
    
    * use Testing PaxExam 4.0.0-SNAPSHOT
    * update test dependencies
    * use Hamcrest's assertThat
---
 pom.xml                                            | 39 ++++++----------------
 .../sling/clam/it/tests/ClamEventsServletIT.java   |  4 +--
 .../sling/clam/it/tests/ClamJcrScanServletIT.java  |  8 +++--
 .../sling/clam/it/tests/ClamTestSupport.java       | 31 +++--------------
 .../it/tests/JcrPropertyScanJobConsumerIT.java     |  5 +--
 .../it/tests/MailSendingScanResultHandlerIT.java   | 26 +++++++++------
 .../ResourcePersistingScanResultHandlerIT.java     |  9 ++---
 7 files changed, 44 insertions(+), 78 deletions(-)

diff --git a/pom.xml b/pom.xml
index c1f3327..4f0fa39 100644
--- a/pom.xml
+++ b/pom.xml
@@ -246,7 +246,7 @@
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.framework</artifactId>
-      <version>7.0.3</version>
+      <version>7.0.5</version>
       <scope>test</scope>
     </dependency>
     <!-- Apache Jackrabbit -->
@@ -321,7 +321,7 @@
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.resource.presence</artifactId>
       <version>0.0.2</version>
-      <scope>provided</scope>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
@@ -360,6 +360,12 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicemix.bundles</groupId>
+      <artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
+      <scope>test</scope>
+      <version>1.3_1</version>
+    </dependency>
     <dependency>
       <groupId>io.rest-assured</groupId>
       <artifactId>rest-assured</artifactId>
@@ -369,13 +375,13 @@
     <dependency>
       <groupId>org.awaitility</groupId>
       <artifactId>awaitility</artifactId>
-      <version>4.2.0</version>
+      <version>3.1.6</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.testcontainers</groupId>
       <artifactId>testcontainers</artifactId>
-      <version>1.17.1</version>
+      <version>1.17.3</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -420,31 +426,6 @@
       <version>2.6.7</version>
       <scope>test</scope>
     </dependency>
-    <!-- testing – truth and dependencies -->
-    <dependency>
-      <groupId>com.google.truth</groupId>
-      <artifactId>truth</artifactId>
-      <version>1.1.3</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>31.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/ClamEventsServletIT.java b/src/test/java/org/apache/sling/clam/it/tests/ClamEventsServletIT.java
index b166078..e774ef6 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
@@ -61,7 +61,7 @@ import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfigurati
 public class ClamEventsServletIT extends ClamTestSupport {
 
     @Inject
-    @Filter(value = "(path=/content/starter)", timeout = 300000)
+    @Filter(value = "(path=/content/starter/img/sling-logo.svg)", timeout = 300000)
     private ResourcePresence resourcePresence;
 
     @Inject
@@ -80,7 +80,7 @@ public class ClamEventsServletIT extends ClamTestSupport {
             clamdConfiguration(),
             slingResourcePresence(),
             factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
-                .put("path", "/content/starter")
+                .put("path", "/content/starter/img/sling-logo.svg")
                 .asOption(),
             slingStarterContent(),
             // ok io/http/eventsource
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 99377fa..6811a51 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
@@ -38,6 +38,7 @@ 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.slingJcrJackrabbitUsermanager;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
 import static org.awaitility.Awaitility.with;
@@ -49,7 +50,7 @@ import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfigurati
 public class ClamJcrScanServletIT extends ClamTestSupport {
 
     @Inject
-    @Filter(value = "(path=/content/starter)", timeout = 300000)
+    @Filter(value = "(path=/content/starter/img/sling-logo.svg)", timeout = 300000)
     private ResourcePresence resourcePresence;
 
     private static final String URL_TEMPLATE = "http://localhost:%s/system/clam-jcr-scan";
@@ -61,9 +62,10 @@ public class ClamJcrScanServletIT extends ClamTestSupport {
             clamdConfiguration(),
             slingResourcePresence(),
             factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
-                .put("path", "/content/starter")
+                .put("path", "/content/starter/img/sling-logo.svg")
                 .asOption(),
-            slingStarterContent()
+            slingStarterContent(),
+            slingJcrJackrabbitUsermanager()
         );
     }
 
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 9bec34f..d3089e6 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
@@ -19,7 +19,6 @@
 package org.apache.sling.clam.it.tests;
 
 import java.util.Collections;
-import java.util.Objects;
 import java.util.regex.Pattern;
 
 import javax.inject.Inject;
@@ -33,26 +32,18 @@ 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.SlingOptions;
 import org.apache.sling.testing.paxexam.TestSupport;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.options.ModifiableCompositeOption;
-import org.ops4j.pax.exam.options.OptionalCompositeOption;
-import org.ops4j.pax.exam.options.extra.VMOption;
 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.slingCommonsClam;
 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.vmOption;
-import static org.ops4j.pax.exam.CoreOptions.when;
-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;
 
@@ -79,46 +70,32 @@ public abstract class ClamTestSupport extends TestSupport {
     static final String USER_PASSWORD = "foo";
 
     protected ModifiableCompositeOption baseConfiguration() {
-        SlingOptions.versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.commons.threads");
         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
             testBundle("bundle.filename"),
             factoryConfiguration("org.apache.sling.jcr.repoinit.RepositoryInitializer")
-                .put("scripts", new String[]{"create service user sling-clam\ncreate path (sling:Folder) /var/clam/results\nset ACL for sling-clam\nallow jcr:all on /var/clam\nend"})
+                .put("scripts", new String[]{"create service user sling-clam with path system/sling\ncreate path (sling:Folder) /var/clam/results(sling:OrderedFolder)\nset principal ACL for sling-clam\nallow jcr:read on /\nallow rep:write on /var/clam\nend"})
                 .asOption(),
             factoryConfiguration("org.apache.sling.jcr.repoinit.RepositoryInitializer")
                 .put("scripts", new String[]{"create user bob with password foo\ncreate group sling-clam-scan\nadd bob to group sling-clam-scan"})
                 .asOption(),
             factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended")
-                .put("user.mapping", new String[]{"org.apache.sling.clam=sling-clam", "org.apache.sling.clam:result-writer=sling-clam"})
+                .put("user.mapping", new String[]{"org.apache.sling.clam=[sling-clam]", "org.apache.sling.clam:result-writer=[sling-clam]"})
                 .asOption(),
             // Sling Commons Clam
-            mavenBundle().groupId(SLING_GROUP_ID).artifactId("org.apache.sling.commons.clam").versionAsInProject(),
+            slingCommonsClam(),
             // testing
             newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist")
                 .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*")
                 .asOption(),
-            junitBundles(),
             awaitility(),
             restassured(),
             testcontainers()
         );
     }
 
-    // remove with Testing PaxExam 4.0
-    protected OptionalCompositeOption jacoco() {
-        final String jacocoCommand = System.getProperty("jacoco.command");
-        final VMOption option = Objects.nonNull(jacocoCommand) && !jacocoCommand.trim().isEmpty() ? vmOption(jacocoCommand) : null;
-        return when(Objects.nonNull(option)).useOptions(option);
-    }
-
     protected Option quickstart() {
         final int httpPort = findFreePort();
         final String workingDirectory = workingDirectory();
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 9028683..381edbe 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,8 @@ 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 com.google.common.truth.Truth.assertThat;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
 import static org.ops4j.pax.exam.CoreOptions.options;
 
 @RunWith(PaxExam.class)
@@ -50,7 +51,7 @@ public class JcrPropertyScanJobConsumerIT extends ClamTestSupport {
 
     @Test
     public void testJobConsumer() {
-        assertThat(jobConsumer).isNotNull();
+        assertThat(jobConsumer, notNullValue());
     }
 
 }
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
index 72fcfcb..c28d162 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/MailSendingScanResultHandlerIT.java
@@ -44,12 +44,16 @@ import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 import org.ops4j.pax.exam.util.PathUtils;
 
-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.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
 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;
@@ -63,7 +67,7 @@ public class MailSendingScanResultHandlerIT extends ClamTestSupport {
     private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
 
     @Inject
-    @Filter(value = "(path=/content/starter)", timeout = 300000)
+    @Filter(value = "(path=/content/starter/img/sling-logo.svg)", timeout = 300000)
     private ResourcePresence resourcePresence;
 
     @Inject
@@ -80,7 +84,7 @@ public class MailSendingScanResultHandlerIT extends ClamTestSupport {
             clamdConfiguration(),
             slingResourcePresence(),
             factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
-                .put("path", "/content/starter")
+                .put("path", "/content/starter/img/sling-logo.svg")
                 .asOption(),
             newConfiguration("org.apache.sling.clam.result.internal.MailSendingScanResultHandler")
                 .put("mail.from", "from@example.org")
@@ -144,7 +148,7 @@ public class MailSendingScanResultHandlerIT extends ClamTestSupport {
 
     @Test
     public void testJcrPropertyScanResultHandler() {
-        assertThat(jcrPropertyScanResultHandler).isNotNull();
+        assertThat(jcrPropertyScanResultHandler, notNullValue());
     }
 
     @Test
@@ -152,16 +156,16 @@ public class MailSendingScanResultHandlerIT extends ClamTestSupport {
         digBinaries(nodeDescendingJcrPropertyDigger, "/content/starter");
         greenMail.waitForIncomingEmail(60000, 8);
         final MimeMessage[] messages = greenMail.getReceivedMessages();
-        assertThat(messages.length).isEqualTo(8);
+        assertThat(messages.length, is(8));
         for (final MimeMessage message : messages) {
-            assertThat(message.getSubject()).startsWith("Clam scan result: OK for /content/starter/");
+            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: ");
+            assertThat(text, containsString("status: OK"));
+            assertThat(text, containsString("message: "));
+            assertThat(text, containsString("path: /content/starter/"));
+            assertThat(text, containsString("started: "));
+            assertThat(text, containsString("timestamp: "));
         }
     }
 
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 d5769ca..d161532 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
@@ -36,12 +36,13 @@ 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 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.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
 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;
@@ -55,7 +56,7 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
     private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
 
     @Inject
-    @Filter(value = "(path=/content/starter)", timeout = 300000)
+    @Filter(value = "(path=/content/starter/img/sling-logo.svg)", timeout = 300000)
     private ResourcePresence resourcePresence;
 
     @Inject
@@ -68,7 +69,7 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
             clamdConfiguration(),
             slingResourcePresence(),
             factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
-                .put("path", "/content/starter")
+                .put("path", "/content/starter/img/sling-logo.svg")
                 .asOption(),
             newConfiguration("org.apache.sling.clam.result.internal.ResourcePersistingScanResultHandler")
                 .put("result.status.ok.persist", true)
@@ -80,7 +81,7 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
 
     @Test
     public void testJcrPropertyScanResultHandler() {
-        assertThat(jcrPropertyScanResultHandler).isNotNull();
+        assertThat(jcrPropertyScanResultHandler, notNullValue());
     }
 
     @Test


[sling-org-apache-sling-clam] 01/02: 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 6854be66df53f97a92a476dad368d40e52c672d5
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Tue Sep 13 21:56:45 2022 +0200

    SLING-9710 Provide a Mail Sending Scan Result Handler
    
    remove date instantiation to make template compatible with Thymeleaf 3.0.12 (see Thymeleaf #809 and #816)
---
 .../result/internal/MailSendingScanResultHandlerConfiguration.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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
index 483c46d..85ea6e4 100644
--- a/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java
+++ b/src/main/java/org/apache/sling/clam/result/internal/MailSendingScanResultHandlerConfiguration.java
@@ -77,8 +77,8 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition;
         + "[# 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";
+        + "started: [(${started})]\n"
+        + "timestamp: [(${timestamp})]\n";
 
     @AttributeDefinition(
         name = "Mail HTML",