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 2016/08/10 12:59:07 UTC

[01/12] jena git commit: JENA-1221: Some tests for the Fuseki embedded server.

Repository: jena
Updated Branches:
  refs/heads/master 57f506197 -> a71367bc7


JENA-1221: Some tests for the Fuseki embedded server.

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

Branch: refs/heads/master
Commit: cd7f4420d16384a1f31cfc3d6e60df059abbf89d
Parents: 870b362
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 13:53:28 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 .../fuseki/embedded/FusekiEmbeddedServer.java   |   3 +-
 .../jena/fuseki/embedded/TS_EmbeddedFuseki.java |  21 ++-
 .../fuseki/embedded/TestEmbeddedFuseki.java     | 147 ++++++++++++++++++-
 3 files changed, 167 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/cd7f4420/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
index cd3b0cb..49184eb 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
@@ -27,7 +27,6 @@ import javax.servlet.ServletContext ;
 import org.apache.jena.fuseki.Fuseki ;
 import org.apache.jena.fuseki.FusekiConfigException ;
 import org.apache.jena.fuseki.FusekiException ;
-import org.apache.jena.fuseki.FusekiLogging ;
 import org.apache.jena.fuseki.build.FusekiBuilder ;
 import org.apache.jena.fuseki.build.FusekiConfig ;
 import org.apache.jena.fuseki.jetty.FusekiErrorHandler1 ;
@@ -74,7 +73,7 @@ public class FusekiEmbeddedServer {
     static { 
         //FusekiEnv.mode = FusekiEnv.INIT.EMBEDDED ;
         // Stop anything accidently resetting Fuseki server logging. 
-        FusekiLogging.allowLoggingReset(false) ;
+        //FusekiLogging.allowLoggingReset(false) ;
     }
     
     /** Construct a Fuseki server for one dataset.

http://git-wip-us.apache.org/repos/asf/jena/blob/cd7f4420/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
index 866200c..c0e06d2 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
@@ -18,6 +18,10 @@
 
 package org.apache.jena.fuseki.embedded;
 
+import org.apache.jena.atlas.logging.LogCtl ;
+import org.apache.jena.fuseki.Fuseki ;
+import org.apache.jena.fuseki.FusekiLogging ;
+import org.junit.BeforeClass ;
 import org.junit.runner.RunWith ;
 import org.junit.runners.Suite ;
 import org.junit.runners.Suite.SuiteClasses ;
@@ -26,4 +30,19 @@ import org.junit.runners.Suite.SuiteClasses ;
 @SuiteClasses({
   TestEmbeddedFuseki.class  
 })
-public class TS_EmbeddedFuseki { }
+public class TS_EmbeddedFuseki {
+    @BeforeClass public static void setupForFusekiServer() {
+        FusekiLogging.setLogging();
+        LogCtl.setLevel(Fuseki.serverLogName,        "WARN");
+        LogCtl.setLevel(Fuseki.actionLogName,        "WARN");
+        LogCtl.setLevel(Fuseki.requestLogName,       "WARN");
+        LogCtl.setLevel("org.eclipse.jetty",         "WARN");
+        
+        // Shouldn't see these in the embedded server.
+//        LogCtl.setLevel("org.apache.shiro",          "WARN") ;
+//        LogCtl.setLevel(Fuseki.configLogName,        "WARN");
+//        LogCtl.setLevel(Fuseki.adminLogName,         "WARN");
+//        LogCtl.setLevel(Fuseki.builderLogName,       "WARN");
+//        LogCtl.setLevel(Fuseki.servletRequestLogName,"WARN");
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/cd7f4420/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
index da9e658..2e2ff7b 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -18,8 +18,153 @@
 
 package org.apache.jena.fuseki.embedded;
 
+import static org.junit.Assert.assertEquals ;
+import static org.junit.Assert.assertFalse ;
+import static org.junit.Assert.assertTrue ;
+
+import java.io.OutputStream ;
+
+import org.apache.http.HttpEntity ;
+import org.apache.http.entity.ContentProducer ;
+import org.apache.http.entity.EntityTemplate ;
+import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.atlas.web.TypedInputStream ;
+import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
+import org.apache.jena.fuseki.server.DataService ;
+import org.apache.jena.fuseki.server.OperationName ;
+import org.apache.jena.graph.Graph ;
+import org.apache.jena.query.QueryExecution ;
+import org.apache.jena.query.QueryExecutionFactory ;
+import org.apache.jena.query.ResultSet ;
+import org.apache.jena.query.ResultSetFormatter ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFFormat ;
+import org.apache.jena.riot.RDFLanguages ;
+import org.apache.jena.riot.web.HttpOp ;
+import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.DatasetGraphFactory ;
+import org.apache.jena.sparql.core.Quad ;
+import org.apache.jena.sparql.graph.GraphFactory ;
+import org.apache.jena.sparql.sse.SSE ;
+import org.apache.jena.system.Txn ;
+import org.apache.jena.update.UpdateExecutionFactory ;
+import org.apache.jena.update.UpdateFactory ;
+import org.apache.jena.update.UpdateRequest ;
 import org.junit.Test ;
 
 public class TestEmbeddedFuseki {
-    @Test public void dummy() {}
+    
+    @Test public void embedded_01() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds", dsg) ;
+        assertTrue(DataAccessPointRegistry.get().isRegistered("/ds")) ;
+        server.start() ;
+        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3330/ds/query", "SELECT * { ?s ?p ?o}") ) {
+            ResultSet rs = qExec.execSelect() ; 
+            assertFalse(rs.hasNext()) ;
+        }
+        server.stop() ;
+    }
+
+    @Test public void embedded_02() {
+        // test order !!!!
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds2", dsg) ;
+        // But no /ds
+        assertEquals(1,  DataAccessPointRegistry.get().size()) ;
+        assertTrue(DataAccessPointRegistry.get().isRegistered("/ds2")) ;
+        assertFalse(DataAccessPointRegistry.get().isRegistered("/ds")) ;
+        server.start() ;
+        server.stop() ;
+    }
+    
+    @Test public void embedded_03() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3331)
+            .add("/ds1", dsg) 
+            .build() ;
+        server.start() ;
+        // Add while live.
+        Txn.execWrite(dsg,  ()->{
+            Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
+            dsg.add(q); 
+        }) ;
+        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3331/ds1/query", "SELECT * { ?s ?p ?o}") ) {
+            ResultSet rs = qExec.execSelect() ; 
+            int x = ResultSetFormatter.consume(rs) ;
+            assertEquals(1, x) ;
+        }
+        server.stop() ;
+    }
+    
+    
+    @Test public void embedded_04() {
+        DatasetGraph dsg = dataset() ;
+        Txn.execWrite(dsg,  ()->{
+            Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
+            dsg.add(q); 
+        }) ;
+
+        // A service with just being able to do quads operations
+        // That is, GET, POST, PUT on  "/data" in N-quads and TriG. 
+        DataService dataService = new DataService(dsg) ;
+        dataService.addEndpoint(OperationName.Quads_RW, "");
+        dataService.addEndpoint(OperationName.Query, "");
+        dataService.addEndpoint(OperationName.Update, "");
+        
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3332)
+            .add("/data", dataService)
+            .build() ;
+        server.start() ;
+        
+        // Put data in.
+        String data = "(graph (:s :p 1) (:s :p 2) (:s :p 3))" ;
+        Graph g = SSE.parseGraph(data) ;
+        HttpEntity e = graphToHttpEntity(g) ;
+        HttpOp.execHttpPut("http://localhost:3332/data", e) ;
+
+        // Get data out.
+        try ( TypedInputStream in = HttpOp.execHttpGet("http://localhost:3332/data") ) { 
+            Graph g2 = GraphFactory.createDefaultGraph() ;
+            RDFDataMgr.read(g2, in, RDFLanguages.contentTypeToLang(in.getContentType())) ;
+            assertTrue(g.isIsomorphicWith(g2)) ;
+        }
+        // Query.
+        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3332/data", "SELECT * { ?s ?p ?o}") ) {
+            ResultSet rs = qExec.execSelect() ; 
+            int x = ResultSetFormatter.consume(rs) ;
+            assertEquals(3, x) ;
+        }
+        // Update
+        UpdateRequest req = UpdateFactory.create("CLEAR DEFAULT") ;
+        UpdateExecutionFactory.createRemote(req, "http://localhost:3332/data").execute(); 
+        // Query again.
+        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3332/data", "SELECT * { ?s ?p ?o}") ) {
+            ResultSet rs = qExec.execSelect() ; 
+            int x = ResultSetFormatter.consume(rs) ;
+            assertEquals(0, x) ;
+        }
+        server.stop() ;
+    }
+        
+    /** Create an HttpEntity for the graph */  
+    protected static HttpEntity graphToHttpEntity(final Graph graph) {
+        final RDFFormat syntax = RDFFormat.TURTLE_BLOCKS ;
+        ContentProducer producer = new ContentProducer() {
+            @Override
+            public void writeTo(OutputStream out) {
+                RDFDataMgr.write(out, graph, syntax) ;
+            }
+        } ;
+        EntityTemplate entity = new EntityTemplate(producer) ;
+        ContentType ct = syntax.getLang().getContentType() ;
+        entity.setContentType(ct.getContentType()) ;
+        return entity ;
+    }
+
+    private DatasetGraph dataset() {
+        return DatasetGraphFactory.createTxnMem() ;
+    }
 }


