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 2012/11/16 21:41:16 UTC

svn commit: r1410561 - in /jena/trunk: jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/ jena-arq/src/main/java/org/openjena/riot/ jena-fuseki/src-dev/dev/ jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/

Author: andy
Date: Fri Nov 16 20:41:15 2012
New Revision: 1410561

URL: http://svn.apache.org/viewvc?rev=1410561&view=rev
Log:
Support for multifile upload (Graph Store Protocol)

Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphTrackActive.java
    jena/trunk/jena-arq/src/main/java/org/openjena/riot/WebContent.java
    jena/trunk/jena-fuseki/src-dev/dev/RunFuseki.java
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
    jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphTrackActive.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphTrackActive.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphTrackActive.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphTrackActive.java Fri Nov 16 20:41:15 2012
@@ -58,8 +58,9 @@ public abstract class DatasetGraphTrackA
     public void abort()
     {
         checkActive() ;
-        _abort() ;
+        // Set before calling _abort, which might throw an exception. 
         inTransaction = false ;
+        _abort() ;
     }
     
     @Override

Modified: jena/trunk/jena-arq/src/main/java/org/openjena/riot/WebContent.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/openjena/riot/WebContent.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/org/openjena/riot/WebContent.java (original)
+++ jena/trunk/jena-arq/src/main/java/org/openjena/riot/WebContent.java Fri Nov 16 20:41:15 2012
@@ -55,7 +55,7 @@ public class WebContent
     public static final String contentTypeTriX              = "application/trix+xml" ;
     public static final String contentTypeOctets            = "application/octet-stream" ;
     public static final String contentTypeMultiMixed        = "multipart/mixed" ;
-    public static final String contentTypeMultiForm         = "multipart/form" ;
+    public static final String contentTypeMultiFormData     = "multipart/form-data" ;
     public static final String contentTypeMultiAlt          = "multipart/alternative" ;
 
     public static final String contentTypeRdfJson			= "application/rdf+json" ;

