Author: andy
Date: Wed May 29 14:00:37 2013
New Revision: 1487491

URL: http://svn.apache.org/r1487491
Log:
JENA-427 : Reorganise counters for operations.

Added:
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
Modified:
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
    
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
 Wed May 29 14:00:37 2013
@@ -95,7 +95,7 @@ public class ActionBackup extends Servle
     
     private void scheduleBackup(final HttpAction action)
     {
-        String dsName = action.desc.name ;
+        String dsName = action.dsRef.name ;
         final String ds = dsName.startsWith("/")? dsName : "/"+dsName ;
         
         String timestamp = Utils.nowAsString("yyyy-MM-dd_HH-mm-ss") ;

Added: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java?rev=1487491&view=auto
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java 
(added)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java 
Wed May 29 14:00:37 2013
@@ -0,0 +1,34 @@
+/**
+ * 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 java.util.concurrent.atomic.AtomicLong ;
+
+/** A statistics counter */
+public class Counter
+{
+    private AtomicLong counter = new AtomicLong(0) ;
+    
+    public Counter()    {}
+    
+    public void inc()   { counter.incrementAndGet() ; } 
+    public void dec()   { counter.decrementAndGet() ; } 
+    public long value() { return counter.get() ; } 
+}
+

Added: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java?rev=1487491&view=auto
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
 (added)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
 Wed May 29 14:00:37 2013
@@ -0,0 +1,77 @@
+/**
+ * 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 for all counters */ 
+public enum CounterName {
+    // Per datasset
+    DatasetRequests("requests"),
+    DatasetRequestsGood("requests.good"),
+    DatasetRequestsBad("requests.bad") ,
+    
+    // Service specific
+    QueryRequests("query.requests") ,  
+    QueryRequestsGood("query.requests.good") ,
+    QueryRequestsBad("query.requests.bad") ,
+    QueryTimeouts("query.timeouts") ,
+    QueryExecErrors("query.execerrors") ,
+    
+    UpdateRequests("update.requests") ,
+    UpdateRequestsGood("update.requests.good") ,
+    UpdateRequestsBad("update.requests.bsd") ,
+    UpdateExecErrors("update.execerrors"),
+    
+    GSPrequests("gsp.requests") ,
+    GSPrequestsGood("gsp.requests.good") ,
+    GSPrequestsBad("gsp.requests.bad") ,
+
+    GSPget("gsp.requests.get") ,
+    GSPgetGood("gsp.requests.get.good") ,
+    GSPgetBad("gsp.requests.get.bad") ,
+
+    GSPpost("gsp.requests.post") ,
+    GSPpostGood("gsp.requests.post.good") ,
+    GSPpostBad("gsp.requests.post.bad") ,
+    
+    GSPdelete("gsp.requests.delete") ,
+    GSPdeleteGood("gsp.requests.delete.good") ,
+    GSPdeleteBad("gsp.requests.delete.bad") ,
+    
+    GSPput("gsp.requests.put") ,
+    GSPputGood("gsp.requests.put.good") ,
+    GSPputBad("gsp.requests.put.bad") ,
+    
+    GSPhead("gsp.requests.head") ,
+    GSPheadGood("gsp.requests.head.good") ,
+    GSPheadBad("gsp.requests.head.bad") ,
+    
+    GSPpatch("gsp.requests.patch") ,
+    GSPpatchGood("gsp.requests.patch.good") ,
+    GSPpatchBad("gsp.requests.patch.bad") ,
+    
+    UploadRequests("upload.requests") ,
+    UploadRequestsGood("upload.requests.good") ,
+    UploadRequestsBad("upload.requests.bad") ,
+    
+    ;
+    
+    private String name ;
+    private CounterName(String name) { this.name = name ; }
+    
+}

Added: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java?rev=1487491&view=auto
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
 (added)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
 Wed May 29 14:00:37 2013
@@ -0,0 +1,53 @@
+/**
+ * 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 java.util.HashMap ;
+import java.util.Map ;
+
+import org.apache.jena.fuseki.Fuseki ;
+
+/** A collection of counters */
+public class CounterSet
+{
+    private Map<CounterName, Counter> counters = new HashMap<CounterName, 
Counter>() ;
+    
+    public CounterSet()    {}
+    
+    public void inc(CounterName c)   { get(c).inc() ; } 
+    public void dec(CounterName c)   { get(c).dec() ; } 
+    public long value(CounterName c) { return get(c).value() ; }
+
+    public void add(CounterName counterName) {
+        if ( counters.containsKey(counterName) ) {
+            Fuseki.serverLog.warn("Duplicate counter in counter set: 
"+counterName) ;
+            return ;
+        }
+        counters.put(counterName, new Counter()) ;
+    }
+    
+    private Counter get(CounterName cn) {
+        Counter c = counters.get(cn) ; 
+        if ( c == null )
+            Fuseki.serverLog.warn("No counter in counter set: "+cn) ;
+            
+        return c ;
+    }
+}
+

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
 Wed May 29 14:00:37 2013
@@ -18,8 +18,12 @@
 
 package org.apache.jena.fuseki.server;
 
+import java.util.HashMap ;
+import java.util.Map ;
 import java.util.concurrent.atomic.AtomicLong ;
 
+import org.apache.jena.fuseki.Fuseki ;
+
 import com.hp.hpl.jena.query.ReadWrite ;
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 
@@ -33,13 +37,44 @@ public class DatasetRef
     public ServiceRef upload                    = new ServiceRef("upload") ;
     public ServiceRef readGraphStore            = new ServiceRef("gspRead") ;
     public ServiceRef readWriteGraphStore       = new 
ServiceRef("gspReadWrite") ; 
+
+    // Dataset-level counters.
+    public final CounterSet counters            = new CounterSet() ;
+    private Map<String, ServiceRef> serviceRefs = new HashMap<String, 
ServiceRef>() ;
+    private boolean initialized = false ;
+    
+    // Two step initiation (c.f. Builder pattern)
+    // Create object - incrementally set state - call init to calculate 
internal datastructures.
+    public DatasetRef() {}
+    public void init() {
+        if ( initialized )
+            Fuseki.serverLog.warn("Already initialized: dataset = "+name) ;
+        initialized = true ;
+        initServices() ;
+    }
     
-//    public List<String> queryEP                 = new ArrayList<String>() ;
-//    public List<String> updateEP                = new ArrayList<String>() ;
-//    public List<String> uploadEP                = new ArrayList<String>() ;
-//    public List<String> readGraphStoreEP        = new ArrayList<String>() ;
-//    public List<String> readWriteGraphStoreEP   = new ArrayList<String>() ;
- 
+    private void initServices() {
+        add(serviceRefs, query) ;
+        add(serviceRefs, update) ;
+        add(serviceRefs, upload) ;
+        add(serviceRefs, readGraphStore) ;
+        add(serviceRefs, readWriteGraphStore) ;
+    }
+    
+    private static void add(Map<String, ServiceRef> serviceRefs, ServiceRef 
srvRef)
+    {
+        for ( String ep : srvRef.endpoints )
+            serviceRefs.put(ep, srvRef) ; 
+    }
+
+    public ServiceRef getServiceRef(String service) {
+        if ( ! initialized )
+            Fuseki.serverLog.error("Not initialized: dataset = "+name) ;
+        if ( service.startsWith("/") )
+            service = service.substring(1, service.length()) ; 
+        return serviceRefs.get(service) ;
+    }
+
     /** Counter of active read transactions */
     public AtomicLong   activeReadTxn           = new AtomicLong(0) ;
     
@@ -52,23 +87,23 @@ public class DatasetRef
     /** Cumulative counter of writer transactions */
     public AtomicLong   totalWriteTxn           = new AtomicLong(0) ;
     
-    /** Count of requests received - any service */
-    public AtomicLong   countServiceRequests    = new AtomicLong(0) ;
-    /** Count of requests received that fail in some way */
-    public AtomicLong   countServiceRequestsBad = new AtomicLong(0) ;
-    /** Count of requests received that fail in some way */
-    public AtomicLong   countServiceRequestsOK  = new AtomicLong(0) ;
-
-    // SPARQL Query
-    
-    /** Count of SPARQL Queries successfully executed */
-    public AtomicLong   countQueryOK            = new AtomicLong(0) ;
-    /** Count of SPARQL Queries with syntax errors */
-    public AtomicLong   countQueryBadSyntax     = new AtomicLong(0) ;
-    /** Count of SPARQL Queries with timeout on execution */
-    public AtomicLong   countQueryTimeout       = new AtomicLong(0) ;
-    /** Count of SPARQL Queries with execution errors (not timeouts) */
-    public AtomicLong   countQueryBadExecution  = new AtomicLong(0) ;
+//    /** Count of requests received - anyzservice */
+//    public AtomicLong   countServiceRequests    = new AtomicLong(0) ;
+//    /** Count of requests received that fail in some way */
+//    public AtomicLong   countServiceRequestsBad = new AtomicLong(0) ;
+//    /** Count of requests received that fail in some way */
+//    public AtomicLong   countServiceRequestsOK  = new AtomicLong(0) ;
+//
+//    // SPARQL Query
+//    
+//    /** Count of SPARQL Queries successfully executed */
+//    public AtomicLong   countQueryOK            = new AtomicLong(0) ;
+//    /** Count of SPARQL Queries with syntax errors */
+//    public AtomicLong   countQueryBadSyntax     = new AtomicLong(0) ;
+//    /** Count of SPARQL Queries with timeout on execution */
+//    public AtomicLong   countQueryTimeout       = new AtomicLong(0) ;
+//    /** Count of SPARQL Queries with execution errors (not timeouts) */
+//    public AtomicLong   countQueryBadExecution  = new AtomicLong(0) ;
 
     public void startTxn(ReadWrite mode)
     {
@@ -112,5 +147,4 @@ public class DatasetRef
                ! readWriteGraphStore.isActive()
                ;
     }
-    
 }

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
 Wed May 29 14:00:37 2013
@@ -109,6 +109,7 @@ public class FusekiConfig
         config.jettyConfigFile = null ;
         config.pages = Fuseki.PagesStatic ;
         config.enableCompression = true ;
+        dbDesc.init() ;
         return config ;
     }
     
