You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/05/28 15:30:01 UTC

svn commit: r1598011 - in /jena/Experimental/jena-fuseki2: ./ docs/ src/main/java/org/apache/jena/fuseki/mgt/

Author: andy
Date: Wed May 28 13:30:00 2014
New Revision: 1598011

URL: http://svn.apache.org/r1598011
Log:
Background tasks set the Location: header with a server relative URL to the task created.

Added:
    jena/Experimental/jena-fuseki2/D.trig
    jena/Experimental/jena-fuseki2/backup   (with props)
    jena/Experimental/jena-fuseki2/dwim   (with props)
Modified:
    jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java

Added: jena/Experimental/jena-fuseki2/D.trig
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/D.trig?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/D.trig (added)
+++ jena/Experimental/jena-fuseki2/D.trig Wed May 28 13:30:00 2014
@@ -0,0 +1,3 @@
+prefix : <http://example/>
+
+:g { :s :p :o }

Added: jena/Experimental/jena-fuseki2/backup
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/backup?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/backup (added)
+++ jena/Experimental/jena-fuseki2/backup Wed May 28 13:30:00 2014
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+DB="ds"
+
+curl -v -XPOST 'http://localhost:3030/$/sleep?interval=10000'
+
+curl -v 'http://localhost:3030/$/tasks
\ No newline at end of file

Propchange: jena/Experimental/jena-fuseki2/backup
------------------------------------------------------------------------------
    svn:executable = *

Modified: jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md (original)
+++ jena/Experimental/jena-fuseki2/docs/fuseki-server-protocol.md Wed May 28 13:30:00 2014
@@ -43,6 +43,7 @@ Further operations may be added within t
 | <tt>GET</tt>    | `/$/stats/*{name}*`    |               |
 ||
 | <tt>POST</tt>   | `/$/backup/*{name}*`   |             |
+| <tt>POST</tt>   | `/$/sleep`             |             |
 ||
 | <tt>GET</tt>    | `/$/tasks/`            |               | 
 | <tt>GET</tt>    | `/$/tasks/*{name}*`    |               |
@@ -145,16 +146,51 @@ Pattern: `/$/backup/*{name}*`
 
 This operation initiates a backup and returns a JSON object with the task Id in it.
 
-Backups are written to the sever local directory 'backups' as  gzip-compressed N-Quads files.
+Backups are written to the server local directory 'backups' as  gzip-compressed N-Quads files.
 
 See [Tasks](#tasks) for how to monitor a backups progress.
 
-### Tasks
+## Tasks
+Some operations cause a backgrond task to be executed, backup is an example.
+The result of such operations includes a json object with teh task id and
+also a `Location:` header with the URL of the task created.
+
+The progress of the task can be monitored with HTTP GET operations:
+
 Pattern: `/$/tasks` &ndash; All asynchronous tasks.<br/>
-Pattern: `/$/tasks/*{taskId}*` &ndash; All asynchronous tasks.
+Pattern: `/$/tasks/*{taskId}*` &ndash; A particular task.
 
-Background tasks, such as 'backup', can be monitored by polling.  The URL `/$/tasks` returns a description of all running and recently tasks. A finished task can be indentified by having a "finishPoint" field.
+The URL `/$/tasks` returns a description of all running and recently tasks. A finished task can be identified by having a "finishPoint" field.
 
 Each background task has an id.  The URL `/$/tasks/*{taskId}*` gets a description about one single task.
 
-Details of the last few completed tasks are retained, up to a fixed number. The records will eventually be removed as laters taks complete, and the task URL will then return 404.
+Details of the last few completed tasks are retained, up to a fixed number. The records will eventually be removed as later tasks complete, and the task URL will then return 404.
+
+Pattern: `/$/tasks` ; example:
+```
+[ { 
+    "finished" : "2014-05-28T12:52:51.860+01:00" ,
+    "started" : "2014-05-28T12:52:50.859+01:00" ,
+    "task" : "sleep" ,
+    "taskId" : "1"
+  } ,
+  { 
+    "finished" : "2014-05-28T12:53:24.718+01:00" ,
+    "started" : "2014-05-28T12:53:14.717+01:00" ,
+    "task" : "sleep" ,
+    "taskId" : "2"
+  }
+]
+```
+Pattern: `/$/tasks/1` : example:
+```
+[ { 
+    "finished" : "2014-05-28T13:54:13.608+01:00" ,
+    "started" : "2014-05-28T13:54:03.607+01:00" ,
+    "task" : "backup" ,
+    "taskId" : "1"
+  }
+]
+```
+This is inside an array to make the format returned the same as `/$/tasks`.
+

Added: jena/Experimental/jena-fuseki2/dwim
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/dwim?rev=1598011&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/dwim (added)
+++ jena/Experimental/jena-fuseki2/dwim Wed May 28 13:30:00 2014
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+
+curl -XPOST --header "Content-type: text/trig" --data-binary @D.trig \
+     http://localhost:3030/ds/data

Propchange: jena/Experimental/jena-fuseki2/dwim
------------------------------------------------------------------------------
    svn:executable = *

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionAsyncTask.java Wed May 28 13:30:00 2014
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRes
 import org.apache.jena.atlas.json.JsonValue ;
 import org.apache.jena.atlas.lib.InternalErrorException ;
 import org.apache.jena.fuseki.async.AsyncPool ;
+import org.apache.jena.fuseki.async.AsyncTask ;
 import org.apache.jena.fuseki.servlets.HttpAction ;
 import org.apache.jena.fuseki.servlets.ServletOps ;
 
@@ -55,7 +56,17 @@ public abstract class ActionAsyncTask ex
     final
     protected JsonValue execPostItem(HttpAction action) {
         Runnable task = createRunnable(action) ;
-        return Async.asyncTask(asyncPool, "backup", action.getDataService(), task) ;
+        AsyncTask aTask = Async.execASyncTask(action, AsyncPool.get(), "backup", task) ;
+        Async.setLocationHeader(action, aTask);
+        return Async.asJson(aTask) ;
+    }
+    
+    public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable task) {
+        AsyncTask atask = Async.asyncTask(asyncPool, displayName, action.getDataService(), task) ;
+        Async.setLocationHeader(action, atask);
+        JsonValue v = Async.asJson(atask) ;
+        ServletOps.sendJsonReponse(action, v);
+        return atask ;
     }
     
     protected abstract Runnable createRunnable(HttpAction action) ;

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/ActionSleep.java Wed May 28 13:30:00 2014
@@ -26,12 +26,13 @@ import javax.servlet.http.HttpServletRes
 import org.apache.jena.atlas.json.JsonValue ;
 import org.apache.jena.atlas.lib.Lib ;
 import org.apache.jena.fuseki.async.AsyncPool ;
