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 2013/12/15 22:29:27 UTC

svn commit: r1551061 - in /jena/branches/jena-fuseki-new-ui: src-dev/dev/ src/main/java/org/apache/jena/fuseki/server/ src/main/java/org/apache/jena/fuseki/servlets/ src/test/java/org/apache/jena/fuseki/ src/test/java/org/apache/jena/fuseki/http/

Author: andy
Date: Sun Dec 15 21:29:27 2013
New Revision: 1551061

URL: http://svn.apache.org/r1551061
Log:
First class REST actions on datasets.
Tests for extended GSP operations.
Rename SPARA_REST* as SPARQL_GSP*.

Added:
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java
      - copied, changed from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
      - copied, changed from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java
      - copied, changed from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_RW.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/FileSender.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestGSP.java
Removed:
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_RW.java
Modified:
    jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionBase.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/http/TestDatasetAccessorHTTP.java

Modified: jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java (original)
+++ jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java Sun Dec 15 21:29:27 2013
@@ -23,6 +23,12 @@ public class PROJECT {
     // All TODO and XXX
     // Graph upload in ActionDatasets == Upload.
 
+    // GSP, and no query string => quads operation. JENA-607
+    
+    // txn and nonTxn server set up for tests.
+    
+    // Enables, disable R/RW on SPARQL_UberServlet(renamed) and quads operations.
+    
     // Remove all direct naming (put in separate servlet if ever needed)  
     //   last place : SPARQL_UberServlet
     

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java Sun Dec 15 21:29:27 2013
@@ -51,7 +51,6 @@ public class FusekiServletContextListene
     public void contextInitialized(ServletContextEvent sce) {
         //confLog.info("contextInitialized");
         ServletContext cxt = sce.getServletContext() ;
-        confLog.info(cxt.getServletContextName()) ;
         init() ;
     }
 

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionBase.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionBase.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionBase.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionBase.java Sun Dec 15 21:29:27 2013
@@ -28,7 +28,7 @@ import javax.servlet.ServletException ;
 import javax.servlet.http.HttpServletRequest ;
 import javax.servlet.http.HttpServletResponse ;
 
-import org.apache.jena.atlas.logging.Log ;
+//import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.fuseki.Fuseki ;
 import org.apache.jena.fuseki.HttpNames ;
 import org.apache.jena.web.HttpSC ;
@@ -50,7 +50,7 @@ public abstract class ActionBase extends
     
     @Override 
     public void init() {
-        Log.info(this, getServletContext().getServletContextName()) ;
+        log.info("ServletContextName="+getServletContext().getServletContextName()) ;
         //super.init() ;
     }
    

Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java?rev=1551061&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java Sun Dec 15 21:29:27 2013
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.servlets;
+
+import static org.apache.jena.fuseki.HttpNames.* ;
+
+import java.io.IOException ;
+import java.util.Locale ;
+
+import javax.servlet.ServletException ;
+import javax.servlet.http.HttpServletRequest ;
+import javax.servlet.http.HttpServletResponse ;
+
+import org.apache.jena.fuseki.server.CounterName ;
+
+/** Common point for */ 
+public abstract class ActionREST extends ActionSPARQL
+{
+    public ActionREST()
+    { super() ; }
+
+    @Override
+    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        // Direct all verbs to our common framework.
+        doCommon(request, response) ;
+    }
+    
+    @Override
+    protected void perform(HttpAction action) {
+        dispatch(action) ;
+    }
+
+    private void dispatch(HttpAction action) {
+        HttpServletRequest req = action.request ;
+        HttpServletResponse resp = action.response ;
+        String method = req.getMethod().toUpperCase(Locale.ROOT) ;
+
+        if (method.equals(METHOD_GET))
+            doGet$(action);
+        else if (method.equals(METHOD_HEAD))
+            doHead$(action);
+        else if (method.equals(METHOD_POST))
+            doPost$(action);
+        else if (method.equals(METHOD_PATCH))
+            doPatch$(action) ;
+        else if (method.equals(METHOD_OPTIONS))
+            doOptions$(action) ;
+        else if (method.equals(METHOD_TRACE))
+            //doTrace(action) ;
+            ServletOps.errorMethodNotAllowed("TRACE") ;
+        else if (method.equals(METHOD_PUT))
+            doPut$(action) ;   
+        else if (method.equals(METHOD_DELETE))
+            doDelete$(action) ;
+        else
+            ServletOps.errorNotImplemented("Unknown method: "+method) ;
+    }
+
+    // Counter wrappers
+    
+    private final void doGet$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPget) ;
+        try {
+            doGet(action) ;
+            incCounter(action.srvRef, CounterName.GSPgetGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPgetBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doHead$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPhead) ;
+        try {
+            doHead(action) ;
+            incCounter(action.srvRef, CounterName.GSPheadGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPheadBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doPost$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPpost) ;
+        try {
+            doPost(action) ;
+            incCounter(action.srvRef, CounterName.GSPpostGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPpostBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doPatch$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPpatch) ;
+        try {
+            doPatch(action) ;
+            incCounter(action.srvRef, CounterName.GSPpatchGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPpatchBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doDelete$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPdelete) ;
+        try {
+            doDelete(action) ;
+            incCounter(action.srvRef, CounterName.GSPdeleteGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPdeleteBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doPut$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPput) ;
+        try {
+            doPut(action) ;
+            incCounter(action.srvRef, CounterName.GSPputGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPputBad) ;
+            throw ex ;
+        }
+    }
+
+    private final void doOptions$(HttpAction action) {
+        incCounter(action.srvRef, CounterName.GSPoptions) ;
+        try {
+            doOptions(action) ;
+            incCounter(action.srvRef, CounterName.GSPoptionsGood) ;
+        } catch ( ActionErrorException ex) {
+            incCounter(action.srvRef, CounterName.GSPoptionsBad) ;
+            throw ex ;
+        }
+    }
+    
+    protected abstract void doGet(HttpAction action) ;
+    protected abstract void doHead(HttpAction action) ;
+    protected abstract void doPost(HttpAction action) ;
+    protected abstract void doPatch(HttpAction action) ;
+    protected abstract void doDelete(HttpAction action) ;
+    protected abstract void doPut(HttpAction action) ;
+    protected abstract void doOptions(HttpAction action) ;
+}

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java Sun Dec 15 21:29:27 2013
@@ -70,8 +70,7 @@ public abstract class ActionSPARQL exten
         executeAction(action) ;
     }
 
-    // Execute - no stats.
-    // Intercept point for the UberServlet 
+    // Execute - allow interception before stats added.
     protected void executeAction(HttpAction action) {
         executeLifecycle(action) ;
     }

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java Sun Dec 15 21:29:27 2013
@@ -43,7 +43,7 @@ import com.hp.hpl.jena.sparql.core.Datas
  * dataset URI.
  */
 
-public class REST_Quads extends SPARQL_REST {
+public abstract class REST_Quads extends SPARQL_GSP {
     // Not supported: GSP direct naming.
 
     public REST_Quads() {

Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java?rev=1551061&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_R.java Sun Dec 15 21:29:27 2013
@@ -0,0 +1,98 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.servlets ;
+
+import static java.lang.String.format ;
+
+import java.io.IOException ;
+
+import javax.servlet.ServletOutputStream ;
+
+import org.apache.jena.atlas.web.MediaType ;
+import org.apache.jena.atlas.web.TypedOutputStream ;
+import org.apache.jena.fuseki.HttpNames ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFLanguages ;
+
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+
+/**
+ * Servlet for operations directly on a dataset - REST(ish) behaviour on the
+ * dataset URI.
+ */
+
+public class REST_Quads_R extends REST_Quads {
+    public REST_Quads_R() {
+        super() ;
+    }
+
+    @Override
+    protected void validate(HttpAction action) { }
+
+    @Override
+    protected void doGet(HttpAction action) {
+        MediaType mediaType = HttpAction.contentNegotationQuads(action) ;
+        ServletOutputStream output ;
+        try {
+            output = action.response.getOutputStream() ;
+        } catch (IOException ex) {
+            ServletOps.errorOccurred(ex) ;
+            output = null ;
+        }
+
+        TypedOutputStream out = new TypedOutputStream(output, mediaType) ;
+        Lang lang = RDFLanguages.contentTypeToLang(mediaType.getContentType()) ;
+        if ( lang == null )
+            lang = RDFLanguages.TRIG ;
+
+        if ( action.verbose )
+            action.log.info(format("[%d]   Get: Content-Type=%s, Charset=%s => %s", action.id,
+                                   mediaType.getContentType(), mediaType.getCharset(), lang.getName())) ;
+        if ( !RDFLanguages.isQuads(lang) )
+            ServletOps.errorBadRequest("Not a quads format: " + mediaType) ;
+
+        action.beginRead() ;
+        try {
+            DatasetGraph dsg = action.getActiveDSG() ;
+            RDFDataMgr.write(out, dsg, lang) ;
+            ServletOps.success(action) ;
+        } finally {
+            action.endRead() ;
+        }
+    }
+
+    @Override
+    protected void doOptions(HttpAction action) {
+        action.response.setHeader(HttpNames.hAllow, "GET, HEAD, OPTIONS") ;
+        action.response.setHeader(HttpNames.hContentLengh, "0") ;
+        ServletOps.success(action) ;
+    }
+
+    @Override
+    protected void doHead(HttpAction action) {
+        action.beginRead() ;
+        try {
+            MediaType mediaType = HttpAction.contentNegotationQuads(action) ;
+            ServletOps.success(action) ;
+        } finally {
+            action.endRead() ;
+        }
+    }
+}

Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java?rev=1551061&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java Sun Dec 15 21:29:27 2013
@@ -0,0 +1,158 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.servlets ;
+
+import org.apache.jena.fuseki.FusekiLib ;
+import org.apache.jena.riot.RiotException ;
+import org.apache.jena.riot.system.StreamRDF ;
+import org.apache.jena.riot.system.StreamRDFLib ;
+
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ;
+
+/**
+ * Servlet for operations directly on a dataset - REST(ish) behaviour on the
+ * dataset URI.
+ */
+
+public class REST_Quads_RW extends REST_Quads_R {
+
+    public REST_Quads_RW() {
+        super() ;
+    }
+
+    @Override
+    protected void validate(HttpAction action) { }
+
+    @Override
+    protected void doPost(HttpAction action) {
+        if ( !action.getDatasetRef().allowDatasetUpdate )
+            ServletOps.errorMethodNotAllowed("POST") ;
+
+        if ( action.isTransactional() )
+            doPutPostTxn(action, false) ;
+        else
+            doPutPostNonTxn(action, false) ;
+    }
+
+    @Override
+    protected void doPut(HttpAction action) {
+        if ( !action.getDatasetRef().allowDatasetUpdate )
+            ServletOps.errorMethodNotAllowed("POST") ;
+
+        if ( action.isTransactional() )
+            doPutPostTxn(action, false) ;
+        else
+            doPutPostNonTxn(action, false) ;
+    }
+
+    // These are very similar to SPARQL_REST_RW.addDataIntoTxn/nonTxn
+    // Maybe can be usually DRYed.
+
+    @Override
+    protected void doDelete(HttpAction action) {
+        ServletOps.errorMethodNotAllowed("DELETE") ;
+    }
+
+    @Override
+    protected void doPatch(HttpAction action) {
+        ServletOps.errorMethodNotAllowed("PATCH") ;
+    }
+
+    private void doPutPostTxn(HttpAction action, boolean clearFirst) {
+        action.beginWrite() ;
+        try {
+            DatasetGraph dsg = action.getActiveDSG() ;
+            StreamRDF dest = StreamRDFLib.dataset(dsg) ;
+            Upload.incomingData(action, dest, false) ;
+            action.commit() ;
+            ServletOps.success(action) ;
+        } catch (RiotException ex) {
+            // Parse error
+            action.abort() ;
+            ServletOps.errorBadRequest(ex.getMessage()) ;
+        } catch (Exception ex) {
+            // Something else went wrong. Backout.
+            action.abort() ;
+            ServletOps.errorOccurred(ex.getMessage()) ;
+        } finally {
+            action.endWrite() ;
+        }
+    }
+    
+    private void doPutPostNonTxn(HttpAction action, boolean clearFirst) {
+        DatasetGraph dsgTmp = DatasetGraphFactory.createMem() ;
+        StreamRDF dest = StreamRDFLib.dataset(dsgTmp) ;
+
+        try {
+            Upload.incomingData(action, dest, false) ;
+        } catch (RiotException ex) {
+            ServletOps.errorBadRequest(ex.getMessage()) ;
+        }
+        // Now insert into dataset
+        action.beginWrite() ;
+        try {
+            FusekiLib.addDataInto(dsgTmp, action.getActiveDSG()) ;
+            action.commit() ;
+            ServletOps.success(action) ;
+        } catch (Exception ex) {
+            // We're in the non-transactional branch, this probably will not
+            // work
+            // but it might and there is no harm safely trying.
+            try {
+                action.abort() ;
+            } catch (Exception ex2) {}
+            ServletOps.errorOccurred(ex.getMessage()) ;
+        } finally {
+            action.endWrite() ;
+        }
+
+    }
+
+//    static int counter = 0 ;
+//
+//    protected void doPostTriplesGSP(HttpAction action, Lang lang) {
+//        // Old code.
+//        // Assumes transactional.
+//        action.beginWrite() ;
+//        try {
+//            DatasetGraph dsg = action.getActiveDSG() ;
+//            // log.info(format("[%d] ** Content-length: %d", action.id,
+//            // action.request.getContentLength())) ;
+//
+//            String name = action.request.getRequestURL().toString() ;
+//            if ( !name.endsWith("/") )
+//                name = name + "/" ;
+//            name = name + (++counter) ;
+//            Node gn = NodeFactory.createURI(name) ;
+//            Graph g = dsg.getGraph(gn) ;
+//            StreamRDF dest = StreamRDFLib.graph(g) ;
+//            LangRIOT parser = RiotReader.createParser(action.request.getInputStream(), lang, name, dest) ;
+//            parser.parse() ;
+//            action.log.info(format("[%d] Location: %s", action.id, name)) ;
+//            action.response.setHeader("Location", name) ;
+//            action.commit() ;
+//            ServletOps.successCreated(action) ;
+//        } catch (IOException ex) {
+//            action.abort() ;
+//        } finally {
+//            action.endWrite() ;
+//        }
+//    }
+}

Copied: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java (from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java)
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java?p2=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java&p1=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java&r1=1550957&r2=1551061&rev=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java Sun Dec 15 21:29:27 2013
@@ -18,31 +18,20 @@
 
 package org.apache.jena.fuseki.servlets;
 
-import static org.apache.jena.fuseki.HttpNames.* ;
-
-import java.io.IOException ;
 import java.util.Enumeration ;
-import java.util.Locale ;
 
-import javax.servlet.ServletException ;
 import javax.servlet.http.HttpServletRequest ;
-import javax.servlet.http.HttpServletResponse ;
 
 import org.apache.jena.fuseki.HttpNames ;
-import org.apache.jena.fuseki.server.CounterName ;
 import org.apache.jena.riot.system.IRIResolver ;
-import org.slf4j.Logger ;
-import org.slf4j.LoggerFactory ;
 
 import com.hp.hpl.jena.graph.Graph ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.NodeFactory ;
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 
-public abstract class SPARQL_REST extends ActionSPARQL
+public abstract class SPARQL_GSP extends ActionREST
 {
-    protected static Logger classLog = LoggerFactory.getLogger(SPARQL_REST.class) ;
-
     protected final static Target determineTarget(HttpAction action) {
         // Delayed until inside a transaction.
         if ( action.getActiveDSG() == null )
@@ -61,14 +50,8 @@ public abstract class SPARQL_REST extend
                 ServletOps.errorBadRequest("Neither default graph nor named graph specified; no direct name") ;
         }
         
-//        // Put these in action.
-//        String datasetUri = mapRequestToDataset(action) ;
-//        String reqUri = action.request.getRequestURI() ;
-//        String serviceName = ActionLib.mapRequestToService(dsRef, reqUri, reqUri) ;
-
         String dsTarget = action.datasetName ;
         
-        
         if ( dftGraph )
             return Target.createDefault(action.getActiveDSG()) ;
         
@@ -80,7 +63,7 @@ public abstract class SPARQL_REST extend
         // Strictly, a bit naughty on the URI resolution.  But more sensible. 
         // Base is dataset.
         
-        // XXX Remove service.
+        // XXX Remove any service.
         
         String base = action.request.getRequestURL().toString() ; //wholeRequestURL(request) ;
         // Make sure it ends in "/", ie. dataset as container.
@@ -176,139 +159,10 @@ public abstract class SPARQL_REST extend
         }
     }
 
-    public SPARQL_REST()
+    public SPARQL_GSP()
     { super() ; }
 
     @Override
-    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        // Direct all verbs to our common framework.
-        doCommon(request, response) ;
-    }
-    
-    private void maybeSetLastModified(HttpServletResponse resp, long lastModified) {
-        if (resp.containsHeader(HEADER_LASTMOD)) return ;
-        if (lastModified >= 0) resp.setDateHeader(HEADER_LASTMOD, lastModified);
-    }
-    
-    @Override
-    protected void perform(HttpAction action) {
-        dispatch(action) ;
-    }
-
-    private void dispatch(HttpAction action) {
-        HttpServletRequest req = action.request ;
-        HttpServletResponse resp = action.response ;
-        String method = req.getMethod().toUpperCase(Locale.ROOT) ;
-
-        if (method.equals(METHOD_GET))
-            doGet$(action);
-        else if (method.equals(METHOD_HEAD))
-            doHead$(action);
-        else if (method.equals(METHOD_POST))
-            doPost$(action);
-        else if (method.equals(METHOD_PATCH))
-            doPatch$(action) ;
-        else if (method.equals(METHOD_OPTIONS))
-            doOptions$(action) ;
-        else if (method.equals(METHOD_TRACE))
-            //doTrace(action) ;
-            ServletOps.errorMethodNotAllowed("TRACE") ;
-        else if (method.equals(METHOD_PUT))
-            doPut$(action) ;   
-        else if (method.equals(METHOD_DELETE))
-            doDelete$(action) ;
-        else
-            ServletOps.errorNotImplemented("Unknown method: "+method) ;
-    }
-
-    // Counter wrappers
-    
-    private final void doGet$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPget) ;
-        try {
-            doGet(action) ;
-            incCounter(action.srvRef, CounterName.GSPgetGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPgetBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doHead$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPhead) ;
-        try {
-            doHead(action) ;
-            incCounter(action.srvRef, CounterName.GSPheadGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPheadBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doPost$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPpost) ;
-        try {
-            doPost(action) ;
-            incCounter(action.srvRef, CounterName.GSPpostGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPpostBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doPatch$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPpatch) ;
-        try {
-            doPatch(action) ;
-            incCounter(action.srvRef, CounterName.GSPpatchGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPpatchBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doDelete$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPdelete) ;
-        try {
-            doDelete(action) ;
-            incCounter(action.srvRef, CounterName.GSPdeleteGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPdeleteBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doPut$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPput) ;
-        try {
-            doPut(action) ;
-            incCounter(action.srvRef, CounterName.GSPputGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPputBad) ;
-            throw ex ;
-        }
-    }
-
-    private final void doOptions$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPoptions) ;
-        try {
-            doOptions(action) ;
-            incCounter(action.srvRef, CounterName.GSPoptionsGood) ;
-        } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPoptionsBad) ;
-            throw ex ;
-        }
-    }
-    
-    protected abstract void doGet(HttpAction action) ;
-    protected abstract void doHead(HttpAction action) ;
-    protected abstract void doPost(HttpAction action) ;
-    protected abstract void doPatch(HttpAction action) ;
-    protected abstract void doDelete(HttpAction action) ;
-    protected abstract void doPut(HttpAction action) ;
-    protected abstract void doOptions(HttpAction action) ;
-    
-    @Override
     protected void validate(HttpAction action)
     {
         HttpServletRequest request = action.request ;

Copied: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java (from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java)
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java?p2=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java&p1=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java&r1=1550957&r2=1551061&rev=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java Sun Dec 15 21:29:27 2013
@@ -32,9 +32,9 @@ import org.apache.jena.riot.* ;
 import com.hp.hpl.jena.graph.Graph ;
 
 /** Only the READ operations */
-public class SPARQL_REST_R extends SPARQL_REST
+public class SPARQL_GSP_R extends SPARQL_GSP
 {
-    public SPARQL_REST_R()
+    public SPARQL_GSP_R()
     { super() ; }
     
     

Copied: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java (from r1550957, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_RW.java)
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java?p2=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java&p1=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_RW.java&r1=1550957&r2=1551061&rev=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_RW.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java Sun Dec 15 21:29:27 2013
@@ -31,9 +31,9 @@ import com.hp.hpl.jena.graph.Graph ;
 import com.hp.hpl.jena.sparql.graph.GraphFactory ;
 
 /** The WRITE operations added to the READ operations */
-public class SPARQL_REST_RW extends SPARQL_REST_R
+public class SPARQL_GSP_RW extends SPARQL_GSP_R
 {
-    public SPARQL_REST_RW()
+    public SPARQL_GSP_RW()
     { super() ; }
 
     @Override

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java Sun Dec 15 21:29:27 2013
@@ -96,9 +96,10 @@ public abstract class SPARQL_UberServlet
     private final ActionSPARQL queryServlet    = new SPARQL_QueryDataset() ;
     private final ActionSPARQL updateServlet   = new SPARQL_Update() ;
     private final ActionSPARQL uploadServlet   = new SPARQL_Upload() ;
-    private final ActionSPARQL restServlet_RW  = new SPARQL_REST_RW() ;
-    private final ActionSPARQL restServlet_R   = new SPARQL_REST_R() ;
-    private final ActionSPARQL restQuads       = new REST_Quads() ;
+    private final ActionSPARQL gspServlet_R    = new SPARQL_GSP_R() ;
+    private final ActionSPARQL gspServlet_RW   = new SPARQL_GSP_RW() ;
+    private final ActionSPARQL restQuads_R     = new REST_Quads_R() ;
+    private final ActionSPARQL restQuads_RW    = new REST_Quads_RW() ;
     
     public SPARQL_UberServlet() { super(); }
 
@@ -169,7 +170,10 @@ public abstract class SPARQL_UberServlet
         
         if ( ! hasTrailing && ! hasParams )
         {
-            restQuads.executeLifecycle(action) ;
+            // Check enabled.  But no trailing here.
+            // if ( serviceDispatch(action, desc.readGraphStore, trailing, restQuads_R) ) return ;
+            // if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, restQuads_RW) ) return ;
+            restQuads_RW.executeLifecycle(action) ;
             return ;
         }
         
@@ -212,9 +216,17 @@ public abstract class SPARQL_UberServlet
             // If so, dispatch to that service.
             if ( serviceDispatch(action, desc.query, trailing, queryServlet) ) return ; 
             if ( serviceDispatch(action, desc.update, trailing, updateServlet) ) return ; 
-            if ( serviceDispatch(action, desc.upload, trailing, uploadServlet) ) return ; 
-            if ( serviceDispatch(action, desc.readGraphStore, trailing, restServlet_R) ) return ; 
-            if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, restServlet_RW) ) return ; 
+            if ( serviceDispatch(action, desc.upload, trailing, uploadServlet) ) return ;
+            if ( hasParams ) {
+                if ( serviceDispatch(action, desc.readGraphStore, trailing, gspServlet_R) ) return ; 
+                if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, gspServlet_RW) ) return ;
+            } else {
+                // No parameters - do as a quads operation on the dataset.
+                if ( serviceDispatch(action, desc.readGraphStore, trailing, restQuads_R) ) return ;
+                if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, restQuads_RW) ) return ;
+            }
+                
+            // If no params, its a daatset operation.
         }       
         // There is a trailing part - params are illegal by this point.
         if ( hasParams )
