JENA-1435: Refactoring, renaming, and clearing up

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/1533ade6
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/1533ade6
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/1533ade6

Branch: refs/heads/master
Commit: 1533ade629199625e9f74b2240e2c18c5f5b5e35
Parents: 5ec56a6
Author: Andy Seaborne <[email protected]>
Authored: Fri Nov 24 17:14:34 2017 +0000
Committer: Andy Seaborne <[email protected]>
Committed: Mon Dec 11 14:56:08 2017 +0000

----------------------------------------------------------------------
 .../apache/jena/fuseki/cmds/FusekiBasicCmd.java |   4 +-
 .../apache/jena/fuseki/build/FusekiBuilder.java |  64 ++-
 .../org/apache/jena/fuseki/mgt/ActionStats.java |  36 +-
 .../apache/jena/fuseki/mgt/JsonDescription.java |  14 +-
 .../org/apache/jena/fuseki/package-info.java    |  61 ++
 .../fuseki/server/DataAccessPointRegistry.java  |   6 +-
 .../apache/jena/fuseki/server/DataService.java  |  22 +-
 .../org/apache/jena/fuseki/server/Endpoint.java |  16 +-
 .../apache/jena/fuseki/server/FusekiInfo.java   |   4 +-
 .../server/FusekiServerEnvironmentInit.java     |   2 +-
 .../apache/jena/fuseki/server/Operation.java    |  95 +++
 .../jena/fuseki/server/OperationName.java       |  93 ---
 .../apache/jena/fuseki/servlets/ActionLib.java  |   6 +-
 .../apache/jena/fuseki/servlets/ActionREST.java |   2 +-
 .../jena/fuseki/servlets/ActionSPARQL.java      | 246 --------
 .../jena/fuseki/servlets/ActionService.java     | 268 +++++++++
 .../apache/jena/fuseki/servlets/Dispatch.java   |  52 +-
 .../jena/fuseki/servlets/FusekiFilter.java      |   2 +-
 .../apache/jena/fuseki/servlets/HttpAction.java |   2 +-
 .../jena/fuseki/servlets/SPARQL_Protocol.java   |   2 +-
 .../servlets/SPARQL_UberServlet_Original.java   |  68 +--
 .../jena/fuseki/servlets/SPARQL_Upload.java     |   2 +-
 .../jena/fuseki/servlets/ServiceRouter.java     | 382 +++++++++++++
 .../fuseki/servlets/ServiceRouterServlet.java   | 573 -------------------
 .../jena/fuseki/servlets/package-info.java      |  61 --
 .../fuseki/embedded/TestEmbeddedFuseki.java     |  16 +-
 26 files changed, 968 insertions(+), 1131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
 
