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() ;