Author: enridaga
Date: Tue Nov 15 23:06:40 2011
New Revision: 1202462

URL: http://svn.apache.org/viewvc?rev=1202462&view=rev
Log:
* Decoupled input preparation from ReasoningServiceExecutor
** Created factory for input management, defined api for input providers
** input providers are still part of the /web submodule, this should be moved 
out in the future
** implemented input providers for url, file, ontonet and rule inputs
** Implemented a simple input managers which collects all currently available 
input providers. This could be moved out and demanded to a SCR component for 
better extendibility in the future.
* Let ReasoningServiceExecutor to be an implementation of Callable
* The reasoners endpoint now supports a new path param 'job' to start a 
background process (needs testing)
* Changed the /jobs rest endpoint to be a subpath of /reasoners
* Fixed a bug on output filtering in the AbstractJenaReasoningService
All this is part of STANBOL-343

Added:
    
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputFactory.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputManager.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputProvider.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/RESTInputFactory.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/SimpleInputManager.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/FileInputProvider.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/OntonetInputProvider.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/RecipeInputProvider.java
    
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/UrlInputProvider.java
Modified:
    
incubator/stanbol/branches/lto-reasoners/reasoners/jena/src/main/java/org/apache/stanbol/reasoners/jena/AbstractJenaReasoningService.java
    incubator/stanbol/branches/lto-reasoners/reasoners/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

Modified: 
incubator/stanbol/branches/lto-reasoners/reasoners/jena/src/main/java/org/apache/stanbol/reasoners/jena/AbstractJenaReasoningService.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/jena/src/main/java/org/apache/stanbol/reasoners/jena/AbstractJenaReasoningService.java?rev=1202462&r1=1202461&r2=1202462&view=diff
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/jena/src/main/java/org/apache/stanbol/reasoners/jena/AbstractJenaReasoningService.java
 (original)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/jena/src/main/java/org/apache/stanbol/reasoners/jena/AbstractJenaReasoningService.java
 Tue Nov 15 23:06:40 2011
@@ -1,6 +1,5 @@
 package org.apache.stanbol.reasoners.jena;
 
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -58,9 +57,10 @@ public abstract class AbstractJenaReason
      */
     @Override
     public InfModel run(Model data) {
-        log.info("Called run(Model data)");
-        InfGraph inferredGraph = this.reasoner.bind(data.getGraph());
-        return ModelFactory.createInfModel(inferredGraph);
+        log.debug(" run(Model data)");
+        InfModel im = ModelFactory.createInfModel(this.reasoner, data);
+        im.prepare();
+        return im;
     }
 
     /**
@@ -73,6 +73,7 @@ public abstract class AbstractJenaReason
      */
     @Override
     public InfModel run(Model data, List<Rule> rules) {
+        log.debug(" run(Model data, List<Rule> rules)");
         InfGraph inferredGraph = customReasoner(rules).bind(data.getGraph());
         return ModelFactory.createInfModel(inferredGraph);
     }
@@ -91,7 +92,7 @@ public abstract class AbstractJenaReason
                                   Map<String,List<String>> parameters) throws 
UnsupportedTaskException,
                                                            
ReasoningServiceException,
                                                            
