You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2013/09/30 19:28:07 UTC

svn commit: r1527672 - in /sling/trunk/bundles/extensions/event/src: main/java/org/apache/sling/event/impl/jobs/ main/java/org/apache/sling/event/impl/support/ main/java/org/apache/sling/event/jobs/ test/java/org/apache/sling/event/it/

Author: cziegeler
Date: Mon Sep 30 17:28:06 2013
New Revision: 1527672

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

Added:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java   (with props)
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java   (with props)
Modified:
    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/support/ResourceHelper.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/Job.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobManager.java
    sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/HistoryTest.java

Added: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java?rev=1527672&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java (added)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java Mon Sep 30 17:28:06 2013
@@ -0,0 +1,93 @@
+/*
+ * 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.event.impl.jobs;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.sling.event.jobs.Job;
+import org.apache.sling.event.jobs.JobBuilder;
+import org.apache.sling.event.jobs.JobManager;
+
+/**
+ * Fluent builder API
+ */
+public class JobBuilderImpl implements JobBuilder {
+
+    private final String topic;
+
+    private final JobManager jobManager;
+
+    private String name;
+
+    private Map<String, Object> properties;
+
+    public JobBuilderImpl(final JobManager manager, final String topic) {
+        this.jobManager = manager;
+        this.topic = topic;
+    }
+
+    @Override
+    public JobBuilder name(final String name) {
+        this.name = name;
+        return this;
+    }
+
+    @Override
+    public JobBuilder properties(final Map<String, Object> props) {
+        this.properties = props;
+        return this;
+    }
+
+    @Override
+    public Job add() {
+        return this.jobManager.addJob(this.topic, this.name, this.properties);
+    }
+
+    @Override
+    public boolean scheduleNow() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean scheduleNow(int times, long period) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean scheduleAt(Date date) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean scheduleAt(Date date, int times, long period) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean schedule(String expression) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+}

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=1527672&r1=1527671&r2=1527672&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 Sep 30 17:28:06 2013
@@ -47,6 +47,13 @@ public class JobImpl implements Job {
     /** Internal job property containing optional delay override. */
     public static final String PROPERTY_DELAY_OVERRIDE = ":slingevent:delayOverride";
 
+    /**
+     * This property contains the finished state of a job once it's marked as finished.
+     * The value is either "CANCELLED" or "SUCCEEDED".
+     * This property is read-only and can't be specified when the job is created.
+     */
+    public static final String PROPERTY_FINISHED_STATE = "slingevent:finishedState";
+
     private final ValueMap properties;
 
     private final String topic;
@@ -308,6 +315,64 @@ public class JobImpl implements Job {
     }
 
     @Override
+    public JobType getJobType() {
+        final String enumValue = this.getProperty(JobImpl.PROPERTY_FINISHED_STATE, String.class);
+        if ( enumValue == null ) {
+            // TODO - find out active
+            return JobType.QUEUED;
+        }
+        return JobType.valueOf(enumValue);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getFinishedDate()
+     */
+    @Override
+    public Calendar getFinishedDate() {
+        return this.getProperty(Job.PROPERTY_FINISHED_DATE, Calendar.class);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getResultMessage()
+     */
+    @Override
+    public String getResultMessage() {
+        return this.getProperty(Job.PROPERTY_RESULT_MESSAGE, String.class);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getProgressLog()
+     */
+    @Override
+    public String[] getProgressLog() {
+        return this.getProperty(Job.PROPERTY_JOB_PROGRESS_LOG, String[].class);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getProgressStepCount()
+     */
+    @Override
+    public int getProgressStepCount() {
+        return this.getProperty(Job.PROPERTY_JOB_PROGRESS_STEPS, -1);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getCurrentProgressStep()
+     */
+    @Override
+    public int getCurrentProgressStep() {
+        return this.getProperty(Job.PROPERTY_JOB_PROGRESS_STEP, 0);
+    }
+
+    /**
+     * @see org.apache.sling.event.jobs.Job#getProgressETA()
+     */
+    @Override
+    public Calendar getProgressETA() {
+        return this.getProperty(Job.PROPERTY_JOB_PROGRESS_ETA, Calendar.class);
+    }
+
+    @Override
     public String toString() {
         return "JobImpl [properties=" + properties + ", topic=" + topic
                 + ", path=" + path + ", name=" + name + ", jobId=" + jobId

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=1527672&r1=1527671&r2=1527672&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 Sep 30 17:28:06 2013
@@ -72,7 +72,7 @@ public abstract class ResourceHelper {
         Job.PROPERTY_JOB_PROGRESS_STEP,
         Job.PROPERTY_JOB_PROGRESS_STEPS,
         Job.PROPERTY_FINISHED_DATE,
-        Job.PROPERTY_FINISHED_STATE,
+        JobImpl.PROPERTY_FINISHED_STATE,
         Job.PROPERTY_RESULT_MESSAGE
     };
 

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/Job.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/Job.java?rev=1527672&r1=1527671&r2=1527672&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/Job.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/Job.java Mon Sep 30 17:28:06 2013
@@ -159,14 +159,6 @@ public interface Job {
     String PROPERTY_RESULT_MESSAGE = "slingevent:resultMessage";
 
     /**
-     * This property contains the finished state of a job once it's marked as finished.
-     * TODO - DOCUMENT
-     * This property is read-only and can't be specified when the job is created.
-     * @since 1.3
-     */
-    String PROPERTY_FINISHED_STATE = "slingevent:finishedState";
-
-    /**
      * This property contains the finished date once a job is marked as finished.
      * The value of this property is a {@link Calendar} object.
      * This property is read-only and can't be specified when the job is created.
@@ -174,6 +166,13 @@ public interface Job {
      */
     String PROPERTY_FINISHED_DATE = "slingevent:finishedDate";
 
+    enum JobType {
+        QUEUED,
+        ACTIVE,
+        SUCCEEDED,
+        CANCELLED
+    };
+
     /**
      * The job topic.
      * @return The job topic
@@ -288,4 +287,50 @@ public interface Job {
      * of the instance where this job has been created.
      */
     String getCreatedInstance();
+
+    /**
+     * Get the job type
+     * @since 1.3
+     */
+    JobType getJobType();
+
+    /**
+     * If the job is cancelled or succeeded, this method will return the finish date.
+     * @return The finish date or <code>null</code>
+     * @since 1.3
+     */
+    Calendar getFinishedDate();
+
+    /**
+     * This method returns the message from the last job processing, regardless
+     * whether the processing failed, succeeded or was cancelled. The message
+     * is optional and can be set by a job consumer.
+     * @return The result message or <code>null</code>
+     * @since 1.3
+     */
+    String getResultMessage();
+
+    /**
+     * TODO
+     * @since 1.3
+     */
+    String[] getProgressLog();
+
+    /**
+     * TODO
+     * @since 1.3
+     */
+    int getProgressStepCount();
+
+    /**
+     * TODO
+     * @since 1.3
+     */
+    int getCurrentProgressStep();
+
+    /**
+     * TODO
+     * @since 1.3
+     */
+    Calendar getProgressETA();
 }

Added: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java?rev=1527672&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java (added)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java Mon Sep 30 17:28:06 2013
@@ -0,0 +1,47 @@
+/*
+ * 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.event.jobs;
+
+import java.util.Map;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * @since 1.3
+ */
+@ProviderType
+public interface JobBuilder {
+
+    JobBuilder name(final String name);
+
+    JobBuilder properties(final Map<String, Object> props);
+
+    Job add();
+
+    ScheduleBuilder schedule(final String name);
+
+    public interface ScheduleBuilder {
+
+        boolean periodically(final int minutes);
+
+        boolean daily(final int hour, final int minute);
+
+        boolean weekly(final int day, final int hour, final int minute);
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobManager.java?rev=1527672&r1=1527671&r2=1527672&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobManager.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/JobManager.java Mon Sep 30 17:28:06 2013
@@ -207,6 +207,14 @@ public interface JobManager {
     void stopJobById(String jobId);
 
     /**
+     * Fluent API to create, start and schedule new jobs
+     * @param topic Required topic
+     * @return A job builder
+     * @since 1.3
+     */
+    JobBuilder createJob(final String topic);
+
+    /**
      * Return all jobs either running or scheduled.
      *
      * @param type Required parameter for the type: either all jobs, only queued or only started can be returned.

Modified: sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/HistoryTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/HistoryTest.java?rev=1527672&r1=1527671&r2=1527672&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/HistoryTest.java (original)
+++ sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/HistoryTest.java Mon Sep 30 17:28:06 2013
@@ -20,6 +20,7 @@ package org.apache.sling.event.it;
 
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -34,6 +35,7 @@ import org.apache.sling.event.jobs.JobMa
 import org.apache.sling.event.jobs.QueueConfiguration;
 import org.apache.sling.event.jobs.consumer.JobExecutionContext;
 import org.apache.sling.event.jobs.consumer.JobExecutor;
+import org.apache.sling.event.jobs.consumer.JobState;
 import org.apache.sling.event.jobs.consumer.JobStatus;
 import org.junit.After;
 import org.junit.Before;
@@ -100,9 +102,9 @@ public class HistoryTest extends Abstrac
                         sleep(5L);
                         final long count = job.getProperty(PROP_COUNTER, Long.class);
                         if ( count == 2 || count == 5 || count == 7 ) {
-                            return JobStatus.CANCELLED;
+                            return new JobStatus(JobState.CANCELLED, JobState.CANCELLED.name());
                         }
-                        return JobStatus.SUCCEEDED;
+                        return new JobStatus(JobState.SUCCEEDED, JobState.SUCCEEDED.name());
                     }
 
                 });
@@ -119,11 +121,18 @@ public class HistoryTest extends Abstrac
             assertEquals(10, col.size());
             assertEquals(3, this.getJobManager().findJobs(JobManager.QueryType.CANCELLED, TOPIC, -1, (Map<String, Object>[])null).size());
             assertEquals(7, this.getJobManager().findJobs(JobManager.QueryType.SUCCEEDED, TOPIC, -1, (Map<String, Object>[])null).size());
-            // verify order
+            // verify order, message and state
             long last = 9;
             for(final Job j : col) {
+                assertNotNull(j.getFinishedDate());
                 final long count = j.getProperty(PROP_COUNTER, Long.class);
                 assertEquals(last, count);
+                if ( count == 2 || count == 5 || count == 7 ) {
+                    assertEquals(Job.JobType.CANCELLED, j.getJobType());
+                } else {
+                    assertEquals(Job.JobType.SUCCEEDED, j.getJobType());
+                }
+                assertEquals(j.getJobType().name(), j.getResultMessage());
                 last--;
             }
         } finally {