@@ -245,9 +257,9 @@ public abstract class SPARQL_UberServlet
            // Graphs Store Protocol, indirect naming, read
            // Indirect naming. Prefer the R service if available.
            if ( desc.readGraphStore.isActive() )
-               executeRequest(action, restServlet_R, desc.readGraphStore) ;
+               executeRequest(action, gspServlet_R, desc.readGraphStore) ;
            else if ( desc.readWriteGraphStore.isActive() )
-               executeRequest(action, restServlet_RW, desc.readWriteGraphStore) ;
+               executeRequest(action, gspServlet_RW, desc.readWriteGraphStore) ;
            else
                ServletOps.errorMethodNotAllowed(method) ;
            return ;
@@ -256,7 +268,7 @@ public abstract class SPARQL_UberServlet
        // Graphs Store Protocol, indirect naming, write
        if ( ! allowREST_W(action))
            ServletOps.errorForbidden("Forbidden: SPARQL Graph Store Protocol : Write operation : "+method) ;
-       executeRequest(action, restServlet_RW, desc.readWriteGraphStore) ;
+       executeRequest(action, gspServlet_RW, desc.readWriteGraphStore) ;
        return ;
     }
 

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/Upload.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/Upload.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/Upload.java Sun Dec 15 21:29:27 2013
@@ -30,10 +30,7 @@ import org.apache.commons.fileupload.ser
 import org.apache.jena.atlas.io.IO ;
 import org.apache.jena.atlas.web.ContentType ;
 import org.apache.jena.fuseki.FusekiLib ;
