Author: cziegeler
Date: Mon May  6 15:43:55 2013
New Revision: 1479608

URL: http://svn.apache.org/r1479608
Log:
SLING-2829 : Provide better error message if a job/event/timed job can't be 
read from the repository

Modified:
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventSender.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobImpl.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/timed/TimedEventSender.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/ResourceHelper.java

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventSender.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventSender.java?rev=1479608&r1=1479607&r2=1479608&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventSender.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/dea/DistributedEventSender.java
 Mon May  6 15:43:55 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.event.impl.dea;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -118,7 +119,9 @@ public class DistributedEventSender
             final String topic = vm.get(EventConstants.EVENT_TOPIC, 
String.class);
             final Map<String, Object> properties = 
ResourceHelper.cloneValueMap(vm);
             // only send event if there are no read errors, otherwise discard 
it
-            if ( properties.get(ResourceHelper.PROPERTY_MARKER_READ_ERROR) == 
null ) {
+            @SuppressWarnings("unchecked")
+            final List<Exception> readErrorList = (List<Exception>) 
properties.remove(ResourceHelper.PROPERTY_MARKER_READ_ERROR_LIST);
+            if ( readErrorList == null ) {
                 properties.remove(EventConstants.EVENT_TOPIC);
 
                 try {
@@ -137,6 +140,10 @@ public class DistributedEventSender
                     // but you never know)
                     logger.error("Unable to read event: " + iae.getMessage(), 
iae);
                 }
+            } else {
+                for(final Exception e : readErrorList) {
+                    logger.warn("Unable to read distributed event from " + 
eventResource.getPath(), e);
+                }
             }
         } catch (final InstantiationException ie) {
             // something happened with the resource in the meanitime

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobImpl.java?rev=1479608&r1=1479607&r2=1479608&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobImpl.java
 Mon May  6 15:43:55 2013
@@ -19,6 +19,7 @@
 package org.apache.sling.event.impl.jobs;
 
 import java.util.Calendar;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -52,7 +53,7 @@ public class JobImpl implements Job {
 
     private final boolean isBridgedEvent;
 
-    private final boolean hasReadError;
+    private final List<Exception> readErrorList;
 
     /**
      * Create a new job instance
@@ -62,6 +63,7 @@ public class JobImpl implements Job {
      * @param jobId The unique (internal) job id
      * @param properties Non-null map of properties, at least containing 
{@link #PROPERTY_RESOURCE_PATH}
      */
+    @SuppressWarnings("unchecked")
     public JobImpl(final String topic,
                    final String name,
                    final String jobId,
@@ -71,7 +73,7 @@ public class JobImpl implements Job {
         this.jobId = jobId;
         this.path = (String)properties.remove(PROPERTY_RESOURCE_PATH);
         this.isBridgedEvent = properties.remove(PROPERTY_BRIDGED_EVENT) != 
null;
-        this.hasReadError = 
properties.remove(ResourceHelper.PROPERTY_MARKER_READ_ERROR) != null;
+        this.readErrorList = (List<Exception>) 
properties.remove(ResourceHelper.PROPERTY_MARKER_READ_ERROR_LIST);
 
         this.properties = new ValueMapDecorator(properties);
     }
@@ -94,7 +96,7 @@ public class JobImpl implements Job {
      * Did we have read errors?
      */
     public boolean hasReadErrors() {
-        return this.hasReadError;
+        return this.readErrorList != null;
     }
 
     /**

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java?rev=1479608&r1=1479607&r2=1479608&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
 Mon May  6 15:43:55 2013
@@ -497,6 +497,13 @@ public class JobManagerImpl
                     jobProperties.put(Job.PROPERTY_JOB_RETRY_COUNT, 
vm.get(Job.PROPERTY_JOB_RETRY_COUNT, Integer.class));
                     jobProperties.put(Job.PROPERTY_JOB_PRIORITY, 
JobPriority.valueOf(vm.get(Job.PROPERTY_JOB_PRIORITY, 
JobPriority.NORM.name())));
 
+                    @SuppressWarnings("unchecked")
+                    final List<Exception> readErrorList = (List<Exception>) 
jobProperties.get(ResourceHelper.PROPERTY_MARKER_READ_ERROR_LIST);
+                    if ( readErrorList != null ) {
+                        for(final Exception e : readErrorList) {
+                            logger.warn("Unable to read job from " + 
resource.getPath(), e);
+                        }
+                    }
                     job = new JobImpl(topic,
                             
(String)jobProperties.get(JobUtil.PROPERTY_JOB_NAME),
                             (String)jobProperties.get(JobUtil.JOB_ID),

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/timed/TimedEventSender.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/timed/TimedEventSender.java?rev=1479608&r1=1479607&r2=1479608&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/timed/TimedEventSender.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/timed/TimedEventSender.java
 Mon May  6 15:43:55 2013
@@ -542,7 +542,14 @@ public class TimedEventSender
                     result.hasReadErrors = true;
                     return result;
                 }
-                result.hasReadErrors = 
properties.remove(ResourceHelper.PROPERTY_MARKER_READ_ERROR) != null;
+                @SuppressWarnings("unchecked")
+                final List<Exception> readErrorList = (List<Exception>) 
properties.remove(ResourceHelper.PROPERTY_MARKER_READ_ERROR_LIST);
+                result.hasReadErrors = readErrorList != null;
+                if ( readErrorList != null ) {
+                    for(final Exception e : readErrorList) {
+                        logger.warn("Unable to read timed event job from " + 
eventResource.getPath(), e);
+                    }
+                }
                 properties.remove(EventConstants.EVENT_TOPIC);
                 properties.put(TimedEventStatusProvider.PROPERTY_EVENT_ID, 
topic.replace('/', '.') + '/' + eventResource.getName());
 

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/ResourceHelper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/ResourceHelper.java?rev=1479608&r1=1479607&r2=1479608&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/ResourceHelper.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/support/ResourceHelper.java
 Mon May  6 15:43:55 2013
@@ -18,10 +18,14 @@
  */
 package org.apache.sling.event.impl.support;
 
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.sling.api.resource.PersistenceException;
@@ -125,10 +129,10 @@ public abstract class ResourceHelper {
         return sb.toString();
     }
 
-    public static final String PROPERTY_MARKER_READ_ERROR = 
ResourceHelper.class.getName() + "/ReadError";
+    public static final String PROPERTY_MARKER_READ_ERROR_LIST = 
ResourceHelper.class.getName() + "/ReadErrorList";
 
     public static Map<String, Object> cloneValueMap(final ValueMap vm) throws 
InstantiationException {
-        boolean hasReadError = false;
+        List<Exception> hasReadError = null;
         try {
             final Map<String, Object> result = new HashMap<String, Object>(vm);
             for(final Map.Entry<String, Object> entry : result.entrySet()) {
@@ -137,12 +141,36 @@ public abstract class ResourceHelper {
                     if ( value != null ) {
                         entry.setValue(value);
                     } else {
-                        hasReadError = true;
+                        if ( hasReadError == null ) {
+                            hasReadError = new ArrayList<Exception>();
+                        }
+                        final int count = hasReadError.size();
+                        // let's find out which class might be missing
+                        ObjectInputStream ois = null;
+                        try {
+                            ois = new 
ObjectInputStream((InputStream)entry.getValue());
+                            ois.readObject();
+                        } catch (final ClassNotFoundException cnfe) {
+                             hasReadError.add(new Exception("Unable to 
deserialize property '" + entry.getKey() + "'", cnfe));
+                        } catch (final IOException ioe) {
+                            hasReadError.add(new Exception("Unable to 
deserialize property '" + entry.getKey() + "'", ioe));
+                        } finally {
+                            if ( ois != null ) {
+                                try {
+                                    ois.close();
+                                } catch (IOException ignore) {
+                                    // ignore
+                                }
+                            }
+                        }
+                        if ( hasReadError.size() == count ) {
+                            hasReadError.add(new Exception("Unable to 
deserialize property '" + entry.getKey() + "'"));
+                        }
                     }
                 }
             }
-            if ( hasReadError ) {
-                result.put(PROPERTY_MARKER_READ_ERROR, Boolean.TRUE);
+            if ( hasReadError != null ) {
+                result.put(PROPERTY_MARKER_READ_ERROR_LIST, hasReadError);
             }
             return result;
         } catch ( final IllegalArgumentException iae) {


Reply via email to