b/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
index 4c219dd..ad68979 100644
--- 
a/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
+++ 
b/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
@@ -476,8 +476,8 @@ public class FusekiBasicCmd {
                 List<String> endpoints = new ArrayList<>();
                 desc.put(ds, endpoints);
                 DataService dSrv = dap.getDataService();
-                dSrv.getOperations().forEach((opName)->{
-                    dSrv.getOperation(opName).forEach(ep-> {
+                dSrv.getOperations().forEach((op)->{
+                    dSrv.getEndpoints(op).forEach(ep-> {
                         String x = ep.getEndpoint();
                         if ( x.isEmpty() )
                             x = "quads";

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiBuilder.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiBuilder.java
index 9eb3b4a..9a177fb 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiBuilder.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiBuilder.java
@@ -18,10 +18,17 @@
 
 package org.apache.jena.fuseki.build;
 
-import static org.apache.jena.fuseki.server.FusekiVocab.* ;
 import static java.lang.String.format ;
 import static org.apache.jena.fuseki.FusekiLib.nodeLabel ;
 import static org.apache.jena.fuseki.FusekiLib.query ;
+import static org.apache.jena.fuseki.server.FusekiVocab.pServiceQueryEP;
+import static 
org.apache.jena.fuseki.server.FusekiVocab.pServiceReadGraphStoreEP;
+import static org.apache.jena.fuseki.server.FusekiVocab.pServiceReadQuadsEP;
+import static 
org.apache.jena.fuseki.server.FusekiVocab.pServiceReadWriteGraphStoreEP;
+import static 
org.apache.jena.fuseki.server.FusekiVocab.pServiceReadWriteQuadsEP;
+import static org.apache.jena.fuseki.server.FusekiVocab.pServiceUpdateEP;
+import static org.apache.jena.fuseki.server.FusekiVocab.pServiceUploadEP;
+
 import org.apache.jena.assembler.Assembler ;
 import org.apache.jena.datatypes.xsd.XSDDatatype ;
 import org.apache.jena.fuseki.Fuseki ;
@@ -29,8 +36,7 @@ import org.apache.jena.fuseki.FusekiConfigException ;
 import org.apache.jena.fuseki.FusekiLib ;
 import org.apache.jena.fuseki.server.DataAccessPoint ;
 import org.apache.jena.fuseki.server.DataService ;
-import org.apache.jena.fuseki.server.Endpoint ;
-import org.apache.jena.fuseki.server.OperationName ;
+import org.apache.jena.fuseki.server.Operation ;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.query.QuerySolution ;
 import org.apache.jena.query.ResultSet ;
@@ -42,6 +48,7 @@ import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.util.FmtUtils ;
 import org.apache.jena.vocabulary.RDF ;
 import org.slf4j.Logger ;
+
 public class FusekiBuilder
 {
     private static Logger log = Fuseki.builderLog ;
@@ -72,26 +79,26 @@ public class FusekiBuilder
         // In case the assembler included ja:contents
         DataService dataService = new DataService(ds.asDatasetGraph()) ;
 
-        addServiceEP(dataService, OperationName.Query,  svc,    
pServiceQueryEP) ;
-        addServiceEP(dataService, OperationName.Update, svc,    
pServiceUpdateEP) ;
-        addServiceEP(dataService, OperationName.Upload, svc,    
pServiceUploadEP);
-        addServiceEP(dataService, OperationName.GSP_R,  svc,    
pServiceReadGraphStoreEP) ;
-        addServiceEP(dataService, OperationName.GSP_RW, svc,    
pServiceReadWriteGraphStoreEP) ;
+        addServiceEP(dataService, Operation.Query,  svc,    pServiceQueryEP) ;
+        addServiceEP(dataService, Operation.Update, svc,    pServiceUpdateEP) ;
+        addServiceEP(dataService, Operation.Upload, svc,    pServiceUploadEP);
+        addServiceEP(dataService, Operation.GSP_R,  svc,    
pServiceReadGraphStoreEP) ;
+        addServiceEP(dataService, Operation.GSP_RW, svc,    
pServiceReadWriteGraphStoreEP) ;
 
-        addServiceEP(dataService, OperationName.Quads_R, svc,   
pServiceReadQuadsEP) ;
-        addServiceEP(dataService, OperationName.Quads_RW, svc,  
pServiceReadWriteQuadsEP) ;
+        addServiceEP(dataService, Operation.Quads_R, svc,   
pServiceReadQuadsEP) ;
+        addServiceEP(dataService, Operation.Quads_RW, svc,  
pServiceReadWriteQuadsEP) ;
         
         // Quads - actions directly on the dataset URL are different.
         // In the config file they are also implicit when using GSP.
         
-        if ( ! dataService.getOperation(OperationName.GSP_RW).isEmpty() || ! 
dataService.getOperation(OperationName.Quads_RW).isEmpty() ) {
+        if ( ! dataService.getEndpoints(Operation.GSP_RW).isEmpty() || ! 
dataService.getEndpoints(Operation.Quads_RW).isEmpty() ) {
             // ReadWrite available.
             // Dispatch needs introspecting on the HTTP request.
-            dataService.addEndpoint(OperationName.DatasetRequest_RW, "") ;
-        } else if ( ! dataService.getOperation(OperationName.GSP_R).isEmpty() 
|| ! dataService.getOperation(OperationName.Quads_R).isEmpty() ) {
+            dataService.addEndpoint(Operation.DatasetRequest_RW, "") ;
+        } else if ( ! dataService.getEndpoints(Operation.GSP_R).isEmpty() || ! 
dataService.getEndpoints(Operation.Quads_R).isEmpty() ) {
             // Read-only available.
             // Dispatch needs introspecting on the HTTP request.
-            dataService.addEndpoint(OperationName.DatasetRequest_R, "") ;
+            dataService.addEndpoint(Operation.DatasetRequest_R, "") ;
         }
         
         // XXX 
@@ -125,24 +132,24 @@ public class FusekiBuilder
     /** Build a DataService starting at Resource svc, with the standard 
(default) set of services */
     public static DataService buildDataServiceStd(DatasetGraph dsg, boolean 
allowUpdate) {
         DataService dataService = new DataService(dsg) ;
-        addServiceEP(dataService, OperationName.Query, "query") ;
-        addServiceEP(dataService, OperationName.Query, "sparql") ;
+        addServiceEP(dataService, Operation.Query, "query") ;
+        addServiceEP(dataService, Operation.Query, "sparql") ;
         if ( ! allowUpdate ) {
-            addServiceEP(dataService, OperationName.GSP_R,      "data") ;
-            addServiceEP(dataService, OperationName.DatasetRequest_R,    "") ;
+            addServiceEP(dataService, Operation.GSP_R,      "data") ;
+            addServiceEP(dataService, Operation.DatasetRequest_R,    "") ;
             return dataService ;
         }
-        addServiceEP(dataService, OperationName.GSP_RW,     "data") ;
-        addServiceEP(dataService, OperationName.GSP_R,      "get") ;
-        addServiceEP(dataService, OperationName.Update,     "update") ;
-        addServiceEP(dataService, OperationName.Upload,     "upload") ;
+        addServiceEP(dataService, Operation.GSP_RW,     "data") ;
+        addServiceEP(dataService, Operation.GSP_R,      "get") ;
+        addServiceEP(dataService, Operation.Update,     "update") ;
+        addServiceEP(dataService, Operation.Upload,     "upload") ;
         // Dispatch needs introspecting on the HTTP request.
-        addServiceEP(dataService, OperationName.DatasetRequest_RW, "") ;
+        addServiceEP(dataService, Operation.DatasetRequest_RW, "") ;
         return dataService ;
     }
 
-    private static void addServiceEP(DataService dataService, OperationName 
opName, String epName) {
-        dataService.addEndpoint(opName, epName) ; 
+    private static void addServiceEP(DataService dataService, Operation 
operation, String epName) {
+        dataService.addEndpoint(operation, epName) ; 
     }
 
     public static RDFNode getOne(Resource svc, String property) {
@@ -156,15 +163,14 @@ public class FusekiBuilder
         return x ;
     }
 
-    private static void addServiceEP(DataService dataService, OperationName 
opName, Resource svc, Property property) {
+    private static void addServiceEP(DataService dataService, Operation 
operation, Resource svc, Property property) {
         String p = "<"+property.getURI()+">" ;
         ResultSet rs = query("SELECT * { ?svc " + p + " ?ep}", svc.getModel(), 
"svc", svc) ;
         for ( ; rs.hasNext() ; ) {
             QuerySolution soln = rs.next() ;
             String epName = soln.getLiteral("ep").getLexicalForm() ;
-            Endpoint operation = new Endpoint(opName, epName) ;
-            addServiceEP(dataService, opName, epName); 
-            //log.info("  " + opName.name + " = " + dataAccessPoint.getName() 
+ "/" + epName) ;
+            addServiceEP(dataService, operation, epName); 
+            //log.info("  " + operation.name + " = " + 
dataAccessPoint.getName() + "/" + epName) ;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
index 079488e..072b604 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
@@ -97,8 +97,8 @@ public class ActionStats extends ActionContainerItem
         
         builder.key(JsonConst.endpoints).startObject("endpoints") ;
         
-        for ( OperationName operName : dSrv.getOperations() ) {
-            List<Endpoint> endpoints = 
access.getDataService().getOperation(operName) ;
+        for ( Operation operName : dSrv.getOperations() ) {
+            List<Endpoint> endpoints = 
access.getDataService().getEndpoints(operName) ;
             
             for ( Endpoint endpoint : endpoints ) {
                 // Endpoint names are unique for a given service.
@@ -150,23 +150,23 @@ public class ActionStats extends ActionContainerItem
         out.println("    Bad           = 
"+dSrv.getCounters().value(CounterName.RequestsBad)) ;
 
         out.println("  SPARQL Query:") ;
-        out.println("    Request       = "+counter(dSrv, OperationName.Query, 
CounterName.Requests)) ;
-        out.println("    Good          = "+counter(dSrv, OperationName.Query, 
CounterName.RequestsGood)) ;
-        out.println("    Bad requests  = "+counter(dSrv, OperationName.Query, 
CounterName.RequestsBad)) ;
-        out.println("    Timeouts      = "+counter(dSrv, OperationName.Query, 
CounterName.QueryTimeouts)) ;
-        out.println("    Bad exec      = "+counter(dSrv, OperationName.Query, 
CounterName.QueryExecErrors)) ;
-        out.println("    IO Errors     = "+counter(dSrv, OperationName.Query, 
CounterName.QueryIOErrors)) ;
+        out.println("    Request       = "+counter(dSrv, Operation.Query, 
CounterName.Requests)) ;
+        out.println("    Good          = "+counter(dSrv, Operation.Query, 
CounterName.RequestsGood)) ;
+        out.println("    Bad requests  = "+counter(dSrv, Operation.Query, 
CounterName.RequestsBad)) ;
+        out.println("    Timeouts      = "+counter(dSrv, Operation.Query, 
CounterName.QueryTimeouts)) ;
+        out.println("    Bad exec      = "+counter(dSrv, Operation.Query, 
CounterName.QueryExecErrors)) ;
+        out.println("    IO Errors     = "+counter(dSrv, Operation.Query, 
CounterName.QueryIOErrors)) ;
 
         out.println("  SPARQL Update:") ;
-        out.println("    Request       = "+counter(dSrv, OperationName.Update, 
CounterName.Requests)) ;
-        out.println("    Good          = "+counter(dSrv, OperationName.Update, 
CounterName.RequestsGood)) ;
-        out.println("    Bad requests  = "+counter(dSrv, OperationName.Update, 
CounterName.RequestsBad)) ;
-        out.println("    Bad exec      = "+counter(dSrv, OperationName.Update, 
CounterName.UpdateExecErrors)) ;
+        out.println("    Request       = "+counter(dSrv, Operation.Update, 
CounterName.Requests)) ;
+        out.println("    Good          = "+counter(dSrv, Operation.Update, 
CounterName.RequestsGood)) ;
+        out.println("    Bad requests  = "+counter(dSrv, Operation.Update, 
CounterName.RequestsBad)) ;
+        out.println("    Bad exec      = "+counter(dSrv, Operation.Update, 
CounterName.UpdateExecErrors)) ;
         
         out.println("  Upload:") ;
-        out.println("    Requests      = "+counter(dSrv, OperationName.Upload, 
CounterName.Requests)) ;
-        out.println("    Good          = "+counter(dSrv, OperationName.Upload, 
CounterName.RequestsGood)) ;
-        out.println("    Bad           = "+counter(dSrv, OperationName.Upload, 
CounterName.RequestsBad)) ;
+        out.println("    Requests      = "+counter(dSrv, Operation.Upload, 
CounterName.Requests)) ;
+        out.println("    Good          = "+counter(dSrv, Operation.Upload, 
CounterName.RequestsGood)) ;
+        out.println("    Bad           = "+counter(dSrv, Operation.Upload, 
CounterName.RequestsBad)) ;
         
         out.println("  SPARQL Graph Store Protocol:") ;
         out.println("    GETs          = "+gspValue(dSrv, 
CounterName.HTTPget)+ " (good="+gspValue(dSrv, 
CounterName.HTTPgetGood)+"/bad="+gspValue(dSrv, CounterName.HTTPGetBad)+")") ;
@@ -176,13 +176,13 @@ public class ActionStats extends ActionContainerItem
         out.println("    HEADs         = "+gspValue(dSrv, 
CounterName.HTTPhead)+ " (good="+gspValue(dSrv, 
CounterName.HTTPheadGood)+"/bad="+gspValue(dSrv, CounterName.HTTPheadBad)+")") ;
     }
     
-    private long counter(DataService dSrv, OperationName opName, CounterName 
cName) {
+    private long counter(DataService dSrv, Operation operation, CounterName 
cName) {
         return 0 ;
     }
     
     private long gspValue(DataService dSrv, CounterName cn) {
-        return  counter(dSrv, OperationName.GSP_RW, cn) +
-                counter(dSrv, OperationName.GSP_R, cn) ;
+        return  counter(dSrv, Operation.GSP_RW, cn) +
+                counter(dSrv, Operation.GSP_R, cn) ;
     }
 
     // We shouldn't get here - no doPost above.

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
index 6c4c11d..c4158d7 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
@@ -24,7 +24,7 @@ import org.apache.jena.atlas.json.JsonBuilder ;
 import org.apache.jena.fuseki.server.DataAccessPoint ;
 import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
 import org.apache.jena.fuseki.server.Endpoint ;
-import org.apache.jena.fuseki.server.OperationName ;
+import org.apache.jena.fuseki.server.Operation ;
 
 /** Create a description of a service */
 public class JsonDescription {
@@ -47,19 +47,19 @@ public class JsonDescription {
         builder.key(JsonConst.dsService) ;
         builder.startArray() ;
         
-        for ( OperationName opName : access.getDataService().getOperations() ) 
{
-            List<Endpoint> endpoints = 
access.getDataService().getOperation(opName) ;
-            describe(builder, opName, endpoints) ;
+        for ( Operation operation : access.getDataService().getOperations() ) {
+            List<Endpoint> endpoints = 
access.getDataService().getEndpoints(operation) ;
+            describe(builder, operation, endpoints) ;
         }
         builder.finishArray() ;
         builder.finishObject() ;
     }
     
-    private static void describe(JsonBuilder builder, OperationName opName, 
List<Endpoint> endpoints) {
+    private static void describe(JsonBuilder builder, Operation operation, 
List<Endpoint> endpoints) {
         builder.startObject() ;
         
-        builder.key(JsonConst.srvType).value(opName.getName()) ;
-        builder.key(JsonConst.srvDescription).value(opName.getDescription()) ;
+        builder.key(JsonConst.srvType).value(operation.getName()) ;
+        
builder.key(JsonConst.srvDescription).value(operation.getDescription()) ;
         builder.key(JsonConst.srvEndpoints) ;
         builder.startArray() ;
         for ( Endpoint endpoint : endpoints )

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/package-info.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/package-info.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/package-info.java
new file mode 100644
index 0000000..34d6339
--- /dev/null
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/package-info.java
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+/** Documentation for dispatch-execute.
+ * <p>
+ * <b>Classes</b>
+ * <ul>
+ * <li><em>DataAccessPointRegistry</em> :: Per server registry of {@code 
DataAccessPoint}s</li>
+ * <li><em>DataAccessPoint</em> :: Name to DataService binding</li>
+ * <li><em>DataService</em> :: RDF Dataset, counters, endpoints</li>
+ * <li><em>Operation</em> :: Internal name of a service, not the name used in 
a configuration file.</li>
+ * <li><em>Endpoint</em> :: Instance of an operation, toether with its 
counters.</li>
+ * <li><em>DataAccessPointRegistry</em> :: Per server registry of 
DataAccessPoint</li>
+ * </ul>
+ * <p>
+ * <li><b>Servlets</b>
+ * <p>
+ * <ul>
+ * <li><em>FusekiFilter</em> :: Routes requests to Fuseki (handles the dynamic 
nature dataset naming) by calling ServiceRouter.</li>
+ * <li><em>ServiceRouterServlet</em> :: Routes requests to the appropriate 
service (i.e. implementing servlet).</li>
+ * <li><em>ActionBase</em> :: Creates a basic {@code HttpAction} and defines 
{@code execCommonWorker}.</li>
+ * <li><em>ActionService</em> :: Fills in {@code HttpAction} with dataset and 
endpoint. Calls {@code setRequest} on an {@code HttpAction}. 
+ * It implements {@code execCommonWorker} as a lifecycle => {@code 
executeAction} => {@code executeLifecycle} => {@code validate - perform}
+ * <li><em>ServiceRouter</em> :: Routing of request to the cocrete servlet 
implementations.
+ * </ul> 
+ * <p>
+ * <pre>
+ * ServiceDispatchServlet &lt; ActionService &lt; ActionBase 
+ * Services               &lt; ActionService &lt; ActionBase
+ * Admin operations       &lt; ActionCtl    &lt; ActionBase
+ * Task management        &lt; ActionTasks  &lt; ActionBase
+ * </pre>
+ * <p>
+ * <b>Registries</b>
+ * <p>Located in {@code FusekiRegistries}.
+ * <p>
+ * <ul>
+ * <li><em>ContentTypeToOperation</em>:: Map&lt;content-type, 
Operation&gt;</li>
+ * <li><em>ContentTypeToOperation</em>:: Map&lt;String, Operation&gt;</li>
+ * <li><em>Dispatch</em> :: Map<Operation, ActionService</li> 
+ * </ul>
+ * <p>
+ */
+
+package org.apache.jena.fuseki;
+

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
index 50b1f4d..5e63132 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
@@ -43,9 +43,9 @@ public class DataAccessPointRegistry extends Registry<String, 
DataAccessPoint>
         System.out.println("== "+string) ;
         this.forEach((k,ref)->{
             System.out.printf("  (key=%s, ref=%s)\n", k, ref.getName()) ;
-            ref.getDataService().getOperations().forEach((opName)->{
-                ref.getDataService().getOperation(opName).forEach(ep->{
-                    System.out.printf("     %s : %s\n", opName, 
ep.getEndpoint()) ;
+            ref.getDataService().getOperations().forEach((op)->{
+                ref.getDataService().getEndpoints(op).forEach(ep->{
+                    System.out.printf("     %s : %s\n", op, ep.getEndpoint()) ;
                 });
             });
         }) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataService.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataService.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataService.java
index d191272..2644b87 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataService.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataService.java
@@ -45,13 +45,13 @@ public class DataService { //implements DatasetMXBean {
     static {
         DatasetGraph dsg = new 
DatasetGraphReadOnly(DatasetGraphFactory.create()) ;
         dummy = new DataService(dsg) ;
-        dummy.addEndpoint(OperationName.Query, DEF.ServiceQuery) ;
-        dummy.addEndpoint(OperationName.Query, DEF.ServiceQueryAlt) ;
+        dummy.addEndpoint(Operation.Query, DEF.ServiceQuery) ;
+        dummy.addEndpoint(Operation.Query, DEF.ServiceQueryAlt) ;
     }
     
     private DatasetGraph dataset ;
 
-    private ListMultimap<OperationName, Endpoint> operations    = 
ArrayListMultimap.create() ;
+    private ListMultimap<Operation, Endpoint> operations    = 
ArrayListMultimap.create() ;
     private Map<String, Endpoint> endpoints                     = new 
HashMap<>() ;
     
     private volatile DatasetStatus state = UNINITIALIZED ;
@@ -86,27 +86,27 @@ public class DataService { //implements DatasetMXBean {
         return dataset ; 
     }
     
-    public void addEndpoint(OperationName operationName, String endpointName) {
-        Endpoint endpoint = new Endpoint(operationName, endpointName) ;
+    public void addEndpoint(Operation operation, String endpointName) {
+        Endpoint endpoint = new Endpoint(operation, endpointName) ;
         endpoints.put(endpointName, endpoint) ;
-        operations.put(operationName, endpoint);
+        operations.put(operation, endpoint);
     }
     
     public Endpoint getEndpoint(String endpointName) {
         return endpoints.get(endpointName) ;
     }
 
-    public List<Endpoint> getOperation(OperationName opName) {
-        List<Endpoint> x = operations.get(opName) ;
+    public List<Endpoint> getEndpoints(Operation operation) {
+        List<Endpoint> x = operations.get(operation) ;
         if ( x == null )
             x = Collections.emptyList() ;
         return x ;  
     }
 
-    /** Return the OperationNames available here.
-     *  @see #getOperation(OperationName) to get the endpoint list
+    /** Return the operations available here.
+     *  @see #getEndpoints(Operation) to get the endpoint list
      */
-    public Collection<OperationName> getOperations() {
+    public Collection<Operation> getOperations() {
         return operations.keySet() ;
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Endpoint.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Endpoint.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Endpoint.java
index 6de7062..c54309d 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Endpoint.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Endpoint.java
@@ -22,15 +22,15 @@ import org.apache.jena.atlas.lib.InternalErrorException ;
 
 public class Endpoint implements Counters {
     
-    public final OperationName opName ;
+    public final Operation operation ;
     public final String endpointName ;
     // Endpoint-level counters.
     private final CounterSet counters           = new CounterSet() ;
 
-    public Endpoint(OperationName opName, String endpointName) {
-        this.opName = opName ;
-        if ( opName == null )
-            throw new InternalErrorException("opName is null") ;
+    public Endpoint(Operation operation, String endpointName) {
+        this.operation = operation ;
+        if ( operation == null )
+            throw new InternalErrorException("operation is null") ;
         this.endpointName = endpointName ;
         // Standard counters - there may be others
         counters.add(CounterName.Requests) ;
@@ -42,11 +42,11 @@ public class Endpoint implements Counters {
     public  CounterSet getCounters()    { return counters ; }
 
     //@Override
-    public OperationName getOperationName()      { return opName ; }
+    public Operation getOperation()     { return operation ; }
     
     //@Override
-    public boolean isType(OperationName operationName) { 
-        return opName.equals(operationName) ;
+    public boolean isType(Operation operation) { 
+        return operation.equals(operation) ;
     }
 
     public String getEndpoint()         { return endpointName ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiInfo.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiInfo.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiInfo.java
index 754f358..7a5643a 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiInfo.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiInfo.java
@@ -72,8 +72,8 @@ public class FusekiInfo {
             List<String> endpoints = new ArrayList<>();
             desc.put(ds, endpoints);
             DataService dSrv = dap.getDataService();
-            dSrv.getOperations().forEach((opName)->{
-                dSrv.getOperation(opName).forEach(ep-> {
+            dSrv.getOperations().forEach((op)->{
+                dSrv.getEndpoints(op).forEach(ep-> {
                     String x = ep.getEndpoint();
                     if ( x.isEmpty() )
                         x = "quads";

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiServerEnvironmentInit.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiServerEnvironmentInit.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiServerEnvironmentInit.java
index 434abf3..cc1fd5c 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiServerEnvironmentInit.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiServerEnvironmentInit.java
@@ -43,7 +43,7 @@ public class FusekiServerEnvironmentInit implements 
ServletContextListener {
     public void contextDestroyed(ServletContextEvent sce) {
         // Stop handling requests.
         
-        // ActionSPARQL uses DataAccessPointRegistry to map URI to services 
(DataAccessPoint)
+        // ActionService uses DataAccessPointRegistry to map URI to services 
(DataAccessPoint)
         
         // DataService -> DataService
 //        DataAccessPointRegistry.shutdown() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Operation.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Operation.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Operation.java
new file mode 100644
index 0000000..1a136e4
--- /dev/null
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Operation.java
@@ -0,0 +1,95 @@
+/**
+ * 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.server;
+
+import org.apache.jena.fuseki.servlets.Dispatch;
+
+/**
+ * Operations are symbol to look up in the {@link Dispatch#operationToHandler} 
map. The name
+ * of an {@code Operation} is not related to the service name used to invoke 
the operation
+ * which is determined by the {@link Endpoint}.
+ */
+public class Operation {
+    
+    // Create intern'ed symbols. 
+    static private NameMgr<Operation> mgr = new NameMgr<>(); 
+    static public Operation register(String name, String description) { return 
mgr.register(name, (x)->new Operation(x, description)); }
+    
+    public static final Operation Query          = register("Query", "SPARQL 
Query");
+    public static final Operation Update         = register("Update", "SPARQL 
Update");
+    public static final Operation Upload         = register("Upload", "File 
Upload");
+    public static final Operation GSP_R          = register("GSP_R", "Graph 
Store Protocol (Read)");
+    public static final Operation GSP_RW         = register("GSP_RW", "Graph 
Store Protocol");
+    public static final Operation Quads_R        = register("Quads_R", "HTTP 
Quads (Read)");
+    public static final Operation Quads_RW       = register("Quads_RW", "HTTP 
Quads");
+    
+    // Plain REST operations on the datset URL 
+    public static final Operation DatasetRequest_R  = Quads_R;
+    public static final Operation DatasetRequest_RW = Quads_RW;
+    
+    private final String description ;
+    private final String name ;
+
+    private Operation(String name, String description) {
+        this.name = name;
+        this.description = description;
+    }
+    
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+    
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+    
+    // Could be this == obj
+    // because we intern'ed the object
+    
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj )
+            return true;
+        if ( obj == null )
+            return false;
+        if ( getClass() != obj.getClass() )
+            return false;
+        Operation other = (Operation)obj;
+        if ( name == null ) {
+            if ( other.name != null )
+                return false;
+        } else if ( !name.equals(other.name) )
+            return false;
+        return true;
+    }
+ 
+    @Override
+    public String toString() {
+        return name;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/OperationName.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/OperationName.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/OperationName.java
deleted file mode 100644
index c18b0a8..0000000
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/OperationName.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * 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.server;
-
-/** 
- * Names (symbols) for operations.
- * An {@code OperationName} is not related to the service name used to invoke 
the operation.
- * That is determined by the {@link Endpoint}. 
- */
-public class OperationName {
-    
-    // Create intern'ed symbols. 
-    static private NameMgr<OperationName> mgr = new NameMgr<>(); 
-    static public OperationName register(String name, String description) { 
return mgr.register(name, (x)->new OperationName(x, description)); }
-    
-    public static final OperationName Query          = register("Query", 
"SPARQL Query");
-    public static final OperationName Update         = register("Update", 
"SPARQL Update");
-    public static final OperationName Upload         = register("Upload", 
"File Upload");
-    public static final OperationName GSP_RW         = register("GSP_RW", 
"Graph Store Protocol");
-    public static final OperationName GSP_R          = register("GSP_R", 
"Graph Store Protocol (Read)");
-    public static final OperationName Quads_RW       = register("Quads_RW", 
"HTTP Quads");
-    public static final OperationName Quads_R        = register("Quads_R", 
"HTTP Quads (Read)");
-    
-    // Dummy "operation" used to mark that datasets accept request made 
directly on them. 
-    public static final OperationName DatasetRequest_RW = Quads_RW; 
//register("Dataset", "HTTP Request");
-    public static final OperationName DatasetRequest_R = Quads_R; 
//register("Dataset", "HTTP Request");
-    
-    private final String description ;
-    private final String name ;
-
-    private OperationName(String name, String description) {
-        this.name = name;
-        this.description = description;
-    }
-    
-    public String getName() {
-        return name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-    
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((name == null) ? 0 : name.hashCode());
-        return result;
-    }
-    
-    // Could be this == obj
-    // because we intern'ed the object
-    
-    @Override
-    public boolean equals(Object obj) {
-        if ( this == obj )
-            return true;
-        if ( obj == null )
-            return false;
-        if ( getClass() != obj.getClass() )
-            return false;
-        OperationName other = (OperationName)obj;
-        if ( name == null ) {
-            if ( other.name != null )
-                return false;
-        } else if ( !name.equals(other.name) )
-            return false;
-        return true;
-    }
- 
-    @Override
-    public String toString() {
-        return name;
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
index 49e25eb..e81b7ab 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
@@ -42,7 +42,7 @@ import org.apache.jena.riot.system.StreamRDF;
 
 public class ActionLib {
     /**
-     * A possible implementation for {@link ActionSPARQL#mapRequestToDataset}
+     * A possible implementation for {@link ActionService#mapRequestToDataset}
      * that assumes the form /dataset/service.
      * @param action the request
      * @return the dataset
@@ -169,8 +169,7 @@ public class ActionLib {
     }
 
     /** Negotiate the content-type and set the response headers */ 
-    public static MediaType contentNegotation(HttpAction action, AcceptList 
myPrefs,
-                                              MediaType defaultMediaType) {
+    public static MediaType contentNegotation(HttpAction action, AcceptList 
myPrefs, MediaType defaultMediaType) {
         MediaType mt = ConNeg.chooseContentType(action.request, myPrefs, 
defaultMediaType) ;
         if ( mt == null )
             return null ;
@@ -190,7 +189,6 @@ public class ActionLib {
     public static MediaType contentNegotationQuads(HttpAction action) {
         return contentNegotation(action, DEF.quadsOffer, DEF.acceptNQuads) ;
     }
-    
 
     /** 
      * Parse RDF content

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
index 13ed6ea..4304399 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java
@@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletResponse ;
 import org.apache.jena.fuseki.server.CounterName ;
 
 /** Common point for operations that are "REST"ish (use GET/PUT etc as 
operations). */ 
-public abstract class ActionREST extends ActionSPARQL
+public abstract class ActionREST extends ActionService
 {
     public ActionREST()
     { super() ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
deleted file mode 100644
index 677e882..0000000
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * 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 static org.apache.jena.fuseki.server.CounterName.Requests ;
-import static org.apache.jena.fuseki.server.CounterName.RequestsBad ;
-import static org.apache.jena.fuseki.server.CounterName.RequestsGood ;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-
-import org.apache.jena.atlas.RuntimeIOException ;
-import org.apache.jena.fuseki.Fuseki ;
-import org.apache.jena.fuseki.server.* ;
-import org.apache.jena.query.QueryCancelledException ;
-import org.apache.jena.web.HttpSC;
-
-/** SPARQL request lifecycle */
-public abstract class ActionSPARQL extends ActionBase
-{
-    protected ActionSPARQL() { super(Fuseki.actionLog) ; }
-    
-    protected abstract void validate(HttpAction action) ;
-    protected abstract void perform(HttpAction action) ;
-
-    /**
-     * Executes common tasks, including mapping the request to the right 
dataset, setting the dataset into the HTTP
-     * action, and retrieving the service for the dataset requested. Finally, 
it calls the
-     * {@link #executeAction(HttpAction)} method, which executes the HTTP 
Action life cycle.
-     * @param action HTTP Action
-     */
-    @Override
-    protected void execCommonWorker(HttpAction action) {
-        DataAccessPoint dataAccessPoint ;
-        DataService dSrv ;
-        
-        String datasetUri = mapRequestToDataset(action) ;
-        if ( datasetUri != null ) {
-            dataAccessPoint = 
action.getDataAccessPointRegistry().get(datasetUri) ;
-            if ( dataAccessPoint == null ) {
-                ServletOps.errorNotFound("No dataset for URI: "+datasetUri) ;
-                return ;
-            }
-            dSrv = dataAccessPoint.getDataService() ;
-            if ( ! dSrv.isAcceptingRequests() ) {
-                ServletOps.error(HttpSC.SERVICE_UNAVAILABLE_503, "Dataset not 
currently active");
-                return ;
-            }
-        } else {
-            dataAccessPoint = null ;
-            dSrv = DataService.serviceOnlyDataService() ;
-        }
-
-        action.setRequest(dataAccessPoint, dSrv) ;
-        String endpointName = mapRequestToOperation(action, dataAccessPoint) ;
-        
-        if ( true ) {
-            // New dispatch
-            OperationName opName = null;
-            if ( ! endpointName.isEmpty() ) {
-                 opName = chooseEndpoint(action, dSrv, endpointName);
-                if ( opName == null )
-                    ServletOps.errorNotFound(format("dataset=%s, service=%s", 
dataAccessPoint.getName(), endpointName));
-                
-            } else {
-                opName = chooseEndpoint(action, dSrv);
-                if ( opName == null )
-                    ServletOps.errorBadRequest(format("dataset=%s",  
dataAccessPoint.getName()));
-            }
-            
-            ActionSPARQL handler = Dispatch.OpNameToHandler.get(opName);
-            // XXX -- replace action.setEndpoint
-            Endpoint ep = dSrv.getEndpoint(endpointName) ;
-            //List<Endpoint> endpoints = dSrv.getOperation(opName);
-            action.setEndpoint(ep, endpointName);
-            handler.executeLifecycle(action);
-            return ;
-        }
-        
-        // Old dispatch via SPARQL_UberServlet.executeAction override.
-        Endpoint op = dSrv.getEndpoint(endpointName) ;
-        action.setEndpoint(op, endpointName);
-        executeAction(action) ;
-    }
-
-    // These are overridden by the ServiceRouterServlet.
-    protected OperationName chooseEndpoint(HttpAction action, DataService 
dataService, String serviceName) {
-        Endpoint ep = dataService.getEndpoint(serviceName) ;
-        OperationName opName = ep.getOperationName();
-        return opName;
-    }
-    
-    protected OperationName chooseEndpoint(HttpAction action, DataService 
dataService) {
-        // No default implementation for directly bound services operation 
servlets.
-        return null;
-    }
-
-    private void executeRequest(HttpAction action, ActionSPARQL servlet) {
-        if ( true ) {
-            // Execute an ActionSPARQL.
-            // Bypasses HttpServlet.service to doMethod dispatch.
-            servlet.executeLifecycle(action) ;
-            return ;
-        }
-        if ( false )  {
-            // Execute by calling the whole servlet mechanism.
-            // This causes HttpServlet.service to call the appropriate 
doMethod.
-            // but the action, and the id, are not passed on and a ne one is 
created.
-            try { servlet.service(action.request, action.response) ; }
-            catch (ServletException | IOException e) {
-                ServletOps.errorOccurred(e);
-            }
-        }
-    }
-
-    
-    /** Execute a SPARQL request. Statistics have not been adjusted at this 
point.
-     * 
-     * @param action
-     */
-    protected void executeAction(HttpAction action) {
-        executeLifecycle(action) ;
-    }
-    
-    /** 
-     * Standard execution lifecycle for a SPARQL Request.
-     * <ul>
-     * <li>{@link #startRequest(HttpAction)}</li>
-     * <li>initial statistics,</li>
-     * <li>{@link #validate(HttpAction)} request,</li>
-     * <li>{@link #perform(HttpAction)} request,</li>
-     * <li>completion/error statistics,</li>
-     * <li>{@link #finishRequest(HttpAction)}
-     * </ul>
-     * 
-     * @param action
-     */
-    // This is the service request lifecycle.
-    final
-    protected void executeLifecycle(HttpAction action) {
-        startRequest(action) ;
-        // And also HTTP counter
-        CounterSet csService = action.getDataService().getCounters() ;
-        CounterSet csOperation = null ;
-        if ( action.getEndpoint() != null )
-            // Direct naming GSP does not have an "endpoint".
-            csOperation = action.getEndpoint().getCounters() ;
-        
-        incCounter(csService, Requests) ;
-        incCounter(csOperation, Requests) ;
-        try {
-            // Either exit this via "bad request" on validation
-            // or in execution in perform. 
-            try {
-                validate(action) ;
-            } catch (ActionErrorException ex) {
-                incCounter(csOperation, RequestsBad) ;
-                incCounter(csService, RequestsBad) ;
-                throw ex ;
-            }
-
-            try {
-                perform(action) ;
-                // Success
-                incCounter(csOperation, RequestsGood) ;
-                incCounter(csService, RequestsGood) ;
-            } catch (ActionErrorException | QueryCancelledException | 
RuntimeIOException ex) {
-                incCounter(csOperation, RequestsBad) ;
-                incCounter(csService, RequestsBad) ;
-                throw ex ;
-            }
-        } finally {
-            finishRequest(action) ;
-        }
-    }
-    
-    /**
-     * Map request {@link HttpAction} to uri in the registry.
-     * A return of {@code null} means no mapping done (passthrough).
-     * @param uri the URI
-     * @return the dataset
-     */
-    protected String mapRequestToDataset(HttpAction action) {
-        return ActionLib.mapRequestToDataset(action) ;
-    }
-
-    /**
-     * Map request to uri in the registry. {@code null} means no mapping done
-     * (passthrough).
-     */
-    protected String mapRequestToOperation(HttpAction action, DataAccessPoint 
dataAccessPoint) {
-        return ActionLib.mapRequestToOperation(action, dataAccessPoint) ;
-    }
-
-    /** Increment counter */
-    protected static void incCounter(Counters counters, CounterName name) {
-        if ( counters == null ) return ;
-        incCounter(counters.getCounters(), name) ; 
-    }
-    
-    /** Decrement counter */
-    protected static void decCounter(Counters counters, CounterName name) {
-        if ( counters == null ) return ;
-        decCounter(counters.getCounters(), name) ; 
-    }
-
-    protected static void incCounter(CounterSet counters, CounterName name) {
-        if ( counters == null )
-            return ;
-        try {
-            if ( counters.contains(name) )
-                counters.inc(name) ;
-        } catch (Exception ex) {
-            Fuseki.serverLog.warn("Exception on counter inc", ex) ;
-        }
-    }
-    
-    protected static void decCounter(CounterSet counters, CounterName name) {
-        if ( counters == null )
-            return ;
-        try {
-            if ( counters.contains(name) )
-                counters.dec(name) ;
-        } catch (Exception ex) {
-            Fuseki.serverLog.warn("Exception on counter dec", ex) ;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionService.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionService.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionService.java
new file mode 100644
index 0000000..0994096
--- /dev/null
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionService.java
@@ -0,0 +1,268 @@
+/*
+ * 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 static org.apache.jena.fuseki.server.CounterName.Requests;
+import static org.apache.jena.fuseki.server.CounterName.RequestsBad;
+import static org.apache.jena.fuseki.server.CounterName.RequestsGood;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+
+import org.apache.jena.atlas.RuntimeIOException;
+import org.apache.jena.fuseki.Fuseki;
+import org.apache.jena.fuseki.server.*;
+import org.apache.jena.query.QueryCancelledException;
+import org.apache.jena.web.HttpSC;
+
+/** SPARQL request lifecycle */
+public abstract class ActionService extends ActionBase {
+    protected ActionService() {
+        super(Fuseki.actionLog);
+    }
+
+    protected abstract void validate(HttpAction action);
+
+    protected abstract void perform(HttpAction action);
+
+    /**
+     * Executes common tasks, including mapping the request to the right 
dataset, setting
+     * the dataset into the HTTP action, and retrieving the service for the 
dataset
+     * requested. Finally, it calls the {@link #executeAction(HttpAction)} 
method, which
+     * executes the HTTP Action life cycle.
+     * 
+     * @param action
+     *            HTTP Action
+     */
+    @Override
+    protected void execCommonWorker(HttpAction action) {
+        DataAccessPoint dataAccessPoint;
+        DataService dSrv;
+
+        String datasetUri = mapRequestToDataset(action);
+        if ( datasetUri != null ) {
+            dataAccessPoint = 
action.getDataAccessPointRegistry().get(datasetUri);
+            if ( dataAccessPoint == null ) {
+                ServletOps.errorNotFound("No dataset for URI: " + datasetUri);
+                return;
+            }
+            dSrv = dataAccessPoint.getDataService();
+            if ( !dSrv.isAcceptingRequests() ) {
+                ServletOps.error(HttpSC.SERVICE_UNAVAILABLE_503, "Dataset not 
currently active");
+                return;
+            }
+        } else {
+            dataAccessPoint = null;
+            dSrv = DataService.serviceOnlyDataService();
+        }
+
+        action.setRequest(dataAccessPoint, dSrv);
+        String endpointName = mapRequestToOperation(action, dataAccessPoint);
+
+        if ( false ) {
+            // DELETE when SPARQL_UberServlet goes.
+            // Old dispatch via SPARQL_UberServlet.executeAction override.
+            SPARQL_UberServlet_Original dummy = null;
+            Endpoint op = dSrv.getEndpoint(endpointName);
+            action.setEndpoint(op, endpointName);
+            executeAction(action);
+            return;
+        }
+
+        // ServiceRouter dispatch
+        Operation operation = null;
+        if ( !endpointName.isEmpty() ) {
+            operation = chooseOperation(action, dSrv, endpointName);
+            if ( operation == null )
+                ServletOps.errorNotFound(format("dataset=%s, service=%s", 
dataAccessPoint.getName(), endpointName));
+
+        } else {
+            operation = chooseOperation(action, dSrv);
+            if ( operation == null )
+                ServletOps.errorBadRequest(format("dataset=%s", 
dataAccessPoint.getName()));
+        }
+
+        ActionService handler = Dispatch.operationToHandler.get(operation);
+        if ( handler == null )
+            ServletOps.errorBadRequest(format("dataset=%s: op=%s", 
dataAccessPoint.getName(), operation.getName()));
+        // XXX -- replace action.setEndpoint
+        Endpoint ep = dSrv.getEndpoint(endpointName);
+        action.setEndpoint(ep, endpointName);
+        handler.executeLifecycle(action);
+        return;
+    }
+
+    // Overridden by the ServiceRouter.
+    protected Operation chooseOperation(HttpAction action, DataService 
dataService, String serviceName) {
+        // This default implementation is plain service name to operation 
based on the
+        // DataService as would be used by operation servlets bound by web.xml.
+        Endpoint ep = dataService.getEndpoint(serviceName);
+        Operation operation = ep.getOperation();
+        return operation;
+    }
+
+    // Overridden by the ServiceRouter.
+    protected Operation chooseOperation(HttpAction action, DataService 
dataService) {
+        // No default implementation for directly bound services operation 
servlets.
+        return null;
+    }
+
+    private void executeRequest(HttpAction action, ActionService servlet) {
+        if ( true ) {
+            // Execute an ActionService.
+            // Bypasses HttpServlet.service to doMethod dispatch.
+            servlet.executeLifecycle(action);
+            return;
+        }
+        if ( false ) {
+            // Execute by calling the whole servlet mechanism.
+            // This causes HttpServlet.service to call the appropriate 
doMethod.
+            // but the action, and the id, are not passed on and a ne one is 
created.
+            try {
+                servlet.service(action.request, action.response);
+            }
+            catch (ServletException | IOException e) {
+                ServletOps.errorOccurred(e);
+            }
+        }
+    }
+
+    /**
+     * Execute a SPARQL request. Statistics have not been adjusted at this 
point.
+     * 
+     * @param action
+     */
+    protected void executeAction(HttpAction action) {
+        executeLifecycle(action);
+    }
+
+    /**
+     * Standard execution lifecycle for a SPARQL Request.
+     * <ul>
+     * <li>{@link #startRequest(HttpAction)}</li>
+     * <li>initial statistics,</li>
+     * <li>{@link #validate(HttpAction)} request,</li>
+     * <li>{@link #perform(HttpAction)} request,</li>
+     * <li>completion/error statistics,</li>
+     * <li>{@link #finishRequest(HttpAction)}
+     * </ul>
+     * 
+     * @param action
+     */
+    // This is the service request lifecycle.
+    final protected void executeLifecycle(HttpAction action) {
+        startRequest(action);
+        // And also HTTP counter
+        CounterSet csService = action.getDataService().getCounters();
+        CounterSet csOperation = null;
+        if ( action.getEndpoint() != null )
+            // Direct naming GSP does not have an "endpoint".
+            csOperation = action.getEndpoint().getCounters();
+
+        incCounter(csService, Requests);
+        incCounter(csOperation, Requests);
+        try {
+            // Either exit this via "bad request" on validation
+            // or in execution in perform.
+            try {
+                validate(action);
+            }
+            catch (ActionErrorException ex) {
+                incCounter(csOperation, RequestsBad);
+                incCounter(csService, RequestsBad);
+                throw ex;
+            }
+
+            try {
+                perform(action);
+                // Success
+                incCounter(csOperation, RequestsGood);
+                incCounter(csService, RequestsGood);
+            }
+            catch (ActionErrorException | QueryCancelledException | 
RuntimeIOException ex) {
+                incCounter(csOperation, RequestsBad);
+                incCounter(csService, RequestsBad);
+                throw ex;
+            }
+        }
+        finally {
+            finishRequest(action);
+        }
+    }
+
+    /**
+     * Map request {@link HttpAction} to uri in the registry. A return of 
{@code null}
+     * means no mapping done (passthrough).
+     * 
+     * @param uri
+     *            the URI
+     * @return the dataset
+     */
+    protected String mapRequestToDataset(HttpAction action) {
+        return ActionLib.mapRequestToDataset(action);
+    }
+
+    /**
+     * Map request to uri in the registry. {@code null} means no mapping done
+     * (passthrough).
+     */
+    protected String mapRequestToOperation(HttpAction action, DataAccessPoint 
dataAccessPoint) {
+        return ActionLib.mapRequestToOperation(action, dataAccessPoint);
+    }
+
+    /** Increment counter */
+    protected static void incCounter(Counters counters, CounterName name) {
+        if ( counters == null )
+            return;
+        incCounter(counters.getCounters(), name);
+    }
+
+    /** Decrement counter */
+    protected static void decCounter(Counters counters, CounterName name) {
+        if ( counters == null )
+            return;
+        decCounter(counters.getCounters(), name);
+    }
+
+    protected static void incCounter(CounterSet counters, CounterName name) {
+        if ( counters == null )
+            return;
+        try {
+            if ( counters.contains(name) )
+                counters.inc(name);
+        }
+        catch (Exception ex) {
+            Fuseki.serverLog.warn("Exception on counter inc", ex);
+        }
+    }
+
+    protected static void decCounter(CounterSet counters, CounterName name) {
+        if ( counters == null )
+            return;
+        try {
+            if ( counters.contains(name) )
+                counters.dec(name);
+        }
+        catch (Exception ex) {
+            Fuseki.serverLog.warn("Exception on counter dec", ex);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Dispatch.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Dispatch.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Dispatch.java
index d0a4cf4..2d66909 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Dispatch.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Dispatch.java
@@ -22,41 +22,41 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.jena.fuseki.server.DataService;
-import org.apache.jena.fuseki.server.OperationName;
+import org.apache.jena.fuseki.server.Operation;
 import org.apache.jena.riot.WebContent;
 
-/** The global mapping of content-type to OperationName. */
+/** The global mapping of content-type to Operation. */
 
 public class Dispatch {
-    /** Map ContentType (lowercase, no charset) to the {@code OperationName} 
for handling it. */  
-    public static Map<String, OperationName> contentTypeToOpName = new 
ConcurrentHashMap<>();
+    /** Map ContentType (lowercase, no charset) to the {@code Operation} for 
handling it. */  
+    public static Map<String, Operation> contentTypeToOperation = new 
ConcurrentHashMap<>();
     static {
-        contentTypeToOpName.put(WebContent.contentTypeSPARQLQuery, 
OperationName.Query);
-        contentTypeToOpName.put(WebContent.contentTypeSPARQLUpdate, 
OperationName.Update);
+        contentTypeToOperation.put(WebContent.contentTypeSPARQLQuery, 
Operation.Query);
+        contentTypeToOperation.put(WebContent.contentTypeSPARQLUpdate, 
Operation.Update);
     }
     
-    /** Map {@link OperationName} to servlet handler.
-     * {@code OperartionNames} are the internal symbol identifying an 
operation,
-     * not the name used in the configuration file, which is mapped by {@link 
DataService#getOperation}. 
-     *   
-     *  */  
-    public static Map<OperationName, ActionSPARQL> OpNameToHandler = new 
ConcurrentHashMap<>();
+    /** Map {@link Operation} to servlet handler.
+     * {@code Operation}s are the internal symbol identifying an operation,
+     * not the name used in the configuration file, 
+     * which is mapped by {@link DataService#getEndpoint(String)}. 
+     */  
+    public static Map<Operation, ActionService> operationToHandler = new 
ConcurrentHashMap<>();
     
-    public static final ActionSPARQL queryServlet    = new 
SPARQL_QueryDataset() ;
-    public static final ActionSPARQL updateServlet   = new SPARQL_Update() ;
-    public static final ActionSPARQL uploadServlet   = new SPARQL_Upload() ;
-    public static final ActionSPARQL gspServlet_R    = new SPARQL_GSP_R() ;
-    public static final ActionSPARQL gspServlet_RW   = new SPARQL_GSP_RW() ;
-    public static final ActionSPARQL restQuads_R     = new REST_Quads_R() ;
-    public static final ActionSPARQL restQuads_RW    = new REST_Quads_RW() ;
+    public static final ActionService queryServlet    = new 
SPARQL_QueryDataset() ;
+    public static final ActionService updateServlet   = new SPARQL_Update() ;
+    public static final ActionService uploadServlet   = new SPARQL_Upload() ;
+    public static final ActionService gspServlet_R    = new SPARQL_GSP_R() ;
+    public static final ActionService gspServlet_RW   = new SPARQL_GSP_RW() ;
+    public static final ActionService restQuads_R     = new REST_Quads_R() ;
+    public static final ActionService restQuads_RW    = new REST_Quads_RW() ;
 
     static {
-        OpNameToHandler.put(OperationName.Query,    queryServlet);
-        OpNameToHandler.put(OperationName.Update,   updateServlet);
-        OpNameToHandler.put(OperationName.Upload,   uploadServlet);
-        OpNameToHandler.put(OperationName.GSP_R,    gspServlet_R);
-        OpNameToHandler.put(OperationName.GSP_RW,   gspServlet_RW);
-        OpNameToHandler.put(OperationName.Quads_R,  restQuads_R);
-        OpNameToHandler.put(OperationName.Quads_RW, restQuads_RW);
+        operationToHandler.put(Operation.Query,    queryServlet);
+        operationToHandler.put(Operation.Update,   updateServlet);
+        operationToHandler.put(Operation.Upload,   uploadServlet);
+        operationToHandler.put(Operation.GSP_R,    gspServlet_R);
+        operationToHandler.put(Operation.GSP_RW,   gspServlet_RW);
+        operationToHandler.put(Operation.Quads_R,  restQuads_R);
+        operationToHandler.put(Operation.Quads_RW, restQuads_RW);
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
index 44ab013..e13fc04 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
@@ -35,7 +35,7 @@ import org.slf4j.Logger ;
  */
 public class FusekiFilter implements Filter {
     private static Logger log = Fuseki.serverLog ;
-    private static ServiceRouterServlet routerServlet = new 
ServiceRouterServlet.AccessByConfig() ;
+    private static ServiceRouter routerServlet = new 
ServiceRouter.AccessByConfig() ;
     
     @Override
     public void init(FilterConfig filterConfig) {

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
index 6dfb1ee..55e32c2 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
@@ -41,7 +41,7 @@ import org.slf4j.Logger ;
 
 /**
  * HTTP action that represents the user request lifecycle. Its state is 
handled in the
- * {@link ActionSPARQL#executeAction(HttpAction)} method.
+ * {@link ActionService#executeAction(HttpAction)} method.
  */
 public class HttpAction
 {

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Protocol.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Protocol.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Protocol.java
index 05143fd..ae5ef8f 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Protocol.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Protocol.java
@@ -37,7 +37,7 @@ import org.apache.jena.sparql.core.DatasetDescription ;
 /**
  * Support for the SPARQL protocol (SPARQL Query, SPARQL Update)
  */
-public abstract class SPARQL_Protocol extends ActionSPARQL {
+public abstract class SPARQL_Protocol extends ActionService {
 
     protected SPARQL_Protocol() {
         super() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet_Original.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet_Original.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet_Original.java
index e10b908..142ba0c 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet_Original.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet_Original.java
@@ -47,7 +47,7 @@ import org.apache.jena.riot.web.HttpNames ;
  *  indirect naming, quads operations on a dataset and
  *  ?query and ?update directly on a dataset.)
  */
-public abstract class SPARQL_UberServlet_Original extends ActionSPARQL
+public abstract class SPARQL_UberServlet_Original extends ActionService
 {
     protected abstract boolean allowQuery(HttpAction action) ;
     protected abstract boolean allowUpdate(HttpAction action) ;
@@ -58,7 +58,7 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
 
     public static class ReadOnly extends SPARQL_UberServlet_Original
     {
-            public ReadOnly()    { super() ; }
+        public ReadOnly()    { super() ; }
         @Override protected boolean allowQuery(HttpAction action)    { return 
true ; }
         @Override protected boolean allowUpdate(HttpAction action)   { return 
false ; }
         @Override protected boolean allowREST_R(HttpAction action)   { return 
true ; }
@@ -69,7 +69,7 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
 
     public static class ReadWrite extends SPARQL_UberServlet_Original
     {
-            public ReadWrite()    { super() ; }
+        public ReadWrite()    { super() ; }
         @Override protected boolean allowQuery(HttpAction action)    { return 
true ; }
         @Override protected boolean allowUpdate(HttpAction action)   { return 
true ; }
         @Override protected boolean allowREST_R(HttpAction action)   { return 
true ; }
@@ -80,23 +80,23 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
 
     public static class AccessByConfig extends SPARQL_UberServlet_Original
     {
-            public AccessByConfig()    { super() ; }
-        @Override protected boolean allowQuery(HttpAction action)    { return 
isEnabled(action, OperationName.Query) ; }
-        @Override protected boolean allowUpdate(HttpAction action)   { return 
isEnabled(action, OperationName.Update) ; }
-        @Override protected boolean allowREST_R(HttpAction action)   { return 
isEnabled(action, OperationName.GSP_R) || isEnabled(action, 
OperationName.GSP_RW) ; }
-        @Override protected boolean allowREST_W(HttpAction action)   { return 
isEnabled(action, OperationName.GSP_RW) ; }
-        @Override protected boolean allowQuadsR(HttpAction action)   { return 
isEnabled(action, OperationName.Quads_R) || isEnabled(action, 
OperationName.Quads_RW) ; }
-        @Override protected boolean allowQuadsW(HttpAction action)   { return 
isEnabled(action, OperationName.Quads_RW) ; }
+        public AccessByConfig()    { super() ; }
+        @Override protected boolean allowQuery(HttpAction action)    { return 
isEnabled(action, Operation.Query) ; }
+        @Override protected boolean allowUpdate(HttpAction action)   { return 
isEnabled(action, Operation.Update) ; }
+        @Override protected boolean allowREST_R(HttpAction action)   { return 
isEnabled(action, Operation.GSP_R) || isEnabled(action, Operation.GSP_RW) ; }
+        @Override protected boolean allowREST_W(HttpAction action)   { return 
isEnabled(action, Operation.GSP_RW) ; }
+        @Override protected boolean allowQuadsR(HttpAction action)   { return 
isEnabled(action, Operation.Quads_R) || isEnabled(action, Operation.Quads_RW) ; 
}
+        @Override protected boolean allowQuadsW(HttpAction action)   { return 
isEnabled(action, Operation.Quads_RW) ; }
 
         // Test whether there is a configuration that allows this action as 
the operation given.
         // Ignores the operation in the action (set due to parsing - it might 
be "quads"
         // which is the generic operation when just the dataset is specificed.
-        private boolean isEnabled(HttpAction action, OperationName opName) {
+        private boolean isEnabled(HttpAction action, Operation operation) {
             // Disregard the operation name of the action
             DataService dSrv = action.getDataService() ;
             if ( dSrv == null )
                 return false;
-            return ! dSrv.getOperation(opName).isEmpty() ;
+            return ! dSrv.getEndpoints(operation).isEmpty() ;
         }
     }
 
@@ -106,13 +106,13 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
      * This takes precedence over direct naming.
      */
 
-    private final ActionSPARQL queryServlet    = new SPARQL_QueryDataset() ;
-    private final ActionSPARQL updateServlet   = new SPARQL_Update() ;
-    private final ActionSPARQL uploadServlet   = new SPARQL_Upload() ;
-    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() ;
+    private final ActionService queryServlet    = new SPARQL_QueryDataset() ;
+    private final ActionService updateServlet   = new SPARQL_Update() ;
+    private final ActionService uploadServlet   = new SPARQL_Upload() ;
+    private final ActionService gspServlet_R    = new SPARQL_GSP_R() ;
+    private final ActionService gspServlet_RW   = new SPARQL_GSP_RW() ;
+    private final ActionService restQuads_R     = new REST_Quads_R() ;
+    private final ActionService restQuads_RW    = new REST_Quads_RW() ;
 
     public SPARQL_UberServlet_Original() { super(); }
 
@@ -264,19 +264,19 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
             // There is a trailing part.
             // Check it's not the same name as a registered service.
             // If so, dispatch to that service.
-            if ( serviceDispatch(action, OperationName.Query, queryServlet) ) 
return ;
-            if ( serviceDispatch(action, OperationName.Update, updateServlet) 
) return ;
-            if ( serviceDispatch(action, OperationName.Upload, uploadServlet) 
) return ;
+            if ( serviceDispatch(action, Operation.Query, queryServlet) ) 
return ;
+            if ( serviceDispatch(action, Operation.Update, updateServlet) ) 
return ;
+            if ( serviceDispatch(action, Operation.Upload, uploadServlet) ) 
return ;
             if ( hasParams ) {
-                if ( serviceDispatch(action, OperationName.GSP_R, 
gspServlet_R) ) return ;
-                if ( serviceDispatch(action, OperationName.GSP_RW, 
gspServlet_RW) ) return ;
+                if ( serviceDispatch(action, Operation.GSP_R, gspServlet_R) ) 
return ;
+                if ( serviceDispatch(action, Operation.GSP_RW, gspServlet_RW) 
) return ;
             } else {
                 // No parameters - do as a quads operation on the dataset.
-                if ( serviceDispatch(action, OperationName.GSP_R, restQuads_R) 
) return ;
-                if ( serviceDispatch(action, OperationName.GSP_RW, 
restQuads_RW) ) return ;
+                if ( serviceDispatch(action, Operation.GSP_R, restQuads_R) ) 
return ;
+                if ( serviceDispatch(action, Operation.GSP_RW, restQuads_RW) ) 
return ;
             }
-            if ( serviceDispatch(action, OperationName.Quads_RW, restQuads_RW) 
) return ;
-            if ( serviceDispatch(action, OperationName.Quads_R, restQuads_R) ) 
return ;
+            if ( serviceDispatch(action, Operation.Quads_RW, restQuads_RW) ) 
return ;
+            if ( serviceDispatch(action, Operation.Quads_R, restQuads_R) ) 
return ;
         }
         // There is a trailing part - params are illegal by this point.
         if ( hasParams )
@@ -296,11 +296,11 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
     /** See if the operation is enabled for this setup.
      * Return true if dispatched
      */
-    private boolean serviceDispatch(HttpAction action, OperationName opName, 
ActionSPARQL servlet) {
-        Endpoint operation = action.getEndpoint() ;
-        if ( operation == null )
+    private boolean serviceDispatch(HttpAction action, Operation operation, 
ActionService servlet) {
+        Endpoint endpoint = action.getEndpoint() ;
+        if ( endpoint == null )
             return false ;
-        if ( ! operation.isType(opName) )
+        if ( ! endpoint.isType(operation) )
             return false ;
         // Handle OPTIONS specially.
 //        if ( 
action.getRequest().getMethod().equals(HttpNames.METHOD_OPTIONS) ) {
@@ -345,9 +345,9 @@ public abstract class SPARQL_UberServlet_Original extends 
ActionSPARQL
         return ;
     }
 
-    private void executeRequest(HttpAction action, ActionSPARQL servlet) {
+    private void executeRequest(HttpAction action, ActionService servlet) {
         if ( true ) {
-            // Execute an ActionSPARQL.
+            // Execute an ActionService.
             // Bypasses HttpServlet.service to doMethod dispatch.
             servlet.executeLifecycle(action) ;
             return ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1533ade6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
----------------------------------------------------------------------
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
index e369f3a..14d4095 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
@@ -49,7 +49,7 @@ import org.apache.jena.sparql.core.DatasetGraphFactory ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.web.HttpSC ;
 
-public class SPARQL_Upload extends ActionSPARQL
+public class SPARQL_Upload extends ActionService
 {
     public SPARQL_Upload() {
         super() ;

Reply via email to