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

svn commit: r1562426 [1/2] - in /jena/branches/jena-fuseki-new-ui: src-dev/dev/ src/main/java/org/apache/jena/fuseki/mgt/ src/main/java/org/apache/jena/fuseki/server/ src/main/java/org/apache/jena/fuseki/servlets/ src/test/java/org/apache/jena/fuseki/

Author: andy
Date: Wed Jan 29 12:16:12 2014
New Revision: 1562426

URL: http://svn.apache.org/r1562426
Log:
Separate URI naming from dataset+services

Added:
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/Operation.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/OperationName.java
Removed:
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
Modified:
    jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java
    jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki2.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/   (props changed)
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/CounterName.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.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/ActionLib.java
    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/ActionSPARQL.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.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
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.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/SPARQL_Update.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAdmin.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=1562426&r1=1562425&r2=1562426&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 Wed Jan 29 12:16:12 2014
@@ -20,49 +20,27 @@ package dev;
 
 public class PROJECT {
     // Backup
-    
+    // Access point stats? HTTP stats?
     // Create dataset - check for existing. 
+    // Timeouts
+    // Active/offline - names of data services? 
+    // Operation to have several endpoints?
+    //  Need Operation and "OperationInstance" = endpoint.
+    //   OperationName == Operation Type?
+    // Check variable nameds on DataAccessPoint,  DataService, Operation
+    // Per HTTP operation counters
+    // Counters interface -> 
+    //   Add to other things? e.g. DatseService
+    // HTTP stats
+    // Per service timeouts. e.g. 
+    // Per service context setting e.g. timeouts, tdb:unionDefaultGraph
+    //   SPARQL_Query.setAnyTimeouts
     
-    
-//    Add DS1
-//    Add DS2
-//    Add symbolic link
-//    Offline DS2
-//
-//    ==>
-//      check offlining works.
-//      how do we manage assembler descriptions?
-//        System database is only status + link to assembler?
-    
-    // Naming 
-    //  fuseki:Service is the endpoints = dataset
-    // DataService : 
+    // Testing - all in-mmeory
+    //   Don't save assemblers 
     
     // Shiro - log failures
     
-    // DatasetRef -> DataService 
-    // DataService has "target"
-    
-    // DSG_Switchable does not work : need to access underlying DB by name.
-    //  ==>
-    //    [] a fuseki:Service, fuseki:Switchable ;
-    //        fuseki:name1 "" ;
-    //        fuseki:name2 "" ;
-    //        .
-    
-    // Assembler for switchable?
-    //   Still need to be able to contact each subDSG for update?
-    //   OR assume just active/offline?
-    
-    // DatasetGraphSwitchable(dsg1, dsg2) + assembler.
-    //   NB The need to query the right DSG 
-    
-    // Stats need to chase down links?
-    
-    // Chase down DatasetRef.getDataset and split into "for action" (follows link) and not
-    // Where do the stats go?
-    // If we want 
-    
     /* Use of:
 <context-param>
   <param-name>org.apache.jena.fuseki.config</param-name>

Modified: jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki2.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki2.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki2.java (original)
+++ jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki2.java Wed Jan 29 12:16:12 2014
@@ -18,6 +18,7 @@
 
 package dev;
 
+import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.fuseki.FusekiCmd ;
 
 public class RunFuseki2
@@ -29,15 +30,13 @@ public class RunFuseki2
         main1() ;
     }
     
-    public static void demo()
-    {
+    public static void demo() {
         String DIR="DemoServer" ;
         FusekiCmd.main("--config="+name(DIR,"config.ttl"), "--pages="+name(DIR, "demo-pages")) ;
         System.exit(0) ;
     }
     
-    public static String name(String DIR, String filename)
-    {
+    public static String name(String DIR, String filename) {
         StringBuilder sb = new StringBuilder() ;
         if ( ! filename.startsWith("/") )
         {
@@ -49,8 +48,11 @@ public class RunFuseki2
         return sb.toString() ;
     }
     
-    private static void main1()
-    {
+    private static void main1() {
+        // Clean server state?
+        if ( true )
+            FileOps.clearDirectory("system") ; 
+        
         String tmpdir = System.getenv("TMPDIR") ;
         if ( tmpdir == null )
             tmpdir = System.getenv("TMP") ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java Wed Jan 29 12:16:12 2014
@@ -34,7 +34,8 @@ import org.apache.jena.atlas.lib.FileOps
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.fuseki.FusekiException ;
 import org.apache.jena.fuseki.FusekiLib ;
-import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
+import org.apache.jena.fuseki.server.DataService ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
 import org.apache.jena.fuseki.servlets.HttpAction ;
 import org.apache.jena.fuseki.servlets.ServletOps ;
@@ -81,8 +82,10 @@ public class ActionBackup extends Action
             return ;
         }
 
-        DatasetRef ref = DatasetRegistry.get().get(dataset) ;
-        action.setRequestRef(ref, dataset) ;
+        DataAccessPoint dataAccessPoint = DatasetRegistry.get().get(dataset) ;
+        DataService dSrv = dataAccessPoint.getDataService() ;
+        action.setControlRequest(dataAccessPoint, dataset) ;
+        action.setOperation(null, null) ;       // No operation or service name.
         scheduleBackup(action) ;
         ServletOps.success(action) ;
     }
@@ -90,7 +93,7 @@ public class ActionBackup extends Action
     static final String BackupArea = "backups" ;
 
     private void scheduleBackup(final HttpAction action) {
-        String dsName = action.dsRef.name ;
+        String dsName = action.getDatasetName() ;
         final String ds = dsName.startsWith("/") ? dsName : "/" + dsName ;
 
         String timestamp = Utils.nowAsString("yyyy-MM-dd_HH-mm-ss") ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java Wed Jan 29 12:16:12 2014
@@ -19,8 +19,10 @@
 package org.apache.jena.fuseki.mgt;
 
 import org.apache.jena.fuseki.Fuseki ;
-import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
+import org.apache.jena.fuseki.server.DataService ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
+import org.apache.jena.fuseki.server.FusekiConfig ;
 import org.apache.jena.fuseki.servlets.ActionBase ;
 import org.apache.jena.fuseki.servlets.HttpAction ;
 import org.apache.jena.fuseki.servlets.ServletOps ;
@@ -32,22 +34,24 @@ public abstract class ActionCtl extends 
     
     @Override
     final
-    protected void execCommonWorker(HttpAction action)
-    {
-        DatasetRef dsRef = null ;
-        String dsURI = mapRequestToDatasetName(action) ;
-        if ( dsURI != null ) {
-            dsRef = DatasetRegistry.get().get(dsURI) ;
-            if ( dsRef == null )
-                ServletOps.errorNotFound("Not found: "+dsURI) ;
+    protected void execCommonWorker(HttpAction action) {
+        DataAccessPoint dataAccessPoint = null ;
+        DataService dSrv = null ;
+        String datasetUri = mapRequestToDatasetName(action) ;
+        if ( datasetUri != null ) {
+            dataAccessPoint = DatasetRegistry.get().get(datasetUri) ;
+            if ( dataAccessPoint == null )
+                ServletOps.errorNotFound("Not found: "+datasetUri) ;
         }
         else {
             // This is a placeholder when creating new DatasetRefs
             // and also if addressing a container, not a dataset
-            dsRef = DatasetRef.nullRef() ;
+            dataAccessPoint = null ;
+            dSrv = FusekiConfig.serviceOnlyDatasetRef() ;
         }
         
-        action.setControlRef(dsRef, dsURI) ;
+        action.setControlRequest(dataAccessPoint, datasetUri) ;
+        action.setOperation(null, null) ;   // No operation or service name.
         executeAction(action) ;
     }
 
@@ -94,7 +98,7 @@ public abstract class ActionCtl extends 
     
     final
     protected boolean isContainerAction(HttpAction action) {
-        return (action.dsRef.name == null ) ;
+        return (action.getDataAccessPoint() == null ) ;
     }
     
     protected abstract void perform(HttpAction action) ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java Wed Jan 29 12:16:12 2014
@@ -149,12 +149,11 @@ public class ActionDatasets extends Acti
     }
 
     private JsonValue execGetDataset(HttpAction action) {
-        action.log.info(format("[%d] GET dataset %s", action.id, action.dsRef.name)) ;
+        action.log.info(format("[%d] GET dataset %s", action.id, action.getDatasetName())) ;
         JsonBuilder builder = new JsonBuilder() ;
-        String datasetPath = DatasetRef.canonicalDatasetPath(action.dsRef.name) ;
-        DatasetRef dsDesc = DatasetRegistry.get().get(datasetPath) ;
+        DataAccessPoint dsDesc = DatasetRegistry.get().get(action.getDatasetName()) ;
         if ( dsDesc == null )
-            ServletOps.errorNotFound("Not found: dataset "+action.dsRef.name);
+            ServletOps.errorNotFound("Not found: dataset "+action.getDatasetName());
         JsonDescription.describe(builder, dsDesc) ;
         return builder.build() ;
     }
@@ -172,15 +171,19 @@ public class ActionDatasets extends Acti
     }
     
     private void execPostDataset(HttpAction action) {
-        String name = action.dsRef.name ;
+        String name = action.getDatasetName() ;
         if ( name == null )
-            name = "" ;
+            name = "''" ;
         action.log.info(format("[%d] POST dataset %s", action.id, name)) ;
         
-//        if ( action.dsRef.getDataset() == null )
-//            ServletOps.errorNotFound("Not found: dataset "+action.dsRef.name);
+        if ( action.getDataAccessPoint() == null )
+            ServletOps.errorNotFound("Not found: dataset "+action.getDatasetName());
+        
+        DataService dSrv = action.getDataService() ;
+        if ( dSrv == null )
+            // If not set explicitly, take from DataAccessPoint
+            dSrv = action.getDataAccessPoint().getDataService() ;
         
-        DatasetRef dsDesc = action.dsRef ;
         String s = action.request.getParameter("state") ;
         if ( s == null || s.isEmpty() )
             ServletOps.errorBadRequest("No state change given") ;
@@ -189,19 +192,30 @@ public class ActionDatasets extends Acti
         if ( s.equalsIgnoreCase("active") ) {
             action.log.info(format("[%d] REBUILD DATASET %s", action.id, name)) ;
             setDatasetState(name, FusekiVocab.stateActive) ;
+            dSrv.goActive() ; 
             // DatasetGraph dsg = ???? ;
-            //dsDesc.activate(dsg) ; 
-            dsDesc.activate() ;
+            //dSrv.activate(dsg) ; 
+            //dSrv.activate() ;
         } else if ( s.equalsIgnoreCase("offline") ) {
-            setDatasetState(name, FusekiVocab.stateOffline) ;        
-            dsDesc.offline() ;
-        } else
-            ServletOps.errorBadRequest("New state '"+s+"' not recognized");
+            action.log.info(format("[%d] OFFLINE DATASET %s", action.id, name)) ;
+            DataAccessPoint access = action.getDataAccessPoint() ;
+            //access.goOffline() ;
+            dSrv.goOffline() ;  // Affects the target of the name. 
+            setDatasetState(name, FusekiVocab.stateOffline) ;  
+            //dSrv.offline() ;
+        } else if ( s.equalsIgnoreCase("unlink") ) {
+            action.log.info(format("[%d] UNLINK ACCESS NAME %s", action.id, name)) ;
+            DataAccessPoint access = action.getDataAccessPoint() ;
+            ServletOps.errorNotImplemented("unlink: dataset"+action.getDatasetName());
+            //access.goOffline() ;
+            // Registry?
+        }
+        else
+            ServletOps.errorBadRequest("State change operation '"+s+"' not recognized");
         ServletOps.success(action) ;
     }
 
     private void execPostContainer(HttpAction action) {
-
         JenaUUID uuid = JenaUUID.generate() ;
         String newURI = uuid.asURI() ;
         Node gn = NodeFactory.createURI(newURI) ;
@@ -247,7 +261,7 @@ public class ActionDatasets extends Acti
                 action.log.warn(format("[%d] Service name '%s' is not a string", action.id, FmtUtils.stringForRDFNode(object)));
 
             String datasetName = object.getLexicalForm() ;
-            String datasetPath = DatasetRef.canonicalDatasetPath(datasetName) ;
+            String datasetPath = DataAccessPoint.canonical(datasetName) ;
             action.log.info(format("[%d] Create database : name = %s", action.id, datasetPath)) ;
             
             if ( DatasetRegistry.get().isRegistered(datasetPath) )
@@ -258,8 +272,8 @@ public class ActionDatasets extends Acti
             model.add(subject, pStatus, FusekiVocab.stateActive) ;
             
             // Need to be in Resource space at this point.
-            DatasetRef dsRef = FusekiConfig.processService(subject) ;
-            FusekiConfig.registerDataset(datasetPath, dsRef) ;
+            DataAccessPoint ref = FusekiConfig.processService(subject) ;
+            FusekiConfig.registerDataset(datasetPath, ref) ;
             action.getResponse().setContentType(WebContent.contentTypeTextPlain); 
             ServletOutputStream out = action.getResponse().getOutputStream() ;
             out.println("That went well") ;
@@ -308,7 +322,7 @@ public class ActionDatasets extends Acti
 
     protected void execDelete(HttpAction action) {
         // Does not exist?
-        String name = action.dsRef.name ;
+        String name = action.getDatasetName() ;
         if ( name == null )
             name = "" ;
         action.log.info(format("[%d] DELETE ds=%s", action.id, name)) ;
@@ -324,9 +338,9 @@ public class ActionDatasets extends Acti
         systemDSG.begin(ReadWrite.WRITE) ;
         boolean committed =false ;
         try {
-            DatasetRef dsRef = DatasetRegistry.get().get(name) ;
+            DataAccessPoint ref = DatasetRegistry.get().get(name) ;
             // Redo check inside transaction.
-            if ( dsRef == null )
+            if ( ref == null )
                 ServletOps.errorNotFound("No such dataset registered: "+name);
                 
             // Name to graph
@@ -335,9 +349,8 @@ public class ActionDatasets extends Acti
                 ServletOps.errorBadRequest("Failed to find dataset for '"+name+"'");
             Node gn = q.getGraph() ;
 
-            dsRef.gracefulShutdown() ;
+            action.log.info("SHUTDOWN NEEDED");
             DatasetRegistry.get().remove(name) ;
-            // XXX or set to state deleted.
             systemDSG.deleteAny(gn, null, null, null) ;
             systemDSG.commit() ;
             committed = true ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java Wed Jan 29 12:16:12 2014
@@ -49,7 +49,7 @@ public class ActionStats extends ActionC
 
     protected void execGet(HttpAction action) {
         JsonValue v ;
-        if (action.dsRef.name == null )
+        if (action.getDatasetName() == null )
             v = execGetContainer(action) ;
         else
             v = execGetDataset(action) ;
@@ -87,10 +87,10 @@ public class ActionStats extends ActionC
     }
 
     private JsonValue execGetDataset(HttpAction action) {
-        action.log.info(format("[%d] GET stats dataset %s", action.id, action.dsRef.name)) ;
+        action.log.info(format("[%d] GET stats dataset %s", action.id, action.getDatasetName())) ;
         
         JsonBuilder builder = new JsonBuilder() ;
-        String datasetPath = DatasetRef.canonicalDatasetPath(action.dsRef.name) ;
+        String datasetPath = DataAccessPoint.canonical(action.getDatasetName()) ;
         builder.startObject("TOP") ;
         
         builder.key("datasets") ;
@@ -106,24 +106,26 @@ public class ActionStats extends ActionC
         // Object started
         builder.key(ds) ;
         
-        DatasetRef desc = DatasetRegistry.get().get(ds) ;
+        DataAccessPoint access = DatasetRegistry.get().get(ds) ;
+        DataService dSrv = access.getDataService() ;
         builder.startObject("counters") ;
         
-        builder.key(CounterName.Requests.name()).value(desc.getCounters().value(CounterName.Requests)) ;
-        builder.key(CounterName.RequestsGood.name()).value(desc.getCounters().value(CounterName.RequestsGood)) ;
-        builder.key(CounterName.RequestsBad.name()).value(desc.getCounters().value(CounterName.RequestsBad)) ;
+        builder.key(CounterName.Requests.name()).value(dSrv.getCounters().value(CounterName.Requests)) ;
+        builder.key(CounterName.RequestsGood.name()).value(dSrv.getCounters().value(CounterName.RequestsGood)) ;
+        builder.key(CounterName.RequestsBad.name()).value(dSrv.getCounters().value(CounterName.RequestsBad)) ;
 
         
         builder.key("services").startObject("services") ;
-        for ( ServiceRef srvRef : desc.getServiceRefs() ) {
-            builder.key(srvRef.name).startObject("service") ;
-            statsService(builder, srvRef) ;
-
+        for ( Operation operation : dSrv.getOperations() ) {
+            builder.key(operation.getEndpoint()).startObject("service") ;
+            statsService(builder, operation) ;
             
             builder.key("endpoints") ;
+            // SHARE WITH ActionDataset.
             builder.startArray() ;
-            for ( String ep : srvRef.endpoints)
-                builder.value(ep) ;
+            builder.value(operation.endpointName) ;
+//            for ( String ep : operation.endpoints)
+//                builder.value(ep) ;
             builder.finishArray() ;
             
             builder.finishObject("service") ;
@@ -133,9 +135,9 @@ public class ActionStats extends ActionC
 
     }
 
-    private void statsService(JsonBuilder builder, ServiceRef srvRef) {
-        for (CounterName cn : srvRef.getCounters().counters()) {
-            Counter c = srvRef.getCounters().get(cn) ;
+    private void statsService(JsonBuilder builder, Operation operation) {
+        for (CounterName cn : operation.getCounters().counters()) {
+            Counter c = operation.getCounters().get(cn) ;
             builder.key(cn.name()).value(c.value()) ;
         }
     }
@@ -150,50 +152,56 @@ public class ActionStats extends ActionC
         while(iter.hasNext())
         {
             String ds = iter.next() ;
-            DatasetRef desc = DatasetRegistry.get().get(ds) ;
+            DataAccessPoint desc = DatasetRegistry.get().get(ds) ;
             statsTxt(out, desc) ;
             if ( iter.hasNext() )
                 out.println() ;
         }
         out.flush() ;
     }
-    private void statsTxt(ServletOutputStream out, DatasetRef desc) throws IOException
+    
+    private void statsTxt(ServletOutputStream out, DataAccessPoint desc) throws IOException
     {
-        out.println("Dataset: "+desc.name) ;
-        out.println("    Requests      = "+desc.getCounters().value(CounterName.Requests)) ;
-        out.println("    Good          = "+desc.getCounters().value(CounterName.RequestsGood)) ;
-        out.println("    Bad           = "+desc.getCounters().value(CounterName.RequestsBad)) ;
+        DataService dSrv = desc.getDataService() ;
+        out.println("Dataset: "+desc.getName()) ;
+        out.println("    Requests      = "+dSrv.getCounters().value(CounterName.Requests)) ;
+        out.println("    Good          = "+dSrv.getCounters().value(CounterName.RequestsGood)) ;
+        out.println("    Bad           = "+dSrv.getCounters().value(CounterName.RequestsBad)) ;
 
         out.println("  SPARQL Query:") ;
-        out.println("    Request       = "+desc.query.getCounters().value(CounterName.Requests)) ;
-        out.println("    Good          = "+desc.query.getCounters().value(CounterName.RequestsGood)) ;
-        out.println("    Bad requests  = "+desc.query.getCounters().value(CounterName.RequestsBad)) ;
-        out.println("    Timeouts      = "+desc.query.getCounters().value(CounterName.QueryTimeouts)) ;
-        out.println("    Bad exec      = "+desc.query.getCounters().value(CounterName.QueryExecErrors)) ;
+        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("  SPARQL Update:") ;
-        out.println("    Request       = "+desc.update.getCounters().value(CounterName.Requests)) ;
-        out.println("    Good          = "+desc.update.getCounters().value(CounterName.RequestsGood)) ;
-        out.println("    Bad requests  = "+desc.update.getCounters().value(CounterName.RequestsBad)) ;
-        out.println("    Bad exec      = "+desc.update.getCounters().value(CounterName.UpdateExecErrors)) ;
+        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("  Upload:") ;
-        out.println("    Requests      = "+desc.upload.getCounters().value(CounterName.Requests)) ;
-        out.println("    Good          = "+desc.upload.getCounters().value(CounterName.RequestsGood)) ;
-        out.println("    Bad           = "+desc.upload.getCounters().value(CounterName.RequestsBad)) ;
+        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("  SPARQL Graph Store Protocol:") ;
-        out.println("    GETs          = "+gspValue(desc, CounterName.GSPget)+ " (good="+gspValue(desc, CounterName.GSPgetGood)+"/bad="+gspValue(desc, CounterName.GSPgetBad)+")") ;
-        out.println("    PUTs          = "+gspValue(desc, CounterName.GSPput)+ " (good="+gspValue(desc, CounterName.GSPputGood)+"/bad="+gspValue(desc, CounterName.GSPputBad)+")") ;
-        out.println("    POSTs         = "+gspValue(desc, CounterName.GSPpost)+ " (good="+gspValue(desc, CounterName.GSPpostGood)+"/bad="+gspValue(desc, CounterName.GSPpostBad)+")") ;
-        out.println("    DELETEs       = "+gspValue(desc, CounterName.GSPdelete)+ " (good="+gspValue(desc, CounterName.GSPdeleteGood)+"/bad="+gspValue(desc, CounterName.GSPdeleteBad)+")") ;
-        out.println("    HEADs         = "+gspValue(desc, CounterName.GSPhead)+ " (good="+gspValue(desc, CounterName.GSPheadGood)+"/bad="+gspValue(desc, CounterName.GSPheadBad)+")") ;
+        out.println("    GETs          = "+gspValue(dSrv, CounterName.HTTPget)+ " (good="+gspValue(dSrv, CounterName.HTTPgetGood)+"/bad="+gspValue(dSrv, CounterName.HTTPGetBad)+")") ;
+        out.println("    PUTs          = "+gspValue(dSrv, CounterName.HTTPput)+ " (good="+gspValue(dSrv, CounterName.HTTPputGood)+"/bad="+gspValue(dSrv, CounterName.HTTPputBad)+")") ;
+        out.println("    POSTs         = "+gspValue(dSrv, CounterName.HTTPpost)+ " (good="+gspValue(dSrv, CounterName.HTTPpostGood)+"/bad="+gspValue(dSrv, CounterName.HTTPpostBad)+")") ;
+        out.println("    DELETEs       = "+gspValue(dSrv, CounterName.HTTPdelete)+ " (good="+gspValue(dSrv, CounterName.HTTPdeleteGood)+"/bad="+gspValue(dSrv, CounterName.HTTPdeleteBad)+")") ;
+        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) {
+        return 0 ;
     }
     
-    private long gspValue(DatasetRef desc, CounterName cn) {
-        long x1 = desc.readGraphStore.getCounters().value(cn) ;
-        long x2 = desc.readWriteGraphStore.getCounters().value(cn) ;
-        return x1+x2 ;
+    private long gspValue(DataService dSrv, CounterName cn) {
+        // XXX Check
+        return  counter(dSrv, OperationName.GSP, cn) +
+                counter(dSrv, OperationName.GSP_R, cn) ;
     }
     
     

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/JsonDescription.java Wed Jan 29 12:16:12 2014
@@ -19,9 +19,9 @@
 package org.apache.jena.fuseki.mgt;
 
 import org.apache.jena.atlas.json.JsonBuilder ;
-import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
-import org.apache.jena.fuseki.server.ServiceRef ;
+import org.apache.jena.fuseki.server.Operation ;
 
 /** Create a description of a service */
 public class JsonDescription {
@@ -35,38 +35,38 @@ public class JsonDescription {
     public static void arrayDatasets(JsonBuilder builder, DatasetRegistry registry) {
         builder.startArray() ;
         for ( String ds : registry.keys() ) {
-            DatasetRef desc = DatasetRegistry.get().get(ds) ;
-            JsonDescription.describe(builder, desc) ;
+            DataAccessPoint access = DatasetRegistry.get().get(ds) ;
+            JsonDescription.describe(builder, access) ;
         }
         builder.finishArray() ;
     }
     
-    public static void describe(JsonBuilder builder, ServiceRef serviceref) {
+    public static void describe(JsonBuilder builder, DataAccessPoint access) {
         builder.startObject() ;
+        builder.key(dsName).value(access.getName()) ;
         
-        builder.key(srvType).value(serviceref.name) ;
-
-        builder.key(srvEndpoints) ;
+        builder.key(dsService) ;
         builder.startArray() ;
-        for ( String ep : serviceref.endpoints )
-            builder.value(ep) ;
+        for ( Operation sRef : access.getDataService().getOperations() )
+            describe(builder, sRef) ;
         builder.finishArray() ;
-        
         builder.finishObject() ;
     }
     
-    public static void describe(JsonBuilder builder, DatasetRef ds) {
-        
+    
+    public static void describe(JsonBuilder builder, Operation operation) {
         builder.startObject() ;
         
-        builder.key(dsName).value(ds.getName()) ;
-        
-        builder.key(dsService) ;
+        builder.key(srvType).value(operation.getName().name) ;
+
+        //Group same operation type? 
+        builder.key(srvEndpoints) ;
         builder.startArray() ;
-        for ( ServiceRef sRef : ds.getServiceRefs() )
-            describe(builder, sRef) ;
+        builder.value(operation.endpointName) ;
         builder.finishArray() ;
+        
         builder.finishObject() ;
     }
+    
 }
 

Propchange: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Jan 29 12:16:12 2014
@@ -0,0 +1,3 @@
+CounterSetLib.java
+DataAccessPoint.java
+DataService.java

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/CounterName.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/CounterName.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/CounterName.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/CounterName.java Wed Jan 29 12:16:12 2014
@@ -20,8 +20,9 @@ package org.apache.jena.fuseki.server;
 
 /** Names for all counters */ 
 public enum CounterName {
-    // There are generic names - apply to all services and datasets
-    // and specific ones.
+    // There are generic names - apply to all services and datasets - and
+    // also specific ones that relate only to a particular kind of service.
+    // By having a fixed list, we 
 
     
     // Total request received
@@ -44,40 +45,41 @@ public enum CounterName {
     
     // Upload ... standard counters
     
-    // Graph Store Protocol.
+    // Graph Store Protocol. uses HTTP codes.
 
     // For each HTTP method
-    GSPget("gsp.get.requests") ,
-    GSPgetGood("gsp.get.requests.good") ,
-    GSPgetBad("gsp.get.requests.bad") ,
-
-    GSPpost("gsp.post.requests") ,
-    GSPpostGood("gsp.post.requests.good") ,
-    GSPpostBad("gsp.post.requests.bad") ,
-
-    GSPdelete("gsp.delete.requests") ,
-    GSPdeleteGood("gsp.delete.requests.good") ,
-    GSPdeleteBad("gsp.delete.requests.bad") ,
-
-    GSPput("gsp.put.requests") ,
-    GSPputGood("gsp.put.requests.good") ,
-    GSPputBad("gsp.put.requests.bad") ,
-
-    GSPhead("gsp.head.requests") ,
-    GSPheadGood("gsp.head.requests.good") ,
-    GSPheadBad("gsp.head.requests.bad") ,
-
-    GSPpatch("gsp.patch.requests") ,
-    GSPpatchGood("gsp.patch.requests.good") ,
-    GSPpatchBad("gsp.patch.requests.bad") ,
-
-    GSPoptions("gsp.options.requests") ,
-    GSPoptionsGood("gsp.options.requests.good") ,
-    GSPoptionsBad("gsp.options.requests.bad") ,
+
+    HTTPget("http.get.requests") ,
+    HTTPgetGood("http.get.requests.good") ,
+    HTTPGetBad("http.get.requests.bad") ,
+
+    HTTPpost("http.post.requests") ,
+    HTTPpostGood("http.post.requests.good") ,
+    HTTPpostBad("http.post.requests.bad") ,
+
+    HTTPdelete("http.delete.requests") ,
+    HTTPdeleteGood("http.delete.requests.good") ,
+    HTTPdeleteBad("http.delete.requests.bad") ,
+
+    HTTPput("http.put.requests") ,
+    HTTPputGood("http.put.requests.good") ,
+    HTTPputBad("http.put.requests.bad") ,
+
+    HTTPhead("http.head.requests") ,
+    HTTPheadGood("http.head.requests.good") ,
+    HTTPheadBad("http.head.requests.bad") ,
+
+    HTTPpatch("http.patch.requests") ,
+    HTTPpatchGood("http.patch.requests.good") ,
+    HTTPpatchBad("http.patch.requests.bad") ,
+
+    HTTPoptions("http.options.requests") ,
+    HTTPoptionsGood("http.options.requests.good") ,
+    HTTPoptionsBad("http.options.requests.bad") ,
     
     ;
     
-    private String name ;
+    public final String name ;
     private CounterName(String name) { this.name = name ; }
     
 }

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java Wed Jan 29 12:16:12 2014
@@ -20,7 +20,8 @@ package org.apache.jena.fuseki.server;
 
 import org.apache.jena.fuseki.migrate.Registry ;
 
-public class DatasetRegistry extends Registry<DatasetRef>
+// XXX rename
+public class DatasetRegistry extends Registry<DataAccessPoint>
 {
     private static DatasetRegistry singleton = new DatasetRegistry() ;
 

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java Wed Jan 29 12:16:12 2014
@@ -43,11 +43,7 @@ import com.hp.hpl.jena.assembler.JA ;
 import com.hp.hpl.jena.query.* ;
 import com.hp.hpl.jena.rdf.model.* ;
 import com.hp.hpl.jena.shared.PrefixMapping ;
-import com.hp.hpl.jena.sparql.core.DatasetGraph ;
-import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ;
-import com.hp.hpl.jena.sparql.core.DatasetGraphReadOnly ;
 import com.hp.hpl.jena.sparql.core.assembler.AssemblerUtils ;
-import com.hp.hpl.jena.sparql.mgt.ARQMgt ;
 import com.hp.hpl.jena.update.UpdateAction ;
 import com.hp.hpl.jena.update.UpdateFactory ;
 import com.hp.hpl.jena.update.UpdateRequest ;
@@ -78,48 +74,35 @@ public class FusekiConfig {
 
     // ---- DatasetRef used where there isn't a real Dataset e.g. the SPARQL processor.
     
-    private static DatasetGraph dummyDSG  = new DatasetGraphReadOnly(DatasetGraphFactory.createMemFixed()) ;
-
-    private static DatasetRef   noDataset = DatasetRef.create("", dummyDSG) ;
-
-    static {
-        noDataset.query.endpoints.add(DEF.ServiceQuery) ;
-        noDataset.query.endpoints.add(DEF.ServiceQueryAlt) ;
-        noDataset.allowDatasetUpdate = false ;
-        noDataset.activate() ;
-        // Don't register it.
-        // This is used as a placeholder and shoudl not be found by
-        // "all datasets"
-        // DatasetRegistry.get().put("", noDataset) ;
-    }
-
-    // ---- DatasetRef used where there isn't a real Dataset e.g. the SPARQL processor.
-    
     /**
-     * Return the DatasetRef (read-only) for when there is no dataset, just a
+     * Return the DataService (read-only) for when there is no dataset, just a
      * SPARQL Query processor
      */
-    public static DatasetRef serviceOnlyDatasetRef() {
-        return noDataset ;
+    public static DataService serviceOnlyDatasetRef() {
+        return DataService.dummy ;
     }
 
     /** Setup the server configuration based on ServerInitialConfig (from command line) */ 
-    public static List<DatasetRef> defaultConfiguration(ServerInitialConfig params) {
+    public static List<DataAccessPoint> defaultConfiguration(ServerInitialConfig params) {
         if ( params.fusekiConfigFile != null )
             log.warn("Configuration file found while processing command line dataset configuration") ;
         
-        DatasetRef dbDesc = DatasetRef.create(params.datasetPath, params.dsg) ;
-        dbDesc.query.endpoints.add(DEF.ServiceQuery) ;
-        dbDesc.query.endpoints.add(DEF.ServiceQueryAlt) ;
-
+        // Use a template assembler.
+        
+        DataService dbSvc = DataService.create(params.dsg) ;
+        DataAccessPoint dataAccess = new DataAccessPoint(params.datasetPath) ;
+        dataAccess.setDataService(dbSvc); 
+        dbSvc.addEndpoint(OperationName.Query, DEF.ServiceQuery);
+        dbSvc.addEndpoint(OperationName.Query, DEF.ServiceQueryAlt) ;
+        
         if ( params.allowUpdate ) {
-            dbDesc.update.endpoints.add(DEF.ServiceUpdate) ;
-            dbDesc.upload.endpoints.add(DEF.ServiceUpload) ;
-            dbDesc.readWriteGraphStore.endpoints.add(DEF.ServiceData) ;
-            dbDesc.allowDatasetUpdate = true ;
+            dbSvc.addEndpoint(OperationName.Update, DEF.ServiceUpdate) ;
+            dbSvc.addEndpoint(OperationName.Upload, DEF.ServiceUpload) ;
+            dbSvc.addEndpoint(OperationName.GSP, DEF.ServiceData) ;
         } else
-            dbDesc.readGraphStore.endpoints.add(DEF.ServiceData) ;
-        return Arrays.asList(dbDesc) ; 
+            dbSvc.addEndpoint(OperationName.GSP_R, DEF.ServiceData) ;
+
+        return Arrays.asList(dataAccess) ; 
     }
 
 //    /** Read one of more dataset descriptions in a model */
@@ -150,7 +133,7 @@ public class FusekiConfig {
 //    }
     
     /** Has side effects in server setup */
-    public static List<DatasetRef> readConfigFile(String filename) {
+    public static List<DataAccessPoint> readConfigFile(String filename) {
         // Old-style config file.
         Model model = FileManager.get().loadModel(filename) ;
         additionalRDF(model) ;
@@ -158,8 +141,8 @@ public class FusekiConfig {
         return servicesAndDatasets(model) ;
     }
 
-    public static List<DatasetRef> readConfigurationDirectory(String dir) {
-        List<DatasetRef> datasets = new ArrayList<DatasetRef>() ;
+    public static List<DataAccessPoint> readConfigurationDirectory(String dir) {
+        List<DataAccessPoint> dataServiceRef = new ArrayList<DataAccessPoint>() ;
         File d = new File(dir) ;
         String[] aFiles = d.list(visibleFiles) ;
         if ( aFiles == null ) {
@@ -171,11 +154,11 @@ public class FusekiConfig {
             // Same code as ActionDatasets
         }
         
-        return datasets ;
+        return dataServiceRef ;
     }
         
         
-    public static List<DatasetRef> readSystemDatabase(Dataset ds) {
+    public static List<DataAccessPoint> readSystemDatabase(Dataset ds) {
         String qs = StrUtils.strjoinNL
             (SystemState.PREFIXES ,
              "SELECT * {" ,
@@ -186,7 +169,7 @@ public class FusekiConfig {
              "}"
              ) ;
         
-        List<DatasetRef> refs = new ArrayList<DatasetRef>() ;
+        List<DataAccessPoint> refs = new ArrayList<DataAccessPoint>() ;
         
         ResultSet rs = query(qs, ds) ;
         
@@ -203,8 +186,7 @@ public class FusekiConfig {
             Model m = ds.getNamedModel(g.getURI()) ;
             s = m.wrapAsResource(s.asNode()) ;
             //String name = row.getLiteral("name").getLexicalForm() ;
-            DatasetRef ref = processService(s) ;
-            ref.setStatus(status) ;
+            DataAccessPoint ref = processService(s) ;
             refs.add(ref) ;
         }
         return refs ;
@@ -227,22 +209,22 @@ public class FusekiConfig {
         processServer(server) ;
     }
     
-    private static List<DatasetRef> servicesAndDatasets(Model model) {
+    private static List<DataAccessPoint> servicesAndDatasets(Model model) {
         // Old style configuration file : server to services.
         // ---- Services
         ResultSet rs = query("SELECT * { ?s fu:services [ list:member ?member ] }", model) ;
         if ( !rs.hasNext() )
             log.warn("No services found") ;
 
-        List<DatasetRef> services = new ArrayList<DatasetRef>() ;
+        List<DataAccessPoint> accessPoints = new ArrayList<DataAccessPoint>() ;
 
         for ( ; rs.hasNext() ; ) {
             QuerySolution soln = rs.next() ;
             Resource svc = soln.getResource("member") ;
-            DatasetRef sd = processService(svc) ;
-            services.add(sd) ;
+            DataAccessPoint acc = processService(svc) ;
+            accessPoints.add(acc) ;
         }
-        return services ;
+        return accessPoints ;
     }
 
     private static void processServer(Resource server) {
@@ -292,60 +274,62 @@ public class FusekiConfig {
     }
 
     /** Build a DatasetRef from an assember starting at Resource svc */
-    public static DatasetRef processService(Resource svc) {
+    public static DataAccessPoint processService(Resource svc) {
         log.info("Service: " + nodeLabel(svc)) ;
         
         String name = ((Literal)getOne(svc, "fu:name")).getLexicalForm() ;
         
         Resource datasetDesc = ((Resource)getOne(svc, "fu:dataset")) ;
-
         // Check if it is in the model.
         if ( !datasetDesc.hasProperty(RDF.type) )
             throw new FusekiConfigException("No rdf:type for dataset " + nodeLabel(datasetDesc)) ;
-
         Dataset ds = (Dataset)Assembler.general.open(datasetDesc) ;
-        // If builder for DatasetRefs, put assembling dataset after services. 
-        DatasetRef sDesc = DatasetRef.create(name, ds.asDatasetGraph()) ;
-        log.info("  name = " + sDesc.name) ;
-
-        addServiceEP("query", sDesc.name, sDesc.query, svc, "fu:serviceQuery") ;
-        addServiceEP("update", sDesc.name, sDesc.update, svc, "fu:serviceUpdate") ;
-        addServiceEP("upload", sDesc.name, sDesc.upload, svc, "fu:serviceUpload") ;
-        addServiceEP("graphStore(RW)", sDesc.name, sDesc.readWriteGraphStore, svc, "fu:serviceReadWriteGraphStore") ;
-        addServiceEP("graphStore(R)", sDesc.name, sDesc.readGraphStore, svc, "fu:serviceReadGraphStore") ;
-        // Extract timeout overriding configuration if present.
-        if ( svc.hasProperty(FusekiVocab.pAllowTimeoutOverride) ) {
-            sDesc.allowTimeoutOverride = svc.getProperty(FusekiVocab.pAllowTimeoutOverride).getObject().asLiteral().getBoolean() ;
-            if ( svc.hasProperty(FusekiVocab.pMaximumTimeoutOverride) ) {
-                sDesc.maximumTimeoutOverride = (int)(svc.getProperty(FusekiVocab.pMaximumTimeoutOverride).getObject().asLiteral().getFloat() * 1000) ;
-            }
-        }
-
-        return sDesc ;
+        // Assembler to do all this. 
+        DataService dataService = new DataService(svc, ds.asDatasetGraph()) ;
+        
+        DataAccessPoint dataAccess = new DataAccessPoint(name) ;
+        dataAccess.setDataService(dataService) ;
+        DatasetRegistry.get().put(name, dataAccess) ; 
+        
+        log.info("  name = " + dataAccess.getName()) ;
+
+        addServiceEP(dataAccess, dataService, OperationName.Query,  svc,    "fu:serviceQuery") ;
+        addServiceEP(dataAccess, dataService, OperationName.Update, svc,    "fu:serviceUpdate") ;
+        addServiceEP(dataAccess, dataService, OperationName.Upload, svc,    "fu:serviceUpload") ;
+        addServiceEP(dataAccess, dataService, OperationName.GSP_R,  svc,    "fu:serviceReadGraphStore") ;
+        addServiceEP(dataAccess, dataService, OperationName.GSP,    svc,    "fu:serviceReadWriteGraphStore") ;
+        // XXX 
+//        // Extract timeout overriding configuration if present.
+//        if ( svc.hasProperty(FusekiVocab.pAllowTimeoutOverride) ) {
+//            sDesc.allowTimeoutOverride = svc.getProperty(FusekiVocab.pAllowTimeoutOverride).getObject().asLiteral().getBoolean() ;
+//            if ( svc.hasProperty(FusekiVocab.pMaximumTimeoutOverride) ) {
+//                sDesc.maximumTimeoutOverride = (int)(svc.getProperty(FusekiVocab.pMaximumTimeoutOverride).getObject().asLiteral().getFloat() * 1000) ;
+//            }
+//        }
 
+        return dataAccess ;
     }
 
     
     /** Initial configuration - for all the datasets, call the per dataset initization  */ 
-    public static void configureDatasets(List<DatasetRef> datasets) {
-        for (DatasetRef dsDesc : datasets)
+    public static void configureDatasets(List<DataAccessPoint> datasets) {
+        for (DataAccessPoint dsDesc : datasets)
             configureOneDataset(dsDesc) ;
     }
 
-    public static void configureOneDataset(DatasetRef dsDesc) {
-        registerDataset(dsDesc.name, dsDesc) ;
-        addJMX(dsDesc) ;
+    public static void configureOneDataset(DataAccessPoint dsDesc) {
+        registerDataset(dsDesc.getName(), dsDesc) ;
+        //addJMX(dsDesc) ;
     }
     
     /** Register a DatasetRef, which should no already be registered */  
     
-    public static void registerDataset(String datasetPath, DatasetRef dsDesc) {
-        dsDesc.enable() ;
+    public static void registerDataset(String datasetPath, DataAccessPoint dataAccess) {
         if ( DatasetRegistry.get().isRegistered(datasetPath) )
             throw new FusekiConfigException("Already registered: key = "+datasetPath) ;
-        DatasetRegistry.get().put(datasetPath, dsDesc) ;
-        serverLog.info(format("Dataset path = %s", datasetPath)) ;
-        addJMX(dsDesc) ;
+        DatasetRegistry.get().put(datasetPath, dataAccess) ;
+        serverLog.info(format("Register dataset path = %s", datasetPath)) ;
+        //addJMX(dsDesc) ;
     }
     
 //    public static void addJMX() {
@@ -356,34 +340,34 @@ public class FusekiConfig {
 //        }
 //    }
 
-    private static void addJMX(DatasetRef dsRef) {
-        String x = dsRef.name ;
-        // if ( x.startsWith("/") )
-        // x = x.substring(1) ;
-        ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x, dsRef) ;
-        // For all endpoints
-        for (ServiceRef sRef : dsRef.getServiceRefs()) {
-            ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name, sRef) ;
-        }
+    private static void addJMX(DataAccessPoint dsRef) {
+//        String x = datasetNames ;
+//        // if ( x.startsWith("/") )
+//        // x = x.substring(1) ;
+//        ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x, dsRef) ;
+//        // For all endpoints
+//        for (ServiceRef sRef : dsRef.getServiceRefs()) {
+//            ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name, sRef) ;
+//        }
     }
 
     public static void removeJMX() {
-        DatasetRegistry registry = DatasetRegistry.get() ;
-        for (String ds : registry.keys()) {
-            DatasetRef ref = registry.get(ds) ;
-            removeJMX(ref) ;
-        }
+//        DatasetRegistry registry = DatasetRegistry.get() ;
+//        for (String ds : registry.keys()) {
+//            DatasetRef ref = registry.get(ds) ;
+//            removeJMX(ref) ;
+//        }
     }
 
-    private static void removeJMX(DatasetRef dsRef) {
-        String x = dsRef.getName() ;
-        ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x) ;
-        for (ServiceRef sRef : dsRef.getServiceRefs()) {
-            ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name) ;
-        }
-    }
+//    private static void removeJMX(DatasetRef dsRef) {
+//        String x = dsRef.getName() ;
+//        ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x) ;
+//        for (ServiceRef sRef : dsRef.getServiceRefs()) {
+//            ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name) ;
+//        }
+//    }
 
-    
+    // XXX Move to utils
     private static Model additionalRDF(Model m) {
         String x1 = StrUtils.strjoinNL
             ( SystemState.PREFIXES, 
@@ -419,18 +403,19 @@ public class FusekiConfig {
         return x ;
     }
 
-    private static List<Resource> getByType(Resource type, Model m) {
+    public static List<Resource> getByType(Resource type, Model m) {
         ResIterator rIter = m.listSubjectsWithProperty(RDF.type, type) ;
         return Iter.toList(rIter) ;
     }
 
-    private static void addServiceEP(String label, String name, ServiceRef service, Resource svc, String property) {
+    private static void addServiceEP(DataAccessPoint dataAccessPoint, DataService dataService, OperationName opName, Resource svc, String property) {
         ResultSet rs = query("SELECT * { ?svc " + property + " ?ep}", svc.getModel(), "svc", svc) ;
         for ( ; rs.hasNext() ; ) {
             QuerySolution soln = rs.next() ;
             String epName = soln.getLiteral("ep").getLexicalForm() ;
-            service.endpoints.add(epName) ;
-            log.info("  " + label + " = " + name + "/" + epName) ;
+            Operation operation = new Operation(opName, epName) ;
+            dataService.addEndpoint(opName, epName); 
+            log.info("  " + opName.name + " = " + dataAccessPoint.getName() + "/" + epName) ;
         }
     }
 
@@ -488,11 +473,13 @@ public class FusekiConfig {
         return lit.getLexicalForm() ;
     }
 
-    private static String strForResource(Resource r) {
+    // XXX Lib
+    public static String strForResource(Resource r) {
         return strForResource(r, r.getModel()) ;
     }
 
-    private static String strForResource(Resource r, PrefixMapping pm) {
+    // XXX Lib
+    public static String strForResource(Resource r, PrefixMapping pm) {
         if ( r == null )
             return "NULL " ;
         if ( r.hasProperty(RDFS.label) ) {

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=1562426&r1=1562425&r2=1562426&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 Wed Jan 29 12:16:12 2014
@@ -84,11 +84,11 @@ public class FusekiServletContextListene
                 // 2 - Directory of assemblers files "assemblers"
                 // 3 - The system database
                  
-                List<DatasetRef> configFileDBs = findDatasets(initialSetup) ;
-                List<DatasetRef> directoryDBs = FusekiConfig.readConfigurationDirectory(configDir) ;
-                List<DatasetRef> systemDBs = FusekiConfig.readSystemDatabase(SystemState.getDataset()) ;
+                List<DataAccessPoint> configFileDBs = findDatasets(initialSetup) ;
+                List<DataAccessPoint> directoryDBs = FusekiConfig.readConfigurationDirectory(configDir) ;
+                List<DataAccessPoint> systemDBs = FusekiConfig.readSystemDatabase(SystemState.getDataset()) ;
                 
-                List<DatasetRef> datasets = new ArrayList<DatasetRef>() ;
+                List<DataAccessPoint> datasets = new ArrayList<DataAccessPoint>() ;
                 datasets.addAll(configFileDBs) ;
                 datasets.addAll(directoryDBs) ;
                 datasets.addAll(systemDBs) ;
@@ -99,17 +99,17 @@ public class FusekiServletContextListene
         }
     }
     
-    private static List<DatasetRef> findDatasets(ServerInitialConfig params) {  
+    private static List<DataAccessPoint> findDatasets(ServerInitialConfig params) {  
         // Has a side effect of global context setting.
 
-        List<DatasetRef> datasets = DS.list() ;
+        List<DataAccessPoint> datasets = DS.list() ;
 
         if ( params.fusekiConfigFile != null ) {
             Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ;
-            List<DatasetRef> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
+            List<DataAccessPoint> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
             datasets.addAll(cmdLineDatasets) ;
         } else {
-            List<DatasetRef> cmdLineDatasets = FusekiConfig.defaultConfiguration(params) ;
+            List<DataAccessPoint> cmdLineDatasets = FusekiConfig.defaultConfiguration(params) ;
             datasets.addAll(cmdLineDatasets) ;
         }
         return datasets ;

Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/Operation.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/Operation.java?rev=1562426&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/Operation.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/Operation.java Wed Jan 29 12:16:12 2014
@@ -0,0 +1,79 @@
+/**
+ * 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.atlas.lib.InternalErrorException ;
+
+
+public class Operation implements Counters {
+    
+    public final OperationName opName ;
+    public final String endpointName ;
+    // Endpoint-level counters.
+    private final CounterSet counters           = new CounterSet() ;
+
+    public Operation(OperationName opName, String endpointName) {
+        this.opName = opName ;
+        if ( opName == null )
+            throw new InternalErrorException("opName is null") ;
+        this.endpointName = endpointName ;
+        // Standard counters - there may be others
+        counters.add(CounterName.Requests) ;
+        counters.add(CounterName.RequestsGood) ;
+        counters.add(CounterName.RequestsBad) ;
+    }
+
+//    /** Endpoints (as absolute path URLs) */
+//    private List<String> endpoints               = new ArrayList<String>() ;
+//    private List<String> endpointsRO             = Collections.unmodifiableList(endpoints) ;
+    
+    @Override
+    public  CounterSet getCounters()    { return counters ; }
+
+//    /** Endpoints */
+//    public  List<String> getEndpoints() { return endpointsRO ; }
+
+//    /** Endpoints */
+//    public void addEndpoint(String endpoint) { endpoints.add(endpoint) ; }
+
+    //@Override
+    public OperationName getName()      { return opName ; }
+    
+    //@Override
+    public boolean isType(OperationName operationName) { 
+        return opName.equals(operationName) ;
+    }
+
+    public String getEndpoint()         { return endpointName ; }
+    
+    //@Override 
+    public long getRequests() { 
+        return counters.value(CounterName.Requests) ;
+    }
+    //@Override
+    public long getRequestsGood() {
+        return counters.value(CounterName.RequestsGood) ;
+    }
+    //@Override
+    public long getRequestsBad() {
+        return counters.value(CounterName.RequestsBad) ;
+    }
+
+}
+

Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/OperationName.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/OperationName.java?rev=1562426&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/OperationName.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/OperationName.java Wed Jan 29 12:16:12 2014
@@ -0,0 +1,35 @@
+/**
+ * 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;
+
+public enum OperationName {
+    // Fixed names give the codebase some resilience.
+    
+    Query("query"),
+    Update("update"),
+    Upload("upload"),
+    GSP("graph store protocol"),
+    GSP_R("graph store protocol (Read)")
+    ;
+    
+    public final String name ;
+    private OperationName(String name) { this.name = name ; }
+    
+}
+

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionLib.java Wed Jan 29 12:16:12 2014
@@ -24,14 +24,12 @@ import org.apache.jena.atlas.web.AcceptL
 import org.apache.jena.atlas.web.MediaType ;
 import org.apache.jena.fuseki.DEF ;
 import org.apache.jena.fuseki.conneg.ConNeg ;
-import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
 
 /** Operations related to servlets */
 
 public class ActionLib {
-
-    
     // TODO Combine ServletOps?
     
     /** Map request to uri in the registry.
@@ -56,13 +54,14 @@ public class ActionLib {
         return uri.substring(0, i) ;
     }
 
-    public static String mapRequestToService(DatasetRef dsRef, String uri, String datasetURI)
+    public static String mapRequestToOperation(DataAccessPoint dsRef, String uri, String datasetURI)
     {
         if ( dsRef == null )
             return "" ;
-        if ( dsRef.name.length() >= uri.length() )
+        String name = dsRef.getName();
+        if ( name.length() >= uri.length() )
             return "" ;
-        return uri.substring(dsRef.name.length()+1) ;   // Skip the separating "/"
+        return uri.substring(name.length()+1) ;   // Skip the separating "/"
         
     }
     

Modified: 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=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionREST.java Wed Jan 29 12:16:12 2014
@@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletRes
 
 import org.apache.jena.fuseki.server.CounterName ;
 
-/** Common point for */ 
+/** Common point for operations that are "REST"ish (use GET/PUT etc as operations). */ 
 public abstract class ActionREST extends ActionSPARQL
 {
     public ActionREST()
@@ -75,78 +75,78 @@ public abstract class ActionREST extends
     // Counter wrappers
     
     private final void doGet$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPget) ;
+        incCounter(action.getOperation(), CounterName.HTTPget) ;
         try {
             doGet(action) ;
-            incCounter(action.srvRef, CounterName.GSPgetGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPgetGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPgetBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPGetBad) ;
             throw ex ;
         }
     }
 
     private final void doHead$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPhead) ;
+        incCounter(action.getOperation(), CounterName.HTTPhead) ;
         try {
             doHead(action) ;
-            incCounter(action.srvRef, CounterName.GSPheadGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPheadGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPheadBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPheadBad) ;
             throw ex ;
         }
     }
 
     private final void doPost$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPpost) ;
+        incCounter(action.getOperation(), CounterName.HTTPpost) ;
         try {
             doPost(action) ;
-            incCounter(action.srvRef, CounterName.GSPpostGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPpostGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPpostBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPpostBad) ;
             throw ex ;
         }
     }
 
     private final void doPatch$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPpatch) ;
+        incCounter(action.getOperation(), CounterName.HTTPpatch) ;
         try {
             doPatch(action) ;
-            incCounter(action.srvRef, CounterName.GSPpatchGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPpatchGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPpatchBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPpatchBad) ;
             throw ex ;
         }
     }
 
     private final void doDelete$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPdelete) ;
+        incCounter(action.getOperation(), CounterName.HTTPdelete) ;
         try {
             doDelete(action) ;
-            incCounter(action.srvRef, CounterName.GSPdeleteGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPdeleteGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPdeleteBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPdeleteBad) ;
             throw ex ;
         }
     }
 
     private final void doPut$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPput) ;
+        incCounter(action.getOperation(), CounterName.HTTPput) ;
         try {
             doPut(action) ;
-            incCounter(action.srvRef, CounterName.GSPputGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPputGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPputBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPputBad) ;
             throw ex ;
         }
     }
 
     private final void doOptions$(HttpAction action) {
-        incCounter(action.srvRef, CounterName.GSPoptions) ;
+        incCounter(action.getOperation(), CounterName.HTTPoptions) ;
         try {
             doOptions(action) ;
-            incCounter(action.srvRef, CounterName.GSPoptionsGood) ;
+            incCounter(action.getOperation(), CounterName.HTTPoptionsGood) ;
         } catch ( ActionErrorException ex) {
-            incCounter(action.srvRef, CounterName.GSPoptionsBad) ;
+            incCounter(action.getOperation(), CounterName.HTTPoptionsBad) ;
             throw ex ;
         }
     }

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=1562426&r1=1562425&r2=1562426&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 Wed Jan 29 12:16:12 2014
@@ -45,30 +45,34 @@ public abstract class ActionSPARQL exten
     protected abstract void perform(HttpAction action) ;
 
     @Override
-    protected void execCommonWorker(HttpAction action)
-    {
-        DatasetRef dsRef = null ;
-
+    protected void execCommonWorker(HttpAction action) {
+        DataAccessPoint dataAccessPoint = null ;
+        DataService dSrv = null ;
+        
         String datasetUri = mapRequestToDataset(action) ;
         
         if ( datasetUri != null ) {
-            dsRef = DatasetRegistry.get().get(datasetUri) ;
-            if ( dsRef == null ) {
+            dataAccessPoint = DatasetRegistry.get().get(datasetUri) ;
+            if ( dataAccessPoint == null ) {
                 ServletOps.errorNotFound("No dataset for URI: "+datasetUri) ;
                 return ;
             }
-            if ( !dsRef.isActive() )
+            //dataAccessPoint.
+            dSrv = dataAccessPoint.getDataService() ;
+            if ( ! dSrv.isAcceptingRequests() ) {
                 ServletOps.errorNotFound("Dataset not active: "+datasetUri) ;
-        } else
-            dsRef = FusekiConfig.serviceOnlyDatasetRef() ;
+                return ;
+            }
+        } else {
+            dataAccessPoint = null ;
+            dSrv = FusekiConfig.serviceOnlyDatasetRef() ;
+        }
 
         String uri = action.request.getRequestURI() ;
-        String serviceEndpointName = ActionLib.mapRequestToService(dsRef, uri, datasetUri) ;
-        ServiceRef srvRef = dsRef.getServiceRef(serviceEndpointName) ;
-
-        action.setRequestRef(dsRef, datasetUri) ;
-        action.setService(srvRef, serviceEndpointName) ;
-        
+        String operationName = ActionLib.mapRequestToOperation(dataAccessPoint, uri, datasetUri) ;
+        action.setRequest(dataAccessPoint, dSrv) ;
+        Operation op = dSrv.getOperation(operationName) ;
+        action.setOperation(op, operationName) ;
         executeAction(action) ;
     }
 
@@ -79,35 +83,37 @@ public abstract class ActionSPARQL exten
     
     // This is the service request lifecycle.
     final
-    protected void executeLifecycle(HttpAction action)
-    {
-        incCounter(action.dsRef, Requests) ;
-        incCounter(action.srvRef, Requests) ;
-        
+    protected void executeLifecycle(HttpAction action) {
         startRequest(action) ;
+        // And also HTTP counter
+        CounterSet csService = action.getDataService().getCounters() ;
+        CounterSet csOperation = action.getDataService().getCounters() ;
+        
+        incCounter(csService, Requests) ;
+        incCounter(csOperation, Requests) ;
         try {
             // Either exit this via "bad request" on validation
-            // or in 
+            // or in execution in perform. 
             try {
                 validate(action) ;
             } catch (ActionErrorException ex) {
-                incCounter(action.dsRef,RequestsBad) ;
-                incCounter(action.srvRef, RequestsBad) ;
+                incCounter(csOperation, RequestsBad) ;
+                incCounter(csService,RequestsBad) ;
                 throw ex ;
             }
 
             try {
                 perform(action) ;
                 // Success
-                incCounter(action.srvRef, RequestsGood) ;
-                incCounter(action.dsRef, RequestsGood) ;
-            } catch (ActionErrorException ex) {
-                incCounter(action.srvRef, RequestsBad) ;
-                incCounter(action.dsRef, RequestsBad) ;
+                incCounter(csOperation, RequestsGood) ;
+                incCounter(csService, RequestsGood) ;
+            } catch (ActionErrorException /*JAVA7 | QueryCancelledException*/ ex) {
+                incCounter(csOperation, RequestsBad) ;
+                incCounter(csService, RequestsBad) ;
                 throw ex ;
             } catch (QueryCancelledException ex) {
-                incCounter(action.srvRef, RequestsBad) ;
-                incCounter(action.dsRef, RequestsBad) ;
+                incCounter(csOperation, RequestsBad) ;
+                incCounter(csService, RequestsBad) ;
                 throw ex ;
             }
         } finally {
@@ -124,22 +130,32 @@ public abstract class ActionSPARQL exten
     }
     
     protected static void incCounter(Counters counters, CounterName name) {
+        if ( counters == null ) return ;
+        incCounter(counters.getCounters(), name) ; 
+    }
+    
+    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.getCounters().contains(name) )
-                counters.getCounters().inc(name) ;
+            if ( counters.contains(name) )
+                counters.inc(name) ;
         } catch (Exception ex) {
             Fuseki.serverLog.warn("Exception on counter inc", ex) ;
         }
     }
     
-    protected static void decCounter(Counters counters, CounterName name) {
+    protected static void decCounter(CounterSet counters, CounterName name) {
         if ( counters == null )
             return ;
         try {
-            if ( counters.getCounters().contains(name) )
-                counters.getCounters().dec(name) ;
+            if ( counters.contains(name) )
+                counters.dec(name) ;
         } catch (Exception ex) {
             Fuseki.serverLog.warn("Exception on counter dec", ex) ;
         }

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java Wed Jan 29 12:16:12 2014
@@ -29,8 +29,9 @@ import javax.servlet.http.HttpServletRes
 
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.fuseki.FusekiException ;
-import org.apache.jena.fuseki.server.DatasetRef ;
-import org.apache.jena.fuseki.server.ServiceRef ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
+import org.apache.jena.fuseki.server.DataService ;
+import org.apache.jena.fuseki.server.Operation ;
 import org.slf4j.Logger ;
 
 import com.hp.hpl.jena.query.ReadWrite ;
@@ -53,7 +54,7 @@ public class HttpAction
     // -- Valid only for operational actions (e.g. SPARQL).
     
     public  String          endpointName    = null ;        // Endpoint name srv was found under 
-    public  ServiceRef      srvRef          = null ;
+    public  Operation       operation       = null ;
     private Transactional   transactional   = null ;
     private boolean         isTransactional = false ;
     private DatasetGraph    activeDSG       = null ;        // Set when inside begin/end.
@@ -63,8 +64,9 @@ public class HttpAction
     
     // -- Shared items (but exact meaning may differ)
     /** Handle to dataset+services being acted on (maybe null) */
-    public  DatasetRef dsRef                = null ;
-    public  String datasetName              = null ;        // Dataset URI used (e.g. registry)
+    private DataAccessPoint dataAccessPoint = null ;
+    private DataService dataService         = null ;
+    private String datasetName              = null ;        // Dataset URI used (e.g. registry)
     private DatasetGraph dsg                = null ;
 
     // ----
@@ -97,16 +99,20 @@ public class HttpAction
     }
 
     /** Initialization after action creation during lifecycle setup */
-    public void setRequestRef(DatasetRef desc, String datasetUri) {
-        if ( this.dsRef != null )
-            throw new FusekiException("Redefintion of DatasetRef in the request action") ;
+    public void setRequest(DataAccessPoint dataAccessPoint, DataService dService) {
+        this.dataAccessPoint = dataAccessPoint ;
+        if ( dataAccessPoint != null )
+            this.datasetName = dataAccessPoint.getName() ; 
+
+        if ( this.dataService != null )
+            throw new FusekiException("Redefinition of DatasetRef in the request action") ;
         
-        this.dsRef = desc ;
-        if ( desc == null || desc.getDataset() == null )
-            throw new FusekiException("Null DatasetRef in the request action") ;
+        this.dataService = dService ;
+        if ( dService == null || dService.getDataset() == null )
+            // Null does not happens for service requests, (it does for admin requests - call setControlRequest) 
+            throw new FusekiException("Null DataService in the request action") ;
         
-        this.datasetName = datasetUri ;
-        this.dsg = desc.getDataset() ;
+        this.dsg = dService.getDataset() ;
         DatasetGraph basedsg = unwrap(dsg) ;
 
         if ( isTransactional(basedsg) && isTransactional(dsg) ) {
@@ -114,20 +120,16 @@ public class HttpAction
             transactional = (Transactional)dsg ;
             isTransactional = true ;
         } else {
-            // Unsure if safe
+            // Unsure if safesetControlRef
             transactional = new DatasetGraphWithLock(dsg) ;
             // No real abort.
             isTransactional = false ;
         }
     }
     
-    public void setControlRef(DatasetRef desc, String datasetUri) {
-        if ( desc == null )
-            throw new FusekiException("Null DatasetRef in the control action") ;
-
-        if ( this.dsRef != null )
-            throw new FusekiException("Redefintion of DatasetRef in the control action") ;
-        this.dsRef = desc ;
+    public void setControlRequest(DataAccessPoint dataAccessPoint, String datasetUri) {
+        this.dataAccessPoint = dataAccessPoint ;
+        this.dataService = null ;
         this.datasetName = datasetUri ;
     }
     
@@ -142,11 +144,15 @@ public class HttpAction
         return dsg ;
     }
         
-    public void setService(ServiceRef srvRef, String endpointName) {
-        this.srvRef = srvRef ; 
+    public void setOperation(Operation srvRef, String endpointName) {
+        this.operation = srvRef ; 
         this.endpointName = endpointName ;
     }
     
+    public Operation getOperation() {
+        return operation ; 
+    }
+
     /**
      * Returns whether or not the underlying DatasetGraph is fully transactional (supports rollback)
      */
@@ -158,11 +164,11 @@ public class HttpAction
         activeMode = READ ;
         transactional.begin(READ) ;
         activeDSG = dsg ;
-        dsRef.startTxn(READ) ;
+        dataService.startTxn(READ) ;
     }
 
     public void endRead() {
-        dsRef.finishTxn(READ) ;
+        dataService.finishTxn(READ) ;
         activeMode = null ;
         transactional.end() ;
         activeDSG = null ;
@@ -172,7 +178,7 @@ public class HttpAction
         transactional.begin(WRITE) ;
         activeMode = WRITE ;
         activeDSG = dsg ;
-        dsRef.startTxn(WRITE) ;
+        dataService.startTxn(WRITE) ;
     }
 
     public void commit() {
@@ -193,7 +199,7 @@ public class HttpAction
     }
 
     public void endWrite() {
-        dsRef.finishTxn(WRITE) ;
+        dataService.finishTxn(WRITE) ;
         activeMode = null ;
 
         if ( transactional.isInTransaction() ) {
@@ -208,22 +214,55 @@ public class HttpAction
         activeDSG = null ;
     }
 
-    public void startRequest()  { if ( dsRef != null ) dsRef.startRequest(this) ; }
+    public final void startRequest()
+    { 
+        if ( dataAccessPoint != null ) 
+            dataAccessPoint.startRequest(this) ;
+    }
 
-    public void finishRequest() { if ( dsRef != null ) dsRef.finishRequest(this) ; }
+    public final void finishRequest() { 
+        if ( dataAccessPoint != null ) 
+            dataAccessPoint.finishRequest(this) ;
+    }
     
     public final DatasetGraph getActiveDSG() {
         return activeDSG ;
     }
 
-    public final DatasetRef getDatasetRef() {
-        return dsRef ;
+    public final DataAccessPoint getDataAccessPoint() {
+        return dataAccessPoint;
+    }
+
+//    public void setDataAccessPoint(DataAccessPoint dataAccessPoint) {
+//        this.dataAccessPoint = dataAccessPoint;
+//    }
+
+    public final DataService getDataService() {
+        return dataService;
     }
 
-    /** Reduce to a size that can be kept around for sometime */
+//    public final void setDataService(DataService dataService) {
+//        this.dataService = dataService;
+//    }
+
+    public final String getDatasetName() {
+        return datasetName;
+    }
+
+//    public void setDatasetName(String datasetName) {
+//        this.datasetName = datasetName;
+//    }
+
+    /** Reduce to a size that can be kept around for sometime. 
+     * Release resources like datasets that may be closed, reset etc.
+     */
     public void minimize() {
         this.request = null ;
         this.response = null ;
+        this.dsg = null ;
+        this.dataService = null ;
+        this.activeDSG = null ;
+        this.operation = null ;
     }
 
     public void setStartTime() {

Modified: 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=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads_RW.java Wed Jan 29 12:16:12 2014
@@ -42,7 +42,7 @@ public class REST_Quads_RW extends REST_
 
     @Override
     protected void doPost(HttpAction action) {
-        if ( !action.getDatasetRef().allowDatasetUpdate )
+        if ( !action.getDataService().allowUpdate() )
             ServletOps.errorMethodNotAllowed("POST") ;
 
         if ( action.isTransactional() )
@@ -53,7 +53,7 @@ public class REST_Quads_RW extends REST_
 
     @Override
     protected void doPut(HttpAction action) {
-        if ( !action.getDatasetRef().allowDatasetUpdate )
+        if ( !action.getDataService().allowUpdate() )
             ServletOps.errorMethodNotAllowed("POST") ;
 
         if ( action.isTransactional() )

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP.java Wed Jan 29 12:16:12 2014
@@ -45,12 +45,12 @@ public abstract class SPARQL_GSP extends
             
             // Direct naming or error.
             uri = action.request.getRequestURL().toString() ;
-            if ( action.request.getRequestURI().equals(action.getDatasetRef().name) )
+            if ( action.request.getRequestURI().equals(action.getDatasetName()) )
                 // No name 
                 ServletOps.errorBadRequest("Neither default graph nor named graph specified; no direct name") ;
         }
         
-        String dsTarget = action.datasetName ;
+        String dsTarget = action.getDatasetName() ;
         
         if ( dftGraph )
             return Target.createDefault(action.getActiveDSG()) ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_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?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_R.java Wed Jan 29 12:16:12 2014
@@ -37,13 +37,11 @@ public class SPARQL_GSP_R extends SPARQL
     public SPARQL_GSP_R()
     { super() ; }
     
-    
     @Override
     protected String mapRequestToDataset(HttpAction action) { return ActionLib.mapRequestToDatasetLongest$(action.request.getRequestURI()) ; } 
 
     @Override
-    protected void doGet(HttpAction action)
-    {
+    protected void doGet(HttpAction action) {
         // Assume success - do the set up before grabbing the lock.
         // Sets content type.
         MediaType mediaType = ActionLib.contentNegotationRDF(action) ;
@@ -82,16 +80,14 @@ public class SPARQL_GSP_R extends SPARQL
     }
     
     @Override
-    protected void doOptions(HttpAction action)
-    {
+    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)
-    {
+    protected void doHead(HttpAction action) {
         action.beginRead() ;
         try { 
             Target target = determineTarget(action) ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java?rev=1562426&r1=1562425&r2=1562426&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java Wed Jan 29 12:16:12 2014
@@ -206,10 +206,10 @@ public abstract class SPARQL_Query exten
             queryStringLog = formatForLog(query) ;
             validateQuery(action, query) ;
         } catch (ActionErrorException ex) {
-            incCounter(action.srvRef, RequestsBad) ;
+            incCounter(action.getOperation().getCounters(), RequestsBad) ;
             throw ex ;
         } catch (QueryParseException ex) {
-            incCounter(action.srvRef, RequestsBad) ;
+            incCounter(action.getOperation().getCounters(), RequestsBad) ;
             ServletOps.errorBadRequest("Parse error: \n" + queryString + "\n\r" + messageForQPE(ex)) ;
         }
         // Should not happen.
@@ -229,11 +229,11 @@ public abstract class SPARQL_Query exten
             sendResults(action, result, query.getPrologue()) ;
         } catch (QueryCancelledException ex) {
             // Additional counter information.
-            incCounter(action.srvRef, QueryTimeouts) ;
+            incCounter(action.getOperation().getCounters(), QueryTimeouts) ;
             throw ex ;
         } catch (QueryExecException ex) {
             // Additional counter information.
-            incCounter(action.srvRef, QueryExecErrors) ;
+            incCounter(action.getOperation().getCounters(), QueryExecErrors) ;
             throw ex ;
         } finally {
             if ( qExec != null )
@@ -298,8 +298,8 @@ public abstract class SPARQL_Query exten
     }
 
     private void setAnyTimeouts(QueryExecution qexec, HttpAction action) {
-        if ( !(action.getDatasetRef().allowTimeoutOverride) )
-            return ;
+//        if ( !(action.getDataService().allowTimeoutOverride) )
+//            return ;
 
         long desiredTimeout = Long.MAX_VALUE ;
         String timeoutHeader = action.request.getHeader("Timeout") ;
@@ -318,7 +318,7 @@ public abstract class SPARQL_Query exten
             }
         }
 
-        desiredTimeout = Math.min(action.getDatasetRef().maximumTimeoutOverride, desiredTimeout) ;
+//        desiredTimeout = Math.min(action.getDataService().maximumTimeoutOverride, desiredTimeout) ;
         if ( desiredTimeout != Long.MAX_VALUE )
             qexec.setTimeout(desiredTimeout) ;
     }