@@ -209,18 +210,16 @@ public class FusekiConfig
 
     private static DatasetRef processService(Resource svc)
     {
-        DatasetRef sDesc = new DatasetRef() ;
         log.info("Service: "+nodeLabel(svc)) ;
-        
+        DatasetRef sDesc = new DatasetRef() ;
         sDesc.name = ((Literal)getOne(svc, "fu:name")).getLexicalForm() ;
         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("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();

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
 Wed May 29 14:00:37 2013
@@ -228,7 +228,10 @@ public class SPARQLServer
         
         if ( datasetPath.endsWith("/") )
             datasetPath = datasetPath.substring(0, datasetPath.length()-1) ; 
-
+        
+        addCounters(dsDesc) ;
+        dsDesc.init() ;
+        
         DatasetRegistry.get().put(datasetPath, dsDesc) ;
         serverLog.info(format("Dataset path = %s", datasetPath)) ;
         
@@ -368,4 +371,63 @@ public class SPARQLServer
             context.addFilter(GzipFilter.class, pathSpec, 
EnumSet.allOf(DispatcherType.class));
     }
 
+    private static void addCounters(DatasetRef sDesc) {
+        sDesc.counters.add(CounterName.DatasetRequests) ;
+        sDesc.counters.add(CounterName.DatasetRequestsGood) ;
+        sDesc.counters.add(CounterName.DatasetRequestsBad) ;
+        
+        sDesc.counters.add(CounterName.GSPrequests) ;
+        sDesc.counters.add(CounterName.GSPrequestsGood) ;
+        sDesc.counters.add(CounterName.GSPrequestsBad) ;
+        
+        sDesc.query.counters.add(CounterName.QueryRequests) ;
+        sDesc.query.counters.add(CounterName.QueryRequestsGood) ;
+        sDesc.query.counters.add(CounterName.QueryRequestsBad) ; 
+        sDesc.query.counters.add(CounterName.QueryTimeouts) ; 
+        sDesc.query.counters.add(CounterName.QueryExecErrors) ;
+        
+        sDesc.update.counters.add(CounterName.UpdateRequests) ;
+        sDesc.update.counters.add(CounterName.UpdateRequestsGood) ;
+        sDesc.update.counters.add(CounterName.UpdateRequestsBad) ; 
+        sDesc.update.counters.add(CounterName.UpdateExecErrors) ;
+        
+        sDesc.upload.counters.add(CounterName.UploadRequests) ;
+        sDesc.upload.counters.add(CounterName.UploadRequestsGood) ;
+        sDesc.upload.counters.add(CounterName.UploadRequestsBad) ; 
+        
+        addCountersForGSP(sDesc.readGraphStore.counters, true) ;
+        addCountersForGSP(sDesc.readWriteGraphStore.counters, false) ;
+        sDesc.init() ;
+    }
+
+    private static void addCountersForGSP(CounterSet cs, boolean readWrite) {
+        cs.add(CounterName.GSPget) ;
+        cs.add(CounterName.GSPgetGood) ;
+        cs.add(CounterName.GSPgetBad) ;
+
+        cs.add(CounterName.GSPhead) ;
+        cs.add(CounterName.GSPheadGood) ;
+        cs.add(CounterName.GSPheadBad) ;
+
+        // Add anyway.
+//        if ( ! readWrite )
+//            return ;
+        
+        cs.add(CounterName.GSPput) ;
+        cs.add(CounterName.GSPputGood) ;
+        cs.add(CounterName.GSPputBad) ;
+
+        cs.add(CounterName.GSPpost) ;
+        cs.add(CounterName.GSPpostGood) ;
+        cs.add(CounterName.GSPpostBad) ;
+
+        cs.add(CounterName.GSPdelete) ;
+        cs.add(CounterName.GSPdeleteGood) ;
+        cs.add(CounterName.GSPdeleteBad) ;
+
+        cs.add(CounterName.GSPpatch) ;
+        cs.add(CounterName.GSPpatchGood) ;
+        cs.add(CounterName.GSPpatchBad) ;
+    }
+
 }

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
 Wed May 29 14:00:37 2013