-import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.RDFLanguages ;
-import org.apache.jena.riot.RiotParseException ;
-import org.apache.jena.riot.WebContent ;
+import org.apache.jena.riot.* ;
 import org.apache.jena.riot.lang.StreamRDFCounting ;
 import org.apache.jena.riot.system.StreamRDF ;
 import org.apache.jena.riot.system.StreamRDFLib ;
@@ -97,7 +94,9 @@ public class Upload {
                 // Process the input stream
                 String contentTypeHeader = fileStream.getContentType() ;
                 ContentType ct = ContentType.create(contentTypeHeader) ;
-                Lang lang = RDFLanguages.contentTypeToLang(ct.getContentType()) ;
+                Lang lang = null ;
+                if ( ! WebContent.contentTypeTextPlain.equals(ct.getContentType()) )
+                    lang = RDFLanguages.contentTypeToLang(ct.getContentType()) ;
     
                 if ( lang == null ) {
                     String name = fileStream.getName() ; 

Added: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/FileSender.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/FileSender.java?rev=1551061&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/FileSender.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/FileSender.java Sun Dec 15 21:29:27 2013
@@ -0,0 +1,90 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki;
+
+import java.io.IOException ;
+import java.io.PrintStream ;
+import java.net.HttpURLConnection ;
+import java.net.URL ;
+import java.util.ArrayList ;
+import java.util.List ;
+import java.util.UUID ;
+
+import org.apache.jena.atlas.io.IO ;
+
+public class FileSender {
+    // HttpClient 4.3 has MultipartEntity but the 4.2->4.3 change is less
+    // than trivial (and it seems some environemnt fix the HttpClient) 
+    // so here's some code for testing support.
+//    MultipartEntity entity = new MultipartEntity();
+//    entity.addPart(...)
+//    HttpPost request = new HttpPost(url);
+//    request.setEntity(entity);
+//    HttpClient client = new DefaultHttpClient();
+//    HttpResponse response = client.execute(request);
+    
+    class Entry {
+        String fileName ;
+        String content ;
+        String contentType ;
+    }
+    
+    private List<Entry> items = new ArrayList<Entry>() ;
+    
+    private String url ;  
+    
+    public FileSender(String url ) { this.url = url ; }
+    
+    public void add(String filename, String content, String type) {
+        Entry e = new Entry() ;
+        e.fileName = filename ;
+        e.content = content ;
+        e.contentType = type ;
+        items.add(e) ;
+    }
+    
+    public void send(String method) {
+        try {
+            String WNL = "\r\n" ;   // Web newline
+            String boundary = UUID.randomUUID().toString() ;
+            
+            HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true) ;
+            connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
+            PrintStream ps = new PrintStream(connection.getOutputStream()) ;
+            try {
+                for ( Entry e : items ) {
+                    ps.print("--" + boundary+WNL) ;
+                    ps.print("Content-Disposition: form-data; name=\"FILE\"; filename=\""+e.fileName+"\""+WNL) ;
+                    ps.print("Content-Type: "+e.contentType+";charset=UTF-8"+WNL) ;
+                    ps.print(WNL);
+                    ps.print(e.content) ;
+                    ps.print(WNL);
+                }
+                ps.print("--" + boundary + "--"+WNL);
+            } finally {
+                ps.close();
+            }
+            connection.connect(); 
+            int responseCode = connection.getResponseCode();
+        } catch (IOException ex) { IO.exception(ex); }
+    }
+}
+

Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java Sun Dec 15 21:29:27 2013
@@ -54,9 +54,10 @@ public class ServerTest
     public static final int port             = 3535 ;
     public static final String urlRoot       = "http://localhost:"+port+"/" ;
     public static final String datasetPath   = "/dataset" ;
-    public static final String serviceUpdate = "http://localhost:"+port+datasetPath+"/update" ; 
-    public static final String serviceQuery  = "http://localhost:"+port+datasetPath+"/query" ; 
-    public static final String serviceREST   = "http://localhost:"+port+datasetPath+"/data" ;
+    public static final String urlDataset    = "http://localhost:"+port+datasetPath ;
+    public static final String serviceUpdate = urlDataset+"/update" ; 
+    public static final String serviceQuery  = urlDataset+"/query" ; 
+    public static final String serviceREST   = urlDataset+"/data" ;
     
     public static final String gn1       = "http://graph/1" ;
     public static final String gn2       = "http://graph/2" ;
@@ -104,6 +105,7 @@ public class ServerTest
         ServerConfig conf = FusekiConfig.defaultConfiguration(ServerTest.datasetPath, dsg, true, true) ;
         conf.port = ServerTest.port ;
         conf.pagesPort = ServerTest.port ;
+        
         server = new SPARQLServer(conf) ;
         server.start() ;
     }

Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java Sun Dec 15 21:29:27 2013
@@ -38,6 +38,8 @@ import org.junit.runners.Suite ;
     , TestDatasetAccessorHTTP.class
     , TestQuery.class
     , TestAuth.class