InconsistentInputException {
-        log.info("Called runTask(String taskID,Model data,List<Rule> 
rules,boolean filtered,Map<String,List<String>> parameters)");
+        log.debug(" runTask(String taskID,Model data,List<Rule> rules,boolean 
filtered,Map<String,List<String>> parameters)");
         if (taskID.equals(ReasoningService.Tasks.CLASSIFY)) {
             if (rules != null) {
                 return classify(data, rules);
@@ -118,6 +119,7 @@ public abstract class AbstractJenaReason
     public Set<Statement> runTask(String taskID, Model data) throws 
UnsupportedTaskException,
                                                             
ReasoningServiceException,
                                                             
InconsistentInputException {
+        log.debug(" runTask(String taskID, Model data)");
         if (taskID.equals(ReasoningService.Tasks.CLASSIFY)) {
             return classify(data);
         } else if (taskID.equals(ReasoningService.Tasks.ENRICH)) {
@@ -140,6 +142,7 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Reasoner customReasoner(List<Rule> customRules) {
+        log.debug(" customReasoner(List<Rule> customRules)");
         List<Rule> standardRules = ((FBRuleReasoner) this.reasoner).getRules();
         standardRules.addAll(customRules);
         return new GenericRuleReasoner(standardRules);
@@ -158,6 +161,7 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Set<Statement> classify(Model data) {
+        log.debug(" classify(Model data)");
         return run(data).listStatements().filterKeep(new 
PropertyFilter(RDF.type)).toSet();
     }
 
@@ -176,6 +180,7 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Set<Statement> classify(Model data, List<Rule> rules) {
+        log.debug(" classify(Model data, List<Rule> rules)");
         return run(data, rules).listStatements().filterKeep(new 
PropertyFilter(RDF.type)).toSet();
     }
 
@@ -191,11 +196,20 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Set<Statement> enrich(Model data, boolean filtered) {
-        Set<Statement> statements = run(data).listStatements().toSet();
-        if (filtered) {
-            return prune(data.listStatements().toSet(), statements);
+        log.debug(" enrich(Model data, boolean filtered)");
+        // Since the input model is modified by the reasoner,
+        // We keep the original list to prune the data after, if necessary
+        if(filtered){
+            Set<Statement> original = new HashSet<Statement>();
+            original.addAll(data.listStatements().toSet());
+            log.debug(" original statements are: {}",original.size());
+            InfModel i = run(data);
+            Set<Statement> inferred = i.listStatements().toSet();
+            log.debug(" inferred statements are: {}",inferred.size());
+            return prune(original, inferred);
+        }else{
+            return run(data).listStatements().toSet();
         }
-        return statements;
     }
 
     /**
@@ -206,12 +220,14 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected final Set<Statement> prune(Set<Statement> first, Set<Statement> 
second) {
+        log.debug(" prune(Set<Statement> first[{}], Set<Statement> 
second[{}])",first.size(),second.size());
         Set<Statement> remove = new HashSet<Statement>();
         for (Statement s : second) {
             if (first.contains(s)) {
                 remove.add(s);
             }
         }
+        log.debug(" ---- removing {} statements from 
{}",first.size(),second.size());
         second.removeAll(remove);
         return second;
     }
@@ -227,6 +243,7 @@ public abstract class AbstractJenaReason
      * @return
      */
     public Set<Statement> enrich(Model data) {
+        log.debug(" enrich(Model data)");
         return enrich(data, true);
     }
 
@@ -243,11 +260,20 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Set<Statement> enrich(Model data, List<Rule> rules, boolean 
filtered) {
-        Set<Statement> statements = run(data, rules).listStatements().toSet();
-        if (filtered) {
-            return prune(data.listStatements().toSet(), statements);
+        log.debug(" enrich(Model data, List<Rule> rules, boolean filtered)");
+        // Since the input model is modified by the reasoner,
+        // We keep the original list to prune the data after, if necessary
+        if(filtered){
+            Set<Statement> original = new HashSet<Statement>();
+            original.addAll(data.listStatements().toSet());
+            log.debug(" original statements are: {}",original.size());
+            InfModel i = run(data, rules);
+            Set<Statement> inferred = i.listStatements().toSet();
+            log.debug(" inferred statements are: {}",inferred.size());
+            return prune(original, inferred);
+        }else{
+            return run(data, rules).listStatements().toSet();
         }
-        return statements;
     }
 
     /**
@@ -262,6 +288,7 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected Set<Statement> enrich(Model data, List<Rule> rules) {
+        log.debug(" enrich(Model data, List<Rule> rules)");
         return enrich(data, rules, true);
     }
 
@@ -273,6 +300,7 @@ public abstract class AbstractJenaReason
      */
     @Override
     public boolean isConsistent(Model data) {
+        log.debug(" isConsistent(Model data)");
         return isConsistent(run(data).validate());
     }
 
@@ -288,6 +316,7 @@ public abstract class AbstractJenaReason
      */
     @Override
     public boolean isConsistent(Model data, List<Rule> rules) {
+        log.debug(" isConsistent(Model data, List<Rule> rules)");
         return isConsistent(run(data, rules).validate());
     }
 
@@ -303,9 +332,12 @@ public abstract class AbstractJenaReason
      * @return
      */
     protected boolean isConsistent(ValidityReport report) {
+        log.debug(" isConsistent(ValidityReport report)");
+        if(log.isDebugEnabled()){
         Iterator<Report> it = report.getReports();
-        while (it.hasNext()) {
-            log.info("Report: {}", it.next());
+            while (it.hasNext()) {
+                log.debug("Report: {}", it.next());
+            }
         }
         return report.isClean();
     }

Modified: incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml?rev=1202462&r1=1202461&r2=1202462&view=diff
==============================================================================
--- incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml (original)
+++ incubator/stanbol/branches/lto-reasoners/reasoners/pom.xml Tue Nov 15 
23:06:40 2011
@@ -43,7 +43,8 @@
     <module>jobs/api</module>
     <module>owlapi</module>
     <module>jena</module>
-    <!--module>hermit</module-->
+    <module>test</module>
+    <module>hermit</module>
     <!--module>base</module-->
     <module>owllink</module>
     <module>web</module>

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputFactory.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputFactory.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputFactory.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,14 @@
+package org.apache.stanbol.reasoners.servicesapi;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ReasoningServiceInputFactory {
+
+    /**
+     * Creates a new {@see ReasoningServiceInputManager} with registered {@see 
ReasoningServiceInputProvider}
+     * 
+     * @return
+     */
+    public ReasoningServiceInputManager 
createInputManager(Map<String,List<String>> parameters);
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputManager.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputManager.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputManager.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputManager.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,42 @@
+package org.apache.stanbol.reasoners.servicesapi;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputProvider;
+
+public interface ReasoningServiceInputManager {
+
+    /**
+     * Add an input provider
+     * 
+     * @param provider
+     */
+    public void addInputProvider(ReasoningServiceInputProvider provider);
+
+    /**
+     * Remove the input provider
+     * 
+     * @param provider
+     */
+    public void removeInputProvider(ReasoningServiceInputProvider provider);
+
+    /**
+     * Get the input data. This should iterate over the collection from all 
the registered input providers.
+     * 
+     * Consider that this can be called more then once, to obtain more then 
one input depending on the type.
+     * 
+     * It is the Type of the object to instruct about its usage.
+     * 
+     * @param type
+     * @return
+     */
+    public <T> Iterator<T> getInputData(Class<T> type);
+    
+    /**
+     * Returns the immutable list of registered providers.
+     * 
+     * @return
+     */
+    public List<ReasoningServiceInputProvider> getProviders();
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputProvider.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputProvider.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/servicesapi/src/main/java/org/apache/stanbol/reasoners/servicesapi/ReasoningServiceInputProvider.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,23 @@
+package org.apache.stanbol.reasoners.servicesapi;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+public interface ReasoningServiceInputProvider {
+
+    /**
+     * The input data form this provider.
+     * 
+     * @param type
+     * @return
+     */
+    public <T> Iterator<T> getInput(Class<T> type) throws IOException;
+    
+    /**
+     * If this provider adapts the input to the specified type.
+     * 
+     * @param type
+     * @return
+     */
+    public <T> boolean adaptTo(Class<T> type);
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/RESTInputFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/RESTInputFactory.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/RESTInputFactory.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/RESTInputFactory.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,98 @@
+package org.apache.stanbol.reasoners.web.input.impl;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+
+import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputFactory;
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputManager;
+import org.apache.stanbol.reasoners.web.input.provider.impl.FileInputProvider;
+import 
org.apache.stanbol.reasoners.web.input.provider.impl.OntonetInputProvider;
+import 
org.apache.stanbol.reasoners.web.input.provider.impl.RecipeInputProvider;
+import org.apache.stanbol.reasoners.web.input.provider.impl.UrlInputProvider;
+import org.apache.stanbol.rules.base.api.RuleStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RESTInputFactory implements ReasoningServiceInputFactory {
+    ONManager onm;
+    RuleStore rStore;
+    
+    private Logger log = LoggerFactory.getLogger(getClass());
+    
+    public RESTInputFactory(ONManager onm,RuleStore rStore){
+        this.onm = onm;
+        this.rStore = rStore;
+    }
+    
+    @Override
+    public ReasoningServiceInputManager 
createInputManager(Map<String,List<String>> parameters) {
+        ReasoningServiceInputManager inmgr = new SimpleInputManager();
+        String scope = null;
+        String session = null;
+        for(Entry<String,List<String>> entry : parameters.entrySet()){
+            if (entry.getKey().equals("url")) {
+                if(!entry.getValue().isEmpty()){
+                    // We keep only the first value 
+                    // XXX (make sense support multiple values?)
+                    inmgr.addInputProvider(new 
UrlInputProvider(entry.getValue().iterator().next()));
+                }else{
+                    // Parameter exists with no value
+                    log.error("Parameter 'url' must have a value!");
+                    throw new 
WebApplicationException(Response.Status.BAD_REQUEST);
+                }
+            }else
+            if (entry.getKey().equals("file")) {
+                if(!entry.getValue().isEmpty()){
+                    // We keep only the first value
+                    // FIXME We create the file once again...
+                    inmgr.addInputProvider(new FileInputProvider(new 
File(entry.getValue().iterator().next())));
+                }else{
+                    // Parameter exists with no value
+                    log.error("Parameter 'url' must have a value!");
+                    throw new 
WebApplicationException(Response.Status.BAD_REQUEST);
+                }
+            }else
+            if(entry.getKey().equals("scope")){
+                if(!entry.getValue().isEmpty()){
+                    scope = entry.getValue().iterator().next();
+                }else{
+                    // Parameter exists with no value
+                    log.error("Parameter 'scope' must have a value!");
+                    throw new 
WebApplicationException(Response.Status.BAD_REQUEST);
+                }
+               
+            }else
+            if(entry.getKey().equals("session")){
+                if(!entry.getValue().isEmpty()){
+                    session = entry.getValue().iterator().next();
+                }else{
+                    // Parameter exists with no value
+                    log.error("Parameter 'session' must have a value!");
+                    throw new 
WebApplicationException(Response.Status.BAD_REQUEST);
+                }
+               
+            }else
+            if(entry.getKey().equals("recipe")){
+                if(!entry.getValue().isEmpty()){
+                    inmgr.addInputProvider(new RecipeInputProvider(rStore, 
entry.getValue().iterator().next()));
+                }else{
+                    // Parameter exists with no value
+                    log.error("Parameter 'recipe' must have a value!");
+                    throw new 
WebApplicationException(Response.Status.BAD_REQUEST);
+                }
+               
+            }
+        }
+        if(scope!=null){
+            inmgr.addInputProvider(new OntonetInputProvider(onm, scope, 
session));
+        }
+        return inmgr;
+    }
+
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/SimpleInputManager.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/SimpleInputManager.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/SimpleInputManager.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/impl/SimpleInputManager.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,132 @@
+package org.apache.stanbol.reasoners.web.input.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputManager;
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SimpleInputManager implements ReasoningServiceInputManager {
+
+    private Logger logger = LoggerFactory.getLogger(SimpleInputManager.class);
+
+    private List<ReasoningServiceInputProvider> providers;
+
+    public SimpleInputManager() {
+        this.providers = new ArrayList<ReasoningServiceInputProvider>();
+    }
+
+    @Override
+    public void addInputProvider(ReasoningServiceInputProvider provider) {
+        providers.add(provider);
+    }
+
+    @Override
+    public void removeInputProvider(ReasoningServiceInputProvider provider) {
+        providers.remove(provider);
+    }
+
+    @Override
+    public <T> Iterator<T> getInputData(final Class<T> type) {
+        final List<ReasoningServiceInputProvider> fProviders = getProviders();
+        return new Iterator<T>() {
+            private Iterator<T> current = null;
+            private Iterator<ReasoningServiceInputProvider> pIterator = 
fProviders.iterator();
+
+            /**
+             * Set the next provider as the current one. Returns true if a 
non-empty iterator have been set in
+             * the current variable, false if no (more) providers are 
available.
+             * 
+             * @return
+             */
+            private boolean nextProvider() {
+                if (pIterator.hasNext()) {
+                    ReasoningServiceInputProvider provider = pIterator.next();
+                    if (provider.adaptTo(type)) {
+                        // If this provider can adapt
+                        try {
+                            current = provider.getInput(type);
+                        } catch (IOException e) {
+                            // This is bad, but we can go on to the next :)
+                            logger.error("Cannot get input from provider", e);
+                            return nextProvider();
+                        }
+                        // If is empty, try the next
+                        if (current.hasNext() == false) {
+                            return nextProvider();
+                        } else {
+                            return true;
+                        }
+                    } else {
+                        // If this provider cannot adapt, try the next
+                        return nextProvider();
+                    }
+                } else {
+                    // No providers anymore
+                    return false;
+                }
+            }
+
+            @Override
+            public boolean hasNext() {
+                if (current == null) {
+                    // initialize the iterator
+                    if (nextProvider()) {
+                        return current.hasNext();
+                    } else {
+                        // No provider available, iterator is empty
+                        return false;
+                    }
+                } else if (current.hasNext()) {
+                    return true;
+                } else {
+                    // If the current iterator has finished, try the next
+                    if (nextProvider()) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+            @Override
+            public T next() {
+                if (current == null) {
+                    // initialize the iterator
+                    if (nextProvider()) {
+                        return current.next();
+                    } else {
+                        throw new IllegalStateException("Iterator has no more 
items");
+                    }
+                }else{
+                    if(current.hasNext()){
+                        return current.next();
+                    }else{
+                        // This has finished, try the next (if any)
+                        if (nextProvider()) {
+                            return current.next();
+                        } else {
+                            throw new IllegalStateException("Iterator has no 
more items");
+                        }
+                    }
+                }
+            }
+
+            @Override
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+
+        };
+    }
+
+    @Override
+    public List<ReasoningServiceInputProvider> getProviders() {
+        return Collections.unmodifiableList(providers);
+    }
+
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/FileInputProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/FileInputProvider.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/FileInputProvider.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/FileInputProvider.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,12 @@
+package org.apache.stanbol.reasoners.web.input.provider.impl;
+
+import java.io.File;
+
+
+public class FileInputProvider extends UrlInputProvider {
+
+    public FileInputProvider(File file) {
+        super(file.toURI().toString());
+    }
+
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/OntonetInputProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/OntonetInputProvider.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/OntonetInputProvider.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/OntonetInputProvider.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,201 @@
+package org.apache.stanbol.reasoners.web.input.provider.impl;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.stanbol.ontologymanager.ontonet.api.ONManager;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyScope;
+import org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologySpace;
+import org.apache.stanbol.owl.transformation.JenaToOwlConvert;
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputProvider;
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.MissingImportEvent;
+import org.semanticweb.owlapi.model.MissingImportListener;
+import org.semanticweb.owlapi.model.OWLAxiom;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+import org.semanticweb.owlapi.model.OWLOntologyLoaderListener;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLOntologySetProvider;
+import org.semanticweb.owlapi.util.OWLOntologyMerger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.rdf.model.StmtIterator;
+
+public class OntonetInputProvider implements ReasoningServiceInputProvider {
+
+    private final Logger log = LoggerFactory.getLogger(UrlInputProvider.class);
+
+    private String scopeId;
+    private String sessionId;
+    private ONManager onManager;
+
+    public OntonetInputProvider(ONManager onManager, String scopeId) {
+        this.onManager = onManager;
+        this.scopeId = scopeId;
+        this.sessionId = null;
+    }
+
+    public OntonetInputProvider(ONManager onManager, String scopeId, String 
sessionId) {
+        this.onManager = onManager;
+        this.scopeId = scopeId;
+        this.sessionId = sessionId;
+    }
+
+    @Override
+    public <T> Iterator<T> getInput(Class<T> type) throws IOException {
+        // This ontology is already a merged version, no need to iterate over 
imported ones
+        final OWLOntology o = getFromOntonet();
+        if (type.isAssignableFrom(OWLAxiom.class)) {
+            final Iterator<OWLAxiom> iterator = o.getAxioms().iterator();
+            return new Iterator<T>() {
+
+                @Override
+                public boolean hasNext() {
+                    return iterator.hasNext();
+                }
+
+                @SuppressWarnings("unchecked")
+                @Override
+                public T next() {
+                    return (T) iterator.next();
+                }
+
+                @Override
+                public void remove() {
+                    // This iterator is read-only
+                    throw new UnsupportedOperationException("Cannot remove 
statements from the iterator");
+                }
+
+            };
+        } else if (type.isAssignableFrom(Statement.class)) {
+            final OntModel input = new 
JenaToOwlConvert().ModelOwlToJenaConvert(o, "RDF/XML");
+            final StmtIterator iterator = input.listStatements();
+            return new Iterator<T>() {
+
+                @Override
+                public boolean hasNext() {
+                    return iterator.hasNext();
+                }
+
+                @SuppressWarnings("unchecked")
+                @Override
+                public T next() {
+                    return (T) iterator.next();
+                }
+
+                @Override
+                public void remove() {
+                    // This iterator is read-only
+                    throw new UnsupportedOperationException("Cannot remove 
statements from the iterator");
+                }
+            };
+        } else {
+            throw new UnsupportedOperationException("This provider does not 
adapt to the given type");
+        }
+    }
+
+    @Override
+    public <T> boolean adaptTo(Class<T> type) {
+        if (type.isAssignableFrom(OWLAxiom.class) || 
type.isAssignableFrom(Statement.class)) return true;
+        return false;
+    }
+
+    private OWLOntology getFromOntonet() throws IOException {
+        try {
+            OntologyScope scope = null;
+            synchronized (onManager) {
+                scope = onManager.getScopeRegistry().getScope(this.scopeId);
+
+            }
+            if (scope == null) {
+                log.error("Scope {} cannot be retrieved", this.scopeId);
+                throw new IOException("Scope " + this.scopeId + " cannot be 
retrieved");
+            }
+            OntologySpace sessionSpace = null;
+            if (this.sessionId != null) {
+                IRI sessionIRI = IRI.create(this.sessionId);
+                sessionSpace = scope.getSessionSpace(sessionIRI.toString());
+            }
+            OntologySpace coreSpace = scope.getCoreSpace();
+            Set<OWLOntology> coreOntologies = coreSpace.getOntologies(true);
+            log.info("Found {} ontologies in core space", 
coreOntologies.size());
+            OntologySpace customSpace = scope.getCustomSpace();
+            Set<OWLOntology> customOntologies = 
customSpace.getOntologies(true);
+            log.info("Found {} ontologies in custom space", 
coreOntologies.size());
+
+            Set<OWLOntology> sessionOntologies = new HashSet<OWLOntology>();
+            log.info("Found {} ontologies in session space", 
coreOntologies.size());
+
+            if (sessionSpace != null) {
+                // FIXME
+                // We collect all the ontologies in session (here we use
+                // 'false')
+                // The reason is that the set contains also an ontology which 
is
+                // the
+                // root of the session space, with buggy owl:import
+                sessionOntologies.addAll(sessionSpace.getOntologies(false));
+            }
+
+            final Set<OWLOntology> set = new HashSet<OWLOntology>();
+            set.addAll(coreOntologies);
+            set.addAll(customOntologies);
+            set.addAll(sessionOntologies);
+            /**
+             * Now we merge the ontologies
+             */
+            OWLOntologyMerger merger = new OWLOntologyMerger(new 
OWLOntologySetProvider() {
+                @Override
+                public Set<OWLOntology> getOntologies() {
+                    return set;
+                }
+            });
+            return merger.createMergedOntology(createOWLOntologyManager(),
+                IRI.create("reasoners:input-" + System.currentTimeMillis()));
+        } catch (OWLOntologyCreationException e) {
+            log.error("The network for scope/session cannot be retrieved:", e);
+            throw new IllegalArgumentException("The network for scope/session 
cannot be retrieved");
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    private OWLOntologyManager createOWLOntologyManager() {
+        // We isolate here the creation of the temporary manager
+        // TODO How to behave when resolving owl:imports?
+        // We should set the manager to use a service to lookup for ontologies,
+        // instead of trying on the web
+        // directly
+        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
+
+        // FIXME Which is the other way of doing this?
+        // Maybe -> OWLOntologyManagerProperties();
+        manager.setSilentMissingImportsHandling(true);
+        // Listening for missing imports
+        manager.addMissingImportListener(new MissingImportListener() {
+            @Override
+            public void importMissing(MissingImportEvent arg0) {
+                log.warn("Missing import {} ", arg0.getImportedOntologyURI());
+            }
+        });
+        manager.addOntologyLoaderListener(new OWLOntologyLoaderListener() {
+
+            @Override
+            public void finishedLoadingOntology(LoadingFinishedEvent arg0) {
+                log.info("Finished loading {} (imported: {})", 
arg0.getOntologyID(), arg0.isImported());
+            }
+
+            @Override
+            public void startedLoadingOntology(LoadingStartedEvent arg0) {
+                log.info("Started loading {} (imported: {}) ...", 
arg0.getOntologyID(), arg0.isImported());
+                log.info(" ... from {}", arg0.getDocumentIRI().toString());
+            }
+        });
+        return manager;
+    }
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/RecipeInputProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/RecipeInputProvider.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/RecipeInputProvider.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/RecipeInputProvider.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,99 @@
+package org.apache.stanbol.reasoners.web.input.provider.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputProvider;
+import org.apache.stanbol.rules.base.api.NoSuchRecipeException;
+import org.apache.stanbol.rules.base.api.Recipe;
+import org.apache.stanbol.rules.base.api.RuleStore;
+import org.apache.stanbol.rules.base.api.util.RuleList;
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.SWRLRule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RecipeInputProvider implements ReasoningServiceInputProvider {
+    private final Logger log = 
LoggerFactory.getLogger(RecipeInputProvider.class);
+
+    private RuleStore store;
+    private String recipeId;
+
+    public RecipeInputProvider(RuleStore store,String recipeId){
+        this.store = store;
+        this.recipeId = recipeId;
+    }
+    
+    @Override
+    public <T> Iterator<T> getInput(Class<T> type) throws IOException {
+        if(!type.isAssignableFrom(SWRLRule.class)){
+            log.error("Cannot adapt to this type {}", type.getCanonicalName());
+            throw new UnsupportedOperationException("Cannot adapt to " + 
type.getCanonicalName());
+        }
+        List<SWRLRule> rules = null;
+        if (recipeId != null) {
+            long start = System.currentTimeMillis();
+            log.info("[start] Prepare rules for OWLApi ");
+
+         // If recipe exists, return it as a list of SWRL rules
+            rules = new ArrayList<SWRLRule>();
+            try {
+                Recipe recipe = null;
+                synchronized (store) {
+                    recipe = store.getRecipe(IRI.create(recipeId));            
        
+                }
+                log.debug("Recipe is: {}", recipe);
+                RuleList ruleList = recipe.getkReSRuleList();
+                log.debug("RuleList is: {}",ruleList);
+                for(org.apache.stanbol.rules.base.api.Rule r : ruleList ){
+                    SWRLRule swrl = r.toSWRL(OWLManager.getOWLDataFactory());
+                    log.debug("Prepared rule: {}",swrl);
+                    rules.add(swrl);
+                }
+            } catch (NoSuchRecipeException e) {
+                log.error("Recipe {} does not exists", recipeId);
+                throw new IOException(e);
+            }
+
+            long end = System.currentTimeMillis();
+            log.info("[end] Prepared {} rules for OWLApi in {} ms.", 
rules.size(), (end - start));
+            
+        }
+        if(rules == null){
+            log.error("No rules have been loaded");
+            throw new IOException("No rules loaded");
+        }
+        final Iterator<SWRLRule> iterator = 
Collections.unmodifiableList(rules).iterator();
+        return new Iterator<T>(){
+
+            @Override
+            public boolean hasNext() {
+                return iterator.hasNext();
+            }
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public T next() {
+                return (T) iterator.next();
+            }
+
+            @Override
+            public void remove() {
+                log.error("Cannot remove items from this iterator. This may be 
cused by an error in the program");
+                throw new UnsupportedOperationException("Cannot remove items 
from this iterator");
+            }
+            
+        };
+    }
+
+    @Override
+    public <T> boolean adaptTo(Class<T> type) {
+        if(type.isAssignableFrom(SWRLRule.class)) return true;
+        return false;
+    }
+
+}

Added: 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/UrlInputProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/UrlInputProvider.java?rev=1202462&view=auto
==============================================================================
--- 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/UrlInputProvider.java
 (added)
+++ 
incubator/stanbol/branches/lto-reasoners/reasoners/web/src/main/java/org/apache/stanbol/reasoners/web/input/provider/impl/UrlInputProvider.java
 Tue Nov 15 23:06:40 2011
@@ -0,0 +1,147 @@
+package org.apache.stanbol.reasoners.web.input.provider.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.stanbol.reasoners.servicesapi.ReasoningServiceInputProvider;
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.MissingImportEvent;
+import org.semanticweb.owlapi.model.MissingImportListener;
+import org.semanticweb.owlapi.model.OWLAxiom;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+import org.semanticweb.owlapi.model.OWLOntologyLoaderListener;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.rdf.model.StmtIterator;
+
+public class UrlInputProvider implements ReasoningServiceInputProvider {
+    private final Logger log = LoggerFactory.getLogger(UrlInputProvider.class);
+    private String url;
+    
+    public UrlInputProvider(String url) {
+        this.url = url;
+    }
+
+    @Override
+    public <T> Iterator<T> getInput(Class<T> type) throws IOException {
+        if (type.isAssignableFrom(OWLAxiom.class)) {
+         // We add additional axioms
+            OWLOntology fromUrl;
+            try {
+                fromUrl = 
createOWLOntologyManager().loadOntologyFromOntologyDocument(
+                    IRI.create(url));
+            } catch (OWLOntologyCreationException e) {
+                throw new IOException(e);
+            }
+            Set<OWLOntology> all = fromUrl.getImportsClosure();
+            List<OWLAxiom> axiomList = new ArrayList<OWLAxiom>();
+            for(OWLOntology o : all){
+               axiomList.addAll(o.getAxioms());
+            }
+            final Iterator<OWLAxiom> iterator = axiomList.iterator();
+            return new Iterator<T>(){
+
+                @Override
+                public boolean hasNext() {
+                    return iterator.hasNext();
+                }
+
+                @SuppressWarnings("unchecked")
+                @Override
+                public T next() { 
+                    return (T) iterator.next();
+                }
+
+                @Override
+                public void remove() {
+                    // This iterator is read-only
+                    throw new UnsupportedOperationException("Cannot remove 
statements from the iterator");
+                }
+                
+            };
+        } else if (type.isAssignableFrom(Statement.class)) {
+            final OntModel input = ModelFactory.createOntologyModel();
+            synchronized (url) {
+                try {
+                    // FIXME: use instead:
+                    // FileManager.get().loadModel
+                    input.read(url);
+                } catch (Exception e) {
+                    throw new IOException(e);
+                }
+            }
+            final StmtIterator iterator = input.listStatements();
+            return new Iterator<T>(){
+                
+                @Override
+                public boolean hasNext() {
+                    return iterator.hasNext();
+                }
+
+                @SuppressWarnings("unchecked")
+                @Override
+                public T next() {
+                    return (T) iterator.next();
+                }
+
+                @Override
+                public void remove() {
+                    // This iterator is read-only
+                    throw new UnsupportedOperationException("Cannot remove 
statements from the iterator");
+                }
+            };
+        } else {
+            throw new UnsupportedOperationException("This provider does not 
adapt to the given type");
+        }
+    }
+
+    @Override
+    public <T> boolean adaptTo(Class<T> type) {
+        if (type.isAssignableFrom(OWLAxiom.class) || 
type.isAssignableFrom(Statement.class)) return true;
+        return false;
+    }
+
+    @SuppressWarnings("deprecation")
+    private OWLOntologyManager createOWLOntologyManager() {
+        // We isolate here the creation of the temporary manager
+        // TODO How to behave when resolving owl:imports?
+        // We should set the manager to use a service to lookup for ontologies,
+        // instead of trying on the web
+        // directly
+        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
+       
+        // FIXME Which is the other way of doing this?
+        // Maybe -> OWLOntologyManagerProperties();
+        manager.setSilentMissingImportsHandling(true);
+        // Listening for missing imports
+        manager.addMissingImportListener(new MissingImportListener() {
+            @Override
+            public void importMissing(MissingImportEvent arg0) {
+                log.warn("Missing import {} ", arg0.getImportedOntologyURI());
+            }
+        });
+        manager.addOntologyLoaderListener(new OWLOntologyLoaderListener(){
+
+            @Override
+            public void finishedLoadingOntology(LoadingFinishedEvent arg0) {
+                log.info("Finished loading {} (imported: 
{})",arg0.getOntologyID(),arg0.isImported());
+            }
+
+            @Override
+            public void startedLoadingOntology(LoadingStartedEvent arg0) {
+                log.info("Started loading {} (imported: {}) 
...",arg0.getOntologyID(),arg0.isImported());
+                log.info(" ... from {}",arg0.getDocumentIRI().toString());
+            }});
+        return manager;
+    }
+}

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=1202462&r1=1202461&r2=1202462&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
 Tue Nov 15 23:06:40 2011
@@ -1,18 +1,24 @@
 package org.apache.stanbol.reasoners.web.resources;
 
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import javax.servlet.ServletContext;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
 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.reasoners.web.utils.ReasoningServiceResult;
+import org.apache.stanbol.reasoners.web.utils.ResponseTaskBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -22,18 +28,20 @@ import org.slf4j.LoggerFactory;
  * @author mac
  * 
  */
-@Path("/jobs")
+@Path("/reasoners/jobs")
 public class JobsResource extends BaseStanbolResource {
     private Logger log = LoggerFactory.getLogger(getClass());
     private ServletContext context;
+    private HttpHeaders headers;
 
-    public JobsResource(@Context ServletContext servletContext) {
+    public JobsResource(@Context ServletContext servletContext,@Context 
HttpHeaders headers) {
         this.context = servletContext;
+        this.headers = headers;
     }
 
     @GET
-    @Path("ping")
-    public Response get(@QueryParam("id") String id) {
+    @Path("ping/{jid}")
+    public Response get(@PathParam("jid") String id) {
         log.info("Pinging job {}", id);
 
         // No id
@@ -52,7 +60,26 @@ public class JobsResource extends BaseSt
                     // 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();
+                    Object o;
+                    try {
+                        o = f.get();
+                        if(o instanceof ReasoningServiceResult<?>){
+                            ReasoningServiceResult<?> result = 
(ReasoningServiceResult<?>) f.get();
+                            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);
+                    }
                 }
             }else{
                 // FIXME Change the HTTP Status code here!
@@ -97,7 +124,7 @@ public class JobsResource extends BaseSt
      * @return
      */
     private JobManager getJobManager() {
-        log.debug("(getServicesManager()) ");
+        log.debug("(getJobManager()) ");
         return (JobManager) 
ContextHelper.getServiceFromContext(JobManager.class, this.context);
     }
 }


Reply via email to