Author: enridaga
Date: Wed Nov 23 09:55:57 2011
New Revision: 1205349
URL: http://svn.apache.org/viewvc?rev=1205349&view=rev
Log:
Moving the jobs modules from /branches/lto-reasoners/reasoners/jobs to
/trunk/commons/jobs (STANBOL-383) (Put folder content)
Added:
incubator/stanbol/trunk/commons/jobs/api/
incubator/stanbol/trunk/commons/jobs/api/pom.xml (with props)
incubator/stanbol/trunk/commons/jobs/api/src/
incubator/stanbol/trunk/commons/jobs/api/src/main/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/reasoners/
incubator/stanbol/trunk/commons/jobs/api/src/test/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/utils/
incubator/stanbol/trunk/commons/jobs/api/src/test/resources/
incubator/stanbol/trunk/commons/jobs/api/src/test/resources/log4j.properties
incubator/stanbol/trunk/commons/jobs/web/
incubator/stanbol/trunk/commons/jobs/web/pom.xml
incubator/stanbol/trunk/commons/jobs/web/src/
incubator/stanbol/trunk/commons/jobs/web/src/main/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/static/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl
incubator/stanbol/trunk/commons/jobs/web/src/test/
incubator/stanbol/trunk/commons/jobs/web/src/test/java/
Modified:
incubator/stanbol/trunk/commons/jobs/ (props changed)
Propchange: incubator/stanbol/trunk/commons/jobs/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Nov 23 09:55:57 2011
@@ -0,0 +1 @@
+.project
Added: incubator/stanbol/trunk/commons/jobs/api/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/pom.xml?rev=1205349&view=auto
==============================================================================
--- incubator/stanbol/trunk/commons/jobs/api/pom.xml (added)
+++ incubator/stanbol/trunk/commons/jobs/api/pom.xml Wed Nov 23 09:55:57 2011
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <parent>
+ <artifactId>stanbol-parent</artifactId>
+ <groupId>org.apache.stanbol</groupId>
+ <version>0.9.0-incubating-SNAPSHOT</version>
+ <relativePath>../../parent</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>org.apache.stanbol.commons.jobs.api</artifactId>
+ <packaging>bundle</packaging>
+ <name>Apache Stanbol Commons Jobs API</name>
+ <version>0.1</version>
+
+ <description>Background jobs, API and Manager </description>
+ <build>
+ <!-- make it an OSGi bundle -->
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Import-Package>
+ org.apache.commons.codec.*,
+ org.slf4j.*
+ </Import-Package>
+ <Export-Package>
+
org.apache.stanbol.commons.jobs.api.*
+ </Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- Diagnostic dependencies -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <!-- Dependencise for testing -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+
<artifactId>org.apache.felix.scr.annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Stanbol dependencies -->
+ <!-- dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.owl</artifactId>
+ </dependency -->
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
Propchange: incubator/stanbol/trunk/commons/jobs/api/pom.xml
------------------------------------------------------------------------------
svn:executable = *
Added:
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,8 @@
+package org.apache.stanbol.commons.jobs.api;
+
+import java.util.concurrent.Callable;
+
+public interface Job extends Callable<JobResult> {
+
+ public String buildResultLocation(String jobId);
+}
Added:
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,59 @@
+package org.apache.stanbol.commons.jobs.api;
+
+import java.util.concurrent.Future;
+/**
+ * This interface defines the executor of asynch processes.
+ *
+ * @author enridaga
+ *
+ */
+public interface JobManager {
+ /**
+ * Adds and runs an asynch process. Returns the String id to use for
pinging its execution.
+ *
+ * @param task
+ * @return
+ */
+ public String execute(Job job);
+
+ /**
+ * Get the Future object to monitor the state of a job
+ */
+ public Future<?> ping(String id);
+
+ /**
+ * Get the location url of the result
+ *
+ * @param id
+ * @return
+ */
+ public String getResultLocation(String id);
+
+ /**
+ * If the executor is managing the given job
+ *
+ * @param id
+ * @return
+ */
+ public boolean hasJob(String id);
+
+ /**
+ * The currently managed jobs, in any state (running, complete,
interrupted)
+ *
+ * @return
+ */
+ public int size();
+
+ /**
+ * Interrupt the asynch process and remove it from the job list.
+ * To interrupt the process and keeping it, use the Future object from the
ping() method.
+ *
+ * @param id
+ */
+ public void remove(String id);
+
+ /**
+ * Interrupt all asynch processes and remove them form the job list.
+ */
+ public void removeAll();
+}
Added:
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,25 @@
+package org.apache.stanbol.commons.jobs.api;
+
+/**
+ * Interface for Job results.
+ * It only provides a report message and a boolean success/failure.
+ *
+ * @author enridaga
+ *
+ */
+public interface JobResult {
+
+ /**
+ * A report message.
+ *
+ * @return
+ */
+ public String getMessage();
+
+ /**
+ * True if the job execution succeeded, false otherwise
+ *
+ * @return
+ */
+ public boolean isSuccess();
+}
Added:
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,130 @@
+package org.apache.stanbol.commons.jobs.impl;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.stanbol.commons.jobs.api.Job;
+import org.apache.stanbol.commons.jobs.api.JobManager;
+/**
+ * Implementation of the {@JobManager} interface.
+ *
+ * @author enridaga
+ *
+ *
+ * @scr.component immediate="true"
+ * @scr.service
+ *
+ */
+public class JobManagerImpl implements JobManager {
+ private ExecutorService pool;
+ private Map<String,Future<?>> taskMap;
+ private Map<String,String> locations;
+
+ public JobManagerImpl() {
+ this.pool = Executors.newCachedThreadPool();
+ this.taskMap = new HashMap<String,Future<?>>();
+ this.locations = new HashMap<String,String>();
+ }
+
+ @Override
+ public String execute(Job job) {
+ String id = JobManagerImpl.buildId(job);
+ Future<?> future = this.pool.submit(job);
+ synchronized (taskMap) {
+ taskMap.put(id, future);
+ locations.put(id, job.buildResultLocation(id));
+ return id;
+ }
+ }
+
+ @Override
+ public Future<?> ping(String id) {
+ synchronized (taskMap) {
+ return taskMap.get(id);
+ }
+ }
+
+
+ @Override
+ public String getResultLocation(String id) {
+ synchronized (locations) {
+ return locations.get(id);
+ }
+ }
+
+ @Override
+ public boolean hasJob(String id) {
+ synchronized (taskMap) {
+ return taskMap.containsKey(id);
+ }
+ }
+
+ @Override
+ public int size() {
+ synchronized (taskMap) {
+ return taskMap.size();
+ }
+ }
+
+ @Override
+ public void remove(String id) {
+ synchronized (taskMap) {
+ // If the job does not exists
+ Future<?> f = taskMap.get(id);
+ if(f==null) {
+ throw new IllegalArgumentException("Job does not exists");
+ }
+ f.cancel(true);
+ taskMap.remove(id);
+ synchronized (locations) {
+ locations.remove(id);
+ }
+ }
+ }
+
+ /**
+ * To build a unique string identifier for a background process
+ *
+ * @param obj
+ * @return
+ */
+ public static String buildId(Object obj) {
+ String str = obj.toString();
+ byte[] thedigest = null;
+ try {
+ byte[] bytesOfMessage = str.getBytes("UTF-8");
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ thedigest = md.digest(bytesOfMessage);
+ } catch (UnsupportedEncodingException e) {
+ // This should never happen
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ // This should never happen
+ e.printStackTrace();
+ }
+ return Base64.encodeBase64URLSafeString(thedigest);
+ }
+
+ /**
+ * Removes all jobs
+ */
+ @Override
+ public void removeAll() {
+ String[] ids;
+ synchronized (taskMap) {
+ ids = taskMap.keySet().toArray(new
String[taskMap.keySet().size()]);
+ }
+ for(String j : ids){
+ remove(j);
+ }
+ }
+
+}
Added:
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,197 @@
+package org.apache.stanbol.reasoners.jobs;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.apache.stanbol.commons.jobs.api.Job;
+import org.apache.stanbol.commons.jobs.api.JobManager;
+import org.apache.stanbol.commons.jobs.api.JobResult;
+import org.apache.stanbol.commons.jobs.impl.JobManagerImpl;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests the {@see JobManagerImpl}
+ *
+ * @author enridaga
+ *
+ */
+public class TestJobManagerImpl {
+ private static final Logger log =
LoggerFactory.getLogger(TestJobManagerImpl.class);
+
+ // Number of jobs to add
+ private static final int numberOfJobs = 20;
+ // Each job counts until ...
+ private static final int countUntil = 100;
+ // Each count sleep ... ms
+ private static final int jobsleepTime = 100;
+
+ private static JobManager jobManager;
+ private static List<String> jobs;
+ private static List<String> terminated;
+
+ @BeforeClass
+ public static void setup() {
+ log.info("Test initialized");
+ jobs = new ArrayList<String>();
+ terminated = new ArrayList<String>();
+ jobManager = new JobManagerImpl();
+
+ for (int x = 0; x < numberOfJobs; x++) {
+ addJob();
+ }
+ log.info("Launched {} processes", numberOfJobs);
+ }
+
+ /**
+ * Before each test method, we add some jobs
+ */
+ @Before
+ public void init() {}
+
+ private static void addJob() {
+ final int max = countUntil;
+ final int number = jobs.size() + 1;
+ final int jst = jobsleepTime;
+ jobs.add(jobManager.execute(new Job() {
+
+ @Override
+ public JobResult call() {
+ final int num = number;
+ for (int i = 0; i < max; i++) {
+ try {
+ //log.debug("Process " + Integer.toString(num) + " is
working");
+ Thread.sleep(jst);
+ } catch (InterruptedException ie) {}
+ }
+ JobResult r = new JobResult(){
+
+ @Override
+ public String getMessage() {
+ return "This is process " + Integer.toString(num);
+ }
+
+ @Override
+ public boolean isSuccess() {
+ return true;
+ }
+ };
+ return r;
+ }
+
+ @Override
+ public String buildResultLocation(String jobId) {
+ return null;
+ }
+ }));
+ }
+
+ @Test
+ public void contains() {
+ log.info("Testing hasJob(String id)");
+ for (String id : jobs) {
+ assertTrue(jobManager.hasJob(id));
+ }
+ }
+
+ @Test
+ public void future() throws InterruptedException, ExecutionException {
+ log.info("Testing monitoring");
+ for (int i = 0; i < jobs.size(); i++) {
+ assertNotNull(jobManager.ping(jobs.get(i)));
+ }
+ }
+
+ @Test
+ public void ping() throws InterruptedException, ExecutionException {
+ log.info("Testing ping(String id)");
+ for (int i = 0; i < jobs.size(); i++) {
+ log.info("Waiting 0.5 sec before checking status");
+ Thread.sleep(500);
+ boolean finished = ping(jobs);
+ if (finished) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * To test the interaction with the Future object, for interrupting jobs.
Jobs are canceled, but they
+ * persist in the manager.
+ */
+ @Test
+ public void interrupt() {
+ log.info("Testing the Future object (for monitoring)");
+ // We interrupt the first numberOfJobs/2 processes
+ int numberToInterrupt = jobs.size() / 2;
+ log.info("Going to interrupt {} jobs", numberToInterrupt);
+ for (String id : jobs) {
+ if (numberToInterrupt == 0) {
+ break;
+ } else {
+ numberToInterrupt--;
+ }
+ Future<?> f = jobManager.ping(id);
+ // We force the job to interrupt
+ boolean success = f.cancel(true);
+ boolean throwsOnget = false;
+ if (success) {
+ try {
+ f.get();
+ } catch (InterruptedException e) {
+ // This should NOT happen
+ assertFalse(true);
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ // This should NOT happen
+ assertFalse(true);
+ e.printStackTrace();
+ } catch (CancellationException e) {
+ // This exception SHOULD happen
+ throwsOnget = true;
+ }
+ assertTrue(throwsOnget);
+ log.debug("Job {} interrupted", id);
+ }
+ }
+ }
+
+ private boolean ping(List<String> processes) throws InterruptedException,
ExecutionException {
+ int size = processes.size();
+ for (String id : processes) {
+ if (terminated.contains(id)) {
+ assertFalse(jobManager.hasJob(id));
+ } else {
+ Future<?> f = jobManager.ping(id);
+ assertNotNull(f);
+ log.debug("Pinging id {}: {}", id, f.isDone());
+ if (f.isCancelled()) {
+ log.info("{} - have been interrupted.", id);
+ terminated.add(id);
+ // We can remove this, since we have known it
+ jobManager.remove(id);
+ // There is no output
+ size = size - 1;
+ } else if (f.isDone()) {
+ terminated.add(id);
+ jobManager.remove(id);
+ // The get method should return something, wince we know
this is not a canceled job
+ log.info("{} completed, output is {}", id, f.get());
+ size = size - 1;
+ }
+ }
+
+ }
+ return (terminated.size() == processes.size());
+ }
+}
Added:
incubator/stanbol/trunk/commons/jobs/api/src/test/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/api/src/test/resources/log4j.properties?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/api/src/test/resources/log4j.properties
(added)
+++
incubator/stanbol/trunk/commons/jobs/api/src/test/resources/log4j.properties
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,8 @@
+
+log4j.rootLogger=WARN, CONSOLE
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}]
%m%n
+log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] [%C{1}] %m%n
+
+log4j.category.org.apache.stanbol.reasoners.jobs=DEBUG
\ No newline at end of file
Added: incubator/stanbol/trunk/commons/jobs/web/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/pom.xml?rev=1205349&view=auto
==============================================================================
--- incubator/stanbol/trunk/commons/jobs/web/pom.xml (added)
+++ incubator/stanbol/trunk/commons/jobs/web/pom.xml Wed Nov 23 09:55:57 2011
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>stanbol-parent</artifactId>
+ <version>0.9.0-incubating-SNAPSHOT</version>
+ <relativePath>../../parent</relativePath>
+ </parent>
+
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.jobs.web</artifactId>
+ <packaging>bundle</packaging>
+
+ <name>Apache Stanbol Commons Jobs Web</name>
+ <description>REST service for managing jobs</description>
+
+ <build>
+ <!-- make it an OSGi bundle -->
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package></Export-Package>
+ <Import-Package>
+ javax.servlet.*,
+ javax.ws.rs.*,
+ org.slf4j.*,
+ org.osgi.framework.*,
+ org.osgi.service.*,
+ freemarker.cache.*,
+ com.sun.jersey.api.view.*,
+ org.apache.commons.io.*,
+ org.apache.stanbol.commons.web.base.*,
+ org.apache.stanbol.commons.jobs.api.*
+ </Import-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- specific deps for this project -->
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-json</artifactId>
+ <exclusions>
+ <!-- jaxb is now part of java 6 -->
+ <exclusion>
+ <groupId>com.sun.xml.bind</groupId>
+ <artifactId>jaxb-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.sun.xml.bind</groupId>
+ <artifactId>jaxb-impl</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>freemarker</groupId>
+ <artifactId>freemarker</artifactId>
+ <version>2.3.9</version>
+ </dependency>
+ <!-- indirect dependency for freemarker -->
+ <dependency>
+ <groupId>org.codehaus.jettison</groupId>
+ <artifactId>jettison</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </dependency>
+
+ <!-- OSGi tax -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Stanbol deps -->
+ <dependency>
+ <groupId>com.hp.hpl.jena</groupId>
+ <artifactId>jena</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Testing deps -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.jobs.api</artifactId>
+ <version>0.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.web.base</artifactId>
+ </dependency>
+ </dependencies>
+
+
+ <repositories>
+ <!-- needed for jersey -->
+ <repository>
+ <id>maven2-repository.dev.java.net</id>
+ <name>Java.net Repository for Maven</name>
+ <url>http://download.java.net/maven/2/</url>
+ </repository>
+ <repository>
+ <id>repository-codehaus</id>
+ <name>Codehaus maven repository</name>
+ <url>http://repository.codehaus.org</url>
+ </repository>
+
+ <!-- needed for clerezza SNAPSHOT only -->
+ <repository>
+ <id>apache repository - snapshot repo</id>
+ <name>apache repository</name>
+ <url>https://repository.apache.org/content/repositories/snapshots</url>
+ </repository>
+ <repository>
+ <id>stlab-cnr-repo</id>
+ <url>http://stlab.istc.cnr.it/software/maven/repo</url>
+ </repository>
+ </repositories>
+
+ <version>0.1</version>
+</project>
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,83 @@
+package org.apache.stanbol.commons.jobs.web;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.commons.jobs.web.resources.JobsResource;
+import org.apache.stanbol.commons.web.base.LinkResource;
+import org.apache.stanbol.commons.web.base.NavigationLink;
+import org.apache.stanbol.commons.web.base.ScriptResource;
+import org.apache.stanbol.commons.web.base.WebFragment;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+
+import freemarker.cache.ClassTemplateLoader;
+import freemarker.cache.TemplateLoader;
+
+@Component(immediate = true, metatype = true)
+@Service(WebFragment.class)
+public class JobsFragment implements WebFragment{
+
+ private static final String NAME = "jobs";
+ private static final String STATIC_RESOURCE_PATH =
"/org/apache/stanbol/commons/jobs/web/static";
+ private static final String TEMPLATE_PATH =
"/org/apache/stanbol/commons/jobs/web/templates";
+
+ private BundleContext bundleContext;
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public String getStaticResourceClassPath() {
+ return STATIC_RESOURCE_PATH;
+ }
+
+ @Override
+ public Set<Class<?>> getJaxrsResourceClasses() {
+ Set<Class<?>> classes = new HashSet<Class<?>>();
+ classes.add(JobsResource.class);
+ return classes;
+ }
+
+ @Override
+ public Set<Object> getJaxrsResourceSingletons() {
+ return Collections.emptySet();
+ }
+
+ @Override
+ public TemplateLoader getTemplateLoader() {
+ return new ClassTemplateLoader(getClass(), TEMPLATE_PATH);
+ }
+
+ @Override
+ public List<LinkResource> getLinkResources() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<ScriptResource> getScriptResources() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<NavigationLink> getNavigationLinks() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public BundleContext getBundleContext() {
+ return this.bundleContext;
+ }
+
+ @Activate
+ protected void activate(ComponentContext ctx) {
+ this.bundleContext = ctx.getBundleContext();
+ }
+}
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,285 @@
+package org.apache.stanbol.commons.jobs.web.resources;
+
+import static javax.ws.rs.core.MediaType.TEXT_HTML;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.stanbol.commons.web.base.ContextHelper;
+import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
+import org.apache.stanbol.commons.jobs.api.Job;
+import org.apache.stanbol.commons.jobs.api.JobManager;
+import org.apache.stanbol.commons.jobs.api.JobResult;
+import org.apache.stanbol.commons.jobs.web.utils.JobInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.jersey.api.view.Viewable;
+
+/**
+ * Manages Background Jobs
+ *
+ * @author enridaga
+ *
+ */
+@Path("/jobs")
+public class JobsResource extends BaseStanbolResource {
+
+ private Logger log = LoggerFactory.getLogger(getClass());
+ private ServletContext context;
+ private HttpHeaders headers;
+
+ private JobInfo info = null;
+
+ public JobsResource(@Context ServletContext servletContext, @Context
HttpHeaders headers) {
+ this.context = servletContext;
+ this.headers = headers;
+ }
+
+ public JobInfo getJobInfo(){
+ return info;
+ }
+
+ @GET
+ public Response get(){
+ return Response.ok(new Viewable("index",this)).build();
+ }
+
+ /**
+ * GET info about a Background Job
+ *
+ * @param id
+ * @return Response
+ */
+ @GET
+ @Path("/{jid}")
+ public Response get(@PathParam("jid") String id) {
+ log.info("Job {}", id);
+
+ // No id
+ if(id == null || id.equals("")){
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ JobManager m = getJobManager();
+
+ // If the job exists
+ if (m.hasJob(id)) {
+ log.info("Found job with id {}", id);
+ Future<?> f = m.ping(id);
+ this.info = new JobInfo();
+ if(f.isDone()){
+ // The job is finished
+ if(f.isCancelled()){
+ // NOTE: Canceled jobs should never exist.
+ // The web service remove any deleted process from the
manager
+ // If a process have been canceled programmatically, it
cannot be managed by the service anymore
+ // (except for DELETE)
+ log.warn("Job with id {} have been canceled. Returning 404
Not found.", id);
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }else{
+ // Job is complete
+ info.setFinished();
+ info.addMessage("You can remove this job using DELETE");
+ }
+ }else{
+ // the job exists but it is not complete
+ info.setRunning();
+ info.addMessage("You can interrupt this job using DELETE");
+ }
+ // Returns 200, the job exists
+ info.setOutputLocation(getPublicBaseUri() +
m.getResultLocation(id));
+
+ if(isHTML()){
+ return Response.ok(new Viewable("info", this)).build();
+ }else{
+ return Response.ok(info).build();
+ }
+ } else {
+ log.info("No job found with id {}", id);
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ }
+
+ private boolean isHTML() {
+ List<MediaType> mediaTypes = headers.getAcceptableMediaTypes();
+ Set<String> htmlformats = new HashSet<String>();
+ htmlformats.add(TEXT_HTML);
+ for (MediaType t : mediaTypes) {
+ String strty = t.toString();
+ log.info("Acceptable is {}", t);
+ if (htmlformats.contains(strty)) {
+ log.debug("Requested format is HTML {}", t);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * DELETE a background job. This method will find a job,
+ * interrupt it if it is running, and removing it
+ * from the {@see JobManager}.
+ *
+ * @param jid
+ * @return
+ */
+ @DELETE
+ @Path("/{jid}")
+ public Response delete(@PathParam(value = "jid") String jid){
+ log.info("Called DELETE ({})", jid);
+ if(!jid.equals("")){
+ log.info("Looking for test job {}", jid);
+ JobManager m = getJobManager();
+
+ // If the job exists
+ if (m.hasJob(jid)){
+ log.info("Deleting Job id {}", jid);
+ m.remove(jid);
+ return Response.ok("Job deleted.").build();
+ }else {
+ log.info("No job found with id {}", jid);
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ }else{
+ throw new WebApplicationException(Response.Status.BAD_REQUEST);
+ }
+ }
+
+ /**
+ * DELETE all background jobs.
+ *
+ * @return
+ */
+ @DELETE
+ public Response delete(){
+ log.info("Called DELETE all jobs");
+ JobManager manager = getJobManager();
+ manager.removeAll();
+ return Response.ok("All jobs have been deleted.").build();
+ }
+
+ /**
+ * Creates a new background job to be used to test the service.
+ * This method is for testing the service and to provide a sample
implementation
+ * of a long term operation started form a rest service.
+ *
+ * @return
+ */
+ @GET
+ @Path("/test{jid: (/.*)?}")
+ public Response test(@PathParam(value = "jid") String jid) {
+ log.info("Called GET (create test job)");
+
+ // If an Id have been provided, check whether the job has finished and
return the result
+ if(!jid.equals("")){
+ log.info("Looking for test job {}", jid);
+ JobManager m = getJobManager();
+ // Remove first slash from param value
+ jid = jid.substring(1);
+
+ // If the job exists
+ if (m.hasJob(jid)){
+ log.info("Found job with id {}", jid);
+ Future<?> f = m.ping(jid);
+ if(f.isDone() && (!f.isCancelled())){
+ /**
+ * We return OK with the result
+ */
+ Object o;
+ try {
+ o = f.get();
+ if(o instanceof JobResult){
+ JobResult result = (JobResult) o;
+ return Response.ok(result.getMessage()).build();
+ }else{
+ log.error("Job {} is not a test job", jid);
+ throw new
WebApplicationException(Response.Status.NOT_FOUND);
+ }
+ } catch (InterruptedException e) {
+ log.error("Error: ",e);
+ throw new
WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
+ } catch (ExecutionException e) {
+ log.error("Error: ",e);
+ throw new
WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
+ }
+
+ }else{
+ /**
+ * We return 404 with additional info (Content-Location,
the related job resource)
+ *
+ * TODO
+ * Change into json representations
+ */
+ String location = getPublicBaseUri() + "jobs/" + jid;
+ String info = new StringBuilder().append("Result not
ready.\n").append("Job Location: ").append(location).toString();
+ return Response.status(404).header("Content-Location",
location).header("Content-type","text/plain").entity(info).build();
+ }
+ }else {
+ log.info("No job found with id {}", jid);
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ }else{
+ // No id have been provided, we create a new test job
+ JobManager m = getJobManager();
+ String id = m.execute(new Job() {
+ @Override
+ public JobResult call() throws Exception {
+ for (int i = 0; i < 30; i++) {
+ try {
+ log.info("Test Process is working");
+ Thread.sleep(1000);
+ } catch (InterruptedException ie) {}
+ }
+ return new JobResult(){
+
+ @Override
+ public String getMessage() {
+ return "This is a test job";
+ }
+
+ @Override
+ public boolean isSuccess() {
+ return true;
+ }
+ };
+ }
+
+ @Override
+ public String buildResultLocation(String jobId) {
+ return "jobs/test/" + jobId;
+ }
+ });
+ // This service returns 201 Created on success
+ String location = getPublicBaseUri() + "jobs/" + id;
+ String info = new StringBuilder().append("Job started.\n")
+ .append("Location: ").append(location).toString();
+ return
Response.created(URI.create(location)).header("Content-type","text/plain").entity(info).build();
+ }
+ }
+
+ /**
+ * Gets the job manager
+ *
+ * @return
+ */
+ private JobManager getJobManager() {
+ log.debug("(getJobManager()) ");
+ return (JobManager)
ContextHelper.getServiceFromContext(JobManager.class, this.context);
+ }
+}
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,53 @@
+package org.apache.stanbol.commons.jobs.web.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class JobInfo {
+ public static final String FINISHED = "finished";
+ public static final String RUNNING = "running";
+
+ private String status = "undefined";
+ private String outputLocation = "";
+ private List<String> messages = new ArrayList<String>();
+
+ public void setOutputLocation(String outputLocation){
+ this.outputLocation = outputLocation;
+ }
+
+ public String getOutputLocation(){
+ return this.outputLocation;
+ }
+
+ public void addMessage(String message){
+ this.messages.add(message);
+ }
+
+ public List<String> getMessages(){
+ return messages;
+ }
+
+ public void setMessages(List<String> messages){
+ this.messages = messages;
+ }
+
+ public String getStatus(){
+ return this.status;
+ }
+
+ public void setFinished(){
+ this.status = FINISHED;
+ }
+
+ public void setRunning(){
+ this.status = RUNNING;
+ }
+
+ public boolean isRunning(){
+ return this.status.equals(RUNNING);
+ }
+
+ public boolean isFinished(){
+ return this.status.equals(FINISHED);
+ }
+}
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,103 @@
+package org.apache.stanbol.commons.jobs.web.writers;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.stanbol.commons.jobs.web.utils.JobInfo;
+
+/**
+ * Writer for job info
+ *
+ * @author enridaga
+ *
+ */
+@Provider
+@Produces({"application/json","text/plain"})
+public class JobInfoWriter implements MessageBodyWriter<JobInfo> {
+
+ private ByteArrayOutputStream stream = null;
+
+ public ByteArrayOutputStream toStream(JobInfo t, String mediaType) throws
IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ if (mediaType.equals("application/json")) {
+ // Json
+ StringBuilder b = new StringBuilder()
+ .append("{")
+ .append("\n\t").append("\"status\":
").append("\"").append(t.getStatus()).append("\"").append(",")
+ .append("\n\t").append("\"outputLocation\":
").append("\"").append(t.getOutputLocation()).append("\"")
+ .append("\n\t").append("\"messages\": ").append("{");
+ for(String m : t.getMessages()){
+ b.append("\n\t\t\"").append(m).append("\",");
+ }
+ b.append("\n\t\t}\n}")
+ .toString();
+ } else if (mediaType.equals("text/plain")) {
+ // Plain text
+ StringBuilder b = new StringBuilder()
+ .append("Status: ").append(t.getStatus())
+ .append("\nOutput location: ").append(t.getOutputLocation())
+ .append("\nMessages:");
+ for(String m : t.getMessages()){
+ b.append("\n - ").append(m);
+ }
+ b.append("\n");
+ IOUtils.write(b.toString(), stream);
+ }
+ return stream;
+ }
+
+ @Override
+ public boolean isWriteable(Class<?> type, Type genericType, Annotation[]
annotations, MediaType mediaType) {
+ return JobInfo.class.isAssignableFrom(type);
+ }
+
+ @Override
+ public long getSize(JobInfo t,
+ Class<?> type,
+ Type genericType,
+ Annotation[] annotations,
+ MediaType mediaType) {
+ try {
+ stream = toStream(t, mediaType.toString());
+ } catch (IOException e) {
+ throw new WebApplicationException(e);
+ }
+ return Integer.valueOf(stream.toByteArray().length).longValue();
+ }
+
+ @Override
+ public void writeTo(JobInfo t,
+ Class<?> type,
+ Type genericType,
+ Annotation[] annotations,
+ MediaType mediaType,
+ MultivaluedMap<String,Object> httpHeaders,
+ OutputStream entityStream) throws
WebApplicationException {
+ if (stream == null) {
+ try {
+ toStream(t, mediaType.toString()).writeTo(entityStream);
+ } catch (IOException e) {
+ throw new WebApplicationException(e);
+ }
+ } else {
+ try {
+ stream.writeTo(entityStream);
+ } catch (IOException e) {
+ throw new WebApplicationException(e);
+ }
+ stream = null;
+ }
+ }
+
+}
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,25 @@
+<#--
+ 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.
+-->
+<#import "/imports/common.ftl" as common>
+<#escape x as x?html>
+<@common.page title="Jobs" hasrestapi=false>
+
+ <div class="panel">
+This is the home page of the Jobs service.
+ </div>
+</@common.page>
+</#escape>
\ No newline at end of file
Added:
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl
URL:
http://svn.apache.org/viewvc/incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl?rev=1205349&view=auto
==============================================================================
---
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl
(added)
+++
incubator/stanbol/trunk/commons/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl
Wed Nov 23 09:55:57 2011
@@ -0,0 +1,33 @@
+<#--
+ 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.
+-->
+<#import "/imports/common.ftl" as common>
+<#escape x as x?html>
+<@common.page title="Jobs" hasrestapi=false>
+
+ <div class="panel">
+<p><b>Status: </b> ${it.jobInfo.status}</p>
+<p><b>Output location: </b> <a
href="${it.jobInfo.outputLocation}">${it.jobInfo.outputLocation}</a></p>
+<p><b>Messages:</b> </p>
+<ul>
+ <#list it.jobInfo.messages as message>
+ <li>${message}</li>
+ </#list>
+</ul>
+
+ </div>
+</@common.page>
+</#escape>
\ No newline at end of file