blob: 2d256297eb219b9172b59e01fb07f3762565c67d [file] [log] [blame]
/*
* 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.tdb;
import java.io.File ;
import org.apache.jena.atlas.lib.FileOps ;
import org.apache.jena.query.Dataset ;
import org.apache.jena.query.DatasetFactory ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.assembler.AssemblerUtils ;
import org.apache.jena.sys.JenaSystem ;
import org.apache.jena.tdb.assembler.VocabTDB ;
import org.apache.jena.tdb.base.file.Location ;
import org.apache.jena.tdb.setup.StoreParams ;
import org.apache.jena.tdb.store.DatasetGraphTDB ;
import org.apache.jena.tdb.sys.TDBInternal ;
import org.apache.jena.tdb.sys.TDBMaker ;
import org.apache.jena.tdb.transaction.DatasetGraphTransaction ;
/** Public factory for creating objects datasets backed by TDB storage */
public class TDBFactory
{
static { JenaSystem.init(); }
private TDBFactory() {}
/** Read the file and assembler a dataset */
public static Dataset assembleDataset(String assemblerFile) {
return (Dataset)AssemblerUtils.build(assemblerFile, VocabTDB.tDatasetTDB) ;
}
/** Create or connect to a TDB-backed dataset */
public static Dataset createDataset(String dir)
{ return createDataset(Location.create(dir)) ; }
/** Create or connect to a TDB-backed dataset */
public static Dataset createDataset(Location location)
{ return createDataset(createDatasetGraph(location)) ; }
/** Create or connect to a TDB dataset backed by an in-memory block manager. For testing.*/
public static Dataset createDataset()
{ return createDataset(createDatasetGraph()) ; }
/** Create a dataset around a DatasetGraphTDB */
private static Dataset createDataset(DatasetGraph datasetGraph)
{ return DatasetFactory.wrap(datasetGraph) ; }
/** Create or connect to a TDB-backed dataset (graph-level) */
public static DatasetGraph createDatasetGraph(String directory)
{ return createDatasetGraph(Location.create(directory)) ; }
/** Create or connect to a TDB-backed dataset (graph-level) */
public static DatasetGraph createDatasetGraph(Location location)
{ return _createDatasetGraph(location) ; }
/** Create a TDB-backed dataset (graph-level) in memory (for testing) */
public static DatasetGraph createDatasetGraph() {
return _createDatasetGraph() ;
}
/** Release from the JVM. All caching is lost. */
public static void release(Dataset dataset) {
release(dataset.asDatasetGraph());
}
/** Release from the JVM. All caching is lost. */
public static void release(DatasetGraph dataset) {
_release(dataset) ;
}
private static void _release(DatasetGraph dataset) {
TDBInternal.expel(dataset);
}
private static DatasetGraph _createDatasetGraph(Location location) {
return TDBMaker.createDatasetGraphTransaction(location) ;
}
private static DatasetGraph _createDatasetGraph() {
return TDBMaker.createDatasetGraphTransaction() ;
}
/** Test whether a dataset is backed by TDB.
* @deprecated Use {@link #isTDB1(Dataset)}
*/
@Deprecated
public static boolean isBackedByTDB(Dataset dataset) {
DatasetGraph dsg = dataset.asDatasetGraph() ;
return isBackedByTDB(dsg) ;
}
/** Test whether a dataset is backed by TDB.
* @deprecated Use {@link #isTDB1(DatasetGraph)}
*/
@Deprecated
public static boolean isBackedByTDB(DatasetGraph datasetGraph) {
if ( datasetGraph instanceof DatasetGraphTransaction )
// The switching "connection" for TDB
return true ;
if ( datasetGraph instanceof DatasetGraphTDB )
// A transaction or the base storage.
return true ;
return false ;
}
/** Test whether a dataset is backed by TDB. */
public static boolean isTDB1(Dataset dataset) {
DatasetGraph dsg = dataset.asDatasetGraph() ;
return isTDB1(dsg) ;
}
/** Test whether a dataset is backed by TDB. */
public static boolean isTDB1(DatasetGraph datasetGraph) {
return TDBInternal.isTDB1(datasetGraph);
}
/** Return the location of a dataset if it is backed by TDB, else null */
public static Location location(Dataset dataset) {
DatasetGraph dsg = dataset.asDatasetGraph() ;
return location(dsg) ;
}
/** Return the location of a DatasetGraph if it is backed by TDB, else null */
public static Location location(DatasetGraph datasetGraph) {
if ( datasetGraph instanceof DatasetGraphTDB )
return ((DatasetGraphTDB)datasetGraph).getLocation() ;
if ( datasetGraph instanceof DatasetGraphTransaction )
return ((DatasetGraphTransaction)datasetGraph).getLocation() ;
return null ;
}
/** Test whether a location already has a TDB database or whether a call to TDBFactory
* will cause a new, fresh TDB database to be created (pragmatic tests).
* The directory may be empty, or not exist.
* Existing databases return "true".
*/
public static boolean inUseLocation(String directory) {
return inUseLocation(Location.create(directory)) ;
}
/** Test whether a location already has a TDB database or whether a call to TDBFactory
* will cause a new, fresh TDB database to be created (pragmatic tests).
* The directory may be empty, or not exist.
* Existing databases return "true".
*/
public static boolean inUseLocation(Location location) {
if ( location.isMemUnique() )
return false ;
if ( location.isMem() )
return StoreConnection.getExisting(location) != null ;
String dirname = location.getDirectoryPath() ;
File d = new File(dirname) ;
if ( ! d.exists() )
// TDB autocreates directories one level.
return ! FileOps.exists(d.getParent()) ;
return ! TDBInternal.isNewDatabaseArea(location) ;
}
/** Set the {@link StoreParams} for specific Location.
* This call must only be called before a dataset from Location
* is created. This operation should be used with care; bad choices
* of {@link StoreParams} can reduce performance.
*
* <a href="http://jena.apache.org/documentation/tdb/store-parameters.html">See documentation</a>.
*
* @param location The persistent storage location
* @param params StoreParams to use
* @throws IllegalStateException If the dataset has already been setup.
*/
public static void setup(Location location, StoreParams params) {
StoreConnection sConn = StoreConnection.getExisting(location) ;
if ( sConn != null )
throw new IllegalStateException("Location is already active") ;
StoreConnection.make(location, params) ;
}
}