@@ -20,32 +20,23 @@ package org.apache.jena.fuseki.server;
 
 import java.util.ArrayList ;
 import java.util.List ;
-import java.util.concurrent.atomic.AtomicLong ;
 
 /** Configuration of an individual service */
 public class ServiceRef
 {
     public final String name ;
-    
+    // Service-level counters.
+    public final CounterSet counters           = new CounterSet() ;
+
     /** Endpoints (as absolute path URLs) */
     public List<String> endpoints               = new ArrayList<String>() ;
     
     // Attach counters to services or datasets 
     // Can we have a counter of the same name on different services?
     // Cost : number of maps.
+    // +ve: Multiple services with the same name counter
     
-    
-    /** Count of requests received - good or bad */
-    public AtomicLong   countRequests           = new AtomicLong(0) ;
-    /** Count of requests received that fail request checking in some way */
-    public AtomicLong   countRequestsBad        = new AtomicLong(0) ;
-    /** Count of requests that are cancelled (e..g timeouts) */
-    public AtomicLong   countRequestsCancelled  = new AtomicLong(0) ;
-    /** Count of requests that fail because of internal server issues (bugs) */
-    public AtomicLong   countRequestsOK         = new AtomicLong(0) ;
-
-    public ServiceRef(String serviceName)
-    {
+    public ServiceRef(String serviceName) {
         this.name = serviceName ;
     }
     

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java 
(original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java 
Wed May 29 14:00:37 2013
@@ -20,12 +20,5 @@ package org.apache.jena.fuseki.server;
 
 public class Stats
 {
-    public enum Counters {
-        DatasetRequests,
-        DatasetRequestsOK,
-        DatasetRequestsBad,
-        QueryRequests ,  QueryRequestsOK,  QueryBadRequests  , QueryExecErrors 
,
-        UpdateRequests , UpdateRequestsOK, UpdateBadRequests  , 
UpdateExecErrors ,
-    }
 }
 

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
 Wed May 29 14:00:37 2013
@@ -32,6 +32,7 @@ import org.apache.jena.atlas.web.MediaTy
 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.ServiceRef ;
 
 import com.hp.hpl.jena.query.ReadWrite ;
 import com.hp.hpl.jena.shared.Lock ;
@@ -42,13 +43,13 @@ import com.hp.hpl.jena.sparql.core.Trans
 
 public class HttpAction
 {
-    public  final long id ;
+    public final long id ;
     public final boolean verbose ;
     
-    
     // Phase two items - set and valida after the datasetRef is known.  
     private DatasetGraph dsg ;                  // The data
-    public DatasetRef desc ;
+    public DatasetRef dsRef ;
+    public ServiceRef srvRef ;
     
     private Transactional transactional ;
     private boolean isTransactional;
@@ -61,6 +62,9 @@ public class HttpAction
     private long startTime = -2 ;
     private long finishTime = -2 ;
     
+    // Incoming
+    //public final 
+    
     // Outcome.
     int statusCode = -1 ;
     String message = null ;
@@ -71,6 +75,7 @@ public class HttpAction
     Map <String, String> headers = new HashMap<String, String>() ;
     public HttpServletRequest request;
     public HttpServletResponseTracker response ;
+    
 
     
 //    // ---- Concurrency checking.
@@ -99,7 +104,7 @@ public class HttpAction
 
     public void setDataset(DatasetRef desc)
     {
-        this.desc = desc ;
+        this.dsRef = desc ;
         this.dsg = desc.dataset ;
 
         if ( dsg instanceof Transactional )
@@ -118,6 +123,10 @@ public class HttpAction
         }
     }
     
+    public void setService(ServiceRef srvRef) {
+        this.srvRef = srvRef ; 
+    }
+    
     /**
      * Returns whether or not the underlying DatasetGraph is fully 
transactional (supports rollback)
      */
@@ -131,12 +140,12 @@ public class HttpAction
         activeMode = READ ;
         transactional.begin(READ) ;
         activeDSG = dsg ;
-        desc.startTxn(READ) ;
+        dsRef.startTxn(READ) ;
     }
 
     public void endRead()
     {
-        desc.finishTxn(READ) ;
+        dsRef.finishTxn(READ) ;
         activeMode = null ;
         transactional.end() ;
         activeDSG = null ;
@@ -147,7 +156,7 @@ public class HttpAction
         transactional.begin(WRITE) ;
         activeMode = WRITE ;
         activeDSG = dsg ;
-        desc.startTxn(WRITE) ;
+        dsRef.startTxn(WRITE) ;
     }
 
     public void commit()
@@ -164,7 +173,7 @@ public class HttpAction
 
     public void endWrite()
     {
-        desc.finishTxn(WRITE) ;
+        dsRef.finishTxn(WRITE) ;
         activeMode = null ;
 
         if (transactional.isInTransaction())
@@ -176,15 +185,13 @@ public class HttpAction
         transactional.end() ;
         activeDSG = null ;
     }
-
-    public final DatasetGraph getActiveDSG()
-    {
+    
+    public final DatasetGraph getActiveDSG() {
         return activeDSG ;
     }
-    
-    public final DatasetRef getDatasetRef()
-    {
-        return desc ;
+
+    public final DatasetRef getDatasetRef() {
+        return dsRef ;
     }
     
     /** Reduce to a size that can be kept around for sometime */  

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
 Wed May 29 14:00:37 2013
@@ -34,6 +34,7 @@ import org.apache.jena.atlas.web.MediaTy
 import org.apache.jena.fuseki.FusekiException ;
 import org.apache.jena.fuseki.FusekiLib ;
 import org.apache.jena.fuseki.HttpNames ;
+import static org.apache.jena.fuseki.server.CounterName.* ;
 import org.apache.jena.riot.WebContent ;
 import org.apache.jena.riot.web.HttpOp ;
 import org.apache.jena.web.HttpSC ;
@@ -115,8 +116,8 @@ public abstract class SPARQL_Query exten
                                                              paramTimeout) ;
     
     @Override
-    protected void startRequest(HttpAction action)
-    {
+    protected void startRequest(HttpAction action) {
+        action.srvRef.counters.inc(QueryRequests) ;
     }
     
     /** Called to validate arguments */
@@ -138,7 +139,10 @@ public abstract class SPARQL_Query exten
         try {
             validateParams(action.request, allParams) ;
             validateRequest(action) ; 
-        } catch (ActionErrorException ex) { 
inc(action.desc.countQueryBadSyntax) ; throw ex ; } 
+        } catch (ActionErrorException ex) { 
+            action.srvRef.counters.inc(QueryRequestsBad) ;
+            throw ex ; 
+        } 
         // Query not yet parsed.
     }
     
@@ -226,15 +230,15 @@ public abstract class SPARQL_Query exten
             queryStringLog = formatForLog(query) ;
             validateQuery(action, query) ;
         } catch (ActionErrorException ex) {
-            inc(action.desc.countQueryBadSyntax) ;
+            action.srvRef.counters.inc(QueryRequestsBad) ;
             throw ex ;
         } catch (QueryParseException ex) {
-            inc(action.desc.countQueryBadSyntax) ;
+            action.srvRef.counters.inc(QueryRequestsBad) ;
             errorBadRequest("Parse error: \n" + queryString + "\n\r" + 
messageForQPE(ex)) ;
         }
         // Should not happen.
         catch (QueryException ex) {
-            inc(action.desc.countQueryBadSyntax) ;
+            action.srvRef.counters.inc(QueryRequestsBad) ;
             errorBadRequest("Error: \n" + queryString + "\n\r" + 
ex.getMessage()) ;
         }
         
@@ -248,11 +252,14 @@ public abstract class SPARQL_Query exten
             
             // Deals with exceptions itself.
             sendResults(action, result, query.getPrologue()) ;
-            inc(action.desc.countQueryOK) ;
-        } 
-        catch (QueryCancelledException ex) { 
inc(action.desc.countQueryTimeout) ; throw ex ; } 
-        catch (QueryExecException ex)      { 
inc(action.desc.countQueryBadExecution) ; throw ex ; } 
-        finally { 
+            action.srvRef.counters.inc(QueryRequestsGood) ;
+        } catch (QueryCancelledException ex) { 
+            action.srvRef.counters.inc(QueryTimeouts) ; 
+            throw ex ; 
+        } catch (QueryExecException ex) { 
+            action.srvRef.counters.inc(QueryExecErrors) ; 
+            throw ex ; 
+        } finally { 
             if ( qExec != null )
                 qExec.close() ;
             action.endRead() ;

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
 Wed May 29 14:00:37 2013
@@ -348,7 +348,6 @@ public abstract class SPARQL_REST extend
                     // Without content length, reading to end of file is 
occassionaly fraught.
                     // Reason unknown - maybe some client mishandling of the 
stream. 
                     String x = FileUtils.readWholeFileAsUTF8(input) ;
-                    //System.out.println(x) ;
                     input = new ByteArrayInputStream(x.getBytes("UTF-8")) ; 
                 }
             }

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
 Wed May 29 14:00:37 2013
