Author: cziegeler
Date: Wed Sep 18 08:07:13 2013
New Revision: 1524326

URL: http://svn.apache.org/r1524326
Log:
SLING-3028 :  Support for progress tracking of jobs 

Modified:
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobHandler.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/queues/AbstractJobQueue.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/consumer/JobExecutionContext.java

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobHandler.java?rev=1524326&r1=1524325&r2=1524326&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobHandler.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobHandler.java
 Wed Sep 18 08:07:13 2013
@@ -41,6 +41,7 @@ public class JobHandler {
     }
 
     public boolean start() {
+        this.job.prepare();
         return this.jobManager.start(this);
     }
 
@@ -77,4 +78,9 @@ public class JobHandler {
     public String toString() {
         return "JobHandler(" + this.job.getId() + ")";
     }
+
+    public void updateProperty(final String propName) {
+        this.jobManager.updateProperty(this.job, propName);
+
+    }
 }
\ No newline at end of file

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=1524326&r1=1524325&r2=1524326&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
 Wed Sep 18 08:07:13 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.event.impl.jobs;
 
+import java.text.MessageFormat;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +46,21 @@ public class JobImpl implements Job {
     /** Internal job property containing optional delay override. */
     public static final String PROPERTY_DELAY_OVERRIDE = 
":slingevent:delayOverride";
 
+    /** Property for log statements. */
+    public static final String PROPERTY_LOG = "slingevent:log";
+
+    /** Property for ETA. */
+    public static final String PROPERTY_ETA = "slingevent:eta";
+
+    /** Property for Steps. */
+    public static final String PROPERTY_STEPS = "slingevent:steps";
+
+    /** Property for Step. */
+    public static final String PROPERTY_STEP = "slingevent:step";
+
+    /** Property for final message. */
+    public static final String PROPERTY_MESSAGE = "slingevent:message";
+
     private final ValueMap properties;
 
     private final String topic;
@@ -238,6 +254,45 @@ public class JobImpl implements Job {
      */
     public void prepare() {
         this.properties.remove(JobImpl.PROPERTY_DELAY_OVERRIDE);
+        this.properties.remove(JobImpl.PROPERTY_LOG);
+        this.properties.remove(JobImpl.PROPERTY_ETA);
+        this.properties.remove(JobImpl.PROPERTY_STEPS);
+        this.properties.remove(JobImpl.PROPERTY_STEP);
+        this.properties.remove(JobImpl.PROPERTY_MESSAGE);
+    }
+
+    public String update(final long eta) {
+        this.setProperty(JobImpl.PROPERTY_ETA, eta);
+        return JobImpl.PROPERTY_ETA;
+    }
+
+    public String startProgress(final long eta) {
+        this.setProperty(JobImpl.PROPERTY_ETA, eta);
+        return JobImpl.PROPERTY_ETA;
+    }
+
+    public String startProgress(final int steps) {
+        this.setProperty(JobImpl.PROPERTY_STEPS, steps);
+        return JobImpl.PROPERTY_STEPS;
+    }
+
+    public String setProgress(final int step) {
+        this.setProperty(JobImpl.PROPERTY_STEP, step);
+        return JobImpl.PROPERTY_STEP;
+    }
+
+    public String log(final String message, Object... args) {
+        final String logEntry = MessageFormat.format(message, args);
+        final String[] entries = this.getProperty(JobImpl.PROPERTY_LOG, 
String[].class);
+        if ( entries == null ) {
+            this.setProperty(JobImpl.PROPERTY_LOG, new String[] {logEntry});
+        } else {
+            final String[] newEntries = new String[entries.length + 1];
+            System.arraycopy(entries, 0, newEntries, 0, entries.length);
+            newEntries[entries.length] = logEntry;
+            this.setProperty(JobImpl.PROPERTY_LOG, newEntries);
+        }
+        return JobImpl.PROPERTY_LOG;
     }
 
     @Override

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=1524326&r1=1524325&r2=1524326&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
 Wed Sep 18 08:07:13 2013
@@ -1122,6 +1122,11 @@ public class JobManagerImpl
                 mvm.put(Job.PROPERTY_JOB_QUEUE_NAME, 
info.getJob().getQueueName());
                 mvm.put(Job.PROPERTY_JOB_RETRIES, 
info.getJob().getNumberOfRetries());
                 mvm.put(Job.PROPERTY_JOB_PRIORITY, 
info.getJob().getJobPriority().name());
+                mvm.remove(JobImpl.PROPERTY_ETA);
+                mvm.remove(JobImpl.PROPERTY_STEPS);
+                mvm.remove(JobImpl.PROPERTY_STEP);
+                mvm.remove(JobImpl.PROPERTY_LOG);
+                mvm.remove(JobImpl.PROPERTY_MESSAGE);
                 resolver.commit();
 
                 return true;
@@ -1354,4 +1359,25 @@ public class JobManagerImpl
     public TopologyCapabilities getTopologyCapabilities() {
         return this.topologyCapabilities;
     }
+
+    public void updateProperty(final JobImpl job, final String propName) {
+        ResourceResolver resolver = null;
+        try {
+            resolver = 
this.resourceResolverFactory.getAdministrativeResourceResolver(null);
+            final Resource jobResource = 
resolver.getResource(job.getResourcePath());
+            if ( jobResource != null ) {
+                final ModifiableValueMap mvm = 
jobResource.adaptTo(ModifiableValueMap.class);
+                mvm.put(propName, job.getProperty(propName));
+                resolver.commit();
+            }
+        } catch ( final PersistenceException ignore ) {
+            this.ignoreException(ignore);
+        } catch ( final LoginException ignore ) {
+            this.ignoreException(ignore);
+        } finally {
+            if ( resolver != null ) {
+                resolver.close();
+            }
+        }
+    }
 }

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/queues/AbstractJobQueue.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/queues/AbstractJobQueue.java?rev=1524326&r1=1524325&r2=1524326&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/queues/AbstractJobQueue.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/queues/AbstractJobQueue.java
 Wed Sep 18 08:07:13 2013
@@ -511,6 +511,7 @@ public abstract class AbstractJobQueue
                              */
                             @Override
                             public void run() {
+                                final Object lock = new Object();
                                 final Thread currentThread = 
Thread.currentThread();
                                 // update priority and name
                                 final String oldName = currentThread.getName();
@@ -531,43 +532,37 @@ public abstract class AbstractJobQueue
                                 final AtomicBoolean isAsync = new 
AtomicBoolean(false);
 
                                 try {
-                                    synchronized ( job ) {
-                                        job.prepare();
+                                    synchronized ( lock ) {
                                         result = consumer.process(job, new 
JobExecutionContext() {
 
                                             @Override
                                             public void update(final long eta) 
{
-                                                // TODO Auto-generated method 
stub
-
+                                                
handler.updateProperty(job.update(eta));
                                             }
 
                                             @Override
                                             public void startProgress(final 
long eta) {
-                                                // TODO Auto-generated method 
stub
-
+                                                
handler.updateProperty(job.startProgress(eta));
                                             }
 
                                             @Override
                                             public void startProgress(final 
int steps) {
-                                                // TODO Auto-generated method 
stub
-
+                                                
handler.updateProperty(job.startProgress(steps));
                                             }
 
                                             @Override
                                             public void setProgress(final int 
step) {
-                                                // TODO Auto-generated method 
stub
-
+                                                
handler.updateProperty(job.setProgress(step));
                                             }
 
                                             @Override
                                             public void log(final String 
message, Object... args) {
-                                                // TODO Auto-generated method 
stub
-
+                                                
handler.updateProperty(job.log(message, args));
                                             }
 
                                             @Override
                                             public void 
asyncProcessingFinished(final JobStatus status) {
-                                                synchronized ( job ) {
+                                                synchronized ( lock ) {
                                                     if ( 
isAsync.compareAndSet(true, false) ) {
                                                         
finishedJob(job.getId(), status, true);
                                                         
asyncCounter.decrementAndGet();
@@ -606,8 +601,7 @@ public abstract class AbstractJobQueue
                             pool.execute(task);
                         } else {
                             // if we don't have a thread pool, we create the 
thread directly
-                            // (this should never happen for jobs, but is a 
safe fallback and
-                            // allows to call this method for other background 
processing.
+                            // (this should never happen for jobs, but is a 
safe fallback)
                             new Thread(task).start();
                         }
 

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/consumer/JobExecutionContext.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/consumer/JobExecutionContext.java?rev=1524326&r1=1524325&r2=1524326&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/consumer/JobExecutionContext.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/consumer/JobExecutionContext.java
 Wed Sep 18 08:07:13 2013
@@ -72,7 +72,8 @@ public interface JobExecutionContext {
 
     /**
      * Log a message.
-     * The message might contain place holders for additional arguments.
+     * The message and the arguments are passed to the {@link 
java.text.MessageFormat}
+     * class.
      * @param message A message
      * @param args Additional arguments
      */


Reply via email to