You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by en...@apache.org on 2011/11/23 01:06:56 UTC

svn commit: r1205244 - in /incubator/stanbol/branches/lto-reasoners/reasoners: ./ jobs/api/ jobs/api/src/main/java/org/apache/stanbol/commons/ jobs/api/src/main/java/org/apache/stanbol/commons/jobs/ jobs/api/src/main/java/org/apache/stanbol/commons/job...

Author: enridaga
Date: Wed Nov 23 00:06:52 2011
New Revision: 1205244

URL: http://svn.apache.org/viewvc?rev=1205244&view=rev
Log:
Starting implementation of jobs/api and jobs/web modules (STANBOL-383).
This code evolves from STANBOL-343. Artifact names have been moved to org.apache.stanbol.commons.* . We commit this to branches in order to complete STANBOL-343. 

Added:
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/
      - copied from r1203566, incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/api/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/
      - copied from r1203566, incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/pom.xml
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/static/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/test/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/test/java/
Removed:
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/
Modified:
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
    incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml
    incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml
    incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java
    incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/ReasoningServiceTaskResource.java
    incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceExecutor.java
    incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceResult.java

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml Wed Nov 23 00:06:52 2011
@@ -9,9 +9,9 @@
 		<relativePath>../../parent</relativePath>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
-	<artifactId>org.apache.stanbol.reasoners.jobs.api</artifactId>
+	<artifactId>org.apache.stanbol.commons.jobs.api</artifactId>
 	<packaging>bundle</packaging>
-	<name>Apache Stanbol Reasoners: Jobs API</name>
+	<name>Apache Stanbol Commons Jobs API</name>
 	<version>0.1</version>
 
 	<description>Background jobs, API and Manager </description>
@@ -33,7 +33,7 @@
 						org.slf4j.*
 						</Import-Package>
 						<Export-Package>
-						org.apache.stanbol.reasoners.jobs.api.*
+						org.apache.stanbol.commons.jobs.api.*
 						</Export-Package>
 					</instructions>
 				</configuration>
@@ -84,11 +84,6 @@
 			<artifactId>org.apache.stanbol.owl</artifactId>
 		</dependency -->
 		<dependency>
-			<groupId>org.apache.stanbol</groupId>
-			<artifactId>org.apache.stanbol.reasoners.servicesapi</artifactId>
-			<version>0.1</version>
-		</dependency>
-		<dependency>
 			<groupId>commons-codec</groupId>
 			<artifactId>commons-codec</artifactId>
 			<scope>provided</scope>

Added: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/Job.java Wed Nov 23 00:06:52 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);
+}

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java?rev=1205244&r1=1203566&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobManager.java Wed Nov 23 00:06:52 2011
@@ -1,6 +1,5 @@
-package org.apache.stanbol.reasoners.jobs.api;
+package org.apache.stanbol.commons.jobs.api;
 
-import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 /**
  * This interface defines the executor of asynch processes.
@@ -15,12 +14,20 @@ public interface JobManager {
      * @param task
      * @return
      */
-    public String execute(Callable<?> task);
+    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
@@ -44,4 +51,9 @@ public interface JobManager {
      * @param id
      */
     public void remove(String id);
+    
+    /**
+     * Interrupt all asynch processes and remove them form the job list.
+     */
+    public void removeAll();
 }