@@ -31,8 +31,10 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse ;
 
 import org.apache.jena.fuseki.HttpNames ;
+import static org.apache.jena.fuseki.server.CounterName.* ;
 import org.apache.jena.fuseki.server.DatasetRef ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
+import org.apache.jena.fuseki.server.ServiceRef ;
 import org.apache.jena.web.HttpSC ;
 
 import com.hp.hpl.jena.query.ARQ ;
@@ -109,7 +111,7 @@ public abstract class SPARQL_ServletBase
         return new HttpAction(id, request, response, verbose_debug) ;
     }
 
-//XXX     protected abstract void startRequest(HttpAction action) ;
+    //protected abstract void startRequest(HttpAction action) ;
     protected void startRequest(HttpAction action) {}
 
     protected abstract void validate(HttpAction action) ;
@@ -125,23 +127,30 @@ public abstract class SPARQL_ServletBase
 
     private void execCommonWorker(HttpAction action)
     {
-        DatasetRef desc = null ;
+        DatasetRef dsRef = null ;
         String uri = action.request.getRequestURI() ;
 
-        uri = mapRequestToDataset(uri) ;
-
-        if ( uri != null ) {
-            desc = DatasetRegistry.get().get(uri) ;
-            if ( desc == null ) {
-                errorNotFound("No dataset for URI: "+uri) ;
+        String datasetUri = mapRequestToDataset(uri) ;
+        
+        if ( datasetUri != null ) {
+            dsRef = DatasetRegistry.get().get(datasetUri) ;
+            if ( dsRef == null ) {
+                errorNotFound("No dataset for URI: "+datasetUri) ;
                 return ;
             }
         } else {
-            // ????
-            desc = new DatasetRef();
-            desc.dataset = dummyDSG;
+            // General SPARQL processor
+            // - is this the right way to do it?
+            // = or make it a completely separate servlet. 
+            dsRef = new DatasetRef();
+            dsRef.dataset = dummyDSG;
+            dsRef.init() ;
         }
-        action.setDataset(desc) ;
+        
+        action.setDataset(dsRef) ;
+        String serviceName = mapRequestToService(dsRef, uri, datasetUri) ;
+        ServiceRef srvRef = dsRef.getServiceRef(serviceName) ;
+        action.setService(srvRef) ;
         executeAction(action) ;
     }
         
@@ -158,28 +167,27 @@ public abstract class SPARQL_ServletBase
     }
     
     // This is the service request lifecycle.
-    // Called directly by the UberServlet which as not done any stats by this 
point.
+    // Called directly by the UberServlet which has not done any stats by this 
point.
     protected void executeLifecycle(HttpAction action)
     {
-        // Fits with uberservlet?
-        inc(action.desc.countServiceRequests) ;
+        action.dsRef.counters.inc(DatasetRequests) ;
         startRequest(action) ;
         try {
             validate(action) ;
         } catch (ActionErrorException ex) {
-            inc(action.desc.countServiceRequestsBad) ;
+            action.dsRef.counters.inc(DatasetRequestsBad) ;
             throw ex ;
         }
 
         try {
             perform(action) ;
             // Success
-            inc(action.desc.countServiceRequestsOK) ;
+            action.dsRef.counters.inc(DatasetRequestsGood) ;
         } catch (ActionErrorException ex) {
-            inc(action.desc.countServiceRequestsBad) ;
+            action.dsRef.counters.inc(DatasetRequestsBad) ;
             throw ex ;
         } catch (QueryCancelledException ex) {
-            inc(action.desc.countServiceRequestsBad) ;
+            action.dsRef.counters.inc(DatasetRequestsBad) ;
             throw ex ;
         }
 
@@ -269,7 +277,7 @@ public abstract class SPARQL_ServletBase
     protected static String mapRequestToDataset$(String uri)
     {
         // Chop off trailing part - the service selector
-        // e.f. /dataset/sparql => /dataset 
+        // e.g. /dataset/sparql => /dataset 
         int i = uri.lastIndexOf('/') ;
         if ( i == -1 )
             return null ;
@@ -280,6 +288,23 @@ public abstract class SPARQL_ServletBase
         }
         
         return uri.substring(0, i) ;
+    }    /** Find the dataset name even if direct naming */ 
+    protected static String findTrailing(String uri, String dsname) 
+    {
+        if ( dsname.length() >= uri.length() )
+            return "" ;
+        return uri.substring(dsname.length()+1) ;   // Skip the separating "/"
+    }
+
+    
+
+    
+    protected static String mapRequestToService(DatasetRef dsRef, String uri, 
String serviceName)
+    {
+        if ( dsRef.name.length() >= uri.length() )
+            return "" ;
+        return uri.substring(dsRef.name.length()+1) ;   // Skip the separating 
"/"
+        
     }
     
     /** Implementation of mapRequestToDataset(String) that looks for the 
longest match.

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
 Wed May 29 14:00:37 2013
@@ -72,13 +72,13 @@ public abstract class SPARQL_UberServlet
     public static class AccessByConfig extends SPARQL_UberServlet
     {
         public AccessByConfig(boolean verbose_debug) { super(verbose_debug) ; }
-        @Override protected boolean allowQuery(HttpAction action)    { return 
isEnabled(action.desc.query) ; }
-        @Override protected boolean allowUpdate(HttpAction action)   { return 
isEnabled(action.desc.update) ; }
-        @Override protected boolean allowREST_R(HttpAction action)   { return 
isEnabled(action.desc.readGraphStore) || allowREST_W(action); }
-        @Override protected boolean allowREST_W(HttpAction action)   { return 
isEnabled(action.desc.readWriteGraphStore) ; }
+        @Override protected boolean allowQuery(HttpAction action)    { return 
isEnabled(action.dsRef.query) ; }
+        @Override protected boolean allowUpdate(HttpAction action)   { return 
isEnabled(action.dsRef.update) ; }
+        @Override protected boolean allowREST_R(HttpAction action)   { return 
isEnabled(action.dsRef.readGraphStore) || allowREST_W(action); }
+        @Override protected boolean allowREST_W(HttpAction action)   { return 
isEnabled(action.dsRef.readWriteGraphStore) ; }
         // Quad operations tied to presence/absence of GSP.
-        @Override protected boolean allowQuadsR(HttpAction action)   { return 
isEnabled(action.desc.readGraphStore) ; }
-        @Override protected boolean allowQuadsW(HttpAction action)   { return 
isEnabled(action.desc.readWriteGraphStore) ; }
+        @Override protected boolean allowQuadsR(HttpAction action)   { return 
isEnabled(action.dsRef.readGraphStore) ; }
+        @Override protected boolean allowQuadsW(HttpAction action)   { return 
isEnabled(action.dsRef.readWriteGraphStore) ; }
 
         private boolean isEnabled(ServiceRef service) { return 
service.isActive() ; } 
     }
@@ -130,7 +130,7 @@ public abstract class SPARQL_UberServlet
     }
     
 
-    /** Intercept the processing cycle at the  point where the action has been 
set up,
+    /** Intercept the processing cycle at the point where the action has been 
set up,
      *  the dataset target decided but no validation or execution has been 
done, 
      *  nor any stats have been done.
      */
@@ -142,7 +142,7 @@ public abstract class SPARQL_UberServlet
         HttpServletResponse response = action.response ;
         String uri = request.getRequestURI() ;
         String method = request.getMethod() ;
-        DatasetRef desc = action.desc ;
+        DatasetRef desc = action.dsRef ;
         
         String trailing = findTrailing(uri, desc.name) ;
         String qs = request.getQueryString() ;
@@ -211,11 +211,11 @@ public abstract class SPARQL_UberServlet
             // There is a trailing part.
             // Check it's not the same name as a registered service.
             // If so, dispatch to that service.
-            if ( checkDispatch(action, desc.query, trailing, queryServlet) ) 
return ; 
-            if ( checkDispatch(action, desc.update, trailing, updateServlet) ) 
return ; 
-            if ( checkDispatch(action, desc.upload, trailing, uploadServlet) ) 
return ; 
-            if ( checkDispatch(action, desc.readGraphStore, trailing, 
restServlet_R) ) return ; 
-            if ( checkDispatch(action, desc.readWriteGraphStore, trailing, 
restServlet_RW) ) return ; 
+            if ( serviceDispatch(action, desc.query, trailing, queryServlet) ) 
return ; 
+            if ( serviceDispatch(action, desc.update, trailing, updateServlet) 
) return ; 
+            if ( serviceDispatch(action, desc.upload, trailing, uploadServlet) 
) return ; 
+            if ( serviceDispatch(action, desc.readGraphStore, trailing, 
restServlet_R) ) return ; 
+            if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, 
restServlet_RW) ) return ; 
         }       
         // There is a trailing part - params are illegal by this point.
         if ( hasParams )
