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 {