Author: enridaga
Date: Fri Oct  7 12:35:39 2011
New Revision: 1180025

URL: http://svn.apache.org/viewvc?rev=1180025&view=rev
Log:
Implementation of the job module started. 
A basic ping service have been added to the web module.
This is a starting point, you can simply create a job form a /test web service 
and then check if it works on the /ping one. It is not yet integrated with the 
actual reasoning service.
STANBOL-343

Added:
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml   (with 
props)
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/
    
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/reasoners/jobs/api/JobManager.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/JobManagerImpl.java
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/
    incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/utils/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/
    
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/log4j.properties
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java
Removed:
    incubator/stanbol/branches/lto-reasoners/reasoners/README
    
incubator/stanbol/branches/lto-reasoners/reasoners/hermit/src/test/resources/catalog-v001.xml
Modified:
    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/ReasonersFragment.java

Added: 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=1180025&view=auto
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml (added)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml Fri Oct 
 7 12:35:39 2011
@@ -0,0 +1,97 @@
+<?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.reasoners.jobs.api</artifactId>
+       <packaging>bundle</packaging>
+       <name>Apache Stanbol Reasoners: 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.reasoners.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>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>
+               </dependency>
+       </dependencies>
+</project>

Propchange: incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/pom.xml
------------------------------------------------------------------------------
    svn:executable = *

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/api/JobManager.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/api/JobManager.java?rev=1180025&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/api/JobManager.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/api/JobManager.java
 Fri Oct  7 12:35:39 2011
@@ -0,0 +1,47 @@
+package org.apache.stanbol.reasoners.jobs.api;
+
+import java.util.concurrent.Callable;
+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(Callable<?> task);
+
+    /**
+     * Get the Future object to monitor the state of a job
+     */
+    public Future<?> ping(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);
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/JobManagerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/JobManagerImpl.java?rev=1180025&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/JobManagerImpl.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/main/java/org/apache/stanbol/reasoners/jobs/impl/JobManagerImpl.java
 Fri Oct  7 12:35:39 2011
@@ -0,0 +1,95 @@
+package org.apache.stanbol.reasoners.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.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;
+/**
+ * Implementation of the {@JobManager} interface.
+ * 
+ * @author enridaga
+ *
+ *
+ * @scr.component immediate="true"
+ * @scr.service
+ *
+ */
+public class JobManagerImpl implements JobManager {
+    ExecutorService pool;
+    Map<String,Future<?>> taskMap;
+
+    public JobManagerImpl() {
+        this.pool = Executors.newCachedThreadPool();
+        this.taskMap = new HashMap<String,Future<?>>();
+    }
+
+    @Override
+    public String execute(Callable<?> callable) {
+        String id = JobManagerImpl.buildId(callable);
+        Future<?> future = this.pool.submit(callable);
+        synchronized (taskMap) {
+            taskMap.put(id, future);
+            return id;
+        }
+    }
+
+    @Override
+    public Future<?> ping(String id) {
+        return taskMap.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) {
+            taskMap.get(id).cancel(true);
+            taskMap.remove(id);
+        }
+    }
+    
+
+    /**
+     * To build a unique string identifier for a background process
+     * 
+     * @param obj
+     * @return
+     */
+    private 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);
+    }
+
+}

Added: 
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=1180025&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/java/org/apache/stanbol/reasoners/jobs/TestJobManagerImpl.java
 Fri Oct  7 12:35:39 2011
@@ -0,0 +1,180 @@
+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.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.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 Callable<String>() {
+
+            @Override
+            public String 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) {}
+                }
+                return "This is process " + Integer.toString(num);
+            }
+
+        }));
+    }
+
+    @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/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/log4j.properties?rev=1180025&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/log4j.properties
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/jobs/api/src/test/resources/log4j.properties
 Fri Oct  7 12:35:39 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

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml?rev=1180025&r1=1180024&r2=1180025&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml Fri Oct  7 
12:35:39 2011
@@ -40,6 +40,7 @@
     <module>../rules/manager</module-->
     <module>servicesapi</module>
     <module>manager</module>
+    <module>jobs/api</module>
     <module>owlapi</module>
     <module>jena</module>
     <!--module>hermit</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=1180025&r1=1180024&r2=1180025&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/web/pom.xml Fri Oct  7 
12:35:39 2011
@@ -72,6 +72,7 @@
            org.apache.stanbol.reasoners.servicesapi.*,
            org.apache.stanbol.reasoners.jena.*,
            org.apache.stanbol.reasoners.owlapi.*,
+           org.apache.stanbol.reasoners.jobs.api.*,
            *
            </Import-Package>
          </instructions>
@@ -327,6 +328,11 @@
     <groupId>org.apache.stanbol</groupId>
     <artifactId>org.apache.stanbol.reasoners.servicesapi</artifactId>
     <version>0.1</version>
+    </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>

Modified: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/ReasonersFragment.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/ReasonersFragment.java?rev=1180025&r1=1180024&r2=1180025&view=diff
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/ReasonersFragment.java
 (original)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/ReasonersFragment.java
 Fri Oct  7 12:35:39 2011
@@ -31,6 +31,7 @@ import org.apache.stanbol.commons.web.ba
 import org.apache.stanbol.commons.web.base.ScriptResource;
 import org.apache.stanbol.commons.web.base.WebFragment;
 import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
+import org.apache.stanbol.reasoners.web.resources.JobsResource;
 import org.apache.stanbol.reasoners.web.resources.ReasoningServiceTaskResource;
 import org.apache.stanbol.reasoners.web.resources.ReasoningServicesResource;
 import org.apache.stanbol.reasoners.web.writers.JenaModelWriter;
@@ -80,6 +81,7 @@ public class ReasonersFragment implement
         //classes.add(ReasonersResource.class);
         classes.add(ReasoningServicesResource.class);
         classes.add(ReasoningServiceTaskResource.class);
+        classes.add(JobsResource.class);
 
         // Writer
         classes.add(JenaModelWriter.class);

Added: 
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=1180025&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/resources/JobsResource.java
 Fri Oct  7 12:35:39 2011
@@ -0,0 +1,103 @@
+package org.apache.stanbol.reasoners.web.resources;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * To ping Jobs
+ * 
+ * @author mac
+ * 
+ */
+@Path("/jobs")
+public class JobsResource extends BaseStanbolResource {
+    private Logger log = LoggerFactory.getLogger(getClass());
+    private ServletContext context;
+
+    public JobsResource(@Context ServletContext servletContext) {
+        this.context = servletContext;
+    }
+
+    @GET
+    @Path("ping")
+    public Response get(@QueryParam("id") String id) {
+        log.info("Pinging 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);
+            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{
+                    return Response.ok("Job is done!").build();
+                }
+            }else{
+                // FIXME Change the HTTP Status code here!
+                return Response.ok("Job is still working").build();
+            }
+        } else {
+            log.info("No job found with id {}", id);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+    }
+
+    /**
+     * 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
+     */
+    private JobManager getJobManager() {
+        log.debug("(getServicesManager()) ");
+        return (JobManager) 
ContextHelper.getServiceFromContext(JobManager.class, this.context);
+    }
+}


Reply via email to