Modified: jena/trunk/jena-fuseki/src-dev/dev/RunFuseki.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src-dev/dev/RunFuseki.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src-dev/dev/RunFuseki.java (original)
+++ jena/trunk/jena-fuseki/src-dev/dev/RunFuseki.java Fri Nov 16 20:41:15 2012
@@ -53,9 +53,13 @@ public class RunFuseki
     private static void main1()
     {
         FusekiCmd.main(
-                     //"--update", "--mem", "--gsp", "--uber", "/ds"
+                     "--update", "--mem", "--gsp", "--uber", "/ds"
+                     
+                     //"--update", "--mem", "/ds"
+                     
                      //"--update", "--loc=/home/afs/tmp/DB", "--set=tdb:unionDefaultGraph=true", "--update", "/ds"
-                     "--update", "--memtdb", "--set=tdb:unionDefaultGraph=true", "--update", "/ds"
+                     //"--update", "--memtdb", "--set=tdb:unionDefaultGraph=true", "--update", "/ds"
+                     
                     //"-v", 
                     //"--debug",
                     //"--update",

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java Fri Nov 16 20:41:15 2012
@@ -81,9 +81,10 @@ public class DumpServlet extends HttpSer
             out.print(dumpRequest(req)) ;
             out.println() ;
                         
-            out.println("==== Body");
+            out.println(">>>> Body");
             out.println() ;
             printBody(out, req) ;
+            out.println("<<<< Body");
             
             out.println("==== ServletContext");
             out.println() ;
@@ -206,7 +207,7 @@ public class DumpServlet extends HttpSer
             }
 
             pw.println() ;
-            printBody(pw, req) ;
+            //printBody(pw, req) ;
 
             pw.close() ;
             sw.close() ;
@@ -226,12 +227,13 @@ public class DumpServlet extends HttpSer
             // This is a dump - try to do something that works, even if inefficient.
             in.mark(100*1024) ;
 
-
-        while(in.ready())
+        while(true)
         {
-            pw.println(in.readLine());
+            String x = in.readLine() ;
+            if ( x == null )
+                break ;
+            pw.println(x) ;
         }
-
         try { in.reset() ;} catch (IOException e) { System.out.println("DumpServlet: Reset of content failed: "+e) ; }
     }
     

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java Fri Nov 16 20:41:15 2012
@@ -204,7 +204,7 @@ public abstract class SPARQL_REST extend
 
     private void dispatch(HttpActionREST action)
     {
-        HttpServletRequest req = action.request ;
+     HttpServletRequest req = action.request ;
         HttpServletResponse resp = action.response ;
         String method = req.getMethod().toUpperCase() ;
 
@@ -285,18 +285,22 @@ public abstract class SPARQL_REST extend
     protected static DatasetGraph parseBody(HttpActionREST action)
     {
         String contentTypeHeader = action.request.getContentType() ;
+        
         if ( contentTypeHeader == null )
             errorBadRequest("No content type: "+contentTypeHeader) ;
             // lang = Lang.guess(action.request.getRequestURI()) ;
         
         ContentType ct = ContentType.parse(contentTypeHeader) ;
         
+        String base = wholeRequestURL(action.request) ;
+        
         // Use WebContent names
-        if ( WebContent.contentTypeMultiForm.equalsIgnoreCase(ct.getContentType()) )
+        if ( WebContent.contentTypeMultiFormData.equalsIgnoreCase(ct.getContentType()) )
         {
-            //log.warn("multipart/form-data not supported (yet)") ;
-            error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "multipart/form-data not supported") ;
-            return null ;
+//            //log.warn("multipart/form-data not supported (yet)") ;
+//            error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "multipart/form-data not supported") ;
+            Graph graphTmp = SPARQL_Upload.upload(action.id,  action.getDatasetRef(), action.request, action.response, base) ;
+            return DatasetGraphFactory.create(graphTmp) ;
         }
         
         if (WebContent.contentTypeMultiMixed.equals(ct.getContentType()) )
@@ -326,8 +330,6 @@ public abstract class SPARQL_REST extend
         
         try {
             InputStream input = action.request.getInputStream() ;
-            String base = wholeRequestURL(action.request) ;
-            
             boolean buffering = false ;
             if ( buffering )
             {

Modified: jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java?rev=1410561&r1=1410560&r2=1410561&view=diff
==============================================================================
--- jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java (original)
+++ jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java Fri Nov 16 20:41:15 2012
@@ -52,7 +52,7 @@ public class SPARQL_Upload extends SPARQ
 {
     private static ErrorHandler errorHandler = ErrorHandlerFactory.errorHandlerStd(log) ;
     
-    private class HttpActionUpload extends HttpAction {
+    private static class HttpActionUpload extends HttpAction {
         public HttpActionUpload(long id, DatasetRef desc, HttpServletRequest request, HttpServletResponse response, boolean verbose)
         {
             super(id, desc, request, response, verbose) ;
@@ -91,18 +91,63 @@ public class SPARQL_Upload extends SPARQ
         if ( ! isMultipart )
             error(HttpSC.BAD_REQUEST_400 , "Not a file upload") ;
         
-        ServletFileUpload upload = new ServletFileUpload();
-        // Locking only needed over the insert into dataset
+        long tripleCount = -1 ;
+        action.beginWrite() ;
         try {
-            String graphName = null ;
-            Graph graphTmp = GraphFactory.createGraphMem() ;
-            Node gn = null ;
-            String name = null ;  
-            ContentType ct = null ;
-            Lang lang = null ;
-            int tripleCount = 0 ;
+            Graph graphTmp = GraphFactory.createDefaultGraph() ;
+            String graphName = upload(action, graphTmp, "http://example/upload-base/") ;
+            tripleCount = graphTmp.size() ;
             
-            FileItemIterator iter = upload.getItemIterator(request);
+            log.info(format("[%d] Upload: Graph: %s (%d triple(s))", 
+                            action.id, graphName,  tripleCount)) ;
+
+            if ( graphName.equals(HttpNames.valueDefault) ) 
+                action.getActiveDSG().getDefaultGraph().getBulkUpdateHandler().add(graphTmp) ;
+            else
+            {
+                Node gn = Node.createURI(graphName) ;
+                action.getActiveDSG().getGraph(gn).getBulkUpdateHandler().add(graphTmp) ;
+            }
+            tripleCount = graphTmp.size();
+            action.commit() ;
+        } catch (RuntimeException ex)
+        {
+            // If anything went wrong, try to backout.
+            try { action.abort() ; } catch (Exception ex2) {}
+            errorOccurred(ex.getMessage()) ;
+        } 
+        finally { action.endWrite() ; }
+        try {
+            response.setContentType("text/plain") ;
+            response.getOutputStream().print("Triples = "+tripleCount) ;
+            success(action) ;
+        }
+        catch (Exception ex) { errorOccurred(ex) ; }
+    }
+    
+    static public Graph upload(long id, DatasetRef desc, HttpServletRequest request, HttpServletResponse response, String destination)
+    {
+        HttpActionUpload action = new HttpActionUpload(id, desc, request, response, false) ;
+        Graph graphTmp = GraphFactory.createDefaultGraph() ;
+        String graphName = upload(action, graphTmp, destination) ;
+        return graphTmp ;
+    }
+    
+    /** @return any graph name found.
+     */
+    
+    static private String upload(HttpActionUpload action, Graph graphDst, String base)
+    {
+        ServletFileUpload upload = new ServletFileUpload();
+        // Locking only needed over the insert into the dataset
+        String graphName = null ;
+        String name = null ;  
+        ContentType ct = null ;
+        Lang lang = null ;
+        int tripleCount = 0 ;
+
+        try {
+            FileItemIterator iter = upload.getItemIterator(action.request);
             while (iter.hasNext()) {
                 FileItemStream item = iter.next();
                 String fieldName = item.getFieldName();
@@ -131,81 +176,52 @@ public class SPARQL_Upload extends SPARQ
                                 if ( iri.getRawPath().charAt(0) != '/' )
                                     errorBadRequest("Bad IRI: Path does not start '/': "+graphName) ;
                             } 
-                            gn = Node.createURI(graphName) ;
                         }
                     }
                     else if ( fieldName.equals(HttpNames.paramDefaultGraphURI) )
                         graphName = null ;
                     else
                         // Add file type?
-                        log.info(format("[%d] Upload: Field="+fieldName+" - ignored")) ;
+                        log.info(format("[%d] Upload: Field=%s ignored", action.id, fieldName)) ;
                 } else {
                     // Process the input stream
                     name = item.getName() ; 
                     if ( name == null || name.equals("") || name.equals("UNSET FILE NAME") ) 
                         errorBadRequest("No name for content - can't determine RDF syntax") ;
-                    
+
                     String contentTypeHeader = item.getContentType() ;
                     ct = ContentType.parse(contentTypeHeader) ;
-                    
+
                     lang = FusekiLib.langFromContentType(ct.getContentType()) ;
                     if ( lang == null )
                         lang = Lang.guess(name) ;
                     if ( lang == null )
                         // Desperate.
                         lang = Lang.RDFXML ;
-                    
-                    String base = "http://example/upload-base/" ;
+
                     // We read into a in-memory graph, then (if successful) update the dataset.
                     // This isolates errors.
-                    Sink<Triple> sink = new SinkTriplesToGraph(graphTmp) ;
+                    Sink<Triple> sink = new SinkTriplesToGraph(graphDst) ;
                     LangRIOT parser = RiotReader.createParserTriples(stream, lang, base, sink) ;
                     parser.getProfile().setHandler(errorHandler) ;
+                    log.info(format("[%d] Upload: Filename: %s, Content-Type=%s, Charset=%s => %s", 
+                                    action.id, name,  ct.getContentType(), ct.getCharset(), lang.getName())) ;
                     try {
                         parser.parse() ;
                     } 
                     catch (RiotException ex) { errorBadRequest("Parse error: "+ex.getMessage()) ; }
                     finally { sink.close() ; }
-                    
-                    tripleCount = graphTmp.size() ;
-                    //DatasetGraph dsgTmp = DatasetGraphFactory.create(graphTmp) ;
                 }
             }    
-                
+
             if ( graphName == null )
                 graphName = "default" ;
-            log.info(format("[%d] Upload: Filename: %s, Content-Type=%s, Charset=%s => (%s,%s,%d triple(s))", 
-                                      action.id, name,  ct.getContentType(), ct.getCharset(), graphName, lang.getName(), tripleCount)) ;
-
-            // Delay updating until all form fields processed to get the graph name 
-            action.beginWrite() ;
-            try {
-                if ( graphName.equals(HttpNames.valueDefault) ) 
-                    action.getActiveDSG().getDefaultGraph().getBulkUpdateHandler().add(graphTmp) ;
-                else
-                    action.getActiveDSG().getGraph(gn).getBulkUpdateHandler().add(graphTmp) ;
-                action.commit() ;
-            } catch (RuntimeException ex)
-            {
-                // If anything went wrong, try to backout.
-                action.abort() ;
-                errorOccurred(ex.getMessage()) ;
-                return ;
-            } 
-            finally { action.endWrite() ; }
-                    
-            response.setContentType("text/plain") ;
-            response.getOutputStream().print("Triples = "+tripleCount) ;
-            success(action) ;
+            return graphName ;
         }
         catch (ActionErrorException ex) { throw ex ; }
-        catch (Exception ex)
-        {
-            errorOccurred(ex) ;
-            return ;
-        }
-    }
-    
+        catch (Exception ex)            { errorOccurred(ex) ; return null ; }
+    }            
+
     @Override
     protected void validate(HttpServletRequest request)
     {}