[03/12] jena git commit: Remove incorrect comment.

Posted by an...@apache.org.
Remove incorrect comment.

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

Branch: refs/heads/master
Commit: 870b3626f5359a771c2c554c501fda6bc2da86be
Parents: 4e20f28
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 12:33:16 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 .../src/test/java/org/apache/jena/fuseki/TS_Fuseki.java             | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/870b3626/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java b/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
index e7a09ee..9424eb8 100644
--- a/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
+++ b/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
@@ -59,7 +59,6 @@ public class TS_Fuseki extends ServerTest
         FusekiLogging.setLogging();
         FusekiEnv.setEnvironment() ;
         
-        // Occasionally log4j.properties gets out of step.
         LogCtl.setLevel("org.apache.shiro",          "WARN") ;
         LogCtl.setLevel("org.eclipse.jetty",         "WARN");
         


[02/12] jena git commit: JENA-1221: Embedded Fuseki server

Posted by an...@apache.org.
JENA-1221: Embedded Fuseki server


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

Branch: refs/heads/master
Commit: cf50a98b731591470ed11df5e9135a5c85ba3ce5
Parents: 57f5061
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Aug 6 14:49:36 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 jena-fuseki2/jena-fuseki-embedded/pom.xml       | 131 ++++++++++
 .../fuseki/embedded/FusekiEmbeddedServer.java   | 257 +++++++++++++++++++
 .../jena/fuseki/embedded/TS_EmbeddedFuseki.java |  29 +++
 .../fuseki/embedded/TestEmbeddedFuseki.java     |  25 ++
 jena-fuseki2/pom.xml                            |   1 +
 5 files changed, 443 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/cf50a98b/jena-fuseki2/jena-fuseki-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/pom.xml b/jena-fuseki2/jena-fuseki-embedded/pom.xml
