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 2017/07/07 15:30:52 UTC

[2/3] jena git commit: JENA-1371: Rename FusekiEmbeddedServer as FusekiServer

JENA-1371: Rename FusekiEmbeddedServer as FusekiServer


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

Branch: refs/heads/master
Commit: 2e579e3811a6af296e539eef622b9dd811630970
Parents: 1e6afdd
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jul 7 11:47:22 2017 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jul 7 11:47:22 2017 +0100

----------------------------------------------------------------------
 .../apache/jena/fuseki/cmds/FusekiBasicCmd.java |  10 +-
 .../fuseki/embedded/FusekiEmbeddedServer.java   | 333 +---------------
 .../jena/fuseki/embedded/FusekiServer.java      | 390 +++++++++++++++++++
 .../jena/fuseki/embedded/FusekiTestAuth.java    |   4 +-
 .../jena/fuseki/embedded/FusekiTestServer.java  |   8 +-
 .../fuseki/embedded/TestEmbeddedFuseki.java     |  22 +-
 .../fuseki/embedded/TestMultipleEmbedded.java   |  16 +-
 .../rdfconnection/TestRDFConnectionRemote.java  |   6 +-
 8 files changed, 442 insertions(+), 347 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java b/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
index 8229a0b..17fb51e 100644
--- a/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
+++ b/jena-fuseki2/jena-fuseki-basic/src/main/java/org/apache/jena/fuseki/cmds/FusekiBasicCmd.java
@@ -37,7 +37,7 @@ import org.apache.jena.atlas.lib.FileOps;
 import org.apache.jena.atlas.logging.FmtLog;
 import org.apache.jena.fuseki.Fuseki;
 import org.apache.jena.fuseki.FusekiLogging;
-import org.apache.jena.fuseki.embedded.FusekiEmbeddedServer;
+import org.apache.jena.fuseki.embedded.FusekiServer;
 import org.apache.jena.fuseki.server.DataAccessPoint;
 import org.apache.jena.fuseki.server.DataAccessPointRegistry;
 import org.apache.jena.fuseki.server.DataService;