+    , TestGSP.class
+    , TestFileUpload.class
 })
 public class TS_Fuseki extends ServerTest
 {

Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java Sun Dec 15 21:29:27 2013
@@ -23,6 +23,7 @@ import java.io.FileWriter ;
 import java.io.IOException ;
 import java.net.URI ;
 import java.net.URISyntaxException ;
+import java.util.Collection ;
 import java.util.HashMap ;
 import java.util.Map ;
 
@@ -32,6 +33,7 @@ import org.apache.jena.atlas.web.auth.Pr
 import org.apache.jena.atlas.web.auth.ScopedAuthenticator ;
 import org.apache.jena.atlas.web.auth.ServiceAuthenticator ;
 import org.apache.jena.atlas.web.auth.SimpleAuthenticator ;
+import org.apache.jena.fuseki.server.DatasetRegistry ;
 import org.apache.jena.fuseki.server.FusekiConfig ;
 import org.apache.jena.fuseki.server.SPARQLServer ;
 import org.apache.jena.fuseki.server.ServerConfig ;
@@ -98,7 +100,9 @@ public class TestAuth extends ServerTest
     @AfterClass
     public static void teardown() {
         server.stop();
-
+        Collection<String> keys = DatasetRegistry.get().keys() ;
+        for ( String k : keys )
+            DatasetRegistry.get().remove(k);
         realmFile.delete();
     }
 

Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestFileUpload.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestFileUpload.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestFileUpload.java Sun Dec 15 21:29:27 2013
@@ -21,6 +21,7 @@ package org.apache.jena.fuseki;
 import static org.apache.jena.fuseki.ServerTest.serviceREST ;
 import org.apache.jena.atlas.junit.BaseTest ;
 import org.junit.AfterClass ;
+import org.junit.Before ;
 import org.junit.BeforeClass ;
 import org.junit.Test ;
 
@@ -41,7 +42,11 @@ public class TestFileUpload extends Base
         ServerTest.freeServer() ;
     }
     