new file mode 100644
index 0000000..72fc04e
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/pom.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" 
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <name>Apache Jena - Fuseki Embedded Server</name>
+  <artifactId>jena-fuseki-embedded</artifactId>
+
+  <parent>
+    <groupId>org.apache.jena</groupId>
+    <artifactId>jena-fuseki</artifactId>
+    <version>2.4.1-SNAPSHOT</version>
+  </parent> 
+
+  <packaging>jar</packaging>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.jena</groupId>
+      <artifactId>jena-fuseki-core</artifactId>
+      <version>2.4.1-SNAPSHOT</version>
+      <!-- No specific logging - leave to the application -->
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-log4j12</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+        </exclusion>
+        <!-- -->
+         <exclusion>
+          <groupId>org.apache.jena</groupId>
+          <artifactId>jena-text</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.jena</groupId>
+          <artifactId>jena-spatial</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <!-- Logging examples -->
+    <!-- java.util.logging.
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-jdk14</artifactId>
+      <version>1.7.21</version>
+    </dependency>
+    -->
+
+    <!-- Log4j
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.7.21</version>
+    </dependency>
+
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.17</version>
+    </dependency> 
+    -->
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>package</phase>
+            <goals>
+              <goal>jar-no-fork</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/TS_*.java</include>
+          </includes>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <overWriteReleases>false</overWriteReleases>
+          <overWriteIfNewer>true</overWriteIfNewer>
+        </configuration>
+      </plugin>
+
+    </plugins>
+
+  </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/jena/blob/cf50a98b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
new file mode 100644
index 0000000..9161453
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
@@ -0,0 +1,257 @@
+/*
+ * 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.embedded;
+
+import java.util.HashMap ;
+import java.util.List ;
+import java.util.Map ;
+
+import org.apache.jena.fuseki.Fuseki ;
+import org.apache.jena.fuseki.FusekiConfigException ;
+import org.apache.jena.fuseki.FusekiException ;
+import org.apache.jena.fuseki.FusekiLogging ;
+import org.apache.jena.fuseki.build.FusekiBuilder ;
+import org.apache.jena.fuseki.build.FusekiConfig ;
+import org.apache.jena.fuseki.jetty.FusekiErrorHandler1 ;
+import org.apache.jena.fuseki.server.* ;
+import org.apache.jena.fuseki.servlets.FusekiFilter ;
+import org.apache.jena.sparql.core.DatasetGraph ;
+import org.eclipse.jetty.server.HttpConnectionFactory ;
+import org.eclipse.jetty.server.Server ;
+import org.eclipse.jetty.server.ServerConnector ;
+import org.eclipse.jetty.servlet.FilterHolder ;
+import org.eclipse.jetty.servlet.ServletContextHandler ;
+
+/**
+ * Embedded Fuseki server. This is a Fuseki server running with a precofigured set of
+ * datasets and services. 
+ * There is no admin UI.
+ * <p>
+ * To create a embedded sever, use {@link FusekiEmbeddedServer} ({@link #make} is a
+ * packaging of a call to {@link FusekiEmbeddedServer} for the case of one dataset,
+ * responding to localhost only).
+ * <p>
+ * The application should call {@link #start()} to actually start the server
+ * (it wil run in the background : see {@link #join}).
+ * <p>Example:
+ * <pre>
+ *      DatasetGraph dsg = ... ;
+ *      FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+ *          .setPort(1234)
+ *          .add("/ds", dsg)
+ *          .build() ;
+ *       server.start() ;
+ * </pre>
+ * Compact form (use the builder pattern above to get more flexibility):
+ * <pre>
+ *    FusekiEmbeddedServer.make(1234, "/ds", dsg).start() ;
+ * </pre>
+ * 
+ */
+public class FusekiEmbeddedServer {
+    static { 
+        //FusekiEnv.mode = FusekiEnv.INIT.EMBEDDED ;
+        // Stop anything accidently resetting Fuseki server logging. 
+        FusekiLogging.allowLoggingReset(false) ;
+    }
+    
+    /** Construct a Fuseki server for one dataset.
+     * It only responds to localhost. 
+     * The returned server has not been started  */ 
+    static public FusekiEmbeddedServer make(int port, String name, DatasetGraph dsg) {
+        return create()
+            .setPort(port)
+            .setLoopback(true)
+            .add(name, dsg)
+            .build() ;
+    }
+    
+    public static Builder create() {
+        return new Builder() ;
+    }
+    
+    public final Server server ;
+    private int port ;
+    
+    public FusekiEmbeddedServer(Server server) {
+        this.server = server ;
+        port = ((ServerConnector)server.getConnectors()[0]).getPort() ;
+    }
+    
+    /** Get the underlying Jetty server which has also been set up.
+     * Adding new servlets is posisble with care.
+     */ 
+    public Server getJettyServer() {
+        return server ; 
+    }
+    
+    /** Start the server - the server continues to run afetr thsi call returns.
+     *  To synchronise with the server stopping, call {@link #join}.  
+     */
+    public void start() { 
+        try { server.start(); }
+        catch (Exception e) { throw new FusekiException(e) ; }
+        if ( port == 0 )
+            port = ((ServerConnector)server.getConnectors()[0]).getLocalPort() ;
+        Fuseki.serverLog.info("Start Fuseki (port="+port+")");
+    }
+
+    /** Stop the server. */
+    public void stop() { 
+        Fuseki.serverLog.info("Stop Fuseki (port="+port+")");
+        try { server.stop(); }
+        catch (Exception e) { throw new FusekiException(e) ; }
+    }
+    
+    /** Wait for the server to exit. This call is blocking. */
+    public void join() {
+        try { server.join(); }
+        catch (Exception e) { throw new FusekiException(e) ; }
+    }
+    
+    /** FusekiEmbeddedServer.Builder */
+    public static class Builder {
+        // Keeping this allows accumulation of data access points for one name.  
+        private Map<String, DataService> map = new HashMap<>() ;
+        private int port = 3333 ;
+        private boolean loopback = false ;
+        private String path = "/" ;
+        
+        /* Set the port to run on */ 
+        public Builder setPort(int port) {
+            this.port = port ;
+            return this ;
+        }
+        
+        /* Context path to Fuseki.  If it's "/" then Fuseki URL look like
+         * "http://host:port/dataset/query" else "http://host:port/path/dataset/query" 
+         */
+        public Builder setContextPath(String path) {
+            this.path = path ;
+            return this ;
+        }
+        
+        /** Restrict the server to only respoding to the localhost interface. */ 
+        public Builder setLoopback(boolean loopback) {
+            this.loopback = loopback;
+            return this ;
+        }
+
+        /* Add the dataset with given name and a default set of services including update */  
+        public Builder add(String name, DatasetGraph dsg) {
+            return add(name, dsg, true) ;
+        }
+
+        /* Add the dataset with given name and a default set of services. */  
+        public Builder add(String name, DatasetGraph dsg, boolean allowUpdate) {
+            DataService dSrv = FusekiBuilder.buildDataService(dsg, allowUpdate) ; 
+            return add(name, dSrv) ;
+        }
+        
+        /* Add a data service that includes dataset and service names.*/  
+        public Builder add(String name, DataService dataService) {
+            return add$(name, dataService) ; 
+        }
+        
+        /* Add an operation, specifing it's endpoint name.
+         * This adds endpoints to any existing data service already setup by the builder.   
+         */
+        public Builder add(String name, DatasetGraph dsg, OperationName opName, String epName) {
+            DataService dSrv = map.get(name) ;
+            if ( dSrv == null ) {
+                dSrv = new DataService(dsg) ;
+                map.put(name, dSrv) ;
+            }
+            dSrv.addEndpoint(opName, epName);
+            return this ; 
+        }
+
+        private Builder add$(String name, DataService dataService) {
+            DataService dSrv = map.get(name) ;
+            if ( dSrv != null ) {
+                DatasetGraph dsg1 = dSrv.getDataset() ;
+                DatasetGraph dsg2 = dataService.getDataset() ;
+                if ( dsg1 != dsg2 ) // Object identity
+                    throw new FusekiConfigException("Attempt to add a DataService for a different dataset: "+name) ;
+                dSrv.getOperations() ;
+            } else
+                map.put(name, dataService) ;
+            return this ;
+        }
+        
+        /** Read and parse a Fuseki services/datasets file.
+         *  <p>
+         *  The application is responsible for ensuring a correct classpath. For example,
+         *  including a dependency on {@code jena-text} if the configuration file
+         *  includes a text index.     
+         */
+        public Builder parseConfigFile(String filename) {
+            List<DataAccessPoint> x = FusekiConfig.readConfigurationFile(filename) ;
+            // Unbundle so that they accumulate.
+            x.forEach(dap-> add(dap.getName(), dap.getDataService())) ;
+            return this ;
+        }
+
+        /** Build a server according to the current description */ 
+        public FusekiEmbeddedServer build() {
+            map.forEach((name, dSrv) -> {
+                DataAccessPoint dap = new DataAccessPoint(name, dSrv) ;
+                DataAccessPointRegistry.get().put(name, dap) ;
+            }) ;
+            Server server = fusekiServer(port, path, loopback) ;
+            return new FusekiEmbeddedServer(server) ;
+        }
+
+        /** build process */
+        private static Server fusekiServer(int port, String contextPath, boolean loopback) {
+            if ( contextPath == null || contextPath.isEmpty() )
+                contextPath = "/" ;
+            ServletContextHandler context = new ServletContextHandler() ;
+            // The Fuseki server-wide setup.
+            DataAccessPointRegistry.set(context.getServletContext(), new DataAccessPointRegistry()); 
+            FusekiFilter ff = new FusekiFilter() ;
+            FilterHolder h = new FilterHolder(ff) ;
+            context.setContextPath(contextPath); 
+            context.addFilter(h, "/*", null);
+            context.setDisplayName(Fuseki.servletRequestLogName);  
+            context.setErrorHandler(new FusekiErrorHandler1());
+            Server server = jettyServer(port, loopback) ;
+            server.setHandler(context);
+            return server ;
+        }
+
+        /** Jetty build process */
+        private static Server jettyServer(int port, boolean loopback) {
+            Server server = new Server() ;
+            HttpConnectionFactory f1 = new HttpConnectionFactory() ;
+            // Some people do try very large operations ... really, should use POST.
+            f1.getHttpConfiguration().setRequestHeaderSize(512 * 1024);
+            f1.getHttpConfiguration().setOutputBufferSize(5 * 1024 * 1024) ;
+            // Do not add "Server: Jetty(....) when not a development system.
+            if ( ! Fuseki.outputJettyServerHeader )
+                f1.getHttpConfiguration().setSendServerVersion(false) ;
+            ServerConnector connector = new ServerConnector(server, f1) ;
+            connector.setPort(port) ;
+            server.addConnector(connector);
+            if ( loopback )
+                connector.setHost("localhost");
+            return server ;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/cf50a98b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
new file mode 100644
index 0000000..866200c
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
@@ -0,0 +1,29 @@
+/*
+ * 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.embedded;
+
+import org.junit.runner.RunWith ;
+import org.junit.runners.Suite ;
+import org.junit.runners.Suite.SuiteClasses ;
+
+@RunWith(Suite.class)
+@SuiteClasses({
+  TestEmbeddedFuseki.class  
+})
+public class TS_EmbeddedFuseki { }

http://git-wip-us.apache.org/repos/asf/jena/blob/cf50a98b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
new file mode 100644
index 0000000..da9e658
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -0,0 +1,25 @@
+/*
+ * 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.embedded;
+
+import org.junit.Test ;
+
+public class TestEmbeddedFuseki {
+    @Test public void dummy() {}
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/cf50a98b/jena-fuseki2/pom.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/pom.xml b/jena-fuseki2/pom.xml
index 11728ee..7b6f126 100644
--- a/jena-fuseki2/pom.xml
+++ b/jena-fuseki2/pom.xml
@@ -70,6 +70,7 @@
 
   <modules>
     <module>jena-fuseki-core</module>
+    <module>jena-fuseki-embedded</module>
     <module>jena-fuseki-war</module>
     <module>jena-fuseki-server</module>
     <module>apache-jena-fuseki</module>


[10/12] jena git commit: Reorder so autogenerate puts the operations in a better order.

Posted by an...@apache.org.
Reorder so autogenerate puts the operations in a better order.

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

Branch: refs/heads/master
Commit: bfa5b147ab921b43e875764b38b9b61cb24e3caa
Parents: 57f5061
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Aug 8 10:38:42 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Aug 8 10:38:42 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/jena/sparql/core/Transactional.java   | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bfa5b147/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
index 1af3f1a..91809af 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
@@ -39,9 +39,9 @@ public interface Transactional
     /** Abort a transaction - finish the transaction and undo any changes (if a "write" transaction) */  
     public void abort() ;
 
-    /** Say whether inside a transaction. */ 
-    public boolean isInTransaction() ;
-    
     /** Finish the transaction - if a write transaction and commit() has not been called, then abort */  
     public void end() ;
+
+    /** Say whether inside a transaction. */ 
+    public boolean isInTransaction() ;
 }


[08/12] jena git commit: Switch default port to 3330.

Posted by an...@apache.org.
Switch default port to 3330.

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

Branch: refs/heads/master
Commit: 1acfc242385545a28c583c9c23c30be9ae627013
Parents: 176fb13
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 18:52:34 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 18:52:34 2016 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java | 2 +-
 .../java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/1acfc242/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
index 49184eb..59c1364 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
@@ -139,7 +139,7 @@ public class FusekiEmbeddedServer {
     public static class Builder {
         // Keeping this allows accumulation of data access points for one name.  
         private Map<String, DataService> map = new HashMap<>() ;
-        private int port = 3333 ;
+        private int port = 3330 ;
         private boolean loopback = false ;
         private boolean withStats = false ;
         private String contextPath = "/" ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1acfc242/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
index d96faa0..8341342 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -63,7 +63,7 @@ public class TestEmbeddedFuseki {
 
     @Test public void embedded_01() {
         DatasetGraph dsg = dataset() ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds", dsg) ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create().add("/ds", dsg).build() ;
         assertTrue(DataAccessPointRegistry.get().isRegistered("/ds")) ;
         server.start() ;
         query("http://localhost:3330/ds/query", "SELECT * { ?s ?p ?o}", qExec-> {


[04/12] jena git commit: Convenience operation to help walking JSON structures.

Posted by an...@apache.org.
Convenience operation to help walking JSON structures.

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

Branch: refs/heads/master
Commit: 9b243604937625447a426d027639e021f86650c4
Parents: 7f4baef
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 11:58:54 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/jena/atlas/json/JsonObject.java  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9b243604/jena-arq/src/main/java/org/apache/jena/atlas/json/JsonObject.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/json/JsonObject.java b/jena-arq/src/main/java/org/apache/jena/atlas/json/JsonObject.java
index b83d1cb..b7e89db 100644
--- a/jena-arq/src/main/java/org/apache/jena/atlas/json/JsonObject.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/json/JsonObject.java
@@ -54,11 +54,6 @@ public class JsonObject extends JsonValue
         return map.containsKey(key) ;
     }
     
-//    @Override
-//    public boolean containsValue(Object value) {
-//        return map.containsValue(value) ;
-//    }
-    
     public Set<String> keys() {
         return map.keySet() ;
     }
@@ -71,6 +66,11 @@ public class JsonObject extends JsonValue
         return map.get(key) ;
     }
 
+    /** For walking structures */
+    public JsonObject getObj(String key) {
+        return get(key).getAsObject() ;
+    }
+
     public boolean isEmpty() {
         return map.isEmpty() ;
     }


[12/12] jena git commit: JENA-1221: Merge commit 'refs/pull/162/head' of github.com:apache/jena

Posted by an...@apache.org.
JENA-1221: Merge commit 'refs/pull/162/head' of github.com:apache/jena

This closes #162.


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

Branch: refs/heads/master
Commit: a71367bc77636ad3ad7593e424602c6d7860acde
Parents: d4c3d4b ff28bc6
Author: Andy Seaborne <an...@apache.org>
Authored: Wed Aug 10 13:15:10 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed Aug 10 13:15:10 2016 +0100

----------------------------------------------------------------------
 .../org/apache/jena/atlas/json/JsonObject.java  |  10 +-
 .../org/apache/jena/fuseki/mgt/ActionStats.java |  47 ++-
 .../fuseki/server/DataAccessPointRegistry.java  |   9 +-
 .../java/org/apache/jena/fuseki/TS_Fuseki.java  |   1 -
 jena-fuseki2/jena-fuseki-embedded/pom.xml       | 131 ++++++++
 .../fuseki/embedded/FusekiEmbeddedServer.java   | 305 +++++++++++++++++++
 .../jena/fuseki/embedded/TS_EmbeddedFuseki.java |  49 +++
 .../fuseki/embedded/TestEmbeddedFuseki.java     | 269 ++++++++++++++++
 .../testing/FusekiEmbedded/config.ttl           |  18 ++
 jena-fuseki2/pom.xml                            |   1 +
 10 files changed, 802 insertions(+), 38 deletions(-)
----------------------------------------------------------------------



[05/12] jena git commit: Refactor code to enable local access to JSON stats building.

Posted by an...@apache.org.
Refactor code to enable local access to JSON stats building.


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

Branch: refs/heads/master
Commit: 7f4baef0d6bb5fac246cc70b71710a0555275eb5
Parents: cf50a98
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 11:41:03 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 .../org/apache/jena/fuseki/mgt/ActionStats.java | 47 ++++++++------------
 1 file changed, 18 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/7f4baef0/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
index b44e678..fc95331 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/mgt/ActionStats.java
@@ -30,6 +30,7 @@ import javax.servlet.ServletOutputStream ;
 import javax.servlet.http.HttpServletResponse ;
 
 import org.apache.jena.atlas.json.JsonBuilder ;
+import org.apache.jena.atlas.json.JsonObject ;
 import org.apache.jena.atlas.json.JsonValue ;
 import org.apache.jena.fuseki.server.* ;
 import org.apache.jena.fuseki.servlets.HttpAction ;
@@ -44,21 +45,20 @@ public class ActionStats extends ActionContainerItem
     @Override
     protected JsonValue execGetContainer(HttpAction action) { 
         action.log.info(format("[%d] GET stats all", action.id)) ;
+        return generateStats(action.getDataAccessPointRegistry()) ;
+    }
+
+    public static JsonObject generateStats(DataAccessPointRegistry registry) {
         JsonBuilder builder = new JsonBuilder() ;
         builder.startObject("top") ;
-        
         builder.key(JsonConst.datasets) ;
         builder.startObject("datasets") ;
-        for ( String ds : action.getDataAccessPointRegistry().keys() ) {
-            DataAccessPoint access = action.getDataAccessPointRegistry().get(ds) ;
-            statsDataset(builder, access) ; 
-        }
+        registry.forEach((name, access)->statsDataset(builder, access));
         builder.finishObject("datasets") ;
-        
         builder.finishObject("top") ;
-        return builder.build() ;
+        return builder.build().getAsObject() ;
     }
-
+    
     @Override
     protected JsonValue execGetItem(HttpAction action) {
         action.log.info(format("[%d] GET stats dataset %s", action.id, action.getDatasetName())) ;
@@ -75,13 +75,19 @@ public class ActionStats extends ActionContainerItem
         builder.finishObject("TOP") ;
         return builder.build() ;
     }
-
+    
+    public static JsonObject generateStats(DataAccessPoint access) {
+        JsonBuilder builder = new JsonBuilder() ;
+        statsDataset(builder, access) ;
+        return builder.build().getAsObject() ;
+    }
+    
     private void statsDataset(JsonBuilder builder, String name, DataAccessPointRegistry registry) {
         DataAccessPoint access = registry.get(name) ;
         statsDataset(builder, access);
     }
     
-    private void statsDataset(JsonBuilder builder, DataAccessPoint access) {
+    private static void statsDataset(JsonBuilder builder, DataAccessPoint access) {
         // Object started
         builder.key(access.getName()) ;
         DataService dSrv = access.getDataService() ;
@@ -91,29 +97,13 @@ public class ActionStats extends ActionContainerItem
         builder.key(CounterName.RequestsGood.name()).value(dSrv.getCounters().value(CounterName.RequestsGood)) ;
         builder.key(CounterName.RequestsBad.name()).value(dSrv.getCounters().value(CounterName.RequestsBad)) ;
         
-        
-        // Build the operation -> endpoint list map.
-        
-//      MultiMap<OperationName, Endpoint> map = MultiMap.createMapList() ;
-//      for ( OperationName operName : dSrv.getOperations() ) {
-//          List<Endpoint> endpoints = access.getDataService().getOperation(operName) ;
-//          for ( Endpoint endpoint : endpoints )
-//              map.put(operName, endpoint) ; 
-//      }
-        
-        
         builder.key(JsonConst.endpoints).startObject("endpoints") ;
         
         for ( OperationName operName : dSrv.getOperations() ) {
             List<Endpoint> endpoints = access.getDataService().getOperation(operName) ;
-//            System.err.println(operName+" : "+endpoints.size()) ;
-//            for ( Endpoint endpoint : endpoints )
-//                System.err.println("  "+endpoint.getEndpoint()) ;
             
             for ( Endpoint endpoint : endpoints ) {
-                
-                // Endpoint names are unique but not services.
-                
+                // Endpoint names are unique for a given service.
                 builder.key(endpoint.getEndpoint()) ;
                 builder.startObject() ;
                 
@@ -126,10 +116,9 @@ public class ActionStats extends ActionContainerItem
         }
         builder.finishObject("endpoints") ;
         builder.finishObject("counters") ;
-
     }
 
-    private void operationCounters(JsonBuilder builder, Endpoint operation) {
+    private static void operationCounters(JsonBuilder builder, Endpoint operation) {
         for (CounterName cn : operation.getCounters().counters()) {
             Counter c = operation.getCounters().get(cn) ;
             builder.key(cn.name()).value(c.value()) ;


[07/12] jena git commit: JENA-1221: More tests

Posted by an...@apache.org.
JENA-1221: More tests

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

Branch: refs/heads/master
Commit: 176fb1331cb3c32725de7aefb708348c79c8bfa4
Parents: cd7f442
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 14:19:19 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 14:19:19 2016 +0100

----------------------------------------------------------------------
 .../jena/fuseki/embedded/TS_EmbeddedFuseki.java |   3 +-
 .../fuseki/embedded/TestEmbeddedFuseki.java     | 182 ++++++++++++++-----
 .../testing/FusekiEmbedded/config.ttl           |  18 ++
 3 files changed, 156 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/176fb133/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
index c0e06d2..c66149d 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TS_EmbeddedFuseki.java
@@ -36,12 +36,13 @@ public class TS_EmbeddedFuseki {
         LogCtl.setLevel(Fuseki.serverLogName,        "WARN");
         LogCtl.setLevel(Fuseki.actionLogName,        "WARN");
         LogCtl.setLevel(Fuseki.requestLogName,       "WARN");
+        LogCtl.setLevel(Fuseki.adminLogName,         "WARN");
         LogCtl.setLevel("org.eclipse.jetty",         "WARN");
         
         // Shouldn't see these in the embedded server.
 //        LogCtl.setLevel("org.apache.shiro",          "WARN") ;
 //        LogCtl.setLevel(Fuseki.configLogName,        "WARN");
-//        LogCtl.setLevel(Fuseki.adminLogName,         "WARN");
+
 //        LogCtl.setLevel(Fuseki.builderLogName,       "WARN");
 //        LogCtl.setLevel(Fuseki.servletRequestLogName,"WARN");
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/176fb133/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
index 2e2ff7b..d96faa0 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -20,14 +20,18 @@ package org.apache.jena.fuseki.embedded;
 
 import static org.junit.Assert.assertEquals ;
 import static org.junit.Assert.assertFalse ;
+import static org.junit.Assert.assertNotNull ;
+import static org.junit.Assert.assertNull ;
 import static org.junit.Assert.assertTrue ;
 
 import java.io.OutputStream ;
+import java.util.function.Consumer ;
 
 import org.apache.http.HttpEntity ;
 import org.apache.http.entity.ContentProducer ;
 import org.apache.http.entity.EntityTemplate ;
 import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.atlas.web.HttpException ;
 import org.apache.jena.atlas.web.TypedInputStream ;
 import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
 import org.apache.jena.fuseki.server.DataService ;
@@ -50,32 +54,35 @@ import org.apache.jena.system.Txn ;
 import org.apache.jena.update.UpdateExecutionFactory ;
 import org.apache.jena.update.UpdateFactory ;
 import org.apache.jena.update.UpdateRequest ;
+import org.apache.jena.web.HttpSC ;
 import org.junit.Test ;
 
 public class TestEmbeddedFuseki {
     
+    private static final String DIR = "testing/FusekiEmbedded/" ;
+
     @Test public void embedded_01() {
         DatasetGraph dsg = dataset() ;
         FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds", dsg) ;
         assertTrue(DataAccessPointRegistry.get().isRegistered("/ds")) ;
         server.start() ;
-        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3330/ds/query", "SELECT * { ?s ?p ?o}") ) {
+        query("http://localhost:3330/ds/query", "SELECT * { ?s ?p ?o}", qExec-> {
             ResultSet rs = qExec.execSelect() ; 
             assertFalse(rs.hasNext()) ;
-        }
+        }) ;
         server.stop() ;
     }
-
+    
     @Test public void embedded_02() {
-        // test order !!!!
         DatasetGraph dsg = dataset() ;
         FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds2", dsg) ;
         // But no /ds
         assertEquals(1,  DataAccessPointRegistry.get().size()) ;
         assertTrue(DataAccessPointRegistry.get().isRegistered("/ds2")) ;
         assertFalse(DataAccessPointRegistry.get().isRegistered("/ds")) ;
-        server.start() ;
-        server.stop() ;
+        try {
+            server.start() ;
+        } finally { server.stop() ; }
     }
     
     @Test public void embedded_03() {
@@ -85,17 +92,18 @@ public class TestEmbeddedFuseki {
             .add("/ds1", dsg) 
             .build() ;
         server.start() ;
-        // Add while live.
-        Txn.execWrite(dsg,  ()->{
-            Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
-            dsg.add(q); 
-        }) ;
-        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3331/ds1/query", "SELECT * { ?s ?p ?o}") ) {
-            ResultSet rs = qExec.execSelect() ; 
-            int x = ResultSetFormatter.consume(rs) ;
-            assertEquals(1, x) ;
-        }
-        server.stop() ;
+        try {
+            // Add while live.
+            Txn.execWrite(dsg,  ()->{
+                Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
+                dsg.add(q); 
+            }) ;
+            query("http://localhost:3331/ds1/query", "SELECT * { ?s ?p ?o}", qExec->{
+                ResultSet rs = qExec.execSelect() ; 
+                int x = ResultSetFormatter.consume(rs) ;
+                assertEquals(1, x) ;
+            }) ;
+        } finally { server.stop() ; }
     }
     
     
@@ -118,37 +126,113 @@ public class TestEmbeddedFuseki {
             .add("/data", dataService)
             .build() ;
         server.start() ;
-        
-        // Put data in.
-        String data = "(graph (:s :p 1) (:s :p 2) (:s :p 3))" ;
-        Graph g = SSE.parseGraph(data) ;
-        HttpEntity e = graphToHttpEntity(g) ;
-        HttpOp.execHttpPut("http://localhost:3332/data", e) ;
-
-        // Get data out.
-        try ( TypedInputStream in = HttpOp.execHttpGet("http://localhost:3332/data") ) { 
-            Graph g2 = GraphFactory.createDefaultGraph() ;
-            RDFDataMgr.read(g2, in, RDFLanguages.contentTypeToLang(in.getContentType())) ;
-            assertTrue(g.isIsomorphicWith(g2)) ;
-        }
-        // Query.
-        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3332/data", "SELECT * { ?s ?p ?o}") ) {
-            ResultSet rs = qExec.execSelect() ; 
-            int x = ResultSetFormatter.consume(rs) ;
-            assertEquals(3, x) ;
-        }
-        // Update
-        UpdateRequest req = UpdateFactory.create("CLEAR DEFAULT") ;
-        UpdateExecutionFactory.createRemote(req, "http://localhost:3332/data").execute(); 
-        // Query again.
-        try (QueryExecution qExec = QueryExecutionFactory.sparqlService("http://localhost:3332/data", "SELECT * { ?s ?p ?o}") ) {
-            ResultSet rs = qExec.execSelect() ; 
-            int x = ResultSetFormatter.consume(rs) ;
-            assertEquals(0, x) ;
-        }
+        try {
+            // Put data in.
+            String data = "(graph (:s :p 1) (:s :p 2) (:s :p 3))" ;
+            Graph g = SSE.parseGraph(data) ;
+            HttpEntity e = graphToHttpEntity(g) ;
+            HttpOp.execHttpPut("http://localhost:3332/data", e) ;
+    
+            // Get data out.
+            try ( TypedInputStream in = HttpOp.execHttpGet("http://localhost:3332/data") ) { 
+                Graph g2 = GraphFactory.createDefaultGraph() ;
+                RDFDataMgr.read(g2, in, RDFLanguages.contentTypeToLang(in.getContentType())) ;
+                assertTrue(g.isIsomorphicWith(g2)) ;
+            }
+            // Query.
+            query("http://localhost:3332/data", "SELECT * { ?s ?p ?o}", qExec->{
+                ResultSet rs = qExec.execSelect() ; 
+                int x = ResultSetFormatter.consume(rs) ;
+                assertEquals(3, x) ;
+            }) ;
+            // Update
+            UpdateRequest req = UpdateFactory.create("CLEAR DEFAULT") ;
+            UpdateExecutionFactory.createRemote(req, "http://localhost:3332/data").execute(); 
+            // Query again.
+            query("http://localhost:3332/data", "SELECT * { ?s ?p ?o}", qExec-> {
+                ResultSet rs = qExec.execSelect() ; 
+                int x = ResultSetFormatter.consume(rs) ;
+                assertEquals(0, x) ;
+            }) ;
+        } finally { server.stop() ; }
+    }
+    
+    @Test public void embedded_05() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3330)
+            .add("/ds0", dsg) 
+            .build() ;
+        server.start() ;
+        try {
+            // No stats
+            String x = HttpOp.execHttpGetString("http://localhost:3330/$/stats") ;
+            assertNull(x) ;  
+        } finally { server.stop() ; }
+    }
+    
+    @Test public void embedded_06() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3330)
+            .add("/ds0", dsg)
+            .enableStats(true)
+            .build() ;
+        server.start() ;
+        // No stats
+        String x = HttpOp.execHttpGetString("http://localhost:3330/$/stats") ;
+        assertNotNull(x) ;
         server.stop() ;
     }
-        
+
+    // Context path.
+    @Test public void embedded_07() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3330)
+            .setContextPath("/ABC")
+            .add("/ds", dsg) 
+            .build() ;
+        server.start() ;
+        try {
+            String x1 = HttpOp.execHttpGetString("http://localhost:3330/ds") ;
+            assertNull(x1) ;
+            String x2 = HttpOp.execHttpGetString("http://localhost:3330/ABC/ds") ;
+            assertNotNull(x2) ;
+        } finally { server.stop() ; }
+    }
+    
+    @Test public void embedded_08() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3330)
+            .parseConfigFile(DIR+"config.ttl") 
+            .build() ;
+        server.start() ;
+        try {
+            query("http://localhost:3330/FuTest", "SELECT * {}", x->{}) ;
+        } finally { server.stop() ; } 
+    }
+    
+    @Test public void embedded_09() {
+        DatasetGraph dsg = dataset() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+            .setPort(3330)
+            .setContextPath("/ABC")
+            .parseConfigFile(DIR+"config.ttl") 
+            .build() ;
+        server.start() ;
+        try {
+            try {
+                query("http://localhost:3330/FuTest", "ASK{}", x->{}) ;
+            } catch (HttpException ex) {
+                assertEquals(HttpSC.METHOD_NOT_ALLOWED_405, ex.getResponseCode()) ;
+            }
+
+            query("http://localhost:3330/ABC/FuTest","ASK{}",x->{}) ;
+        } finally { server.stop() ; } 
+    }
+
     /** Create an HttpEntity for the graph */  
     protected static HttpEntity graphToHttpEntity(final Graph graph) {
         final RDFFormat syntax = RDFFormat.TURTLE_BLOCKS ;
@@ -167,4 +251,10 @@ public class TestEmbeddedFuseki {
     private DatasetGraph dataset() {
         return DatasetGraphFactory.createTxnMem() ;
     }
+
+    private static void query(String URL, String query, Consumer<QueryExecution> body) {
+        try (QueryExecution qExec = QueryExecutionFactory.sparqlService(URL, query) ) {
+            body.accept(qExec);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/176fb133/jena-fuseki2/jena-fuseki-embedded/testing/FusekiEmbedded/config.ttl
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/testing/FusekiEmbedded/config.ttl b/jena-fuseki2/jena-fuseki-embedded/testing/FusekiEmbedded/config.ttl
new file mode 100644
index 0000000..5a7f84a
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/testing/FusekiEmbedded/config.ttl
@@ -0,0 +1,18 @@
+@prefix :        <#> .
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
+
+<#serviceInMemory> rdf:type fuseki:Service;
+    rdfs:label "test";
+    fuseki:name "FuTest";
+    fuseki:serviceQuery "query";
+    fuseki:serviceUpdate "update";
+    fuseki:serviceUpload "upload" ;
+    fuseki:dataset <#dataset> ;
+.
+
+<#dataset> rdf:type ja:RDFDataset;
+.


[11/12] jena git commit: Typo

Posted by an...@apache.org.
Typo

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

Branch: refs/heads/master
Commit: d4c3d4bbceb3235de0fd88db418cf67bcaecef59
Parents: bfa5b14
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Aug 8 11:05:50 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Aug 8 11:05:50 2016 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/d4c3d4bb/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
index 1477e6b..4f5d554 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
@@ -61,7 +61,7 @@ public class TxnCounter implements Transactional {
     }
     
     // Global state - the exterally visible value and the starting point for any
-    // transaction. This is set to a new value when a write trasnaction commits.
+    // transaction. This is set to a new value when a write transaction commits.
     
     private final AtomicLong value = new AtomicLong(-1712) ; 
 


[09/12] jena git commit: Add Dataset variations.

Posted by an...@apache.org.
Add Dataset variations.

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

Branch: refs/heads/master
Commit: ff28bc6968a38cdb9eb3ce50c3466cc85b654217
Parents: 1acfc24
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 22:26:02 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 22:26:02 2016 +0100

----------------------------------------------------------------------
 .../fuseki/embedded/FusekiEmbeddedServer.java   | 42 +++++++++++++++-----
 .../fuseki/embedded/TestEmbeddedFuseki.java     | 17 ++++++--
 2 files changed, 46 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/ff28bc69/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
index 59c1364..aa206fa 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
@@ -36,6 +36,7 @@ import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
 import org.apache.jena.fuseki.server.DataService ;
 import org.apache.jena.fuseki.server.OperationName ;
 import org.apache.jena.fuseki.servlets.FusekiFilter ;
+import org.apache.jena.query.Dataset ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.eclipse.jetty.server.HttpConnectionFactory ;
 import org.eclipse.jetty.server.Server ;
@@ -173,11 +174,22 @@ public class FusekiEmbeddedServer {
         }
 
         /* Add the dataset with given name and a default set of services including update */  
+        public Builder add(String name, Dataset ds) {
+            return add(name, ds.asDatasetGraph()) ;
+        }
+
+        /* Add the dataset with given name and a default set of services including update */  
         public Builder add(String name, DatasetGraph dsg) {
             return add(name, dsg, true) ;
         }
 
         /* Add the dataset with given name and a default set of services. */  
+        public Builder add(String name, Dataset ds, boolean allowUpdate) {
+            return add(name, ds.asDatasetGraph(), allowUpdate) ;
+        }
+            
+        
+        /* Add the dataset with given name and a default set of services. */  
         public Builder add(String name, DatasetGraph dsg, boolean allowUpdate) {
             DataService dSrv = FusekiBuilder.buildDataService(dsg, allowUpdate) ; 
             return add(name, dSrv) ;
@@ -191,6 +203,13 @@ public class FusekiEmbeddedServer {
         /* Add an operation, specifing it's endpoint name.
          * This adds endpoints to any existing data service already setup by the builder.   
          */
+        public Builder add(String name, Dataset ds, OperationName opName, String epName) {
+            return add(name, ds.asDatasetGraph(), opName, epName) ; 
+        }
+
+            /* Add an operation, specifing it's endpoint name.
+         * This adds endpoints to any existing data service already setup by the builder.   
+         */
         public Builder add(String name, DatasetGraph dsg, OperationName opName, String epName) {
             DataService dSrv = map.get(name) ;
             if ( dSrv == null ) {
@@ -203,15 +222,20 @@ public class FusekiEmbeddedServer {
 
         private Builder add$(String name, DataService dataService) {
             name = DataAccessPoint.canonical(name) ;
-            DataService dSrv = map.get(name) ;
-            if ( dSrv != null ) {
-                DatasetGraph dsg1 = dSrv.getDataset() ;
-                DatasetGraph dsg2 = dataService.getDataset() ;
-                if ( dsg1 != dsg2 ) // Object identity
-                    throw new FusekiConfigException("Attempt to add a DataService for a different dataset: "+name) ;
-                dSrv.getOperations() ;
-            } else
-                map.put(name, dataService) ;
+            if ( map.containsKey(name) )
+                throw new FusekiConfigException("Attempt to add a DataService for a different dataset: "+name) ;
+            map.put(name, dataService) ;
+            
+            // Merge endpoints : too complicated 
+//            DataService dSrv = map.get(name) ;
+//            if ( dSrv != null ) {
+//                DatasetGraph dsg1 = dSrv.getDataset() ;
+//                DatasetGraph dsg2 = dataService.getDataset() ;
+//                if ( dsg1 != dsg2 ) // Object identity
+//                    throw new FusekiConfigException("Attempt to add a DataService for a different dataset: "+name) ;
+//                dSrv.getOperations() ;
+//            } else
+//                map.put(name, dataService) ;
             return this ;
         }
         

http://git-wip-us.apache.org/repos/asf/jena/blob/ff28bc69/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
index 8341342..cbc0adb 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -37,10 +37,7 @@ import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
 import org.apache.jena.fuseki.server.DataService ;
 import org.apache.jena.fuseki.server.OperationName ;
 import org.apache.jena.graph.Graph ;
-import org.apache.jena.query.QueryExecution ;
-import org.apache.jena.query.QueryExecutionFactory ;
-import org.apache.jena.query.ResultSet ;
-import org.apache.jena.query.ResultSetFormatter ;
+import org.apache.jena.query.* ;
 import org.apache.jena.riot.RDFDataMgr ;
 import org.apache.jena.riot.RDFFormat ;
 import org.apache.jena.riot.RDFLanguages ;
@@ -73,6 +70,18 @@ public class TestEmbeddedFuseki {
         server.stop() ;
     }
     
+    @Test public void embedded_01a() {
+        Dataset ds = DatasetFactory.createTxnMem() ;
+        FusekiEmbeddedServer server = FusekiEmbeddedServer.create().add("/ds", ds).build() ;
+        assertTrue(DataAccessPointRegistry.get().isRegistered("/ds")) ;
+        server.start() ;
+        query("http://localhost:3330/ds/query", "SELECT * { ?s ?p ?o}", qExec-> {
+            ResultSet rs = qExec.execSelect() ; 
+            assertFalse(rs.hasNext()) ;
+        }) ;
+        server.stop() ;
+    }
+
     @Test public void embedded_02() {
         DatasetGraph dsg = dataset() ;
         FusekiEmbeddedServer server = FusekiEmbeddedServer.make(3330, "/ds2", dsg) ;


[06/12] jena git commit: Add adding of /$/stats. Don't assume a global DataAccessPointRegistry.

Posted by an...@apache.org.
Add adding of /$/stats.  Don't assume a global DataAccessPointRegistry.

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

Branch: refs/heads/master
Commit: 4e20f283e09e2e2978f85364b61354c78487f23e
Parents: 9b24360
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 7 12:00:55 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 7 13:55:50 2016 +0100

----------------------------------------------------------------------
 .../fuseki/server/DataAccessPointRegistry.java  |  9 ++-
 .../fuseki/embedded/FusekiEmbeddedServer.java   | 69 +++++++++++++-------
 2 files changed, 53 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/4e20f283/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
index eee14ea..533b49e 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/DataAccessPointRegistry.java
@@ -50,18 +50,21 @@ public class DataAccessPointRegistry extends Registry<String, DataAccessPoint>
         }) ;
     }
     
-    // To be removed ...
+    // TODO To be removed ...
     private static DataAccessPointRegistry singleton = new DataAccessPointRegistry() ;
+    // Still used by ServerTest and FusekiEmbeddedServer (but nowhere else)
     public static DataAccessPointRegistry get() { return singleton ; }
 
-    private static final String attrNameRegistry = "jena.apache.org/fuseki/dataAccessPointRegistry" ;
+    private static final String attrNameRegistry = "jena-fuseki:dataAccessPointRegistry" ;
     // Policy for the location of the server-wide DataAccessPointRegistry 
     public static DataAccessPointRegistry get(ServletContext cxt) {
         //return (DataAccessPointRegistry)cxt.getAttribute(attrName) ;
         return singleton ;
     }
     
-    public static void set(ServletContext cxt, DataAccessPointRegistry registry) { 
+    public static void set(ServletContext cxt, DataAccessPointRegistry registry) {
+        // Temporary until get() removed completely.
+        singleton = registry ;
         cxt.setAttribute(attrNameRegistry, registry) ;
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/4e20f283/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
index 9161453..cd3b0cb 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiEmbeddedServer.java
@@ -22,6 +22,8 @@ import java.util.HashMap ;
 import java.util.List ;
 import java.util.Map ;
 
+import javax.servlet.ServletContext ;
+
 import org.apache.jena.fuseki.Fuseki ;
 import org.apache.jena.fuseki.FusekiConfigException ;
 import org.apache.jena.fuseki.FusekiException ;
@@ -29,7 +31,11 @@ import org.apache.jena.fuseki.FusekiLogging ;
 import org.apache.jena.fuseki.build.FusekiBuilder ;
 import org.apache.jena.fuseki.build.FusekiConfig ;
 import org.apache.jena.fuseki.jetty.FusekiErrorHandler1 ;
-import org.apache.jena.fuseki.server.* ;
+import org.apache.jena.fuseki.mgt.ActionStats ;
+import org.apache.jena.fuseki.server.DataAccessPoint ;
+import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
+import org.apache.jena.fuseki.server.DataService ;
+import org.apache.jena.fuseki.server.OperationName ;
 import org.apache.jena.fuseki.servlets.FusekiFilter ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.eclipse.jetty.server.HttpConnectionFactory ;
@@ -94,14 +100,19 @@ public class FusekiEmbeddedServer {
         port = ((ServerConnector)server.getConnectors()[0]).getPort() ;
     }
     
-    /** Get the underlying Jetty server which has also been set up.
-     * Adding new servlets is posisble with care.
-     */ 
+    /** Get the underlying Jetty server which has also been set up. */ 
     public Server getJettyServer() {
         return server ; 
     }
     
-    /** Start the server - the server continues to run afetr thsi call returns.
+    /** Get the {@link ServletContext}.
+     * Adding new servlets is possible with care.
+     */ 
+    public ServletContext getServletContext() {
+        return ((ServletContextHandler)server.getHandler()).getServletContext() ;
+    }
+
+    /** Start the server - the server continues to run after this call returns.
      *  To synchronise with the server stopping, call {@link #join}.  
      */
     public void start() { 
@@ -131,7 +142,8 @@ public class FusekiEmbeddedServer {
         private Map<String, DataService> map = new HashMap<>() ;
         private int port = 3333 ;
         private boolean loopback = false ;
-        private String path = "/" ;
+        private boolean withStats = false ;
+        private String contextPath = "/" ;
         
         /* Set the port to run on */ 
         public Builder setPort(int port) {
@@ -143,7 +155,7 @@ public class FusekiEmbeddedServer {
          * "http://host:port/dataset/query" else "http://host:port/path/dataset/query" 
          */
         public Builder setContextPath(String path) {
-            this.path = path ;
+            this.contextPath = path ;
             return this ;
         }
         
@@ -153,6 +165,14 @@ public class FusekiEmbeddedServer {
             return this ;
         }
 
+        /** Add the "/$/stats" servlet that responds with stats about the server,
+         * including counts of all calls made.
+         */ 
+        public Builder enableStats(boolean withStats) {
+            this.withStats = withStats;
+            return this ;
+        }
+
         /* Add the dataset with given name and a default set of services including update */  
         public Builder add(String name, DatasetGraph dsg) {
             return add(name, dsg, true) ;
@@ -183,6 +203,7 @@ public class FusekiEmbeddedServer {
         }
 
         private Builder add$(String name, DataService dataService) {
+            name = DataAccessPoint.canonical(name) ;
             DataService dSrv = map.get(name) ;
             if ( dSrv != null ) {
                 DatasetGraph dsg1 = dSrv.getDataset() ;
@@ -210,33 +231,37 @@ public class FusekiEmbeddedServer {
 
         /** Build a server according to the current description */ 
         public FusekiEmbeddedServer build() {
+            DataAccessPointRegistry registry = new DataAccessPointRegistry() ;
             map.forEach((name, dSrv) -> {
                 DataAccessPoint dap = new DataAccessPoint(name, dSrv) ;
-                DataAccessPointRegistry.get().put(name, dap) ;
+                registry.put(name, dap) ;
             }) ;
-            Server server = fusekiServer(port, path, loopback) ;
+            ServletContextHandler handler = buildServletContext(contextPath, registry) ;
+            if ( withStats )
+                handler.addServlet(ActionStats.class, "/$/stats") ;
+            DataAccessPointRegistry.set(handler.getServletContext(), registry) ;
+            Server server = jettyServer(port, loopback) ;
+            server.setHandler(handler);
             return new FusekiEmbeddedServer(server) ;
         }
 
-        /** build process */
-        private static Server fusekiServer(int port, String contextPath, boolean loopback) {
+        /** Build a ServletContextHandler with the Fuseki router : {@link FusekiFilter} */
+        private static ServletContextHandler buildServletContext(String contextPath, DataAccessPointRegistry registry) {
             if ( contextPath == null || contextPath.isEmpty() )
                 contextPath = "/" ;
+            else if ( !contextPath.startsWith("/") )
+                contextPath = "/" + contextPath ;
             ServletContextHandler context = new ServletContextHandler() ;
-            // The Fuseki server-wide setup.
-            DataAccessPointRegistry.set(context.getServletContext(), new DataAccessPointRegistry()); 
             FusekiFilter ff = new FusekiFilter() ;
             FilterHolder h = new FilterHolder(ff) ;
-            context.setContextPath(contextPath); 
-            context.addFilter(h, "/*", null);
-            context.setDisplayName(Fuseki.servletRequestLogName);  
-            context.setErrorHandler(new FusekiErrorHandler1());
-            Server server = jettyServer(port, loopback) ;
-            server.setHandler(context);
-            return server ;
+            context.setContextPath(contextPath) ;
+            context.addFilter(h, "/*", null) ;
+            context.setDisplayName(Fuseki.servletRequestLogName) ;
+            context.setErrorHandler(new FusekiErrorHandler1()) ;
+            return context ;
         }
-
-        /** Jetty build process */
+        
+        /** Jetty server */
         private static Server jettyServer(int port, boolean loopback) {
             Server server = new Server() ;
             HttpConnectionFactory f1 = new HttpConnectionFactory() ;