You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/02/02 19:02:10 UTC
svn commit: r1563690 [2/2] - in /jena/branches/jena-fuseki-new-ui:
src-dev/dev/ src/main/java/org/apache/jena/fuseki/
src/main/java/org/apache/jena/fuseki/async/
src/main/java/org/apache/jena/fuseki/authz/
src/main/java/org/apache/jena/fuseki/build/ sr...
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java Sun Feb 2 18:02:09 2014
@@ -18,11 +18,18 @@
package org.apache.jena.fuseki.server;
+import org.apache.commons.collections.FunctorException ;
import org.apache.jena.fuseki.migrate.Registry ;
// XXX rename
public class DatasetRegistry extends Registry<DataAccessPoint>
{
+ public static void register(String name, DataAccessPoint accessPt) {
+ if ( get().isRegistered(name) )
+ throw new FunctorException("Already registered: "+name) ;
+ get().put(name, accessPt);
+ }
+
private static DatasetRegistry singleton = new DatasetRegistry() ;
public static DatasetRegistry get() { return singleton ; }
Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java?rev=1563690&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java Sun Feb 2 18:02:09 2014
@@ -0,0 +1,146 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.server;
+
+import java.io.StringReader ;
+import java.util.ArrayList ;
+import java.util.HashMap ;
+import java.util.List ;
+import java.util.Map ;
+
+import org.apache.jena.atlas.lib.DS ;
+import org.apache.jena.atlas.lib.FileOps ;
+import org.apache.jena.atlas.lib.InternalErrorException ;
+import org.apache.jena.fuseki.Fuseki ;
+import org.apache.jena.fuseki.FusekiConfigException ;
+import org.apache.jena.fuseki.build.Builder ;
+import org.apache.jena.fuseki.build.FusekiConfig ;
+import org.apache.jena.fuseki.build.Template ;
+import org.apache.jena.fuseki.build.TemplateFunctions ;
+import org.apache.jena.fuseki.servlets.ServletOps ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFLanguages ;
+
+import com.hp.hpl.jena.rdf.model.* ;
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+
+public class FusekiServer
+{
+ public static void init(ServerInitialConfig initialSetup, String configDir) {
+ FileOps.ensureDir(Fuseki.configDirName) ;
+ FileOps.ensureDir(Fuseki.systemFileArea) ;
+
+ //FileOps.ensureDir(Fuseki.systemDatabaseName) ;
+ // XXX Make relative.
+
+
+ List<DataAccessPoint> configFileDBs = findDatasets(initialSetup) ;
+ List<DataAccessPoint> directoryDBs = FusekiConfig.readConfigurationDirectory(configDir) ;
+ List<DataAccessPoint> systemDBs = FusekiConfig.readSystemDatabase(SystemState.getDataset()) ;
+
+ List<DataAccessPoint> datapoints = new ArrayList<DataAccessPoint>() ;
+ datapoints.addAll(configFileDBs) ;
+ datapoints.addAll(directoryDBs) ;
+ datapoints.addAll(systemDBs) ;
+
+ // Having found them, set them all running.
+ enable(datapoints);
+ }
+
+ private static void enable(List<DataAccessPoint> datapoints) {
+ for ( DataAccessPoint dap : datapoints ) {
+ Fuseki.configLog.info("Register: "+dap.getName()) ;
+ DatasetRegistry.register(dap.getName(), dap);
+ }
+ }
+
+ private static List<DataAccessPoint> findDatasets(ServerInitialConfig params) {
+ // Has a side effect of global context setting
+ // when processing a config file.
+ // Compatibility.
+
+ List<DataAccessPoint> datasets = DS.list() ;
+ if ( params == null )
+ return datasets ;
+
+ if ( params.fusekiConfigFile != null ) {
+ Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ;
+ List<DataAccessPoint> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
+ datasets.addAll(cmdLineDatasets) ;
+ } else if ( params.dsg != null ) {
+ DataAccessPoint dap = defaultConfiguration(params.datasetPath, params.dsg, params.allowUpdate) ;
+ datasets.add(dap) ;
+ } else if ( params.templateFile != null ) {
+ Fuseki.configLog.info("Template file: " + params.templateFile) ;
+ DataAccessPoint dap = configFromTemplate(params.templateFile, params.datasetPath) ;
+ datasets.add(dap) ;
+ } else
+ throw new FusekiConfigException("Invalid ServerInitialConfig") ;
+ return datasets ;
+ }
+
+ private static DataAccessPoint configFromTemplate(String templateFile, String datasetPath) {
+ datasetPath = DataAccessPoint.canonical(datasetPath) ;
+ // DRY -- ActionDatasets (and others?)
+ Map<String, String> params = new HashMap<String, String>() ;
+ params.put(Template.NAME, datasetPath) ;
+ String str = TemplateFunctions.template(templateFile, params) ;
+ Lang lang = RDFLanguages.filenameToLang(str, Lang.TTL) ;
+ StringReader sr = new StringReader(str) ;
+ Model model = ModelFactory.createDefaultModel() ;
+ RDFDataMgr.read(model, sr, datasetPath, lang);
+
+ // Find DataAccessPoint
+ Statement stmt = getOne(model, null, FusekiVocab.pServiceName, null) ;
+ if ( stmt == null ) {
+ StmtIterator sIter = model.listStatements(null, FusekiVocab.pServiceName, (RDFNode)null ) ;
+ if ( ! sIter.hasNext() )
+ ServletOps.errorBadRequest("No name given in description of Fuseki service") ;
+ sIter.next() ;
+ if ( sIter.hasNext() )
+ ServletOps.errorBadRequest("Multiple names given in description of Fuseki service") ;
+ throw new InternalErrorException("Inconsistent: getOne didn't fail the second time") ;
+ }
+ Resource subject = stmt.getSubject() ;
+ DataAccessPoint dap = Builder.buildDataAccessPoint(subject) ;
+ return dap ;
+ }
+
+ // DRY -- ActionDatasets (and others?)
+ private static Statement getOne(Model m, Resource s, Property p, RDFNode o) {
+ StmtIterator iter = m.listStatements(s, p, o) ;
+ if ( ! iter.hasNext() )
+ return null ;
+ Statement stmt = iter.next() ;
+ if ( iter.hasNext() )
+ return null ;
+ return stmt ;
+ }
+
+ // ----
+ private static DataAccessPoint defaultConfiguration( String name, DatasetGraph dsg, boolean updatable) {
+ name = DataAccessPoint.canonical(name) ;
+ DataAccessPoint dap = new DataAccessPoint(name) ;
+ DataService ds = Builder.buildDataService(dsg, updatable) ;
+ dap.setDataService(ds) ;
+ return dap ;
+ }
+}
+
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java Sun Feb 2 18:02:09 2014
@@ -28,6 +28,7 @@ import javax.servlet.ServletContextListe
import org.apache.jena.atlas.lib.DS ;
import org.apache.jena.atlas.lib.FileOps ;
import org.apache.jena.fuseki.Fuseki ;
+import org.apache.jena.fuseki.build.FusekiConfig ;
import org.slf4j.Logger ;
public class FusekiServletContextListener implements ServletContextListener {
@@ -46,7 +47,7 @@ public class FusekiServletContextListene
// ----
static public final String configDir = /* dir root + */ Fuseki.configDirName ;
- private Boolean initialized = false ;
+ private volatile Boolean initialized = false ;
@Override
public void contextInitialized(ServletContextEvent sce) {
@@ -74,45 +75,13 @@ public class FusekiServletContextListene
}
if ( initialSetup != null ) {
- //FileOps.ensureDir(Fuseki.systemDatabaseName) ;
- // XXX Make relative.
- FileOps.ensureDir(Fuseki.configDirName) ;
- FileOps.ensureDir(Fuseki.systemFileArea) ;
-
- // Places to look:
- // 1 - Fuseki v1 config file (deprecated)
- // 2 - Directory of assemblers files "assemblers"
- // 3 - The system database
-
- List<DataAccessPoint> configFileDBs = findDatasets(initialSetup) ;
- List<DataAccessPoint> directoryDBs = FusekiConfig.readConfigurationDirectory(configDir) ;
- List<DataAccessPoint> systemDBs = FusekiConfig.readSystemDatabase(SystemState.getDataset()) ;
-
- List<DataAccessPoint> datasets = new ArrayList<DataAccessPoint>() ;
- datasets.addAll(configFileDBs) ;
- datasets.addAll(directoryDBs) ;
- datasets.addAll(systemDBs) ;
-
- // Having found them, set them all running.
- FusekiConfig.configureDatasets(datasets);
+ FusekiServer.init(initialSetup, configDir) ;
+ } else {
+ Fuseki.serverLog.error("No configuration") ;
+ System.exit(0) ;
}
+
}
}
-
- private static List<DataAccessPoint> findDatasets(ServerInitialConfig params) {
- // Has a side effect of global context setting.
-
- List<DataAccessPoint> datasets = DS.list() ;
-
- if ( params.fusekiConfigFile != null ) {
- Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ;
- List<DataAccessPoint> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
- datasets.addAll(cmdLineDatasets) ;
- } else {
- List<DataAccessPoint> cmdLineDatasets = FusekiConfig.defaultConfiguration(params) ;
- datasets.addAll(cmdLineDatasets) ;
- }
- return datasets ;
- }
}
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java Sun Feb 2 18:02:09 2014
@@ -31,6 +31,7 @@ import javax.servlet.DispatcherType ;
import org.apache.jena.atlas.lib.NotImplemented ;
import org.apache.jena.fuseki.Fuseki ;
import org.apache.jena.fuseki.FusekiException ;
+import org.apache.jena.fuseki.mgt.MgtJMX ;
import org.apache.jena.fuseki.servlets.FusekiFilter ;
import org.eclipse.jetty.security.* ;
import org.eclipse.jetty.security.authentication.BasicAuthenticator ;
@@ -134,7 +135,7 @@ public class SPARQLServer {
} catch (Exception ex) {
Fuseki.serverLog.warn("SPARQLServer: Exception while stopping server: " + ex.getMessage(), ex) ;
}
- FusekiConfig.removeJMX() ;
+ MgtJMX.removeJMX() ;
}
/**
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java Sun Feb 2 18:02:09 2014
@@ -18,13 +18,23 @@
package org.apache.jena.fuseki.server;
+import java.util.HashMap ;
+import java.util.Map ;
+
import com.hp.hpl.jena.sparql.core.DatasetGraph ;
/** Dataset setup (command line, config file) for a dataset (or several if config file) */
public class ServerInitialConfig {
- // Either dsg/datasetPath are null or fusekiConfigFile is null.
- public DatasetGraph dsg = null ;
- public String datasetPath = null ;
- public boolean allowUpdate = false ;
- public String fusekiConfigFile = null ;
+ // Either this ...
+ public String templateFile = null ;
+ public Map<String,String> params = new HashMap<String,String>() ;
+ public String datasetPath = null ;
+ public boolean allowUpdate = false ;
+ // Or this ...
+ public String fusekiConfigFile = null ;
+
+ // Special case - directly pass in the dataset graphs - datasetPath must be given.
+ // This is not persistet across server restarts.
+ public DatasetGraph dsg = null ;
+
}
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java Sun Feb 2 18:02:09 2014
@@ -65,7 +65,7 @@ public abstract class ActionSPARQL exten
}
} else {
dataAccessPoint = null ;
- dSrv = FusekiConfig.serviceOnlyDatasetRef() ;
+ dSrv = DataService.serviceOnlyDataService() ;
}
String uri = action.request.getRequestURI() ;
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java Sun Feb 2 18:02:09 2014
@@ -48,22 +48,21 @@ public class FusekiFilter implements Fil
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
- // See SPARQL_Servlet.execCommonWorker
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response ;
// XXX Context path
- // Put this somewhere.
String x = request.getServletContext().getContextPath() ;
-
-
String uri = req.getRequestURI() ;
String datasetUri = ActionLib.mapRequestToDataset(uri) ;
+ // is it a long running operation?
+ // (this could be a separate filter)
+
+ // is it a request to a DataService via an access point.
if ( x != null )
datasetUri = datasetUri.substring(x.length()) ;
-
if ( datasetUri != null ) {
if ( DatasetRegistry.get().isRegistered(datasetUri) ) {
// Intercept and redirect
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java Sun Feb 2 18:02:09 2014
@@ -27,7 +27,6 @@ import java.util.List ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
-import org.apache.jena.atlas.lib.Lib ;
import org.apache.jena.atlas.web.MediaType ;
import org.apache.jena.fuseki.DEF ;
import org.apache.jena.fuseki.FusekiException ;
Added: jena/branches/jena-fuseki-new-ui/templates/config-service
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/templates/config-service?rev=1563690&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/templates/config-service (added)
+++ jena/branches/jena-fuseki-new-ui/templates/config-service Sun Feb 2 18:02:09 2014
@@ -0,0 +1,23 @@
+# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
+
+@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 tdb: <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
+
+## ---------------------------------------------------------------
+## Read-only in-memory dataset - used as a default, dummy datasets
+
+<#service1> rdf:type fuseki:Service ;
+ fuseki:name "" ;
+ fuseki:serviceQuery "sparql" ;
+ fuseki:serviceQuery "query" ;
+ fuseki:serviceReadGraphStore "get" ;
+ fuseki:dataset <#dataset> ;
+ .
+
+## In-memory, empty.
+<#dataset> rdf:type ja:RDFDataset .
Modified: jena/branches/jena-fuseki-new-ui/templates/config-tdb
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/templates/config-tdb?rev=1563690&r1=1563689&r2=1563690&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/templates/config-tdb (original)
+++ jena/branches/jena-fuseki-new-ui/templates/config-tdb Sun Feb 2 18:02:09 2014
@@ -31,6 +31,6 @@ tdb:GraphTDB rdfs:subClassOf ja:Mode
<#tdb_dataset_readwrite> rdf:type tdb:DatasetTDB ;
tdb:location "databases/{NAME}" ;
- ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
- tdb:unionDefaultGraph true ;
+ ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "3000" ] ;
+ ##tdb:unionDefaultGraph true ;
.
Added: jena/branches/jena-fuseki-new-ui/templates/config-tdb-dir
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/templates/config-tdb-dir?rev=1563690&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/templates/config-tdb-dir (added)
+++ jena/branches/jena-fuseki-new-ui/templates/config-tdb-dir Sun Feb 2 18:02:09 2014
@@ -0,0 +1,35 @@
+# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
+
+@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 tdb: <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
+
+# TDB
+[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
+tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
+tdb:GraphTDB rdfs:subClassOf ja:Model .
+
+## ---------------------------------------------------------------
+## Updatable TDB dataset with all services enabled.
+
+<#service_tdb_all> rdf:type fuseki:Service ;
+ rdfs:label "TDB {NAME}" ;
+ fuseki:name "{NAME}" ;
+ fuseki:serviceQuery "query" ;
+ fuseki:serviceQuery "sparql" ;
+ fuseki:serviceUpdate "update" ;
+ fuseki:serviceUpload "upload" ;
+ fuseki:serviceReadWriteGraphStore "data" ;
+ # A separate read-only graph store endpoint:
+ fuseki:serviceReadGraphStore "get" ;
+ fuseki:dataset <#tdb_dataset_readwrite> ;
+
+ .
+
+<#tdb_dataset_readwrite> rdf:type tdb:DatasetTDB ;
+ tdb:location "{DIR}" ;
+ ##tdb:unionDefaultGraph true ;
+ .
Added: jena/branches/jena-fuseki-new-ui/templates/config-tdb-mem
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/templates/config-tdb-mem?rev=1563690&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/templates/config-tdb-mem (added)
+++ jena/branches/jena-fuseki-new-ui/templates/config-tdb-mem Sun Feb 2 18:02:09 2014
@@ -0,0 +1,36 @@
+# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
+
+@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 tdb: <http://jena.hpl.hp.com/2008/tdb#> .
+@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
+
+# TDB
+[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
+tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
+tdb:GraphTDB rdfs:subClassOf ja:Model .
+
+## ---------------------------------------------------------------
+## Updatable TDB dataset with all services enabled.
+
+<#service_tdb_all> rdf:type fuseki:Service ;
+ rdfs:label "TDB {NAME}" ;
+ fuseki:name "{NAME}" ;
+ fuseki:serviceQuery "query" ;
+ fuseki:serviceQuery "sparql" ;
+ fuseki:serviceUpdate "update" ;
+ fuseki:serviceUpload "upload" ;
+ fuseki:serviceReadWriteGraphStore "data" ;
+ # A separate read-only graph store endpoint:
+ fuseki:serviceReadGraphStore "get" ;
+ fuseki:dataset <#tdb_dataset_readwrite> ;
+
+ .
+
+<#tdb_dataset_readwrite> rdf:type tdb:DatasetTDB ;
+ tdb:location "--mem--" ;
+ ja:context [ ja:cxtName "arq:queryTimeout" ; ja:cxtValue "1000" ] ;
+ # tdb:unionDefaultGraph true ;
+ .