-    @Test public void upload_01()
+    @Before public void beforeTest() {
+        ServerTest.resetServer() ;
+    }
+    
+    @Test public void upload_gsp_01()
     {
         FileSender x = new FileSender(ServerTest.serviceREST+"?default") ;
         x.add("D.ttl", "<http://example/s> <http://example/p> <http://example/o> .", "text/turtle") ;
@@ -52,7 +57,7 @@ public class TestFileUpload extends Base
         assertEquals(1, m.size()) ;
     }
     
-    @Test public void upload_02()
+    @Test public void upload_gsp_02()
     {
         FileSender x = new FileSender(ServerTest.serviceREST+"?default") ;
         x.add("D.ttl", "<http://example/s> <http://example/p> 123 .", "text/turtle") ;
@@ -64,4 +69,60 @@ public class TestFileUpload extends Base
         assertEquals(2, m.size()) ;
     }
 
+    // Beyond strict GSP - no graph selector => dataset
+    @Test public void upload_gsp_03()
+    {
+        FileSender x = new FileSender(ServerTest.serviceREST) ;
+        x.add("D.ttl", "<http://example/s> <http://example/p> <http://example/o> .", "text/turtle") ;
+        x.add("D.trig", "<http://example/g> { <http://example/s> <http://example/p> <http://example/o> }", "text/trig") ;
+        x.send("POST") ;
+        
+        DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+        Model m = du.getModel() ;
+        assertEquals(1, m.size()) ;
+    }
+
+    @Test public void upload_gsp_04()
+    {
+        {
+            DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+            Model m = du.getModel() ;
+            assertEquals(0, m.size()) ;
+        }
+        FileSender x = new FileSender(ServerTest.urlDataset) ;
+        x.add("D.ttl", "<http://example/s> <http://example/p> <http://example/o> .", "text/plain") ;
+        x.add("D.trig", "<http://example/g> { <http://example/s> <http://example/p> 123,456 }", "text/plain") ;
+        x.send("POST") ;
+        
+        DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+        Model m = du.getModel() ;
+        assertEquals(1, m.size()) ;
+        m = du.getModel("http://example/g") ;
+        assertEquals(2, m.size()) ;
+    }
+
+    @Test public void upload_dataset_01() {
+        FileSender x = new FileSender(ServerTest.urlDataset) ;
+        x.add("D.nq", "", "application/-n-quads") ;
+        x.send("PUT") ;
+        
+        DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+        Model m = du.getModel() ;
+        assertEquals(0, m.size()) ;
+        
+    }
+    
+    @Test public void upload_dataset_02() {
+        FileSender x = new FileSender(ServerTest.urlDataset) ;
+        x.add("D.nq", "<http://example/s> <http://example/p> <http://example/o-456> <http://example/g> .", "application/-n-quads") ;
+        x.send("PUT") ;
+        
+        DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+        Model m = du.getModel("http://example/g") ;
+        assertEquals(1, m.size()) ;
+        m = du.getModel() ;
+        assertEquals(0, m.size()) ;
+        
+    }
+
 }

