SLING-10200 - Provide the importer errors as queue properties (#48)

diff --git a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueItemStatus.java b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueItemStatus.java
index 95cb786..7cb06d6 100644
--- a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueItemStatus.java
+++ b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueItemStatus.java
@@ -35,11 +35,18 @@
 
     private final String queueName;
 
-    public DistributionQueueItemStatus(Calendar entered, DistributionQueueItemState state, int attempts, String queueName) {
+    private final Throwable error;
+
+    public DistributionQueueItemStatus(Calendar entered, DistributionQueueItemState state, int attempts, String queueName, Throwable error) {
         this.entered = entered;
         this.state = state;
         this.attempts = attempts;
         this.queueName = queueName;
+        this.error = error;
+    }
+
+    public DistributionQueueItemStatus(Calendar entered, DistributionQueueItemState state, int attempts, String queueName) {
+        this(entered, state, attempts, queueName, null);
     }
 
     public DistributionQueueItemStatus(DistributionQueueItemState state, String queueName) {
@@ -58,10 +65,15 @@
         return queueName;
     }
 
+    public Throwable getError() {
+        return error;
+    }
+
     @Override
     public String toString() {
         return "{\"attempts\":\"" + attempts + "\",\"" + "\",\"" + "state\":\"" + state +
-                "\",\"" + "queueName\":\"" + queueName + "\"}";
+                "\",\"" + "queueName\":\"" + queueName +
+                "\",\"" + "error\":\"" + error + "\"}";
     }
 
     public Calendar getEntered() {
diff --git a/src/main/java/org/apache/sling/distribution/queue/package-info.java b/src/main/java/org/apache/sling/distribution/queue/package-info.java
index 70795e9..6f003ea 100644
--- a/src/main/java/org/apache/sling/distribution/queue/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/queue/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("0.1.0")
+@Version("0.2.0")
 package org.apache.sling.distribution.queue;
 
 import aQute.bnd.annotation.Version;
diff --git a/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java b/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java
index 2733d90..d905a1c 100644
--- a/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java
+++ b/src/main/java/org/apache/sling/distribution/resources/impl/ExtendedDistributionServiceResourceProvider.java
@@ -19,6 +19,8 @@
 
 package org.apache.sling.distribution.resources.impl;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -209,7 +211,13 @@
             result.put("attempts", status.getAttempts());
             result.put("time", status.getEntered().getTime());
             result.put("state", status.getItemState().name());
-
+            Throwable error = status.getError();
+            if (error != null) {
+                StringWriter trace = new StringWriter();
+                error.printStackTrace(new PrintWriter(trace));
+                result.put("errorTrace", trace.toString());
+                result.put("errorMessage", error.getMessage());
+            }
         }
 
         return result;
diff --git a/src/test/java/org/apache/sling/distribution/queue/DistributionQueueItemStatusTest.java b/src/test/java/org/apache/sling/distribution/queue/DistributionQueueItemStatusTest.java
new file mode 100644
index 0000000..2ad28cb
--- /dev/null
+++ b/src/test/java/org/apache/sling/distribution/queue/DistributionQueueItemStatusTest.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.distribution.queue;
+
+import java.util.Calendar;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+
+public class DistributionQueueItemStatusTest {
+
+    @Test
+    public void getNoErrorByDefault() {
+        DistributionQueueItemStatus status = new DistributionQueueItemStatus(any(Calendar.class),
+                any(DistributionQueueItemState.class), anyInt(), anyString());
+        assertNull(status.getError());
+    }
+
+    @Test
+    public void getErrorByDefault() {
+        Throwable cause = mock(Throwable.class);
+        DistributionQueueItemStatus status = new DistributionQueueItemStatus(any(Calendar.class),
+                any(DistributionQueueItemState.class), anyInt(), anyString(), cause);
+        assertNotNull(status.getError());
+        assertEquals(cause, status.getError());
+    }
+}
\ No newline at end of file