@@ -357,7 +357,7 @@ public class FusekiBasicCmd {
         @Override
         protected void exec() {
             try {
-                FusekiEmbeddedServer server = buildServer(serverConfig);
+                FusekiServer server = buildServer(serverConfig);
                 info(server, serverConfig);
                 server.start();
                 server.join();
@@ -372,8 +372,8 @@ public class FusekiBasicCmd {
         }
 
         // ServerConfig -> Setup the builder.
-        private static FusekiEmbeddedServer buildServer(ServerConfig serverConfig) {
-            FusekiEmbeddedServer.Builder builder = FusekiEmbeddedServer.create();
+        private static FusekiServer buildServer(ServerConfig serverConfig) {
+            FusekiServer.Builder builder = FusekiServer.create();
             // Loopback.
             builder.setPort(serverConfig.port);
             builder.setLoopback(serverConfig.loopback);
@@ -401,7 +401,7 @@ public class FusekiBasicCmd {
             return builder.build();
         }
 
-        private void info(FusekiEmbeddedServer server, ServerConfig serverConfig) {
+        private void info(FusekiServer server, ServerConfig serverConfig) {
             if ( super.isQuiet() )
                 return;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/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 5ff5c74..8462d1e 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
@@ -18,95 +18,34 @@
 
 package org.apache.jena.fuseki.embedded;
 
-import java.util.ArrayList;
-import java.util.HashMap ;
-import java.util.List ;
-import java.util.Map ;
-
 import javax.servlet.ServletContext ;
-import javax.servlet.http.HttpServlet;
 
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.fuseki.Fuseki ;
-import org.apache.jena.fuseki.FusekiConfigException ;
-import org.apache.jena.fuseki.FusekiException ;
-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.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.servlets.FusekiFilter ;
-import org.apache.jena.query.Dataset ;
-import org.apache.jena.riot.WebContent;
 import org.apache.jena.sparql.core.DatasetGraph ;
-import org.eclipse.jetty.http.MimeTypes;
-import org.eclipse.jetty.security.SecurityHandler;
-import org.eclipse.jetty.server.HttpConnectionFactory ;
 import org.eclipse.jetty.server.Server ;
-import org.eclipse.jetty.server.ServerConnector ;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.FilterHolder ;
-import org.eclipse.jetty.servlet.ServletContextHandler ;
-import org.eclipse.jetty.servlet.ServletHolder;
 
 /**
- * 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>
- * 
+ * Embedded Fuseki server.
+ * @deprecated Use {@link FusekiServer} 
  */
+@Deprecated
 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  */ 
+    /** @deprecated Use {@link FusekiServer#make} */  
+    @Deprecated
     static public FusekiEmbeddedServer make(int port, String name, DatasetGraph dsg) {
-        return create()
-            .setPort(port)
-            .setLoopback(true)
-            .add(name, dsg)
-            .build() ;
+        return new FusekiEmbeddedServer(FusekiServer.make(port, name, dsg));
     }
     
-    public static Builder create() {
-        return new Builder() ;
+    /** @deprecated Use {@link FusekiServer#create} */  
+    @Deprecated
+    public static FusekiServer.Builder create() {
+        return FusekiServer.create();
     }
     
-    public final Server server ;
-    private int port ;
+    private final FusekiServer server ;
     
-    private FusekiEmbeddedServer(int port, Server server) {
+    private FusekiEmbeddedServer(FusekiServer server) {
         this.server = server ;
-        // This should be the same.
-        //this.port = ((ServerConnector)server.getConnectors()[0]).getPort() ;
-        this.port = port ;
     }
     
     /** 
@@ -115,277 +54,43 @@ public class FusekiEmbeddedServer {
      * the one actually allocated if the port was 0 ("choose a free port").
      */
     public int getPort() {
-        return port ; 
+        return server.getPort();
     }
 
     /** Get the underlying Jetty server which has also been set up. */ 
     public Server getJettyServer() {
-        return server ; 
+        return server.getJettyServer();
     }
     
     /** Get the {@link ServletContext}.
      * Adding new servlets is possible with care.
      */ 
     public ServletContext getServletContext() {
-        return ((ServletContextHandler)server.getHandler()).getServletContext() ;
+        return server.getServletContext() ;
     }
 
     /** Get the {@link DataAccessPointRegistry}.
      * This method is intended for inspecting the registry.
      */ 
     public DataAccessPointRegistry getDataAccessPointRegistry() {
-        return DataAccessPointRegistry.get(getServletContext()) ;
+        return server.getDataAccessPointRegistry() ;
     }
 
     /** Start the server - the server continues to run after this call returns.
      *  To synchronise with the server stopping, call {@link #join}.  
      */
     public FusekiEmbeddedServer 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+")");
+        server.start();
         return this ;
     }
 
     /** Stop the server. */
     public void stop() { 
-        Fuseki.serverLog.info("Stop Fuseki (port="+port+")");
-        try { server.stop(); }
-        catch (Exception e) { throw new FusekiException(e) ; }
+        server.stop();
     }
     
     /** 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 {
-        private Map<String, DataService> map                = new HashMap<>() ;
-        // Default values.
-        private int                      port               = 3330 ;
-        private boolean                  loopback           = false ;
-        private boolean                  withStats          = false ;
-        // Other servlets to add.
-        private List<Pair<String, HttpServlet>> other = new ArrayList<>();
-        private String                   contextPath        = "/" ;
-        private String                   staticContentDir   = null ;
-        private SecurityHandler          securityHandler    = null ;
-
-        /** Set the port to run on. */ 
-        public Builder setPort(int port) {
-            if ( port < 0 )
-                throw new IllegalArgumentException("Illegal port="+port+" : Port must be greater than or equal to zero.") ;
-            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.contextPath = path ;
-            return this ;
-        }
-        
-        /** Restrict the server to only responding to the localhost interface. */ 
-        public Builder setLoopback(boolean loopback) {
-            this.loopback = loopback;
-            return this ;
-        }
-
-        /** Set the location (filing system directory) to serve static file from. */ 
-        public Builder setStaticFileBase(String directory) {
-            this.staticContentDir = directory;
-            return this ;
-        }
-        
-        /** Set a Jetty SecurityHandler.
-         *  By default, the server runs with no security.
-         *  This is more for using the basic server for testing.
-         *  The full Fuseki server provides secjurity with Apache Shiro
-         *  and a defensive reverse proxy (e.g. Apache httpd) in front og the Jetty server
-         *  can also be used, which provides a wide varient of proven security options.   
-         */
-        public Builder setSecurityHandler(SecurityHandler securityHandler) {
-            this.securityHandler = securityHandler;
-            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, 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) ;
-        }
-        
-        /** Add a data service that includes dataset and service names.
-         * A {@link DataService} allows for choices of the various endpoint names.
-         */  
-        public Builder add(String name, DataService dataService) {
-            return add$(name, dataService) ; 
-        }
-        
-        private Builder add$(String name, DataService dataService) {
-            name = DataAccessPoint.canonical(name) ;
-            if ( map.containsKey(name) )
-                throw new FusekiConfigException("Data service name already registered: "+name) ;
-            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 ;
-        }
-
-        /**
-         * Add the given servlet with the pathSpec. These are added so that they are
-         * checked after the Fuseki filter for datasets and before the static content
-         * handler (which is the last servlet) used for {@link #setStaticFileBase(String)}.
-         */
-        public Builder addServlet(String pathSpec, HttpServlet servlet) {
-            other.add(Pair.create(pathSpec, servlet));
-            return this;
-        }
-        
-        /** 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) ;
-                registry.put(name, dap) ;
-            }) ;
-            ServletContextHandler handler = buildServletContext(contextPath, registry) ;
-            
-            setMimeTypes(handler);
-            servlets(handler);
-            
-            DataAccessPointRegistry.set(handler.getServletContext(), registry) ;
-            Server server = jettyServer(port, loopback) ;
-            server.setHandler(handler);
-            return new FusekiEmbeddedServer(port, server) ;
-        }
-
-        /** Build a ServletContextHandler with the Fuseki router : {@link FusekiFilter} */
-        private ServletContextHandler buildServletContext(String contextPath, DataAccessPointRegistry registry) {
-            if ( contextPath == null || contextPath.isEmpty() )
-                contextPath = "/" ;
-            else if ( !contextPath.startsWith("/") )
-                contextPath = "/" + contextPath ;
-            ServletContextHandler context = new ServletContextHandler() ;
-            context.setDisplayName(Fuseki.servletRequestLogName) ;
-            context.setErrorHandler(new FusekiErrorHandler1()) ;
-            context.setContextPath(contextPath) ;
-            if ( securityHandler != null )
-                context.setSecurityHandler(securityHandler);
-            
-            return context ;
-        }
-        
-        private static void setMimeTypes(ServletContextHandler context) {
-            MimeTypes mimeTypes = new MimeTypes();
-            // RDF syntax
-            mimeTypes.addMimeMapping("nt",      WebContent.contentTypeNTriples);
-            mimeTypes.addMimeMapping("nq",      WebContent.contentTypeNQuads);
-            mimeTypes.addMimeMapping("ttl",     WebContent.contentTypeTurtle+";charset=utf-8");
-            mimeTypes.addMimeMapping("trig",    WebContent.contentTypeTriG+";charset=utf-8");
-            mimeTypes.addMimeMapping("rdfxml",  WebContent.contentTypeRDFXML);
-            mimeTypes.addMimeMapping("jsonld",  WebContent.contentTypeJSONLD);
-            mimeTypes.addMimeMapping("rj",      WebContent.contentTypeRDFJSON);
-            mimeTypes.addMimeMapping("rt",      WebContent.contentTypeRDFThrift);
-            mimeTypes.addMimeMapping("trdf",    WebContent.contentTypeRDFThrift);
-
-            // SPARQL syntax
-            mimeTypes.addMimeMapping("rq",      WebContent.contentTypeSPARQLQuery);
-            mimeTypes.addMimeMapping("ru",      WebContent.contentTypeSPARQLUpdate);
-
-            // SPARQL Result set
-            mimeTypes.addMimeMapping("rsj",     WebContent.contentTypeResultsJSON);
-            mimeTypes.addMimeMapping("rsx",     WebContent.contentTypeResultsXML);
-            mimeTypes.addMimeMapping("srt",     WebContent.contentTypeResultsThrift);
-
-            // Other
-            mimeTypes.addMimeMapping("txt",     WebContent.contentTypeTextPlain);
-            mimeTypes.addMimeMapping("csv",     WebContent.contentTypeTextCSV);
-            mimeTypes.addMimeMapping("tsv",     WebContent.contentTypeTextTSV);
-            context.setMimeTypes(mimeTypes);
-        }
-
-        private void servlets(ServletContextHandler context) {
-            // Fuseki dataset services filter
-            FusekiFilter ff = new FusekiFilter() ;
-            FilterHolder h = new FilterHolder(ff) ;
-            context.addFilter(h, "/*", null) ;
-
-            other.forEach(p->addServlet(context, p.getLeft(), p.getRight()));
-            
-            if ( withStats )
-                addServlet(context, "/$/stats", new ActionStats()) ;
-            
-            if ( staticContentDir != null ) {
-                DefaultServlet staticServlet = new DefaultServlet() ;
-                ServletHolder staticContent = new ServletHolder(staticServlet) ;
-                staticContent.setInitParameter("resourceBase", staticContentDir) ;
-                context.addServlet(staticContent, "/");
-            }
-                
-        }
-
-        private static void addServlet(ServletContextHandler context, String pathspec, HttpServlet httpServlet) {
-            ServletHolder sh = new ServletHolder(httpServlet);
-            context.addServlet(sh, pathspec) ;
-        }
-
-        /** Jetty server */
-        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(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 ;
-        }
+        server.join();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiServer.java b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiServer.java
new file mode 100644
index 0000000..5e9e887
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-embedded/src/main/java/org/apache/jena/fuseki/embedded/FusekiServer.java
@@ -0,0 +1,390 @@
+/*
+ * 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.ArrayList;
+import java.util.HashMap ;
+import java.util.List ;
+import java.util.Map ;
+
+import javax.servlet.ServletContext ;
+import javax.servlet.http.HttpServlet;
+
+import org.apache.jena.atlas.lib.Pair;
+import org.apache.jena.fuseki.Fuseki ;
+import org.apache.jena.fuseki.FusekiConfigException ;
+import org.apache.jena.fuseki.FusekiException ;
+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.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.servlets.FusekiFilter ;
+import org.apache.jena.query.Dataset ;
+import org.apache.jena.riot.WebContent;
+import org.apache.jena.sparql.core.DatasetGraph ;
+import org.eclipse.jetty.http.MimeTypes;
+import org.eclipse.jetty.security.SecurityHandler;
+import org.eclipse.jetty.server.HttpConnectionFactory ;
+import org.eclipse.jetty.server.Server ;
+import org.eclipse.jetty.server.ServerConnector ;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.FilterHolder ;
+import org.eclipse.jetty.servlet.ServletContextHandler ;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+/**
+ * Embedded Fuseki server. This is a Fuseki server running with a precofigured set of
+ * datasets and services. There is no admin UI and no security.
+ * <p>
+ * To create a embedded sever, use {@link FusekiServer} ({@link #make} is a
+ * packaging of a call to {@link FusekiServer} 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 = ... ;
+ *      FusekiServer server = FusekiServer.create()
+ *          .setPort(1234)
+ *          .add("/ds", dsg)
+ *          .build() ;
+ *       server.start() ;
+ * </pre>
+ * Compact form (use the builder pattern above to get more flexibility):
+ * <pre>
+ *    FusekiServer.make(1234, "/ds", dsg).start() ;
+ * </pre>
+ * 
+ */
+public class FusekiServer {
+    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 FusekiServer 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 ;
+    
+    private FusekiServer(int port, Server server) {
+        this.server = server ;
+        // This should be the same.
+        //this.port = ((ServerConnector)server.getConnectors()[0]).getPort() ;
+        this.port = port ;
+    }
+    
+    /** 
+     * Return the port begin used.  
+     * This will be the give port, which defauls to 3330, or
+     * the one actually allocated if the port was 0 ("choose a free port").
+     */
+    public int getPort() {
+        return port ; 
+    }
+
+    /** Get the underlying Jetty server which has also been set up. */ 
+    public Server getJettyServer() {
+        return server ; 
+    }
+    
+    /** Get the {@link ServletContext}.
+     * Adding new servlets is possible with care.
+     */ 
+    public ServletContext getServletContext() {
+        return ((ServletContextHandler)server.getHandler()).getServletContext() ;
+    }
+
+    /** Get the {@link DataAccessPointRegistry}.
+     * This method is intended for inspecting the registry.
+     */ 
+    public DataAccessPointRegistry getDataAccessPointRegistry() {
+        return DataAccessPointRegistry.get(getServletContext()) ;
+    }
+
+    /** Start the server - the server continues to run after this call returns.
+     *  To synchronise with the server stopping, call {@link #join}.  
+     */
+    public FusekiServer 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+")");
+        return this ;
+    }
+
+    /** 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) ; }
+    }
+    
+    /** FusekiServer.Builder */
+    public static class Builder {
+        private Map<String, DataService> map                = new HashMap<>() ;
+        // Default values.
+        private int                      port               = 3330 ;
+        private boolean                  loopback           = false ;
+        private boolean                  withStats          = false ;
+        // Other servlets to add.
+        private List<Pair<String, HttpServlet>> other = new ArrayList<>();
+        private String                   contextPath        = "/" ;
+        private String                   staticContentDir   = null ;
+        private SecurityHandler          securityHandler    = null ;
+
+        /** Set the port to run on. */ 
+        public Builder setPort(int port) {
+            if ( port < 0 )
+                throw new IllegalArgumentException("Illegal port="+port+" : Port must be greater than or equal to zero.") ;
+            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.contextPath = path ;
+            return this ;
+        }
+        
+        /** Restrict the server to only responding to the localhost interface. */ 
+        public Builder setLoopback(boolean loopback) {
+            this.loopback = loopback;
+            return this ;
+        }
+
+        /** Set the location (filing system directory) to serve static file from. */ 
+        public Builder setStaticFileBase(String directory) {
+            this.staticContentDir = directory;
+            return this ;
+        }
+        
+        /** Set a Jetty SecurityHandler.
+         *  By default, the server runs with no security.
+         *  This is more for using the basic server for testing.
+         *  The full Fuseki server provides secjurity with Apache Shiro
+         *  and a defensive reverse proxy (e.g. Apache httpd) in front og the Jetty server
+         *  can also be used, which provides a wide varient of proven security options.   
+         */
+        public Builder setSecurityHandler(SecurityHandler securityHandler) {
+            this.securityHandler = securityHandler;
+            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, 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) ;
+        }
+        
+        /** Add a data service that includes dataset and service names.
+         * A {@link DataService} allows for choices of the various endpoint names.
+         */  
+        public Builder add(String name, DataService dataService) {
+            return add$(name, dataService) ; 
+        }
+        
+        private Builder add$(String name, DataService dataService) {
+            name = DataAccessPoint.canonical(name) ;
+            if ( map.containsKey(name) )
+                throw new FusekiConfigException("Data service name already registered: "+name) ;
+            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 ;
+        }
+
+        /**
+         * Add the given servlet with the pathSpec. These are added so that they are
+         * checked after the Fuseki filter for datasets and before the static content
+         * handler (which is the last servlet) used for {@link #setStaticFileBase(String)}.
+         */
+        public Builder addServlet(String pathSpec, HttpServlet servlet) {
+            other.add(Pair.create(pathSpec, servlet));
+            return this;
+        }
+        
+        /** Build a server according to the current description */ 
+        public FusekiServer build() {
+            DataAccessPointRegistry registry = new DataAccessPointRegistry() ;
+            map.forEach((name, dSrv) -> {
+                DataAccessPoint dap = new DataAccessPoint(name, dSrv) ;
+                registry.put(name, dap) ;
+            }) ;
+            ServletContextHandler handler = buildServletContext(contextPath, registry) ;
+            
+            setMimeTypes(handler);
+            servlets(handler);
+            
+            DataAccessPointRegistry.set(handler.getServletContext(), registry) ;
+            Server server = jettyServer(port, loopback) ;
+            server.setHandler(handler);
+            return new FusekiServer(port, server) ;
+        }
+
+        /** Build a ServletContextHandler with the Fuseki router : {@link FusekiFilter} */
+        private ServletContextHandler buildServletContext(String contextPath, DataAccessPointRegistry registry) {
+            if ( contextPath == null || contextPath.isEmpty() )
+                contextPath = "/" ;
+            else if ( !contextPath.startsWith("/") )
+                contextPath = "/" + contextPath ;
+            ServletContextHandler context = new ServletContextHandler() ;
+            context.setDisplayName(Fuseki.servletRequestLogName) ;
+            context.setErrorHandler(new FusekiErrorHandler1()) ;
+            context.setContextPath(contextPath) ;
+            if ( securityHandler != null )
+                context.setSecurityHandler(securityHandler);
+            
+            return context ;
+        }
+        
+        private static void setMimeTypes(ServletContextHandler context) {
+            MimeTypes mimeTypes = new MimeTypes();
+            // RDF syntax
+            mimeTypes.addMimeMapping("nt",      WebContent.contentTypeNTriples);
+            mimeTypes.addMimeMapping("nq",      WebContent.contentTypeNQuads);
+            mimeTypes.addMimeMapping("ttl",     WebContent.contentTypeTurtle+";charset=utf-8");
+            mimeTypes.addMimeMapping("trig",    WebContent.contentTypeTriG+";charset=utf-8");
+            mimeTypes.addMimeMapping("rdfxml",  WebContent.contentTypeRDFXML);
+            mimeTypes.addMimeMapping("jsonld",  WebContent.contentTypeJSONLD);
+            mimeTypes.addMimeMapping("rj",      WebContent.contentTypeRDFJSON);
+            mimeTypes.addMimeMapping("rt",      WebContent.contentTypeRDFThrift);
+            mimeTypes.addMimeMapping("trdf",    WebContent.contentTypeRDFThrift);
+
+            // SPARQL syntax
+            mimeTypes.addMimeMapping("rq",      WebContent.contentTypeSPARQLQuery);
+            mimeTypes.addMimeMapping("ru",      WebContent.contentTypeSPARQLUpdate);
+
+            // SPARQL Result set
+            mimeTypes.addMimeMapping("rsj",     WebContent.contentTypeResultsJSON);
+            mimeTypes.addMimeMapping("rsx",     WebContent.contentTypeResultsXML);
+            mimeTypes.addMimeMapping("srt",     WebContent.contentTypeResultsThrift);
+
+            // Other
+            mimeTypes.addMimeMapping("txt",     WebContent.contentTypeTextPlain);
+            mimeTypes.addMimeMapping("csv",     WebContent.contentTypeTextCSV);
+            mimeTypes.addMimeMapping("tsv",     WebContent.contentTypeTextTSV);
+            context.setMimeTypes(mimeTypes);
+        }
+
+        private void servlets(ServletContextHandler context) {
+            // Fuseki dataset services filter
+            FusekiFilter ff = new FusekiFilter() ;
+            FilterHolder h = new FilterHolder(ff) ;
+            context.addFilter(h, "/*", null) ;
+
+            other.forEach(p->addServlet(context, p.getLeft(), p.getRight()));
+            
+            if ( withStats )
+                addServlet(context, "/$/stats", new ActionStats()) ;
+            
+            if ( staticContentDir != null ) {
+                DefaultServlet staticServlet = new DefaultServlet() ;
+                ServletHolder staticContent = new ServletHolder(staticServlet) ;
+                staticContent.setInitParameter("resourceBase", staticContentDir) ;
+                context.addServlet(staticContent, "/");
+            }
+                
+        }
+
+        private static void addServlet(ServletContextHandler context, String pathspec, HttpServlet httpServlet) {
+            ServletHolder sh = new ServletHolder(httpServlet);
+            context.addServlet(sh, pathspec) ;
+        }
+
+        /** Jetty server */
+        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(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/2e579e38/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestAuth.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestAuth.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestAuth.java
index 8b10f50..fc0eccb 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestAuth.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestAuth.java
@@ -98,7 +98,7 @@ public class FusekiTestAuth {
     public static final String serviceQuery()       { return "http://localhost:"+port()+datasetPath()+"/query" ; }
     public static final String serviceGSP()         { return "http://localhost:"+port()+datasetPath()+"/data" ; }
     
-    private static FusekiEmbeddedServer server ;
+    private static FusekiServer server ;
 
     /** Setup a testing server, using the given  Jetty {@link SecurityHandler} for authentication. 
      * The server will have an empty, in-emory transactional dataset.
@@ -111,7 +111,7 @@ public class FusekiTestAuth {
      */
     public static void setupServer(boolean updateable, SecurityHandler sh, DatasetGraph dsg) {
         dsgTesting = dsg;
-        server = FusekiEmbeddedServer.create()
+        server = FusekiServer.create()
             .add(datasetPath(), dsgTesting)
             .setPort(port())
             .setSecurityHandler(sh)

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestServer.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestServer.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestServer.java
index 72deb5d..b661e5d 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestServer.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/FusekiTestServer.java
@@ -77,12 +77,12 @@ import org.apache.jena.update.UpdateProcessor ;
  * Much of this machinery is unnessecary for just running a sever in the background:
  * 
  * <pre>
- *   private static FusekiEmbeddedServer server ;
+ *   private static FusekiServer server ;
  *   private static DatasetGraph serverdsg = DatasetGraphFactory.createTxnMem() ;
  *
  *   &#64;BeforeClass
  *   public static void beforeClass() {
- *       server = FusekiEmbeddedServer.create()
+ *       server = FusekiServer.create()
  *           .setPort(....)
  *           .add("/ds", serverdsg)
  *           .build()
@@ -215,7 +215,7 @@ public class FusekiTestServer {
     
     // reference count of start/stop server
     private static AtomicInteger countServer = new AtomicInteger() ; 
-    private static FusekiEmbeddedServer server        = null ;
+    private static FusekiServer server        = null ;
     
     /*package*/ static void allocServer() {
         if ( countServer.getAndIncrement() == 0 )
@@ -229,7 +229,7 @@ public class FusekiTestServer {
     
     /*package*/ static void setupServer(boolean updateable) {
         dsgTesting = DatasetGraphFactory.createTxnMem();
-        server = FusekiEmbeddedServer.create()
+        server = FusekiServer.create()
             .add(datasetPath(), dsgTesting)
             .setPort(port())
             .build()

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/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 2743bcb..1925753 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
@@ -66,7 +66,7 @@ public class TestEmbeddedFuseki {
     @Test public void embedded_01() {
         DatasetGraph dsg = dataset() ;
         int port = 3330 ;   // Default port.
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create().add("/ds", dsg).build() ;
+        FusekiServer server = FusekiServer.create().add("/ds", dsg).build() ;
         assertTrue(server.getDataAccessPointRegistry().isRegistered("/ds")) ;
         server.start() ;
         query("http://localhost:"+port+"/ds/query", "SELECT * { ?s ?p ?o}", qExec-> {
@@ -80,7 +80,7 @@ public class TestEmbeddedFuseki {
     @Test public void embedded_02() {
         DatasetGraph dsg = dataset() ;
         int port = 0 ;//FusekiEnv.choosePort() ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.make(port, "/ds2", dsg) ;
+        FusekiServer server = FusekiServer.make(port, "/ds2", dsg) ;
         DataAccessPointRegistry registry = server.getDataAccessPointRegistry() ;
         // But no /ds
         assertEquals(1, registry.size()) ;
@@ -95,7 +95,7 @@ public class TestEmbeddedFuseki {
     @Test public void embedded_03() {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .add("/ds1", dsg) 
             .build() ;
@@ -130,7 +130,7 @@ public class TestEmbeddedFuseki {
         dataService.addEndpoint(OperationName.Update, "");
         int port = FusekiLib.choosePort() ;
         
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .add("/data", dataService)
             .build() ;
@@ -169,7 +169,7 @@ public class TestEmbeddedFuseki {
     @Test public void embedded_05() {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .add("/ds0", dsg) 
             .build() ;
@@ -184,7 +184,7 @@ public class TestEmbeddedFuseki {
     @Test public void embedded_06() {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .add("/ds0", dsg)
             .enableStats(true)
@@ -201,7 +201,7 @@ public class TestEmbeddedFuseki {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
         
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .setContextPath("/ABC")
             .add("/ds", dsg) 
@@ -219,7 +219,7 @@ public class TestEmbeddedFuseki {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
 
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .parseConfigFile(DIR+"config.ttl") 
             .build() ;
@@ -233,7 +233,7 @@ public class TestEmbeddedFuseki {
         DatasetGraph dsg = dataset() ;
         int port = FusekiLib.choosePort() ;
 
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .setPort(port)
             .setContextPath("/ABC")
             .parseConfigFile(DIR+"config.ttl") 
@@ -257,7 +257,7 @@ public class TestEmbeddedFuseki {
         DataService dSrv = new DataService(dsg) ;
         dSrv.addEndpoint(OperationName.Query, "q") ;
         dSrv.addEndpoint(OperationName.GSP_R, "gsp") ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .add("/dsrv1", dSrv)
             .setPort(port)
             .build() ;
@@ -276,7 +276,7 @@ public class TestEmbeddedFuseki {
         DataService dSrv = new DataService(dsg) ;
         dSrv.addEndpoint(OperationName.Query, "q") ;
         dSrv.addEndpoint(OperationName.GSP_R, "gsp") ;
-        FusekiEmbeddedServer server = FusekiEmbeddedServer.create()
+        FusekiServer server = FusekiServer.create()
             .add("/dsrv1", dSrv)
             .setStaticFileBase(DIR)
             .setPort(port)

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestMultipleEmbedded.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestMultipleEmbedded.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestMultipleEmbedded.java
index bb45b8f..7a154c2 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestMultipleEmbedded.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestMultipleEmbedded.java
@@ -53,9 +53,9 @@ public class TestMultipleEmbedded {
         DatasetGraph dsg = dataset() ;
 
         int port = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server1 = FusekiEmbeddedServer.create().setPort(port).add("/ds1", dsg).build() ;
+        FusekiServer server1 = FusekiServer.create().setPort(port).add("/ds1", dsg).build() ;
         // Same port - Bbad.
-        FusekiEmbeddedServer server2 = FusekiEmbeddedServer.create().setPort(port).add("/ds2", dsg).build() ;
+        FusekiServer server2 = FusekiServer.create().setPort(port).add("/ds2", dsg).build() ;
     
         server1.start();
         
@@ -75,11 +75,11 @@ public class TestMultipleEmbedded {
     public void multiple_02() {
         DatasetGraph dsg = dataset() ;
         int port1 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server1 = FusekiEmbeddedServer.create().setPort(port1).add("/ds1", dsg).build() ;
+        FusekiServer server1 = FusekiServer.create().setPort(port1).add("/ds1", dsg).build() ;
 
         // Different port - good
         int port2 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server2 = FusekiEmbeddedServer.create().setPort(port2).add("/ds2", dsg).build() ;
+        FusekiServer server2 = FusekiServer.create().setPort(port2).add("/ds2", dsg).build() ;
 
         try {
             server1.start();
@@ -97,11 +97,11 @@ public class TestMultipleEmbedded {
         DatasetGraph dsg2 = dataset() ;
         // Same name.
         int port1 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server1 = FusekiEmbeddedServer.create().setPort(port1).add("/ds", dsg1).build().start() ;
+        FusekiServer server1 = FusekiServer.create().setPort(port1).add("/ds", dsg1).build().start() ;
         Txn.executeWrite(dsg1, ()->dsg1.add(q1));
         
         int port2 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server2 = FusekiEmbeddedServer.create().setPort(port2).add("/ds", dsg2).build().start() ;
+        FusekiServer server2 = FusekiServer.create().setPort(port2).add("/ds", dsg2).build().start() ;
         Txn.executeWrite(dsg2, ()->dsg2.add(q2));
         
         query("http://localhost:"+port1+"/ds/", "SELECT * {?s ?p 1}", qExec->{
@@ -130,11 +130,11 @@ public class TestMultipleEmbedded {
         DatasetGraph dsg = dataset() ;
         
         int port1 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server1 = FusekiEmbeddedServer.create().setPort(port1).add("/ds1", dsg).build().start() ;
+        FusekiServer server1 = FusekiServer.create().setPort(port1).add("/ds1", dsg).build().start() ;
         Txn.executeWrite(dsg, ()->dsg.add(q1));
         
         int port2 = FusekiLib.choosePort() ;
-        FusekiEmbeddedServer server2 = FusekiEmbeddedServer.create().setPort(port2).add("/ds2", dsg).build().start() ;
+        FusekiServer server2 = FusekiServer.create().setPort(port2).add("/ds2", dsg).build().start() ;
         Txn.executeWrite(dsg, ()->dsg.add(q2));
         
         query("http://localhost:"+port1+"/ds1", "SELECT * {?s ?p ?o}", qExec->{

http://git-wip-us.apache.org/repos/asf/jena/blob/2e579e38/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionRemote.java
----------------------------------------------------------------------
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionRemote.java b/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionRemote.java
index b60d0b9..4b2615f 100644
--- a/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionRemote.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionRemote.java
@@ -20,7 +20,7 @@ package org.apache.jena.test.rdfconnection;
 
 import org.apache.jena.atlas.logging.LogCtl ;
 import org.apache.jena.fuseki.Fuseki ;
-import org.apache.jena.fuseki.embedded.FusekiEmbeddedServer ;
+import org.apache.jena.fuseki.embedded.FusekiServer ;
 import org.apache.jena.rdfconnection.AbstractTestRDFConnection;
 import org.apache.jena.rdfconnection.RDFConnection;
 import org.apache.jena.rdfconnection.RDFConnectionFactory;
@@ -32,12 +32,12 @@ import org.junit.Before ;
 import org.junit.BeforeClass ;
 
 public class TestRDFConnectionRemote extends AbstractTestRDFConnection {
-    private static FusekiEmbeddedServer server ;
+    private static FusekiServer server ;
     private static DatasetGraph serverdsg = DatasetGraphFactory.createTxnMem() ;
     
     @BeforeClass
     public static void beforeClass() {
-        server = FusekiEmbeddedServer.create()
+        server = FusekiServer.create()
             .setPort(2244)
             .add("/ds", serverdsg)
             .build() ;