+import org.apache.jena.fuseki.async.AsyncTask ;
 import org.apache.jena.fuseki.servlets.HttpAction ;
 import org.apache.jena.fuseki.servlets.ServletOps ;
 import org.slf4j.Logger ;
 
 /** A task that kicks off a asynchornous operation that simply waits and exits.  For testing. */
-public class ActionSleep extends ActionCtl
+public class ActionSleep extends ActionCtl /* Not ActionAsyncTask - that is a container */
 {
     public ActionSleep() { super() ; }
     
@@ -44,7 +45,9 @@ public class ActionSleep extends ActionC
     @Override
     protected void perform(HttpAction action) {
         Runnable task = createRunnable(action) ;
-        JsonValue v = Async.asyncTask(AsyncPool.get(), "sleep", null, task) ;
+        AsyncTask aTask = Async.execASyncTask(action, AsyncPool.get(), "sleep", task) ;
+        JsonValue v = Async.asJson(aTask) ;
+        Async.setLocationHeader(action, aTask);
         ServletOps.sendJsonReponse(action, v);
     }
 

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java?rev=1598011&r1=1598010&r2=1598011&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/mgt/Async.java Wed May 28 13:30:00 2014
@@ -18,21 +18,51 @@
 
 package org.apache.jena.fuseki.mgt;
 
+import org.apache.http.HttpHeaders ;
 import org.apache.jena.atlas.json.JsonBuilder ;
 import org.apache.jena.atlas.json.JsonValue ;
 import org.apache.jena.fuseki.async.AsyncPool ;
 import org.apache.jena.fuseki.async.AsyncTask ;
 import org.apache.jena.fuseki.server.DataService ;
+import org.apache.jena.fuseki.servlets.HttpAction ;
 
 public class Async
 {
-    public static JsonValue asyncTask(AsyncPool asyncPool, String displayName, DataService dataService, Runnable task) {
+    public static AsyncTask asyncTask(AsyncPool asyncPool, String displayName, DataService dataService, Runnable task) {
         AsyncTask asyncTask = asyncPool.submit(task, displayName, dataService) ;
+        return asyncTask ;
+    }
+    
+    public static JsonValue asJson(AsyncTask asyncTask) {
         JsonBuilder builder = new JsonBuilder() ;
         builder.startObject("outer") ;
         builder.key(JsonConst.taskId).value(asyncTask.getTaskId()) ;
         builder.finishObject("outer") ;
         return builder.build() ;
     }
+    
+    public static void setLocationHeader(HttpAction action, AsyncTask asyncTask) {
+        String x = action.getRequest().getRequestURI() ;
+        if ( ! x.endsWith("/") )
+            x += "/" ;
+        x += asyncTask.getTaskId() ;
+        //String x = "/$/tasks/"+asyncTask.getTaskId() ;
+        action.getResponse().setHeader(HttpHeaders.LOCATION, x) ;
+    }
+
+    public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable runnable) {
+        AsyncTask atask = Async.asyncTask(asyncPool, "backup", action.getDataService(), runnable) ;
+        Async.setLocationHeader(action, atask); 
+        return atask ;
+    }
+    
+    // Combined does not work very well - e.g sleep does not set Location.
+//        public static AsyncTask execASyncTask(HttpAction action, AsyncPool asyncPool, String displayName, Runnable task) {
+//        AsyncTask atask = Async.asyncTask(asyncPool, displayName, action.getDataService(), task) ;
+//        Async.setLocationHeader(action, atask);
+//        JsonValue v = Async.asJson(atask) ;
+//        ServletOps.sendJsonReponse(action, v);
+//        return atask ;
+//    }
 }