@@ -229,7 +229,7 @@ public abstract class SPARQL_UberServlet
     private void doGraphStoreProtocol(HttpAction action)
     {
         // The GSP servlets handle direct and indirect naming. 
-        DatasetRef desc = action.desc ;
+        DatasetRef desc = action.dsRef ;
         String method = action.request.getMethod() ;
         
         if ( HttpNames.METHOD_GET.equalsIgnoreCase(method) ||
@@ -291,7 +291,8 @@ public abstract class SPARQL_UberServlet
         return mt ;
     }
 
-    private boolean checkDispatch(HttpAction action, ServiceRef service, 
String srvName , SPARQL_ServletBase servlet)
+    /** return true if dispatched */
+    private boolean serviceDispatch(HttpAction action, ServiceRef service, 
String srvName , SPARQL_ServletBase servlet)
     {
         if ( ! service.endpoints.contains(srvName) )
             return false ;

Modified: 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
--- 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
 (original)
+++ 
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
 Wed May 29 14:00:37 2013
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServlet ;
 import javax.servlet.http.HttpServletRequest ;
 import javax.servlet.http.HttpServletResponse ;
 
+import org.apache.jena.fuseki.server.CounterName ;
 import org.apache.jena.fuseki.server.DatasetRef ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
 
@@ -57,25 +58,43 @@ public class StatsServlet extends HttpSe
     private void stats(PrintWriter out, DatasetRef desc)
     {
         out.println("Dataset: "+desc.name) ;
-        out.println("    Requests   = "+desc.countServiceRequests) ;
-        out.println("    Good       = "+desc.countServiceRequestsOK) ;
-        out.println("    Bad        = "+desc.countServiceRequestsBad) ;
+        out.println("    Requests      = 
"+desc.counters.value(CounterName.DatasetRequests)) ;
+        out.println("    Good          = 
"+desc.counters.value(CounterName.DatasetRequestsGood)) ;
+        out.println("    Bad           = 
"+desc.counters.value(CounterName.DatasetRequestsBad)) ;
+
         out.println("  SPARQL Query:") ;
-        out.println("    OK         = "+desc.countQueryOK) ;
-        out.println("    Bad Syntax = "+desc.countQueryBadSyntax) ;
-        out.println("    Timeouts   = "+desc.countQueryTimeout) ;
-        out.println("    Bad exec   = "+desc.countQueryBadExecution);
+        out.println("    Request       = 
"+desc.query.counters.value(CounterName.QueryRequests)) ;
+        out.println("    Good          = 
"+desc.query.counters.value(CounterName.QueryRequestsGood)) ;
+        out.println("    Bad requests  = 
"+desc.query.counters.value(CounterName.QueryRequestsBad)) ;
+        out.println("    Timeouts      = 
"+desc.query.counters.value(CounterName.QueryTimeouts)) ;
+        out.println("    Bad exec      = 
"+desc.query.counters.value(CounterName.QueryExecErrors)) ;
+
         out.println("  SPARQL Update:") ;
-//        out.println("    Updates    = "+desc.update.    
-//        out.println("  Upload:") ;
-//        out.println("    Uploads    = "+desc.countUpload) ;
-//        out.println("  SPARQL Graph Store Protocol:") ;
-//        out.println("    GETs       = "+desc.countGET) ;
-//        out.println("    POSTs      = "+desc.countPOST) ;
-//        out.println("    PUTs       = "+desc.countPUT) ;
-//        out.println("    DELETEs    = "+desc.countDELETE) ;
-        //out.println("   HEADs     = "+desc.countHEAD) ;
+        out.println("    Request       = 
"+desc.update.counters.value(CounterName.UpdateRequests)) ;
+        out.println("    Good          = 
"+desc.update.counters.value(CounterName.UpdateRequestsGood)) ;
+        out.println("    Bad requests  = 
"+desc.update.counters.value(CounterName.UpdateRequestsBad)) ;
+        out.println("    Bad exec      = 
"+desc.update.counters.value(CounterName.UpdateExecErrors)) ;
+        
+        out.println("  Upload:") ;
+        out.println("    Requests      = 
"+desc.upload.counters.value(CounterName.UploadRequests)) ;
+        out.println("    Good          = 
"+desc.upload.counters.value(CounterName.UploadRequestsGood)) ;
+        out.println("    Bad           = 
"+desc.upload.counters.value(CounterName.UploadRequestsBad)) ;
+        
+        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)+")") ;
+    }
+    
+    private long gspValue(DatasetRef desc, CounterName cn) {
+        long x1 = desc.readGraphStore.counters.value(cn) ;
+        long x2 = desc.readWriteGraphStore.counters.value(cn) ;
+        return x1+x2 ;
     }
     
+    
 }
 
+


Reply via email to