Added: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestGSP.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestGSP.java?rev=1551061&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestGSP.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestGSP.java Sun Dec 15 21:29:27 2013
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki;
+
+import static org.apache.jena.fuseki.ServerTest.serviceQuery ;
+import static org.apache.jena.fuseki.ServerTest.serviceREST ;
+import static org.apache.jena.fuseki.ServerTest.urlDataset ;
+
+import java.io.IOException ;
+import java.io.OutputStream ;
+import java.io.StringReader ;
+
+import org.apache.http.HttpEntity ;
+import org.apache.http.entity.ContentProducer ;
+import org.apache.http.entity.EntityTemplate ;
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.apache.jena.atlas.lib.StrUtils ;
+import org.apache.jena.atlas.web.HttpException ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFFormat ;
+import org.apache.jena.riot.web.HttpOp ;
+import org.apache.jena.web.HttpSC ;
+import org.junit.AfterClass ;
+import org.junit.Before ;
+import org.junit.BeforeClass ;
+import org.junit.Test ;
+
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ;
+import com.hp.hpl.jena.sparql.sse.SSE ;
+
+/** TestDatasetAccessorHTTP does most of the GSP testing.
+ *  This class adds the testing of Fuseki extras.
+ */
+public class TestGSP extends BaseTest 
+{
+    @BeforeClass
+    public static void beforeClass() {
+        ServerTest.allocServer() ;
+        //ServerTest.resetServer() ;
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        ServerTest.freeServer() ;
+    }
+    
+    @Before public void beforeTest() {
+        ServerTest.resetServer() ;
+    }
+    
+    static DatasetGraph data = SSE.parseDatasetGraph(StrUtils.strjoinNL
+        ("(prefix ((: <http://example/>))",
+         "  (dataset",
+         "    (graph (_:x :p 1) (_:x :p 2))" ,
+         "    (graph :g (_:x :p 3))",
+         "))"
+         )) ;
+    
+    /** Create an HttpEntity for the graph */  
+    protected HttpEntity datasetToHttpEntity(final DatasetGraph dsg) {
+
+        final RDFFormat syntax = RDFFormat.NQUADS ;
+        ContentProducer producer = new ContentProducer() {
+            @Override
+            public void writeTo(OutputStream out) throws IOException {
+                RDFDataMgr.write(out, dsg, syntax) ;
+            }
+        } ;
+        EntityTemplate entity = new EntityTemplate(producer) ;
+        String ct = syntax.getLang().getContentType().getContentType() ;
+        entity.setContentType(ct) ;
+        return entity ;
+    }
+    
+    @Test public void gsp_x_01() {
+        gsp_x(urlDataset, urlDataset) ;
+    }
+
+    @Test public void gsp_x_02() {
+        gsp_x(urlDataset, serviceREST) ;
+    }
+
+    @Test public void gsp_x_03() {
+        gsp_x(serviceREST, urlDataset) ;
+    }
+
+    @Test public void gsp_x_04() {
+        gsp_x(serviceREST, urlDataset) ;
+    }
+    private void gsp_x(String outward, String inward) {
+        HttpEntity e = datasetToHttpEntity(data) ;
+        HttpOp.execHttpPut(outward, e);
+        String x = HttpOp.execHttpGetString(inward, "application/n-quads") ;
+        DatasetGraph dsg = DatasetGraphFactory.createMem() ;
+        RDFDataMgr.read(dsg, new StringReader(x), null, Lang.NQUADS) ;
+        assertEquals(2, dsg.getDefaultGraph().size()) ;
+    }
+
+    @Test 
+    public void gsp_x_10()
+    {
+        HttpEntity e = datasetToHttpEntity(data) ;
+        try { 
+            HttpOp.execHttpPost(serviceQuery, e);
+        } catch (HttpException ex) {
+            assertTrue(HttpSC.isClientError(ex.getResponseCode())) ;
+        }
+    }
+}
\ No newline at end of file

Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/http/TestDatasetAccessorHTTP.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/http/TestDatasetAccessorHTTP.java?rev=1551061&r1=1551060&r2=1551061&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/http/TestDatasetAccessorHTTP.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/http/TestDatasetAccessorHTTP.java Sun Dec 15 21:29:27 2013
@@ -47,10 +47,10 @@ public class TestDatasetAccessorHTTP ext
     @AfterClass public static void afterClass()     { ServerTest.freeServer() ; }
     @Before public void before()                    { ServerTest.resetServer() ; }
     
-    @Test(expected=HttpException.class)
+    @Test
     public void test_ds_1()
     {
-        // Can't GET the dataset service.
+        // Can GET the dataset service.
         try {
             HttpOp.execHttpGet(serviceREST) ;
         } catch (HttpException ex) {