Added: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/api/JobResult.java Wed Nov 23 00:06:52 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();
+}

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java?rev=1205244&r1=1203566&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/commons/jobs/impl/JobManagerImpl.java Wed Nov 23 00:06:52 2011
@@ -1,17 +1,18 @@
-package org.apache.stanbol.reasoners.jobs.impl;
+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.concurrent.Callable;
+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.reasoners.jobs.api.JobManager;
+import org.apache.stanbol.commons.jobs.api.Job;
+import org.apache.stanbol.commons.jobs.api.JobManager;
 /**
  * Implementation of the {@JobManager} interface.
  * 
@@ -23,27 +24,40 @@ import org.apache.stanbol.reasoners.jobs
  *
  */
 public class JobManagerImpl implements JobManager {
-    ExecutorService pool;
-    Map<String,Future<?>> taskMap;
+    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(Callable<?> callable) {
-        String id = JobManagerImpl.buildId(callable);
-        Future<?> future = this.pool.submit(callable);
+    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) {
-        return taskMap.get(id);
+        synchronized (taskMap) {
+            return taskMap.get(id);            
+        }
+    }
+
+
+    @Override
+    public String getResultLocation(String id) {
+        synchronized (locations) {
+            return locations.get(id);            
+        }
     }
 
     @Override
@@ -63,11 +77,18 @@ public class JobManagerImpl implements J
     @Override
     public void remove(String id) {
         synchronized (taskMap) {
-            taskMap.get(id).cancel(true);
+            // 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
@@ -75,7 +96,7 @@ public class JobManagerImpl implements J
      * @param obj
      * @return
      */
-    private static String buildId(Object obj) {
+    public static String buildId(Object obj) {
         String str = obj.toString();
         byte[] thedigest = null;
         try {
@@ -92,4 +113,18 @@ public class JobManagerImpl implements J
         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);
+        }
+    }
+
 }

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java Wed Nov 23 00:06:52 2011
@@ -6,13 +6,14 @@ import static org.junit.Assert.assertTru
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.Callable;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
-import org.apache.stanbol.reasoners.jobs.api.JobManager;
-import org.apache.stanbol.reasoners.jobs.impl.JobManagerImpl;
+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;
@@ -62,10 +63,10 @@ public class TestJobManagerImpl {
         final int max = countUntil;
         final int number = jobs.size() + 1;
         final int jst = jobsleepTime;
-        jobs.add(jobManager.execute(new Callable<String>() {
+        jobs.add(jobManager.execute(new Job() {
 
             @Override
-            public String call() {
+            public JobResult call() {
                 final int num = number;
                 for (int i = 0; i < max; i++) {
                     try {
@@ -73,9 +74,25 @@ public class TestJobManagerImpl {
                         Thread.sleep(jst);
                     } catch (InterruptedException ie) {}
                 }
-                return "This is process " + Integer.toString(num);
+                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;
+            }
         }));
     }
 

Added: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/pom.xml?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/pom.xml (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/pom.xml Wed Nov 23 00:06:52 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/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/JobsFragment.java Wed Nov 23 00:06:52 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/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/resources/JobsResource.java Wed Nov 23 00:06:52 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/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/utils/JobInfo.java Wed Nov 23 00:06:52 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/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/web/src/main/java/org/apache/stanbol/commons/jobs/web/writers/JobInfoWriter.java Wed Nov 23 00:06:52 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/branches/lto-reasoners/reasoners/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/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/index.ftl?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/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/branches/lto-reasoners/reasoners/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 00:06:52 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/branches/lto-reasoners/reasoners/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/branches/lto-reasoners/reasoners/jobs/web/src/main/resources/org/apache/stanbol/commons/jobs/web/templates/org/apache/stanbol/commons/jobs/web/resources/JobsResource/info.ftl?rev=1205244&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/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/branches/lto-reasoners/reasoners/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 00:06:52 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

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml Wed Nov 23 00:06:52 2011
@@ -41,6 +41,7 @@
     <module>servicesapi</module>
     <module>manager</module>
     <module>jobs/api</module>
+    <module>jobs/web</module>
     <module>owlapi</module>
     <module>jena</module>
     <module>test</module>

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml Wed Nov 23 00:06:52 2011
@@ -331,11 +331,6 @@
     </dependency>    
     <dependency>
     <groupId>org.apache.stanbol</groupId>
-    <artifactId>org.apache.stanbol.reasoners.jobs.api</artifactId>
-    <version>0.1</version>
-    </dependency>
-    <dependency>
-    <groupId>org.apache.stanbol</groupId>
     <artifactId>org.apache.stanbol.reasoners.jena</artifactId>
     <version>0.1</version>
     </dependency>
@@ -364,6 +359,11 @@
 		  <groupId>org.apache.stanbol</groupId>
 		  <artifactId>org.apache.stanbol.commons.testing.stanbol</artifactId>
 	  </dependency-->
+		<dependency>
+			<groupId>org.apache.stanbol</groupId>
+			<artifactId>org.apache.stanbol.commons.jobs.api</artifactId>
+			<version>0.1</version>
+		</dependency>
   </dependencies>
 
 

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java Wed Nov 23 00:06:52 2011
@@ -1,6 +1,5 @@
 package org.apache.stanbol.reasoners.web.resources;
 
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
@@ -15,16 +14,16 @@ 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.reasoners.jobs.api.JobManager;
+import org.apache.stanbol.commons.jobs.api.JobManager;
 import org.apache.stanbol.reasoners.web.utils.ReasoningServiceResult;
 import org.apache.stanbol.reasoners.web.utils.ResponseTaskBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * To ping Jobs
+ * Return the result of a reasoners background job
  * 
- * @author mac
+ * @author enridaga
  * 
  */
 @Path("/reasoners/jobs")
@@ -38,8 +37,14 @@ public class JobsResource extends BaseSt
         this.headers = headers;
     }
 
+    /**
+     * To read a /reasoners job output.
+     * 
+     * @param id
+     * @return
+     */
     @GET
-    @Path("ping/{jid}")
+    @Path("/{jid}")
     public Response get(@PathParam("jid") String id) {
         log.info("Pinging job {}", id);
 
@@ -54,36 +59,38 @@ public class JobsResource extends BaseSt
         if (m.hasJob(id)) {
             log.info("Found job with id {}", id);
             Future<?> f = m.ping(id);
-            if(f.isDone()){
-                if(f.isCancelled()){
-                    // NOTE: In this case the job still remains in the JobManager list
-                    return Response.ok("Job have been canceled!").build();                
-                }else{
-                    Object o;
-                    try {
-                        o = f.get();
-                        if(o instanceof ReasoningServiceResult){
-                            log.debug("Is a ReasoningServiceResult");
-                            ReasoningServiceResult<?> result = (ReasoningServiceResult<?>) o;
-                            return new ResponseTaskBuilder(uriInfo,context,headers).build(result);
-                        }else if(o instanceof String){
-                            // FIXME We keep this for the moment, must remove later on
-                            return Response.ok("Test Job is done!\n " + (String) o).build();                        
-                        }else{
-                            log.error("Unsupported job result type: {}",o.getClass());
-                            throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
-                        }
-                    } 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);
+            if(f.isDone() && (!f.isCancelled())){
+                /**
+                 * We return OK with the result
+                 */
+                Object o;
+                try {
+                    o = f.get();
+                    if(o instanceof ReasoningServiceResult){
+                        log.debug("Is a ReasoningServiceResult");
+                        ReasoningServiceResult<?> result = (ReasoningServiceResult<?>) o;
+                        return new ResponseTaskBuilder(uriInfo,context,headers).build(result);
+                    }else{
+                        log.error("Job {} does not belong to reasoners", id);
+                        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{
-                // FIXME Change the HTTP Status code here!
-                return Response.ok("Job is still working").build();
+                /**
+                 * We return 404 with additional info
+                 */
+                String jobService = new StringBuilder().append(getPublicBaseUri()).append("/jobs/").append(id).toString();
+                StringBuilder b = new StringBuilder();
+                b.append("Result not ready.\n");
+                b.append("See: ").append(jobService);
+                return Response.status(404).header("Content-Location", jobService).entity( b.toString() ).build();
             }
         } else {
             log.info("No job found with id {}", id);
@@ -92,33 +99,6 @@ public class JobsResource extends BaseSt
     }
 
     /**
-     * Creates a new background job to be used to test
-     * 
-     * @return
-     */
-    @GET
-    @Path("test")
-    public Response test() {
-        log.info("Starting test job");
-
-        // No id
-        JobManager m = getJobManager();
-        String id = m.execute(new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                for (int i = 0; i < 10; i++) {
-                    try {
-                        log.info("Test Process is working");
-                        Thread.sleep(1000);
-                    } catch (InterruptedException ie) {}
-                }
-                return "This is the test job";
-            }
-        });
-        return Response.ok(id).build();
-    }
-
-    /**
      * Gets the job manager
      * 
      * @return

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/ReasoningServiceTaskResource.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/ReasoningServiceTaskResource.java?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/ReasoningServiceTaskResource.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/ReasoningServiceTaskResource.java Wed Nov 23 00:06:52 2011
@@ -6,6 +6,7 @@ import static javax.ws.rs.core.MediaType
 
 import java.io.File;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -34,7 +35,7 @@ import org.apache.stanbol.commons.web.ba
 import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
 import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
 import org.apache.stanbol.reasoners.jena.JenaReasoningService;
-import org.apache.stanbol.reasoners.jobs.api.JobManager;
+import org.apache.stanbol.commons.jobs.api.JobManager;
 import org.apache.stanbol.reasoners.owlapi.OWLApiReasoningService;
 import org.apache.stanbol.reasoners.servicesapi.InconsistentInputException;
 import org.apache.stanbol.reasoners.servicesapi.ReasoningService;
@@ -236,9 +237,11 @@ public class ReasoningServiceTaskResourc
         ReasoningServiceExecutor executor = new ReasoningServiceExecutor(tcManager, imngr,
                 getCurrentService(), getCurrentTask(), target, parameters);
         String jid = getJobManager().execute(executor);
-        // FIXME Represent this result better
-        // How to indicate another URI to ping for the actual response?
-        return Response.ok(jid).build();   
+        /**
+         * If everything went well, we return 201 Created
+         * We include the header Location: with the Job URL
+         */
+        return Response.created(URI.create(getPublicBaseUri() + "reasoners/job/"+jid)).build();   
     }
     
     private Response processRealTimeRequest(){

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceExecutor.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceExecutor.java?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceExecutor.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceExecutor.java Wed Nov 23 00:06:52 2011
@@ -7,7 +7,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.Callable;
 import java.util.concurrent.locks.Lock;
 
 import org.apache.clerezza.rdf.core.MGraph;
@@ -18,6 +17,7 @@ import org.apache.clerezza.rdf.core.acce
 import org.apache.stanbol.owl.transformation.JenaToClerezzaConverter;
 import org.apache.stanbol.owl.transformation.OWLAPIToClerezzaConverter;
 import org.apache.stanbol.reasoners.jena.JenaReasoningService;
+import org.apache.stanbol.commons.jobs.api.Job;
 import org.apache.stanbol.reasoners.owlapi.OWLApiReasoningService;
 import org.apache.stanbol.reasoners.servicesapi.InconsistentInputException;
 import org.apache.stanbol.reasoners.servicesapi.ReasoningService;
@@ -42,7 +42,7 @@ import com.hp.hpl.jena.reasoner.rulesys.
 /**
  * TODO Add comment
  */
-public class ReasoningServiceExecutor implements Callable<ReasoningServiceResult<?>> {
+public class ReasoningServiceExecutor implements Job {
 	private Logger log = LoggerFactory.getLogger(getClass());
 	private TcManager tcManager;
 	private ReasoningServiceInputManager inmgr;
@@ -343,4 +343,9 @@ public class ReasoningServiceExecutor im
         return execute(task,service,targetGraph,parameters);
     }
 
+    @Override
+    public String buildResultLocation(String jobId) {
+        return "/reasoners/jobs/" + jobId;
+    }
+
 }

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceResult.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceResult.java?rev=1205244&r1=1205243&r2=1205244&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceResult.java (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/utils/ReasoningServiceResult.java Wed Nov 23 00:06:52 2011
@@ -1,6 +1,8 @@
 package org.apache.stanbol.reasoners.web.utils;
 
-public class ReasoningServiceResult<T extends Object> {
+import org.apache.stanbol.commons.jobs.api.JobResult;
+
+public class ReasoningServiceResult<T extends Object> implements JobResult{
     private T resultObj;
     private boolean success;
     private String task;
@@ -29,10 +31,11 @@ public class ReasoningServiceResult<T ex
         this.success = true;
     }
 
-    public Object get() {
+    public T get() {
         return this.resultObj;
     }
 
+    @Override
     public boolean isSuccess() {
         return success;
     }
@@ -40,4 +43,14 @@ public class ReasoningServiceResult<T ex
     public String getTask() {
         return task;
     }
+
+    @Override
+    public String getMessage() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Task: ").append(task).append(". Result: ").append(success).append(". ");
+        if(resultObj!=null){
+            sb.append("Result type is ").append(resultObj.getClass().getCanonicalName());
+        }
+        return sb.toString();
+    }
 }