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 2020/12/04 14:52:38 UTC
[jena] branch master updated: JENA-2006: DatasetGraph prefixes
This is an automated email from the ASF dual-hosted git repository.
andy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jena.git
The following commit(s) were added to refs/heads/master by this push:
new 19b4ed3 JENA-2006: DatasetGraph prefixes
new 3ca8d03 Merge pull request #880 from afs/dataset-prefixes
19b4ed3 is described below
commit 19b4ed3d8a6e39573a78d5a0c39aeb3b3f95fe7b
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sun Nov 22 18:44:43 2020 +0000
JENA-2006: DatasetGraph prefixes
---
.../main/java/org/apache/jena/query/Dataset.java | 65 +--
.../main/java/org/apache/jena/riot/RDFParser.java | 84 ++--
.../main/java/org/apache/jena/riot/RDFWriter.java | 2 +-
.../apache/jena/riot/lang/CollectorStreamBase.java | 20 +-
.../apache/jena/riot/lang/CollectorStreamRDF.java | 32 +-
.../apache/jena/riot/lang/PipedRDFIterator.java | 16 +-
.../org/apache/jena/riot/system}/PrefixEntry.java | 23 +-
.../org/apache/jena/riot/system}/PrefixLib.java | 79 ++--
.../org/apache/jena/riot/system/PrefixMap.java | 54 ++-
.../apache/jena/riot/system/PrefixMapAdapter.java | 120 ++++++
.../org/apache/jena/riot/system/PrefixMapBase.java | 110 +++--
.../apache/jena/riot/system/PrefixMapExtended.java | 127 ------
.../apache/jena/riot/system/PrefixMapFactory.java | 88 ++--
.../org/apache/jena/riot/system/PrefixMapNull.java | 34 +-
.../apache/jena/riot/system/PrefixMapProxy.java} | 22 +-
.../system/PrefixMapSink.java} | 37 +-
.../org/apache/jena/riot/system/PrefixMapStd.java | 101 +++--
.../jena/riot/system/PrefixMapUnmodifiable.java | 16 +-
.../apache/jena/riot/system/PrefixMapWrapper.java | 49 ++-
.../apache/jena/riot/system/PrefixMapZero.java} | 19 +-
.../java/org/apache/jena/riot/system/Prefixes.java | 160 ++++++++
.../java/org/apache/jena/riot/system/Prologue.java | 103 ++---
.../java/org/apache/jena/riot/system/RiotLib.java | 88 ++--
.../org/apache/jena/riot/system/StreamRDFLib.java | 97 ++---
.../org/apache/jena/sparql/core/DatasetGraph.java | 54 +--
.../apache/jena/sparql/core/DatasetGraphMap.java | 46 ++-
.../jena/sparql/core/DatasetGraphMapLink.java | 27 +-
.../apache/jena/sparql/core/DatasetGraphOne.java | 30 +-
.../apache/jena/sparql/core/DatasetGraphSink.java | 28 +-
.../jena/sparql/core/DatasetGraphWrapper.java | 73 ++--
.../apache/jena/sparql/core/DatasetGraphZero.java | 11 +-
.../org/apache/jena/sparql/core/GraphView.java | 91 +++--
.../java/org/apache/jena/sparql/core/Prologue.java | 76 ++--
.../jena/sparql/core/mem/DatasetGraphInMemory.java | 61 +--
.../core/mem/DatasetPrefixStorageInMemory.java | 104 -----
.../apache/jena/sparql/core/mem/GraphInMemory.java | 6 +-
.../sparql/engine/binding/BindingInputStream.java | 40 +-
.../engine/iterator/QueryIterRepeatApply.java | 38 +-
.../jena/sparql/graph/GraphPrefixesProjection.java | 162 --------
.../jena/sparql/graph/PrefixMappingAdapter.java | 40 +-
.../jena/sparql/graph/PrefixMappingZero.java | 6 +-
.../jena/sparql/util/DifferenceDatasetGraph.java | 12 +-
.../jena/sparql/util/DyadicDatasetGraph.java | 14 +-
.../jena/sparql/util/IntersectionDatasetGraph.java | 9 +-
.../apache/jena/sparql/util/NodeFactoryExtra.java | 25 +-
.../apache/jena/sparql/util/UnionDatasetGraph.java | 13 +-
.../apache/jena/riot/lang/TestParserFactory.java | 32 +-
.../org/apache/jena/riot/system/TS_RiotSystem.java | 5 +-
.../jena/riot/system/TestJsonLDReadWrite.java | 58 +--
.../apache/jena/riot/writer/TestJsonLDWriter.java | 17 +-
.../sparql/core/AbstractDatasetGraphTests.java | 175 +++++---
.../jena/sparql/core/DatasetGraphSimpleMem.java | 18 +-
.../graph/AbstractTestPrefixMappingView.java | 36 +-
.../util/AbstractTestDyadicDatasetGraph.java | 25 +-
.../main/java/org/apache/jena/atlas/lib/Lib.java | 5 +
jena-cmds/src/main/java/tdb/tdbconfig.java | 46 +--
.../java/org/apache/jena/util/MonitorModel.java | 10 +-
.../org/apache/jena/dboe/storage/DatabaseRDF.java | 2 +-
.../org/apache/jena/dboe/storage/Prefixes.java | 39 --
.../apache/jena/dboe/storage/StoragePrefixes.java | 3 +-
.../org/apache/jena/dboe/storage/StorageRDF.java | 6 +-
.../jena/dboe/storage/prefixes/PrefixMapI.java | 146 -------
...IOverStorage.java => PrefixMapOverStorage.java} | 50 +--
.../storage/prefixes/PrefixMapStorageSimple.java | 2 +
.../prefixes/PrefixMappingOverPrefixMapI.java | 145 -------
.../dboe/storage/prefixes/PrefixesDboeFactory.java | 48 +++
.../dboe/storage/prefixes/PrefixesFactory.java | 60 ---
.../dboe/storage/prefixes/StoragePrefixMap.java | 2 +
.../storage/prefixes/StoragePrefixesEmpty.java | 1 +
.../dboe/storage/prefixes/StoragePrefixesView.java | 12 +-
.../apache/jena/dboe/storage/simple/SimpleDB.java | 2 +-
...fixesMem.java => StoragePrefixesSimpleMem.java} | 42 +-
.../{StorageMem.java => StorageSimpleMem.java} | 4 +-
.../dboe/storage/system/DatasetGraphStorage.java | 23 +-
.../jena/dboe/storage/system/GraphViewStorage.java | 26 --
.../AbstractTestDatasetPrefixesStorage.java | 1 +
.../jena/dboe/storage/prefixes/TS_Prefixes.java | 2 -
.../storage/prefixes/TestDatasetPrefixesMem.java | 2 +-
.../jena/dboe/storage/prefixes/TestPrefixLib.java | 22 +-
.../TestPrefixMappingOverDatasetPrefixes.java | 9 +-
.../TestPrefixMappingOverDatasetPrefixes2.java | 9 +-
.../prefixes/TestPrefixMappingOverPrefixMap.java | 39 --
.../dboe/storage/storage/TestStorageSimple.java | 4 +-
.../jena/dboe/trans/bplustree/BPTreeNodeMgr.java | 9 +-
.../bplustree/rewriter/BPTreeNodeBuilder.java | 13 -
.../jena/dboe/trans/data/TransBinaryDataFile.java | 4 +-
.../org/apache/jena/dboe/trans/data/TransBlob.java | 18 +-
.../jena/dboe/transaction/txn/Transaction.java | 7 +-
.../jena/tdb2/loader/main/DataToTuplesInline.java | 4 +-
.../tdb2/loader/main/DataToTuplesInlineSingle.java | 4 +-
.../apache/jena/tdb2/loader/main/LoaderMain.java | 2 +-
.../jena/tdb2/loader/main/PrefixHandlerBulk.java | 4 +-
.../jena/tdb2/store/DatasetGraphSwitchable.java | 14 +-
.../apache/jena/tdb2/store/DatasetGraphTDB.java | 6 +-
.../java/org/apache/jena/tdb2/store/GraphTDB.java | 8 +-
.../jena/tdb2/store/GraphViewSwitchable.java | 65 +--
.../jena/tdb2/store/PrefixMapSwitchable.java} | 29 +-
.../apache/jena/tdb2/store/StoragePrefixesTDB.java | 17 +-
.../jena/tdb2/graph/AbstractTestGraphsTDB.java | 12 -
.../jena/tdb2/graph/TestDatasetGraphTDB.java | 7 -
.../org/apache/jena/tdb2/store/TestDatasetTDB.java | 3 +-
.../org/apache/jena/tdb2/sys/TestDatabaseOps.java | 11 +-
.../apache/jena/arq/querybuilder/Converters.java | 59 ++-
.../org/apache/jena/fuseki/ctl/ActionPing.java | 3 +-
.../org/apache/jena/fuseki/server/Dispatcher.java | 14 -
.../java/org/apache/jena/test/TC_Integration.java | 25 +-
.../jena/test/integration/TS_Integration.java | 20 +-
.../jena/test/integration/TestDatasetPrefixes.java | 236 +++++++++++
.../apache/jena/test/txn/TestDataset2Graph.java | 28 +-
.../org/apache/jena/sdb/store/DatasetGraphSDB.java | 20 +-
.../jena/tdb/index/bplustree/BPTreeNode.java | 448 ++++++++++-----------
.../tdb/index/bplustree/BPTreeNodeBuilder.java | 54 +--
.../jena/tdb/index/bplustree/BPTreeNodeMgr.java | 86 ++--
.../main/java/org/apache/jena/tdb/lib/DumpOps.java | 2 +-
.../org/apache/jena/tdb/store/DatasetGraphTDB.java | 72 ++--
.../jena/tdb/store}/DatasetPrefixStorage.java | 51 +--
.../jena/tdb/store/DatasetPrefixStorageLogger.java | 128 ------
.../apache/jena/tdb/store/DatasetPrefixesTDB.java | 94 ++---
.../jena/tdb/store/GraphPrefixesProjection.java | 113 ++++++
.../java/org/apache/jena/tdb/store/GraphTDB.java | 67 +--
.../org/apache/jena/tdb/store/PrefixMapTDB1.java | 25 +-
.../jena/tdb/store/bulkloader/BulkLoader.java | 22 +-
.../store/bulkloader2/ProcNodeTableBuilder.java | 44 +-
.../apache/jena/tdb/store/nodetable/NodecSSE.java | 52 +--
.../tdb/store/nodetupletable/NodeTupleTable.java | 14 +-
.../nodetupletable/NodeTupleTableConcrete.java | 13 +-
.../tdb/store/tupletable/TupleIndexRecord.java | 8 +-
.../tdb/transaction/DatasetGraphTransaction.java | 82 ++--
.../org/apache/jena/tdb/transaction/Journal.java | 4 +-
.../java/org/apache/jena/tdb/graph/TS_Graph.java | 3 +-
.../apache/jena/tdb/graph/TestDatasetGraphTDB.java | 7 -
.../apache/jena/tdb/graph/TestPrefixMapTDB.java | 10 +-
.../jena/tdb/graph/TestPrefixMappingTDB.java | 42 +-
.../org/apache/jena/tdb/store/TestDatasetTDB.java | 85 ++--
.../java/org/apache/jena/tdb/store/TestLoader.java | 6 +-
.../tdb/store/nodetable/AbstractTestNodeTable.java | 30 +-
136 files changed, 2855 insertions(+), 2989 deletions(-)
diff --git a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
index 3a43214..cc54587 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
@@ -21,26 +21,28 @@ package org.apache.jena.query;
import java.util.Iterator ;
import org.apache.jena.rdf.model.Model ;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.shared.Lock ;
+import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.core.Transactional ;
+import org.apache.jena.sparql.core.Transactional;
import org.apache.jena.sparql.util.Context ;
/** Query is over a Dataset, a collection of named graphs
* and a background graph (also called the default
* graph or unnamed graph). */
-public interface Dataset extends Transactional
+public interface Dataset extends Transactional
{
/** Get the default graph as a Jena Model */
public Model getDefaultModel() ;
-
- /** Get the graph which is the unionof all named graphs as a Jena Model */
+
+ /** Get the graph which is the union of all named graphs as a Jena Model */
public Model getUnionModel() ;
/**
* Set the default graph. Can be set to null for none.
- *
+ *
* @param model the default graph to set
* @return this {@code Dataset} for continued usage
*/
@@ -49,12 +51,12 @@ public interface Dataset extends Transactional
/** Get a graph by name as a Jena Model */
public Model getNamedModel(String uri) ;
- /** Does the dataset contain a model with the name supplied? */
+ /** Does the dataset contain a model with the name supplied? */
public boolean containsNamedModel(String uri) ;
/**
* Set a named graph.
- *
+ *
* @param uri the name of the graph to set
* @param model the graph to set
* @return this {@code Dataset} for continued usage
@@ -63,7 +65,7 @@ public interface Dataset extends Transactional
/**
* Remove a named graph.
- *
+ *
* @param uri the name of the gaph to remove
* @return this {@code Dataset} for continued usage
*/
@@ -71,19 +73,19 @@ public interface Dataset extends Transactional
/**
* Change a named graph for another using the same name
- *
+ *
* @param uri the name of the graph to replace
* @param model the graph with which to replace it
* @return this {@code Dataset} for continued usage
*/
public Dataset replaceNamedModel(String uri, Model model);
-
+
/** List the names */
public Iterator<String> listNames() ;
-
+
/** Get the lock for this dataset */
public Lock getLock() ;
-
+
/** Get the context associated with this dataset */
public Context getContext() ;
@@ -102,40 +104,51 @@ public interface Dataset extends Transactional
* In addition, check details of a specific implementation.
*/
public boolean supportsTransactions() ;
-
+
/** Declare whether {@link #abort} is supported.
* This goes along with clearing up after exceptions inside application transaction code.
*/
public boolean supportsTransactionAbort() ;
-
- /** Start either a READ or WRITE transaction */
+
+ /** Start either a READ or WRITE transaction */
@Override
public void begin(ReadWrite readWrite) ;
-
- /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */
+
+ /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */
@Override
public void commit() ;
-
- /** Abort a transaction - finish the transaction and undo any changes (if a "write" transaction) */
+
+ /** Abort a transaction - finish the transaction and undo any changes (if a "write" transaction) */
@Override
public void abort() ;
- /** Say whether a transaction is active */
+ /** Say whether a transaction is active */
@Override
public boolean isInTransaction() ;
-
- /** Finish the transaction - if a write transaction and commit() has not been called, then abort */
+
+ /** Finish the transaction - if a write transaction and commit() has not been called, then abort */
@Override
public void end() ;
-
+
/** Get the dataset in graph form */
- public DatasetGraph asDatasetGraph() ;
-
+ public DatasetGraph asDatasetGraph() ;
+
+ /** Get the {@link PrefixMapping} this dataset.
+ * <p>
+ * This is an optional operation.
+ */
+ public default PrefixMapping getPrefixMapping() {
+ DatasetGraph dsg = asDatasetGraph();
+ if ( dsg == null )
+ throw new UnsupportedOperationException("Dataset.getPrefixMapping");
+ return Prefixes.adapt(dsg.prefixes());
+ }
+
/** Close the dataset, potentially releasing any associated resources.
* The dataset can not be used for query after this call.
*/
public void close() ;
-
+
/**
* @return Whether this {@code Dataset} is empty of triples, whether in the default graph or in any named graph.
*/
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
index 5794c65..b546d71 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
@@ -54,9 +54,9 @@ import org.apache.jena.sparql.util.Context;
* "parse" method is called. It can be used multiple times in which case the same source
* is reread. The destination can vary. The application is responsible for concurrency of
* the destination of the parse operation.
- *
+ *
* The process is
- *
+ *
* <pre>
* StreamRDF destination = ...
* RDFParser parser = RDFParser.create().source("filename.ttl").build();
@@ -68,12 +68,12 @@ import org.apache.jena.sparql.util.Context;
* </pre>
* The {@code destination} {@link StreamRDF} and can be given as a
* {@link Graph} or {@link DatasetGraph} as well.
- *
- * @see ReaderRIOT The interface to the syntax parsing process for each RDF syntax.
+ *
+ * @see ReaderRIOT The interface to the syntax parsing process for each RDF syntax.
*/
public class RDFParser {
- /*package*/ enum LangTagForm { NONE, LOWER_CASE, CANONICAL }
+ /*package*/ enum LangTagForm { NONE, LOWER_CASE, CANONICAL }
private final String uri;
private final Path path;
@@ -100,7 +100,7 @@ public class RDFParser {
private boolean canUseThisParser = true;
// ---- Builder creation
-
+
/** Create an {@link RDFParserBuilder}.
* <p>
* Often used in a pattern such as:
@@ -109,7 +109,7 @@ public class RDFParser {
* .source("data.ttl")
* .parse(graph);
* </pre>
- *
+ *
*/
public static RDFParserBuilder create() {
return RDFParserBuilder.create();
@@ -120,7 +120,7 @@ public class RDFParser {
* {@link Path}.
* <p>
* This is a shortcut for {@code RDFParser.create().source(path)}.
- *
+ *
* @param path
* @return this
*/
@@ -133,11 +133,11 @@ public class RDFParser {
* can be a filename.
* <p>
* This is a shortcut for {@code RDFParser.create().source(uriOrFile)}.
- *
+ *
* @param uriOrFile
* @return this
*/
-
+
public static RDFParserBuilder source(String uriOrFile) {
return RDFParserBuilder.create().source(uriOrFile);
}
@@ -154,23 +154,23 @@ public class RDFParser {
return RDFParserBuilder.create().fromString(string);
}
- /**
+ /**
* Create an {@link RDFParserBuilder} and set the source to {@link InputStream}.
- * The {@link InputStream} will be closed when the
- * parser is called and the parser can not be reused.
+ * The {@link InputStream} will be closed when the
+ * parser is called and the parser can not be reused.
* The syntax must be set with {@code .lang(...)}.
* <p>
* This is a shortcut for {@code RDFParser.create().source(input)}.
* @param input
- * @return this
+ * @return this
*/
public static RDFParserBuilder source(InputStream input) {
return RDFParserBuilder.create().source(input);
}
-
- /* package */ RDFParser(String uri, Path path, String content, InputStream inputStream, Reader javaReader, StreamManager streamManager,
- HttpClient httpClient, Lang hintLang, Lang forceLang, String baseUri, boolean strict, Optional<Boolean> checking,
- boolean canonicalLexicalValues, LangTagForm langTagForm,
+
+ /* package */ RDFParser(String uri, Path path, String content, InputStream inputStream, Reader javaReader, StreamManager streamManager,
+ HttpClient httpClient, Lang hintLang, Lang forceLang, String baseUri, boolean strict, Optional<Boolean> checking,
+ boolean canonicalLexicalValues, LangTagForm langTagForm,
boolean resolveURIs, IRIResolver resolver, FactoryRDF factory,
ErrorHandler errorHandler, Context context) {
int x = countNonNull(uri, path, content, inputStream, javaReader);
@@ -181,7 +181,7 @@ public class RDFParser {
Objects.requireNonNull(factory);
Objects.requireNonNull(errorHandler);
Objects.requireNonNull(checking);
-
+
this.uri = uri;
this.path = path;
this.content = content;
@@ -229,40 +229,40 @@ public class RDFParser {
return false;
return true;
}
-
+
/**
* Parse the source, sending the results to a {@link Graph}. The source must be for
- * triples; any quads are discarded.
+ * triples; any quads are discarded.
*/
public void parse(Graph graph) {
parse(StreamRDFLib.graph(graph));
}
-
+
/**
* Parse the source, sending the results to a {@link Model}.
* The source must be for triples; any quads are discarded.
- * This method is equivalent to {@code parse(model.getGraph())}.
+ * This method is equivalent to {@code parse(model.getGraph())}.
*/
public void parse(Model model) {
parse(model.getGraph());
}
-
+
/**
* Parse the source, sending the results to a {@link DatasetGraph}.
*/
public void parse(DatasetGraph dataset) {
parse(StreamRDFLib.dataset(dataset));
}
-
+
/**
* Parse the source, sending the results to a {@link Dataset}.
- * This method is equivalent to {@code parse(dataset.asDatasetGraph())}.
+ * This method is equivalent to {@code parse(dataset.asDatasetGraph())}.
*/
public void parse(Dataset dataset) {
parse(dataset.asDatasetGraph());
}
-
- /**
+
+ /**
* Parse the source, sending the results to a {@link StreamRDF}.
*/
public void parse(StreamRDF destination) {
@@ -273,7 +273,7 @@ public class RDFParser {
// FactoryRDF is stateful in the LabelToNode mapping.
// NB FactoryRDFCaching does not need to reset its cache.
factory.reset() ;
-
+
if ( canonicalLexicalValues )
destination = new StreamCanonicalLiterals(destination);
switch(langTagForm) {
@@ -332,23 +332,23 @@ public class RDFParser {
ContentType ct = WebContent.determineCT(null, lang, baseUri);
if ( ct == null )
throw new RiotException("Failed to determine the RDF syntax (.lang or .base required)");
-
+
ReaderRIOT readerRiot = createReader(ct);
if ( readerRiot == null )
throw new RiotException("No parser registered for content type: " + ct.getContentTypeStr());
Reader jr = javaReader;
if ( content != null )
jr = new StringReader(content);
-
+
read(readerRiot, inputStream, jr, baseUri, context, ct, destination);
}
-
+
/** Call the reader, from either an InputStream or a Reader */
private static void read(ReaderRIOT readerRiot, InputStream inputStream, Reader javaReader,
String baseUri, Context context,
ContentType ct, StreamRDF destination) {
if ( inputStream != null && javaReader != null )
- throw new InternalErrorException("Both inputStream and javaReader are non-null");
+ throw new InternalErrorException("Both inputStream and javaReader are non-null");
if ( inputStream != null ) {
readerRiot.read(inputStream, baseUri, ct, destination, context);
return;
@@ -373,19 +373,19 @@ public class RDFParser {
{ throw new RiotNotFoundException() ;}
catch (IOException ex) { IO.exception(ex); }
}
-
+
TypedInputStream in;
// Need more control than LocatorURL provides to get the Accept header in and the HttpCLient.
// So map now.
urlStr = streamManager.mapURI(urlStr);
if ( urlStr.startsWith("http://") || urlStr.startsWith("https://") ) {
// HttpOp.execHttpGet(,acceptHeader,) overrides the HttpClient default setting.
- //
+ //
// If there is an explicitly set HttpClient use that as given, and do not override
// the accept header (i.e. pass null to arg accpetHeader in execHttpGet).
// Else, use httpOp as setup and set the accept header.
- String acceptHeader =
- ( httpClient == null ) ? WebContent.defaultRDFAcceptHeader : null;
+ String acceptHeader =
+ ( httpClient == null ) ? WebContent.defaultRDFAcceptHeader : null;
in = HttpOp.execHttpGet(urlStr, acceptHeader, httpClient, null);
} else {
// Already mapped.
@@ -394,7 +394,7 @@ public class RDFParser {
if ( in == null )
throw new RiotNotFoundException("Not found: "+urlStr);
return in ;
-
+
}
private ReaderRIOT createReader(ContentType ct) {
@@ -406,7 +406,7 @@ public class RDFParser {
ReaderRIOTFactory r = RDFParserRegistry.getFactory(lang);
if ( r == null )
return null;
-
+
ReaderRIOT reader = createReader(r, lang);
return reader ;
}
@@ -420,7 +420,7 @@ public class RDFParser {
private ParserProfile makeParserProfile(Lang lang) {
boolean resolve = resolveURIs;
boolean checking$ = strict;
-
+
// Per language tweaks.
if ( sameLang(NTRIPLES, lang) || sameLang(NQUADS, lang) ) {
if ( ! strict )
@@ -435,11 +435,11 @@ public class RDFParser {
IRIResolver resolver = this.resolver;
if ( resolver == null ) {
- resolver = resolve ?
+ resolver = resolve ?
IRIResolver.create(baseUri) :
IRIResolver.createNoResolve() ;
}
- PrefixMap prefixMap = PrefixMapFactory.createForInput();
+ PrefixMap prefixMap = PrefixMapFactory.create();
ParserProfileStd parserFactory = new ParserProfileStd(factory, errorHandler, resolver, prefixMap, context, checking$, strict);
return parserFactory;
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
index 9e9694f..3a1ed89 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
@@ -219,7 +219,7 @@ public class RDFWriter {
}
private PrefixMap prefixMap(DatasetGraph dataset) {
- return prefixMap(dataset.getDefaultGraph());
+ return PrefixMapFactory.createForOutput(dataset.prefixes());
}
private static PrefixMap prefixMap(Graph graph) {
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
index 23af37f..68f9e63 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
@@ -28,11 +28,11 @@ import org.apache.jena.sparql.core.Quad ;
/**
* Base class for StreamRDF implementations which store received <T>
- * objects in a {@link java.util.Collection}.
- *
+ * objects in a {@link java.util.Collection}.
+ *
* The resulting collection can be retrieved via the {@link #getCollected()}
* method.
- *
+ *
* Implementations are suitable for single-threaded parsing, for use with small
* data or distributed computing frameworks (e.g. Hadoop) where the overhead
* of creating many threads is significant.
@@ -40,12 +40,12 @@ import org.apache.jena.sparql.core.Quad ;
* @param <T> Type of the value stored in the collection
*/
public abstract class CollectorStreamBase<T> implements StreamRDF {
- private final PrefixMap prefixes = PrefixMapFactory.createForInput();
+ private final PrefixMap prefixes = PrefixMapFactory.create();
private String baseIri;
-
+
@Override
public void finish() {}
-
+
@Override
public void triple(Triple triple) {}
@@ -54,17 +54,17 @@ public abstract class CollectorStreamBase<T> implements StreamRDF {
@Override
public void start() {}
-
+
@Override
public void base(String base) {
this.baseIri = base;
}
-
+
@Override
public void prefix(String prefix, String iri) {
prefixes.add(prefix, iri);
}
-
+
public PrefixMap getPrefixes() {
return prefixes;
}
@@ -74,7 +74,7 @@ public abstract class CollectorStreamBase<T> implements StreamRDF {
}
/**
- * @return The collection received by this instance.
+ * @return The collection received by this instance.
*/
public abstract Collection<T> getCollected();
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
index 5afa453..2964be6 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
@@ -28,50 +28,50 @@ import org.apache.jena.riot.system.StreamRDF ;
import org.apache.jena.sparql.core.Quad ;
/**
- * StreamRDF implementations which store received triples and quads
- * in a {@link java.util.Collection}.
- *
+ * StreamRDF implementations which store received triples and quads
+ * in a {@link java.util.Collection}.
+ *
* The resulting collection can be retrieved via the
- * {@link #getTriples()} and {@link #getQuads()}
+ * {@link #getTriples()} and {@link #getQuads()}
* methods.
- *
+ *
* The implementations are suitable for single-threaded parsing, for use with small
* data or distributed computing frameworks (e.g. Hadoop) where the overhead
* of creating many threads for a push-pull parser setup is significant.
*/
public class CollectorStreamRDF implements StreamRDF {
- private PrefixMap prefixes = PrefixMapFactory.createForInput();
+ private PrefixMap prefixes = PrefixMapFactory.create();
private String baseIri;
-
+
private List<Triple> triples = new ArrayList<>();
private List<Quad> quads = new ArrayList<>();
-
+
@Override
public void start() {
triples.clear() ;
quads.clear() ;
- prefixes = PrefixMapFactory.createForInput();
+ prefixes = PrefixMapFactory.create();
}
@Override
public void finish() {}
-
+
@Override
public void triple(Triple triple) { triples.add(triple) ; }
-
+
@Override
public void quad(Quad quad) { quads.add(quad) ; }
-
+
@Override
public void base(String base) {
this.baseIri = base;
}
-
+
@Override
public void prefix(String prefix, String iri) {
prefixes.add(prefix, iri);
}
-
+
public PrefixMap getPrefixes() {
return prefixes;
}
@@ -80,6 +80,6 @@ public class CollectorStreamRDF implements StreamRDF {
return baseIri;
}
- public List<Triple> getTriples() { return triples ; }
- public List<Quad> getQuads() { return quads ; }
+ public List<Triple> getTriples() { return triples ; }
+ public List<Quad> getQuads() { return quads ; }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
index a79ae6f..b2fca7b 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
@@ -48,11 +48,11 @@ import org.apache.jena.riot.system.PrefixMapFactory;
* Inspired by Java's {@link java.io.PipedInputStream} and
* {@link java.io.PipedOutputStream}
* </p>
- *
+ *
* @param <T>
* The type of the RDF primitive, should be one of {@code Triple},
* {@code Quad}, or {@code Tuple<Node>}
- *
+ *
* @see PipedTriplesStream
* @see PipedQuadsStream
* @see PipedTuplesStream
@@ -94,7 +94,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
private final Object lock = new Object(); // protects baseIri and prefixes
private String baseIri;
- private final PrefixMap prefixes = PrefixMapFactory.createForInput();
+ private final PrefixMap prefixes = PrefixMapFactory.create();
/**
* Creates a new piped RDF iterator with the default buffer size of
@@ -122,7 +122,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
* the expected input size though you may need to tune this depending on how
* fast your consumer thread is.
* </p>
- *
+ *
* @param bufferSize
* Buffer size
*/
@@ -146,7 +146,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
* chance of thread starvation. This likely need only be set to {@code true}
* if there will be multiple consumers.
* </p>
- *
+ *
* @param bufferSize
* Buffer size
* @param fair
@@ -188,7 +188,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
* and errors out accordingly. You may need to adjust this if you have a
* slow producer thread or many consumer threads.
* </p>
- *
+ *
* @param bufferSize
* Buffer size
* @param fair
@@ -328,7 +328,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
/**
* Gets the most recently seen Base IRI
- *
+ *
* @return Base IRI
*/
public String getBaseIri() {
@@ -345,7 +345,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
/**
* Gets the prefix map which contains the prefixes seen so far in the stream
- *
+ *
* @return Prefix Map
*/
public PrefixMap getPrefixes() {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
similarity index 68%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java
rename to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
index 7bab96a..c7effd5 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
@@ -15,13 +15,17 @@
* information regarding copyright ownership.
*/
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.riot.system;
+
+import java.util.Objects;
/** Entry in a prefix map. */
public class PrefixEntry {
// Custom interface to get more appropriate names.
public static PrefixEntry create(String prefix, String uri) {
+ Objects.requireNonNull(prefix);
+ Objects.requireNonNull(uri);
return new PrefixEntry(prefix, uri);
}
private final String prefix;
@@ -44,4 +48,21 @@ public class PrefixEntry {
public String toString() {
return "PrefixEntry["+prefix+": <"+uri+">]";
}
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(prefix, uri);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj )
+ return true;
+ if ( obj == null )
+ return false;
+ if ( getClass() != obj.getClass() )
+ return false;
+ PrefixEntry other = (PrefixEntry)obj;
+ return Objects.equals(prefix, other.prefix) && Objects.equals(uri, other.uri);
+ }
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
similarity index 63%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java
rename to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
index 56b1eab..4bb2e4d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
@@ -15,26 +15,28 @@
* information regarding copyright ownership.
*/
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.riot.system;
-import java.util.Objects;
+import java.util.Map;
+import java.util.Map.Entry;
import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.dboe.storage.Prefixes;
import org.apache.jena.graph.Node;
import org.apache.jena.sparql.core.Quad;
/**
- * Algorithms over {@link PrefixMapI} to abbreviate and expand
+ * Algorithms over {@link PrefixMap} to abbreviate and expand
*/
public class PrefixLib {
-
/**
* Remove ":" from a prefix if necessary to make it canonical.
* @param prefix
* @return prefix, without colon.
*/
public static String canonicalPrefix(String prefix) {
+ if ( prefix == null )
+ // null is not good style but let's be robust.
+ return "";
if ( prefix.endsWith(":") )
return prefix.substring(0, prefix.length() - 1);
return prefix;
@@ -42,31 +44,21 @@ public class PrefixLib {
/** Canonical name for graphs */
public static Node canonicalGraphName(Node graphName) {
- if ( graphName == Prefixes.nodeDefaultGraph)
- return graphName;
if ( graphName == null || Quad.isDefaultGraph(graphName) )
- return Prefixes.nodeDefaultGraph;
+ return Prefixes.nodeDataset;
return graphName;
}
/**
- * Is this the canonical, internal marker for the default graph for storage
- * prefixes? ({@link Prefixes#nodeDefaultGraph})
- *
- * @param graphName
- */
- public static boolean isNodeDefaultGraph(Node graphName) {
- return Objects.equals(Prefixes.nodeDefaultGraph, graphName);
- }
-
- /** abbreviate a uriStr, giving a string as a short form. If not possible return null.
+ * Abbreviate a uriStr, giving a string as a short form. If not possible return null.
* This does not guarantee that the result is suitable for all RDF syntaxes.
* Further checking for the rules of a particular syntax are necessary.
*/
- public static String abbreviate(PrefixMapI pmap, String uriStr) {
- for ( PrefixEntry e : pmap ) {
- String prefix = e.getPrefix();
- String prefixUri = e.getUri();
+ public static String abbreviate(PrefixMap prefixes, String uriStr) {
+ Map<String, String> map = prefixes.getMapping();
+ for ( Entry<String, String> e : map.entrySet() ) {
+ String prefix = e.getKey();
+ String prefixUri = e.getValue();
if ( uriStr.startsWith(prefixUri) ) {
String ln = uriStr.substring(prefixUri.length());
if ( strSafeFor(ln, '/') && strSafeFor(ln, '#') && strSafeFor(ln, ':') )
@@ -80,17 +72,34 @@ public class PrefixLib {
* Abbreviate a uriStr, return the prefix and local parts.
* This does not guarantee that the result is suitable for all RDF syntaxes.
*/
- public static Pair<String, String> abbrev(PrefixMapI prefixes, String uriStr) {
- for ( PrefixEntry e : prefixes ) {
- String uriForPrefix = e.getUri();
- if ( uriStr.startsWith(uriForPrefix) )
- return Pair.create(e.getPrefix(), uriStr.substring(uriForPrefix.length()));
+ public static Pair<String, String> abbrev(PrefixMap prefixes, String uriStr) {
+ return abbrev(prefixes.getMapping(), uriStr, true);
+ }
+
+ /**
+ * Abbreviate a uriStr, return the prefix and local parts, using a {@code Map} of
+ * prefix string to URI string. This does not guarantee that the result is
+ * suitable for all RDF syntaxes. In addition, perform a fast check for legal
+ * turtle local parts using {@link #isSafeLocalPart}. This covers the majority of
+ * real work cases and allows the code to find a probably-legal abbrev pair if an
+ * illegal one is found. (In practice, illegal local names arise only when one
+ * prefix URI is a substring of another.)
+ */
+ public static Pair<String, String> abbrev(Map<String, String> prefixesMap, String uriStr, boolean turtleSafeLocalPart) {
+ for ( Entry<String, String> e : prefixesMap.entrySet() ) {
+ String prefix = e.getKey();
+ String uriForPrefix = e.getValue();
+ if ( uriStr.startsWith(uriForPrefix) ) {
+ String ln = uriStr.substring(uriForPrefix.length());
+ if (! turtleSafeLocalPart || isSafeLocalPart(ln))
+ return Pair.create(e.getKey(), ln);
+ }
}
return null;
}
/** Expand a prefixedName which must include a ':' */
- public static String expand(PrefixMapI prefixes, String prefixedName) {
+ public static String expand(PrefixMap prefixes, String prefixedName) {
int i = prefixedName.indexOf(':');
if ( i < 0 )
return null;
@@ -98,17 +107,17 @@ public class PrefixLib {
}
/** Expand a prefix, local name pair. */
- public static String expand(PrefixMapI prefixes, String prefix, String localName) {
+ public static String expand(PrefixMap prefixes, String prefix, String localName) {
prefix = canonicalPrefix(prefix);
String x = prefixes.get(prefix);
if ( x == null )
return null;
return x + localName;
}
-
+
/**
* Takes a guess for the String string to use in abbreviation.
- *
+ *
* @param iriString String string
* @return String or null
*/
@@ -130,15 +139,15 @@ public class PrefixLib {
* @param localName Local name
* @return True if safe, false otherwise
*/
- public boolean isSafeLocalPart(String localName) {
- // This test isn't complete but covers the common issues that arise.
+ public static boolean isSafeLocalPart(String localName) {
+ // This test isn't complete but covers the common issues that arise.
// Does not consider possible escaping.
// There needs to be a further, stronger check for output.
- // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name.
+ // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name.
return strSafeFor(localName, '/') && strSafeFor(localName, '#');
}
private static boolean strSafeFor(String str, char ch) {
return str.indexOf(ch) == -1;
}
- }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
index 8193d9f..79746c2 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
@@ -19,6 +19,7 @@ package org.apache.jena.riot.system;
import java.util.Map;
import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
import org.apache.jena.atlas.lib.Pair;
import org.apache.jena.iri.IRI;
@@ -35,6 +36,24 @@ import org.apache.jena.shared.PrefixMapping ;
* </p>
*/
public interface PrefixMap {
+ /**
+ * Return the URI for the prefix, or null if there is no entry for this prefix.
+ */
+ public String get(String prefix);
+
+ // Is this a good idea? Leave out until it is justified.
+// /**
+// * Find a prefix that is mapped to the URI argument.
+// * <p>
+// * Several prefixes may map to the same URI; this function does not say which is
+// * return nor whether the same prefix is returned each time.
+// * <p>
+// * This operation may be slow (a scan of all the prefix mappings).
+// */
+// public default String getByURI(String uri) {
+// Objects.requireNonNull(uri);
+// return getMapping().entrySet().stream().filter(e->e.getValue().equals(uri)).map(e->e.getKey()).findFirst().orElse(null);
+// }
/**
* Return the underlying mapping, this is generally unsafe to modify and
@@ -45,7 +64,7 @@ public interface PrefixMap {
*
* @return Underlying mapping
*/
- public abstract Map<String, String> getMapping();
+ public Map<String, String> getMapping();
/**
* Return a fresh copy of the underlying mapping, should be safe to modify
@@ -53,12 +72,17 @@ public interface PrefixMap {
*
* @return Copy of the mapping
*/
- public abstract Map<String, String> getMappingCopy();
+ public Map<String, String> getMappingCopy();
+
+ /**
+ * Apply a {@link BiConsumer}{@literal<String, String>} to each entry in the PrefixMap.
+ */
+ public void forEach(BiConsumer<String, String> action) ;
/**
- * Apply a {@link BiConsumer}{@code <String, String>} to each entry in the Prefixmap.
+ * Return a stream of {@link PrefixEntry}, pairs of prefix and URI.
*/
- public abstract void forEach(BiConsumer<String, String> action) ;
+ public Stream<PrefixEntry> stream();
/**
* Add a prefix, overwrites any existing association
@@ -66,7 +90,7 @@ public interface PrefixMap {
* @param prefix Prefix
* @param iriString Namespace IRI
*/
- public abstract void add(String prefix, String iriString);
+ public void add(String prefix, String iriString);
/**
* Add a prefix, overwrites any existing association
@@ -85,33 +109,33 @@ public interface PrefixMap {
*
* @param pmap Prefix Map
*/
- public abstract void putAll(PrefixMap pmap);
+ public void putAll(PrefixMap pmap);
/**
* Add a prefix, overwrites any existing association
*
* @param pmap Prefix Mapping
*/
- public abstract void putAll(PrefixMapping pmap);
+ public void putAll(PrefixMapping pmap);
/**
* Add a prefix, overwrites any existing association
*
* @param mapping A Map of prefix name to IRI string
*/
- public abstract void putAll(Map<String, String> mapping) ;
+ public void putAll(Map<String, String> mapping) ;
/**
* Delete a prefix
*
* @param prefix Prefix to delete
*/
- public abstract void delete(String prefix);
+ public void delete(String prefix);
/**
* Clear all prefixes.
*/
- public abstract void clear();
+ public void clear();
/**
* Gets whether the map contains a given prefix
@@ -120,7 +144,7 @@ public interface PrefixMap {
* Prefix
* @return True if the prefix is contained in the map, false otherwise
*/
- public abstract boolean containsPrefix(String prefix);
+ public boolean containsPrefix(String prefix);
/** @deprecated Use {@link #containsPrefix(String)} */
@Deprecated
@@ -134,7 +158,7 @@ public interface PrefixMap {
* @param uriStr URI to abbreviate
* @return URI in prefixed name form if possible, null otherwise
*/
- public abstract String abbreviate(String uriStr);
+ public String abbreviate(String uriStr);
/**
* Abbreviate an IRI and return a pair of prefix and local parts, or null.
@@ -143,7 +167,7 @@ public interface PrefixMap {
* @return Pair of prefix and local name
* @see #abbreviate
*/
- public abstract Pair<String, String> abbrev(String uriStr);
+ public Pair<String, String> abbrev(String uriStr);
/**
* Expand a prefix named, return null if it can't be expanded
@@ -151,7 +175,7 @@ public interface PrefixMap {
* @param prefixedName Prefixed Name
* @return Expanded URI if possible, null otherwise
*/
- public abstract String expand(String prefixedName);
+ public String expand(String prefixedName);
/**
* Expand a prefix, return null if it can't be expanded
@@ -160,7 +184,7 @@ public interface PrefixMap {
* @param localName Local name
* @return Expanded URI if possible, null otherwise
*/
- public abstract String expand(String prefix, String localName);
+ public String expand(String prefix, String localName);
/**
* Return whether the prefix map is empty or not.
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java
new file mode 100644
index 0000000..195d286
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java
@@ -0,0 +1,120 @@
+/*
+ * 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.riot.system;
+
+import java.util.Map;
+
+import org.apache.jena.atlas.lib.Pair;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.sparql.graph.PrefixMappingAdapter;
+import org.apache.jena.util.SplitIRI;
+
+/**
+ * Provided {@link PrefixMap} for a {@link PrefixMapping}.
+ * @see PrefixMappingAdapter
+ */
+final
+public class PrefixMapAdapter extends PrefixMapBase implements PrefixMap {
+ private final PrefixMapping prefixMapping;
+
+ public PrefixMapAdapter(PrefixMapping prefixMapping) {
+ this.prefixMapping = prefixMapping;
+ }
+
+ public PrefixMapping getPrefixMapping() {
+ return prefixMapping;
+ }
+
+ @Override
+ public String get(String prefix) {
+ return prefixMapping.getNsPrefixURI(prefix);
+ }
+
+ @Override
+ public Map<String, String> getMappingCopy() {
+ return prefixMapping.getNsPrefixMap();
+ }
+
+ @Override
+ public Map<String, String> getMapping() {
+ // Actually a copy. There is no direct access in PrefixMapping.
+ return prefixMapping.getNsPrefixMap();
+ }
+
+ @Override
+ public void add(String prefix, String iriString) {
+ // Will apply addition PrefixMapping restrictions.
+ prefixMapping.setNsPrefix(prefix, iriString);
+ }
+
+ @Override
+ public void delete(String prefix) {
+ prefixMapping.removeNsPrefix(prefix);
+ }
+
+ @Override
+ public void clear() {
+ prefixMapping.clearNsPrefixMap();
+ }
+
+ @Override
+ public boolean containsPrefix(String prefix) {
+ return prefixMapping.getNsPrefixURI(prefix) != null;
+ }
+
+ @Override
+ public String abbreviate(String uriStr) {
+ return prefixMapping.qnameFor(uriStr);
+ }
+
+ @Override
+ public Pair<String, String> abbrev(String uriStr) {
+ int split = SplitIRI.splitXML(uriStr);
+ if ( split == uriStr.length() ) {
+ return null;
+ }
+ String ns = uriStr.substring(0, split);
+ String local = uriStr.substring(split);
+ return Pair.create(ns, local);
+ }
+
+ @Override
+ public String expand(String prefix, String localName) {
+ String prefixUri = prefixMapping.getNsPrefixURI(prefix);
+ if ( prefixUri == null )
+ return null;
+ return prefixUri+localName;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0 ;
+ }
+
+ @Override
+ public int size() {
+ return prefixMapping.numPrefixes();
+ }
+
+ @Override
+ public String toString() {
+ return Prefixes.toString(this);
+ }
+}
+
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
index 1c81d57..b49cfab 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
@@ -19,30 +19,28 @@
package org.apache.jena.riot.system;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Objects;
import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
+import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.lib.Pair;
import org.apache.jena.shared.PrefixMapping ;
/**
* Abstract base implementation of a {@link PrefixMap} which provides
- * some useful helper methods
- *
+ * some implementations of API methods.
*/
public abstract class PrefixMapBase implements PrefixMap {
+ protected PrefixMapBase() {}
+
protected boolean strSafeFor(String str, char ch) {
return str.indexOf(ch) == -1;
}
- protected String canonicalPrefix(String prefix) {
- if (prefix.endsWith(":"))
- return prefix.substring(0, prefix.length() - 1);
- return prefix;
- }
-
@Override
public Map<String, String> getMappingCopy() {
return new HashMap<>(this.getMapping());
@@ -53,9 +51,19 @@ public abstract class PrefixMapBase implements PrefixMap {
getMapping().forEach(action);
}
+ // e.g. Iterable.
+ private Iterator<PrefixEntry> iterator() {
+ return Iter.iter(getMapping().entrySet()).map(e->PrefixEntry.create(e.getKey(), e.getValue()));
+ }
+
+ @Override
+ public Stream<PrefixEntry> stream() {
+ return getMapping().entrySet().stream().map(e->PrefixEntry.create(e.getKey(), e.getValue()));
+ }
+
@Override
public void putAll(PrefixMap pmap) {
- pmap.getMapping().forEach(this::add);
+ pmap.getMapping().forEach(this::add);
}
@Override
@@ -65,69 +73,49 @@ public abstract class PrefixMapBase implements PrefixMap {
@Override
public void putAll(Map<String, String> mapping) {
- mapping.forEach(this::add);
+ mapping.forEach(this::add);
}
- /**
- * Abbreviate an IRI or return a pair of prefix and local parts.
- *
- * @param uriStr
- * URI string to abbreviate
- * @param turtleSafe
- * Only return legal Turtle local names.
- */
- protected Pair<String, String> abbrev(Map<String, String> prefixes, String uriStr, boolean checkLocalPart) {
- for (Entry<String, String> e : prefixes.entrySet()) {
- String uriForPrefix = e.getValue();
-
- if (uriStr.startsWith(uriForPrefix)) {
- String ln = uriStr.substring(uriForPrefix.length());
- if (!checkLocalPart || this.isSafeLocalPart(ln))
- return Pair.create(e.getKey(), ln);
- }
- }
- return null;
+ @Override
+ public String abbreviate(String uriStr) {
+ Objects.requireNonNull(uriStr);
+ PrefixLib.abbreviate(this, uriStr);
+ Pair<String, String> p = abbrev(uriStr);
+ if (p == null)
+ return null;
+ return p.getLeft() + ":" + p.getRight();
}
@Override
- public String expand(String prefixedName) {
- int i = prefixedName.indexOf(':');
- if (i < 0)
- return null;
- return expand(prefixedName.substring(0, i), prefixedName.substring(i + 1));
+ public String expand(String prefix, String localName) {
+ Objects.requireNonNull(prefix);
+ Objects.requireNonNull(localName);
+ return PrefixLib.expand(this, prefix, localName);
+ }
+
+ @Override
+ public Pair<String, String> abbrev(String uriStr) {
+ return PrefixLib.abbrev(this, uriStr);
}
/**
- * Is a local name safe? Default is a fast check for Turtle-like local names.
- * @param ln Local name
- * @return True if safe, false otherwise
+ * Abbreviate an IRI and return a pair of prefix and local parts; return null otherwise.
+ *
+ * @param uriStr URI string to abbreviate
+ * @param turtleSafeLocalPart Only return legal Turtle local names.
*/
- protected boolean isSafeLocalPart(String ln) {
- // This test isn't complete but covers the common issues that arise.
- // Does not consider possible escaping.
- // There needs to be a further, stronger check for output.
- // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name.
- return strSafeFor(ln, '/') && strSafeFor(ln, '#');
+ protected Pair<String, String> abbrev(Map<String, String> prefixesMap, String uriStr, boolean turtleSafeLocalPart) {
+ return PrefixLib.abbrev(prefixesMap, uriStr, turtleSafeLocalPart);
+ }
+
+ @Override
+ public String expand(String prefixedName) {
+ Objects.requireNonNull(prefixedName);
+ return PrefixLib.expand(this, prefixedName);
}
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("{ ");
- boolean first = true;
-
- for (Entry<String, String> e : this.getMapping().entrySet()) {
- String prefix = e.getKey();
- String iri = e.getValue();
- if (first)
- first = false;
- else
- sb.append(" ,");
- sb.append(prefix);
- sb.append(":=");
- sb.append(iri);
- }
- sb.append(" }");
- return sb.toString();
+ return Prefixes.toString(this);
}
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java
deleted file mode 100644
index 02f671c..0000000
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.riot.system;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.atlas.logging.Log;
-
-// UNUSED
-/**
- * Implementation of a {@link PrefixMap} which extends another prefix map
- * without ever altering the parent.
- * <p>
- * This allows code to modify a prefix map based off of another map without
- * modifying that original map. This is somewhat different than simply making a
- * copy of an existing map since this implementation is partly a view over
- * another map so will reflect changes that happen to the other map.
- * </p>
- */
-public class PrefixMapExtended extends PrefixMapBase {
- protected PrefixMap parent;
- protected PrefixMap local;
-
- /**
- * Creates an extended prefix map
- *
- * @param ext
- * Prefix Map to extend
- */
- public PrefixMapExtended(PrefixMap ext) {
- if (ext == null)
- throw new IllegalArgumentException("Prefix Map to extend cannot be null");
- this.parent = ext;
- this.local = PrefixMapFactory.create();
- }
-
- @Override
- public void add(String prefix, String iri) {
- prefix = canonicalPrefix(prefix);
- // Add to local always.
- local.add(prefix, iri);
- }
-
- @Override
- public void delete(String prefix) {
- prefix = canonicalPrefix(prefix);
- local.delete(prefix);
- if (parent.containsPrefix(prefix))
- Log.warn(this, "Attempt to delete a prefix in the parent");
- }
-
- @Override
- public void clear() {
- local.clear();
-// if (!parent.isEmpty() )
-// Log.warn(this, "clear() : Parent not empty") ;
- }
-
- @Override
- public String expand(String prefix, String localName) {
- prefix = canonicalPrefix(prefix);
- String x = local.expand(prefix, localName);
- if (x != null)
- return x;
- return parent.expand(prefix, localName);
- }
-
- @Override
- public Map<String, String> getMapping() {
- Map<String, String> mapping = new HashMap<>();
- mapping.putAll(parent.getMapping());
- mapping.putAll(local.getMapping());
- return Collections.unmodifiableMap(mapping);
- }
-
- @Override
- public boolean containsPrefix(String prefix) {
- return local.containsPrefix(prefix) || parent.containsPrefix(prefix);
- }
-
- @Override
- public String abbreviate(String uriStr) {
- String x = local.abbreviate(uriStr);
- if (x != null)
- return x;
- return parent.abbreviate(uriStr);
- }
-
- @Override
- public Pair<String, String> abbrev(String uriStr) {
- Pair<String, String> p = local.abbrev(uriStr);
- if (p != null)
- return p;
- return parent.abbrev(uriStr);
- }
-
- @Override
- public boolean isEmpty()
- {
- return parent.isEmpty() && local.isEmpty() ;
- }
-
- @Override
- public int size()
- {
- return parent.size() + local.size() ;
- }
-}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
index 563f640..7039833 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
@@ -24,7 +24,7 @@ import org.apache.jena.shared.PrefixMapping ;
/**
* Factory which provides prefix maps
- *
+ *
*/
public class PrefixMapFactory {
@@ -34,7 +34,7 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the default
* implementation, this may change from release to release.
* </p>
- *
+ *
* @return Prefix Map
*/
public static PrefixMap create() {
@@ -48,10 +48,10 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the default
* implementation, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* Prefix Map to copy
- *
+ *
* @return Prefix Map
*/
public static PrefixMap create(PrefixMap pmap) {
@@ -65,10 +65,10 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the default
* implementation, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* PrefixMapping to copy
- *
+ *
* @return Prefix Map
*/
public static PrefixMap create(PrefixMapping pmap) {
@@ -83,7 +83,7 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the default
* implementation, this may change from release to release.
* </p>
- *
+ *
* @param pmap Mapping from prefix to IRI string
* @return Prefix Map
*/
@@ -95,11 +95,13 @@ public class PrefixMapFactory {
/**
* Creates a new prefix map which is intended for use in input.
- *
+ *
* @return Prefix map
+ * @deprecated Use {@link #create()}
*/
+ @Deprecated
public static PrefixMap createForInput() {
- return new PrefixMapStd();
+ return create();
}
/**
@@ -109,13 +111,15 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the best
* implementation for input, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* Prefix Map to copy
* @return Prefix Map
+ * @deprecated Use {@link #create(PrefixMap)}
*/
+ @Deprecated
public static PrefixMap createForInput(PrefixMap pmap) {
- return new PrefixMapStd(pmap);
+ return create(pmap);
}
/**
@@ -125,38 +129,37 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the best
* implementation for input, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* Prefix Map to copy
- *
+ *
* @return Prefix Map
+ * @deprecated Use {@link #create(PrefixMapping)}
*/
+ @Deprecated
public static PrefixMap createForInput(PrefixMapping pmap) {
- PrefixMap created = createForInput();
- created.putAll(pmap);
- return created;
+ return create(pmap);
}
/**
* Creates a new prefix map, initialized from a Map of prefix to IRI string.
- *
+ *
* @param pmap Mapping from prefix to IRI string
* @return Prefix Map
+ * @deprecated Use {@link #create(Map)}
*/
+ @Deprecated
public static PrefixMap createForInput(Map<String, String> pmap) {
- PrefixMap created = createForInput();
- created.putAll(pmap);
- return created;
+ return create(pmap);
}
-
/**
* Creates a new prefix map which is intended for use in output
* <p>
* Will use whatever the version of ARQ you are using considers the best
* implementation for output, this may change from release to release.
* </p>
- *
+ *
* @return Prefix Map
*/
public static PrefixMap createForOutput() {
@@ -170,10 +173,10 @@ public class PrefixMapFactory {
* Will use whatever the version of ARQ you are using considers the best
* implementation for output, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* Prefix Map to copy
- *
+ *
* @return Prefix Map
*/
public static PrefixMap createForOutput(PrefixMap pmap) {
@@ -182,15 +185,15 @@ public class PrefixMapFactory {
/**
* Creates a new prefix map which is intended for use in output which starts
- * with a copy of an existing map
+ * with a copy of an existing map.
* <p>
* Will use whatever the version of ARQ you are using considers the best
* implementation for output, this may change from release to release.
* </p>
- *
+ *
* @param pmap
* Prefix Map to copy
- *
+ *
* @return Prefix Map
*/
public static PrefixMap createForOutput(PrefixMapping pmap) {
@@ -201,7 +204,7 @@ public class PrefixMapFactory {
/**
* Creates a new prefix map, initialized from a Map of prefix to IRI string.
- *
+ *
* @param pmap Mapping from prefix to IRI string
* @return Prefix Map
*/
@@ -211,25 +214,8 @@ public class PrefixMapFactory {
return created;
}
- /**
- * Creates a new prefix map which is an extension of an existing prefix map
- * <p>
- * This differs from using one of the various {@code create} methods since
- * it does not copy the existing prefix map, rather it maintains both a
- * local map and the existing map. All operations favour the local map but
- * defer to the existing map if the local map cannot fulfil a request.
- * </p>
- *
- * @param pmap
- * Prefix Map to extend
- * @return Prefix Map
- */
- public static PrefixMap extend(PrefixMap pmap) {
- return new PrefixMapExtended(pmap);
- }
-
/** Return an immutable view of the prefix map.
- * Throws {@link UnsupportedOperationException} on
+ * Throws {@link UnsupportedOperationException} on
* attempts to update it. Reflects changes made to the underlying map.
* @param pmap PrefixMap
* @return Prefix Map
@@ -238,13 +224,13 @@ public class PrefixMapFactory {
{
return new PrefixMapUnmodifiable(pmap) ;
}
-
- /** Return an always-empty and immutable prefix map
+
+ /** Return an always-empty and immutable prefix map
* @return Prefix Map
- */
+ */
public static PrefixMap emptyPrefixMap()
{
- return PrefixMapNull.empty ;
+ return PrefixMapZero.empty ;
}
-
+
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
index b394dc3..b4cc3cd 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
@@ -18,18 +18,20 @@
package org.apache.jena.riot.system ;
+import static org.apache.jena.atlas.lib.Lib.unsupportedMethod;
+
import java.util.Collections ;
import java.util.Map ;
import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
import org.apache.jena.atlas.lib.Pair ;
import org.apache.jena.shared.PrefixMapping ;
-/** Always empty prefix map */
-public class PrefixMapNull implements PrefixMap {
- public static PrefixMap empty = new PrefixMapNull() ;
+/** Base of always empty prefix maps {@link PrefixMapSink} and {@link PrefixMapZero}. */
+public abstract class PrefixMapNull implements PrefixMap {
- private PrefixMapNull() {}
+ protected PrefixMapNull() {}
@Override
public Map<String, String> getMapping() {
@@ -44,34 +46,46 @@ public class PrefixMapNull implements PrefixMap {
@Override
public void forEach(BiConsumer<String, String> action) {}
+
+ @Override
+ public Stream<PrefixEntry> stream() {
+ return Stream.empty();
+ }
+
+
+ @Override
+ public String get(String prefix) {
+ return null;
+ }
+
@Override
public void add(String prefix, String iri) {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "add") ;
}
@Override
public void putAll(PrefixMap pmap) {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "putAll") ;
}
@Override
public void putAll(PrefixMapping pmap) {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "putAll") ;
}
@Override
public void putAll(Map<String, String> mapping) {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "putAll") ;
}
@Override
public void delete(String prefix) {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "delete") ;
}
@Override
public void clear() {
- throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+ throw unsupportedMethod(this, "clear") ;
}
@Override
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
similarity index 62%
copy from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
index 1ee7efb..fd32368 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
@@ -18,15 +18,25 @@
package org.apache.jena.riot.system;
+import java.util.function.Supplier;
+
+import org.apache.jena.sparql.core.DatasetGraph;
+
/**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
+ * Delay touching the {@link DatasetGraph#prefixes} until an
+ * operation (method call) happens.
*/
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+public class PrefixMapProxy extends PrefixMapWrapper {
- @Override
- protected PrefixMap getPrefixMap() {
- return new PrefixMapExtended(new PrefixMapStd());
+ private final Supplier<DatasetGraph> base;
+ public PrefixMapProxy(Supplier<DatasetGraph> other) {
+ super(null);
+ this.base = other;
}
+ @Override
+ protected PrefixMap getR() { return base.get().prefixes(); }
+
+ @Override
+ protected PrefixMap getW() { return base.get().prefixes(); }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
similarity index 57%
copy from jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
index f7ad75c..8bafdcb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
@@ -1,4 +1,4 @@
-/*
+/**
* 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
@@ -16,25 +16,38 @@
* limitations under the License.
*/
-package org.apache.jena.sparql.graph;
+package org.apache.jena.riot.system ;
-import org.apache.jena.shared.PrefixMapping;
+import java.util.Map ;
-/** Immutable empty {@link PrefixMapping}. */
-public class PrefixMappingZero extends PrefixMappingSink {
+import org.apache.jena.shared.PrefixMapping ;
+
+/** Empty prefix map that throws away updates. */
+public class PrefixMapSink extends PrefixMapNull {
+ public static PrefixMap sink = new PrefixMapSink() ;
+
+ private PrefixMapSink() {}
@Override
- protected void add(String prefix, String uri) {
- throw new UnsupportedOperationException("add prefix");
- }
+ public void add(String prefix, String iri) { }
@Override
- protected void remove(String prefix) {
- throw new UnsupportedOperationException("remove prefix");
- }
+ public void putAll(PrefixMap pmap) { }
+
+ @Override
+ public void putAll(PrefixMapping pmap) { }
+
+ @Override
+ public void putAll(Map<String, String> mapping) { }
+
+ @Override
+ public void delete(String prefix) { }
+
+ @Override
+ public void clear() { }
@Override
public String toString() {
- return "pm:Zero";
+ return "PrefixMapSink";
}
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
index 20b6b53..1ee20cd 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
@@ -18,38 +18,55 @@
package org.apache.jena.riot.system;
+import static org.apache.jena.riot.system.PrefixLib.canonicalPrefix;
+import static org.apache.jena.riot.system.PrefixLib.isSafeLocalPart;
+
import java.util.Collections ;
-import java.util.HashMap ;
import java.util.Map ;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.jena.atlas.lib.Pair ;
/**
- * Default implementation of a {@link PrefixMap}.
+ * In-memory implementation of a {@link PrefixMap}.
+ * <p>
+ * This also provides fast URI to prefix name calculation suitable for output. For
+ * output, calculating possible prefix names from a URI happens on every URI so this
+ * operations needs to be efficient. Normally, a prefix map is "prefix to URI" and
+ * the abbreviation is a reverse lookup, which is a scan of the value of the map.
+ * This class keeps a reverse lookup map of URI to prefix which combined with a fast,
+ * approximate for determining the split point exploiting the most common use cases,
+ * provides efficient abbreviation.
+ * <p>
+ * Usage for abbreviation: call
+ * {@linkplain PrefixMapFactory#createForOutput(PrefixMap)} which copies the argument
+ * prefix map into an instance of this class, setting up the reverse lookup. This
+ * copy is cheaper than repeated reverse lookups would be.
*/
public class PrefixMapStd extends PrefixMapBase {
// Expansion map
- final Map<String, String> prefixes = new HashMap<>();
+ final Map<String, String> prefixes = new ConcurrentHashMap<>();
- // Immutable view of prefixes
+ // Immutable view of prefixes
private final Map<String, String> prefixes2 = Collections.unmodifiableMap(prefixes);
-
+
// Abbreviation map used for common cases.
// This keeps the URI->prefix mappings for a computed guess at the answer, before
- // resorting to a full search. See abbrev(String) below.
- final Map<String, String> uriToPrefix = new HashMap<>();
+ // resorting to a full search. See abbrev(String) below.
+ private final Map<String, String> uriToPrefix = new ConcurrentHashMap<>();
/**
* Creates a new empty prefix mapping
*/
- public PrefixMapStd() {
- }
+ public PrefixMapStd() {}
/**
* Creates a new prefix mapping copied from an existing map
* @param prefixMap Prefix Map
*/
public PrefixMapStd(PrefixMap prefixMap) {
+ Objects.requireNonNull(prefixMap);
prefixes.putAll(prefixMap.getMapping());
}
@@ -59,14 +76,27 @@ public class PrefixMapStd extends PrefixMapBase {
}
@Override
+ public String get(String prefix) {
+ Objects.requireNonNull(prefix);
+ prefix = canonicalPrefix(prefix);
+ return prefixes.get(prefix);
+ }
+
+ @Override
public void add(String prefix, String iri) {
+ Objects.requireNonNull(prefix);
+ Objects.requireNonNull(iri);
prefix = canonicalPrefix(prefix);
+ String oldURI = prefixes.get(prefix);
+ if ( oldURI != null )
+ uriToPrefix.remove(oldURI);
prefixes.put(prefix, iri);
uriToPrefix.put(iri.toString(), prefix) ;
}
@Override
public void delete(String prefix) {
+ Objects.requireNonNull(prefix);
prefix = canonicalPrefix(prefix);
prefixes.remove(prefix);
// Remove from the abbreviation map.
@@ -75,43 +105,51 @@ public class PrefixMapStd extends PrefixMapBase {
@Override
public void clear() {
- prefixes.clear() ;
+ prefixes.clear() ;
}
@Override
public boolean containsPrefix(String prefix) {
+ Objects.requireNonNull(prefix);
prefix = canonicalPrefix(prefix);
return prefixes.containsKey(prefix);
}
@Override
public String abbreviate(String uriStr) {
+ Objects.requireNonNull(uriStr);
Pair<String, String> p = abbrev(uriStr);
if (p == null)
return null;
return p.getLeft() + ":" + p.getRight();
}
+ // This is thread safe (does not crash) - it is not thread-consistent (answer
+ // uncertain if the prefix mappings are in flux).
@Override
public Pair<String, String> abbrev(String uriStr) {
+ Objects.requireNonNull(uriStr);
+ // Fast path.
// Look for a prefix by URI ending "#" or "/"
// then look for that as a known prefix.
- String candidate = getPossibleKey(uriStr) ;
- String uriForPrefix = uriToPrefix.get(candidate) ;
- if ( uriForPrefix != null )
- {
- // Fast track.
- String ln = uriStr.substring(candidate.length());
- if ( isSafeLocalPart(ln))
- return Pair.create(uriForPrefix, ln);
+ String candidate = getPossibleKey(uriStr);
+ if ( candidate != null ) {
+ String uriForPrefix = uriToPrefix.get(candidate);
+ if ( uriForPrefix != null ) {
+ // Fast track.
+ String ln = uriStr.substring(candidate.length());
+ if ( isSafeLocalPart(ln) )
+ return Pair.create(uriForPrefix, ln);
+ }
}
- // Not in the uri -> prefix map. Crunch it.
- return abbrev(this.prefixes, uriStr, true);
+ // Not in the uri -> prefix map. Crunch it.
+ return PrefixLib.abbrev(prefixes, uriStr, true);
}
/**
- * Takes a guess for the String string to use in abbreviation.
- *
+ * Takes a guess for the namespace URI string to use in abbreviation.
+ * Finds the part of the IRI string before the last '#' or '/'.
+ *
* @param iriString String string
* @return String or null
*/
@@ -129,23 +167,12 @@ public class PrefixMapStd extends PrefixMapBase {
}
@Override
- public String expand(String prefix, String localName) {
- prefix = canonicalPrefix(prefix);
- String x = prefixes.get(prefix);
- if (x == null)
- return null;
- return x.toString() + localName;
- }
-
- @Override
- public boolean isEmpty()
- {
- return prefixes.isEmpty() ;
+ public boolean isEmpty() {
+ return prefixes.isEmpty();
}
@Override
- public int size()
- {
- return prefixes.size() ;
+ public int size() {
+ return prefixes.size();
}
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
index 7591219..ae8535e 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
@@ -24,36 +24,36 @@ import java.util.Map ;
import org.apache.jena.iri.IRI ;
import org.apache.jena.shared.PrefixMapping ;
-/** A PrefixMap that traps update operations on a wrapped prefix map */
+/** A PrefixMap that traps update operations on a wrapped prefix map */
public class PrefixMapUnmodifiable extends PrefixMapWrapper
{
public PrefixMapUnmodifiable(PrefixMap other) { super(other) ; }
@Override
public Map<String, String> getMapping()
- { return Collections.unmodifiableMap(get().getMapping()) ; }
+ { return Collections.unmodifiableMap(getR().getMapping()) ; }
@Override
public void add(String prefix, String iriString)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
@Override
public void add(String prefix, IRI iri)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
@Override
public void putAll(PrefixMap pmap)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
@Override
public void putAll(PrefixMapping pmap)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
@Override
public void putAll(Map<String, String> mapping)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
@Override
public void delete(String prefix)
- { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
+ { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
index d147db3..e100825 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
@@ -20,6 +20,7 @@ package org.apache.jena.riot.system;
import java.util.Map ;
import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
import org.apache.jena.atlas.lib.Pair ;
import org.apache.jena.shared.PrefixMapping ;
@@ -27,72 +28,84 @@ import org.apache.jena.shared.PrefixMapping ;
public class PrefixMapWrapper implements PrefixMap
{
private final PrefixMap other ;
- protected PrefixMap get() { return other; }
+ private PrefixMap get() { return other; }
public PrefixMapWrapper(PrefixMap other) { this.other = other ; }
+ protected PrefixMap getR() { return get(); }
+
+ protected PrefixMap getW() { return get(); }
+
@Override
public Map<String, String> getMapping()
- { return get().getMapping() ; }
+ { return getR().getMapping() ; }
@Override
public Map<String, String> getMappingCopy()
- { return get().getMappingCopy() ; }
+ { return getR().getMappingCopy() ; }
+
+ @Override
+ public void forEach(BiConsumer<String, String> action)
+ { getR().forEach(action); }
@Override
- public void forEach(BiConsumer<String, String> action) {
- get().forEach(action);
+ public Stream<PrefixEntry> stream() {
+ return getR().stream();
}
@Override
+ public String get(String prefix)
+ { return getR().get(prefix); }
+
+ @Override
public void add(String prefix, String iri)
- { get().add(prefix, iri) ; }
+ { getW().add(prefix, iri) ; }
@Override
public void putAll(PrefixMap pmap)
- { get().putAll(pmap) ; }
+ { getW().putAll(pmap) ; }
@Override
public void putAll(PrefixMapping pmap)
- { get().putAll(pmap) ; }
+ { getW().putAll(pmap) ; }
@Override
public void putAll(Map<String, String> mapping)
- { get().putAll(mapping) ; }
+ { getW().putAll(mapping) ; }
@Override
public void delete(String prefix)
- { get().delete(prefix) ; }
+ { getW().delete(prefix) ; }
@Override
public void clear()
- { get().clear(); }
+ { getW().clear(); }
@Override
public boolean containsPrefix(String prefix)
- { return get().containsPrefix(prefix) ; }
+ { return getR().containsPrefix(prefix) ; }
@Override
public String abbreviate(String uriStr)
- { return get().abbreviate(uriStr) ; }
+ { return getR().abbreviate(uriStr) ; }
@Override
public Pair<String, String> abbrev(String uriStr)
- { return get().abbrev(uriStr) ; }
+ { return getR().abbrev(uriStr) ; }
@Override
public String expand(String prefixedName)
- { return get().expand(prefixedName) ; }
+ { return getR().expand(prefixedName) ; }
@Override
public String expand(String prefix, String localName)
- { return get().expand(prefix, localName) ; }
+ { return getR().expand(prefix, localName) ; }
@Override
public boolean isEmpty()
- { return get().isEmpty() ; }
+ { return getR().isEmpty() ; }
@Override
public int size()
- { return get().size() ; }
+ { return getR().size() ; }
}
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
similarity index 74%
copy from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
index 1ee7efb..e4800d1 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
@@ -1,4 +1,4 @@
-/*
+/**
* 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
@@ -16,17 +16,16 @@
* limitations under the License.
*/
-package org.apache.jena.riot.system;
+package org.apache.jena.riot.system ;
-/**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
- */
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+/** Always empty, immutable prefix map */
+public class PrefixMapZero extends PrefixMapNull {
+ public static PrefixMap empty = new PrefixMapZero() ;
+
+ private PrefixMapZero() {}
@Override
- protected PrefixMap getPrefixMap() {
- return new PrefixMapExtended(new PrefixMapStd());
+ public String toString() {
+ return "PrefixMapZero";
}
-
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java b/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java
new file mode 100644
index 0000000..fbb6d38
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java
@@ -0,0 +1,160 @@
+/*
+ * 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.riot.system;
+
+import java.util.Map.Entry;
+
+import static java.lang.String.format;
+
+import java.util.Objects;
+import java.util.StringJoiner;
+
+import org.apache.jena.graph.Graph;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.graph.PrefixMappingAdapter;
+
+public class Prefixes {
+ // Distinguished nodes:
+ // Default graph : Quad.defaultGraphNodeGenerated would have been preferred.
+ // For compatibility reasons, in TDB2, this is the URI <> (empty string).
+
+
+ // **** Implementations
+ // ** DatasetGraphMap, DatasetGraphMapLink : adapter to the default graph
+ //
+ // ** DatasetGraphOne : adapt the graph
+ //
+ // ** TIM
+ // Prefixes are thread safe, MRSW but not transactional. (Uses PrefixMapStd).
+ //
+ // ** TDB1
+ // DatasetGraphTDB
+ // -> DatasetPrefixesTDB
+ // -> GraphPrefixesProjection which is a prefixMap
+ //
+ // ** TDB2
+ // DatasetGraphTDB
+ // -> StoragePrefixes
+ // -> StoragePrefixesView(projection) implements StoragePrefixMap
+ // -> PrefixMapOverStorage
+ //
+ // ** DatasetGraphNull > DatasetGraphSink/DatasetGraphZero
+ // PrefixMapNull > PrefixMapSink/PrefixMapZero
+
+// /** Name for dataset-wide prefixes. */
+// public static final String dftGraphPrefixSet = "";
+
+ /** Name for dataset-wide prefixes. */
+ public static final String datasetPrefixSet = ""; //dftGraphPrefixSet;
+
+ // As Nodes.
+ /** Name assigned to the default graph. */
+// public static Node nodeDefaultGraph = NodeFactory.createURI(dftGraphPrefixSet);
+
+ /** Name for dataset prefixes. */
+ public static Node nodeDataset = NodeFactory.createURI(datasetPrefixSet);
+
+ private static final String dftUri1 = Quad.defaultGraphIRI.getURI();
+ private static final String dftUri2 = Quad.defaultGraphNodeGenerated.getURI();
+
+ /** Is this a name for the default graph prefix set? */
+ public static boolean isDftGraph(String graphName) {
+ return graphName == null
+ //|| graphName.equals(dftGraphPrefixSet)
+ || graphName.equals(dftUri1) || graphName.equals(dftUri2);
+ }
+
+ /** Is this a name node for the default graph prefix set? */
+ public static boolean isDftGraph(Node graphName) {
+ if ( !graphName.isURI() )
+ return false;
+ return graphName == null
+ //|| graphName.equals(nodeDefaultGraph)
+ || Quad.isDefaultGraph(graphName);
+ }
+
+ /**
+ * Canonical prefix - remove a trailing ":". The return is not null.
+ */
+ public static String prefix(String prefix) {
+ if ( prefix == null )
+ // null is not good style but let's be robust.
+ return "";
+ if ( prefix.endsWith(":") )
+ return prefix.substring(prefix.length() - 1);
+ return prefix;
+ }
+
+ /**
+ * Reverse lookup of URI to a prefix. General implementation by scanning the
+ * {@link PrefixMap}. Returns a prefix if found or null. If several prefixes for
+ * the same URI, returns one at random.
+ */
+ public static String findByURI(PrefixMap pmap, String uriStr) {
+ return pmap.getMapping().entrySet().stream()
+ .filter(e -> Objects.equals(uriStr, e.getValue().toString()))
+ .map(Entry::getKey)
+ .findFirst()
+ .orElse(null);
+ }
+
+ /**
+ * Provide, via an adapter if necessary, the {@link PrefixMap} for a {@link Graph}.
+ */
+ public static PrefixMap adapt(Graph graph) {
+ Objects.requireNonNull(graph);
+ return adapt(graph.getPrefixMapping());
+ }
+
+ /**
+ * Apply a wrapper to a {@link PrefixMap} to provide the
+ * {@link PrefixMapping} API.
+ */
+ public static PrefixMapping adapt(PrefixMap prefixMap) {
+ Objects.requireNonNull(prefixMap);
+ if ( prefixMap instanceof PrefixMapAdapter )
+ // Already adapter from a PrefixMapping
+ return ((PrefixMapAdapter)prefixMap).getPrefixMapping();
+ return new PrefixMappingAdapter(prefixMap);
+ }
+
+ /**
+ * Apply a wrapper to a {@link PrefixMapping} to provide the
+ * {@link PrefixMap} API.
+ */
+ public static PrefixMap adapt(PrefixMapping prefixMapping) {
+ Objects.requireNonNull(prefixMapping);
+ if ( prefixMapping instanceof PrefixMappingAdapter )
+ // Already adapter from a PrefixMap
+ return ((PrefixMappingAdapter)prefixMapping).getPrefixMap();
+ return new PrefixMapAdapter(prefixMapping);
+ }
+
+ /** Calculate a printable multi-line string. */
+ public static String toString(PrefixMap prefixMap) {
+ if ( prefixMap.isEmpty() )
+ return "{}";
+ StringJoiner sj = new StringJoiner("\n", "{\n", "}");
+ prefixMap.getMapping().forEach((p,u)->sj.add(format(" %-6s <%s>\n", p+":", u)));
+ return sj.toString();
+ }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java b/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
index 921d62a..5599e3b 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
@@ -28,71 +28,69 @@ public class Prologue
protected PrefixMap prefixMap = null ;
protected IRIResolver resolver = null ;
-
+
public static Prologue create(String base, PrefixMapping pmapping)
{
- PrefixMap pmap = null ;
+ PrefixMap pmap = new PrefixMapStd() ;
if ( pmapping != null )
- {
- pmap = PrefixMapFactory.createForInput(pmapping) ;
- }
+ // Copy to isolate
+ pmap.putAll(pmapping);
IRIResolver resolver = null ;
if ( base != null )
resolver = IRIResolver.create(base) ;
return new Prologue(pmap, resolver) ;
}
-
+
public Prologue()
- {
- this.prefixMap = PrefixMapFactory.createForInput() ;
+ {
+ this.prefixMap = PrefixMapFactory.create() ;
this.resolver = null ;
}
-
+
public Prologue(PrefixMap pmap, IRIResolver resolver)
{
- this.prefixMap = pmap ;
+ this.prefixMap = pmap ;
this.resolver = resolver ;
}
-
+
public Prologue(Prologue other)
{
- this.prefixMap = other.prefixMap ;
+ this.prefixMap = other.prefixMap ;
this.resolver = other.resolver ;
}
public Prologue copy()
{
- PrefixMap prefixMap = PrefixMapFactory.createForInput(this.prefixMap) ;
+ PrefixMap prefixMap = PrefixMapFactory.create(this.prefixMap) ;
return new Prologue(prefixMap, resolver) ;
}
-
+
public void usePrologueFrom(Prologue other)
{
// Copy.
- prefixMap = PrefixMapFactory.createForInput(other.prefixMap) ;
+ prefixMap = PrefixMapFactory.create(other.prefixMap) ;
seenBaseURI = false ;
if ( other.resolver != null )
resolver = IRIResolver.create(other.resolver.getBaseIRIasString()) ;
}
-
+
public Prologue sub(PrefixMap newMappings) { return sub(newMappings, null) ; }
public Prologue sub(String base) { return sub(null, base) ; }
-
- public Prologue sub(PrefixMap newMappings, String base)
- {
+
+ public Prologue sub(PrefixMap newMappings, String base) {
// New prefix mappings
PrefixMap ext = getPrefixMap() ;
if ( newMappings != null )
- ext = PrefixMapFactory.extend(ext) ;
+ ext.putAll(newMappings);
// New base.
IRIResolver r = resolver ;
if ( base != null )
r = IRIResolver.create(base) ;
return new Prologue(ext, r) ;
}
-
+
/**
- * @return True if the query has an explicitly set base URI.
+ * @return True if the query has an explicitly set base URI.
*/
public boolean explicitlySetBaseURI() { return seenBaseURI ; }
@@ -103,7 +101,7 @@ public class Prologue
{
if ( resolver == null )
return null ;
-
+
// if ( baseURI == null )
// setDefaultBaseIRI() ;
return resolver.getBaseIRIasString();
@@ -114,13 +112,13 @@ public class Prologue
public void setBaseURI(String baseURI)
{
this.seenBaseURI = true ;
- this.resolver = IRIResolver.create(baseURI) ;
+ this.resolver = IRIResolver.create(baseURI) ;
}
-
+
public void setBaseURI(IRI iri)
{
this.seenBaseURI = true ;
- this.resolver = IRIResolver.create(iri) ;
+ this.resolver = IRIResolver.create(iri) ;
}
/**
@@ -129,64 +127,23 @@ public class Prologue
public void setBaseURI(IRIResolver resolver)
{
this.seenBaseURI = true ;
- this.resolver = resolver ;
+ this.resolver = resolver ;
}
-
-// protected void setDefaultBaseIRI() { setDefaultBaseIRI(null) ; }
-//
-// protected void setDefaultBaseIRI(String base)
-// {
-// if ( baseURI != null )
-// return ;
-//
-// baseURI = IRIResolver.chooseBaseURI(base) ;
-// }
-
+
// ---- Query prefixes
-
+
/** Set a prefix for this query */
public void setPrefix(String prefix, String expansion)
{
prefixMap.add(prefix, expansion) ;
- }
+ }
- /** Return the prefix map from the parsed query */
+ /** Return the prefix map from the parsed query */
public PrefixMap getPrefixMap() { return prefixMap ; }
-// /** Set the mapping */
-// public void setPrefixMapping(PrefixMap pmap ) { prefixMap = pmap ; }
-
-// /** Reverse lookup of a URI to get a prefix */
-// public String getPrefix(String uriStr)
-// {
-// return prefixMap.getPrefix(uriStr) ;
-// }
/** Get the IRI resolver */
public IRIResolver getResolver() { return resolver ; }
-
+
/** Set the IRI resolver */
public void setResolver(IRIResolver resolver) { this.resolver = resolver; }
-
-// /** Expand prefixed name
-// *
-// * @param qname The prefixed name to be expanded
-// * @return URI, or null if not expanded.
-// */
-//
-// public String expandPrefixedName(String qname)
-// {
-// // Split qname.
-//
-// String s = prefixMap.expand(qname) ;
-// if ( s.equals(qname) )
-// return null ;
-// return s ;
-// }
-
-// /** Use the prefix map to turn a URI into a qname, or return the original URI */
-//
-// public String shortForm(String uri)
-// {
-// return prefixMap.shortForm(uri) ;
-// }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
index 966ce3b..6cda2f8 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
@@ -55,7 +55,7 @@ public class RiotLib
{
// ---- BlankNode skolemization as IRIs
private final static boolean skolomizedBNodes = ARQ.isTrueOrUndef(ARQ.constantBNodeLabels);
- /** "Skolemize" to a node.
+ /** "Skolemize" to a node.
* Returns a Node_URI.
*/
public static Node blankNodeToIri(Node node) {
@@ -64,7 +64,7 @@ public class RiotLib
return node;
}
- /** "Skolemize" to a string. */
+ /** "Skolemize" to a string. */
public static String blankNodeToIriString(Node node) {
if ( node.isBlank() ) {
String x = node.getBlankNodeLabel();
@@ -95,21 +95,21 @@ public class RiotLib
public static boolean isBNodeIRI(String iri) {
return iri.startsWith(bNodeLabelStart);
}
-
+
private static final String URI_PREFIX_FIXUP = "::";
-
+
// These two must be in-step.
- /** Function applied to undefined prefixes to convert to a URI string */
+ /** Function applied to undefined prefixes to convert to a URI string */
public static final Function<String,String> fixupPrefixes = (x) -> URI_PREFIX_FIXUP.concat(x);
- /** Function to test for undefined prefix URIs*/
+ /** Function to test for undefined prefix URIs*/
public static final Predicate<String> testFixupedPrefixURI = (x) -> x.startsWith(URI_PREFIX_FIXUP);
-
+
/** Test whether a IRI is a ARQ-encoded blank node. */
public static boolean isPrefixIRI(String iri) {
return testFixupedPrefixURI.test(iri);
}
-
+
/** Convert an prefix name (qname) to an IRI, for when the prerix is nor defined.
* @see ARQ#fixupUndefinedPrefixes
*/
@@ -123,29 +123,29 @@ public class RiotLib
public static String fixupPrefixIRI(String prefixedName) {
return fixupPrefixes.apply(prefixedName);
}
-
- /** Internal ParserProfile used to create nodes from strings. */
+
+ /** Internal ParserProfile used to create nodes from strings. */
private static ParserProfile setupInternalParserProfile() {
- PrefixMap pmap = PrefixMapFactory.createForInput();
+ PrefixMap pmap = PrefixMapFactory.create();
pmap.add("rdf", ARQConstants.rdfPrefix);
pmap.add("rdfs", ARQConstants.rdfsPrefix);
pmap.add("xsd", ARQConstants.xsdPrefix);
pmap.add("owl" , ARQConstants.owlPrefix);
- pmap.add("fn" , ARQConstants.fnPrefix);
- pmap.add("op" , ARQConstants.fnPrefix);
+ pmap.add("fn" , ARQConstants.fnPrefix);
+ pmap.add("op" , ARQConstants.fnPrefix);
pmap.add("ex" , "http://example/ns#");
pmap.add("" , "http://example/");
-
- return new ParserProfileStd(RiotLib.factoryRDF(),
+
+ return new ParserProfileStd(RiotLib.factoryRDF(),
ErrorHandlerFactory.errorHandlerStd,
IRIResolver.create(),
pmap,
RIOT.getContext().copy(),
true, false);
}
-
+
private static ParserProfile profile = setupInternalParserProfile();
-
+
/** Parse a string to get one Node (the first token in the string) */
public static Node parse(String string) {
return NodeFactoryExtra.parseNode(string, null);
@@ -172,7 +172,7 @@ public class RiotLib
/** Create a parser profile for the given setup
* @param baseIRI Base IRI
* @param resolveIRIs Whether to resolve IRIs
- * @param checking Whether to check
+ * @param checking Whether to check
* @param handler Error handler
* @return ParserProfile
* @see #profile for per-language setup
@@ -182,7 +182,7 @@ public class RiotLib
public static ParserProfile profile(String baseIRI, boolean resolveIRIs, boolean checking, ErrorHandler handler)
{
LabelToNode labelToNode = SyntaxLabels.createLabelToNode();
-
+
IRIResolver resolver;
if ( resolveIRIs )
resolver = IRIResolver.create(baseIRI);
@@ -193,15 +193,15 @@ public class RiotLib
}
/** Create a new (not influenced by anything else) {@code FactoryRDF}
- * using the label to blank node scheme provided.
+ * using the label to blank node scheme provided.
*/
public static FactoryRDF factoryRDF(LabelToNode labelMapping) {
return new FactoryRDFCaching(FactoryRDFCaching.DftNodeCacheSize, labelMapping);
}
/** Create a new (not influenced by anything else) {@code FactoryRDF}
- * using the default label to blank node scheme.
- */
+ * using the default label to blank node scheme.
+ */
public static FactoryRDF factoryRDF() {
return factoryRDF(SyntaxLabels.createLabelToNode());
}
@@ -218,21 +218,21 @@ public class RiotLib
/** Create a {@link ParserProfile} with default settings, and a specific error handler. */
public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler, boolean checking) {
- return new ParserProfileStd(factory,
+ return new ParserProfileStd(factory,
errorHandler,
IRIResolver.create(),
- PrefixMapFactory.createForInput(),
+ PrefixMapFactory.create(),
RIOT.getContext().copy(),
checking, false);
}
-
+
/** Create a {@link ParserProfile}. */
- public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler,
+ public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler,
IRIResolver resolver, boolean checking) {
- return new ParserProfileStd(factory,
+ return new ParserProfileStd(factory,
errorHandler,
resolver,
- PrefixMapFactory.createForInput(),
+ PrefixMapFactory.create(),
RIOT.getContext().copy(),
checking, false);
}
@@ -273,7 +273,7 @@ public class RiotLib
public static boolean strSafeFor(String str, char ch) {
return str.indexOf(ch) == -1;
}
-
+
public static void writeBase(IndentedWriter out, String base, boolean newStyle) {
if ( newStyle )
writeBaseNewStyle(out, base);
@@ -304,7 +304,7 @@ public class RiotLib
}
}
- /** Write prefixes */
+ /** Write prefixes */
public static void writePrefixes(IndentedWriter out, PrefixMap prefixMap, boolean newStyle) {
if ( prefixMap != null && !prefixMap.isEmpty() ) {
for ( Map.Entry<String, String> e : prefixMap.getMapping().entrySet() ) {
@@ -315,10 +315,10 @@ public class RiotLib
}
}
}
-
+
/** Write a prefix.
* Write using {@code @prefix} or {@code PREFIX}.
- */
+ */
public static void writePrefix(IndentedWriter out, String prefix, String uri, boolean newStyle) {
if ( newStyle )
writePrefixNewStyle(out, prefix, uri);
@@ -326,7 +326,7 @@ public class RiotLib
writePrefixOldStyle(out, prefix, uri);
}
- /** Write prefix, using {@code PREFIX} */
+ /** Write prefix, using {@code PREFIX} */
private static void writePrefixNewStyle(IndentedWriter out, String prefix, String uri) {
out.print("PREFIX ");
out.print(prefix);
@@ -338,7 +338,7 @@ public class RiotLib
out.println();
}
- /** Write prefixes, using {@code @prefix} */
+ /** Write prefixes, using {@code @prefix} */
public static void writePrefixOldStyle(IndentedWriter out, String prefix, String uri) {
out.print("@prefix ");
out.print(prefix);
@@ -369,7 +369,7 @@ public class RiotLib
{
if ( ! prefixMap.containsPrefix(rdfNS) && RDF_type.equals(p) )
return 1;
-
+
String x = prefixMap.abbreviate(p.getURI());
if ( x == null )
return p.getURI().length()+2;
@@ -378,9 +378,9 @@ public class RiotLib
public static int calcWidth(PrefixMap prefixMap, String baseURI, Collection<Node> nodes, int minWidth, int maxWidth)
{
- Node prev = null;
+ Node prev = null;
int nodeMaxWidth = minWidth;
-
+
for ( Node n : nodes )
{
if ( prev != null && prev.equals(n) )
@@ -392,14 +392,14 @@ public class RiotLib
nodeMaxWidth = len;
prev = n;
}
- return nodeMaxWidth;
+ return nodeMaxWidth;
}
public static int calcWidthTriples(PrefixMap prefixMap, String baseURI, Collection<Triple> triples, int minWidth, int maxWidth)
{
- Node prev = null;
+ Node prev = null;
int nodeMaxWidth = minWidth;
-
+
for ( Triple triple : triples )
{
Node n = triple.getPredicate();
@@ -423,7 +423,7 @@ public class RiotLib
public static WriterGraphRIOTBase adapter(WriterDatasetRIOT writer)
{ return new WriterAdapter(writer); }
- /** Hidden to direct program to using OutputStreams (for RDF, that gets the charset right) */
+ /** Hidden to direct program to using OutputStreams (for RDF, that gets the charset right) */
private static class IndentedWriterWriter extends IndentedWriter
{
IndentedWriterWriter(Writer w) { super(w); }
@@ -432,16 +432,16 @@ public class RiotLib
private static class WriterAdapter extends WriterGraphRIOTBase
{
private WriterDatasetRIOT writer;
-
+
WriterAdapter(WriterDatasetRIOT writer) { this.writer = writer; }
@Override
public Lang getLang()
{ return writer.getLang(); }
-
+
@Override
public void write(OutputStream out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
{ writer.write(out, DatasetGraphFactory.wrap(graph), prefixMap, baseURI, context); }
-
+
@Override
public void write(Writer out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
{ writer.write(out, DatasetGraphFactory.wrap(graph), prefixMap, baseURI, context); }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
index 21e80ca..5b4bc7e 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
@@ -31,7 +31,6 @@ import org.apache.jena.graph.Triple ;
import org.apache.jena.riot.lang.StreamRDFCounting ;
import org.apache.jena.riot.writer.WriterStreamRDFPlain ;
import org.apache.jena.shared.JenaException ;
-import org.apache.jena.shared.PrefixMapping ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.Quad ;
@@ -172,74 +171,76 @@ public class StreamRDFLib
{ sink.flush() ; }
}
- private static class ParserOutputGraph extends StreamRDFBase
- {
- protected final Graph graph ;
- protected boolean warningIssued = false ;
- public ParserOutputGraph(Graph graph) { this.graph = graph ; }
+ private static class ParserOutputGraph extends StreamRDFBase {
+ protected final Graph graph;
+ protected boolean warningIssued = false;
+ public ParserOutputGraph(Graph graph) {
+ this.graph = graph;
+ }
+
+ @Override
+ public void triple(Triple triple) {
+ graph.add(triple);
+ }
- @Override public void triple(Triple triple) { graph.add(triple) ; }
- @Override public void quad(Quad quad)
- {
+ @Override
+ public void quad(Quad quad) {
if ( quad.isTriple() || quad.isDefaultGraph() )
- graph.add(quad.asTriple()) ;
- else
- {
- if ( ! warningIssued )
- {
- //SysRIOT.getLogger().warn("Only triples or default graph data expected : named graph data ignored") ;
+ graph.add(quad.asTriple());
+ else {
+ if ( !warningIssued ) {
+ // SysRIOT.getLogger().warn("Only triples or default graph data expected : named graph data ignored") ;
// Not ideal - assumes the global default.
- ErrorHandlerFactory.getDefaultErrorHandler().warning("Only triples or default graph data expected : named graph data ignored", -1, -1) ;
+ ErrorHandlerFactory.getDefaultErrorHandler()
+ .warning("Only triples or default graph data expected : named graph data ignored", -1, -1);
}
- warningIssued = true ;
+ warningIssued = true;
}
- //throw new IllegalStateException("Quad passed to graph parsing") ;
+ // throw new IllegalStateException("Quad passed to graph parsing") ;
}
- @Override public void base(String base)
- { }
+ @Override
+ public void base(String base) {}
- @Override public void prefix(String prefix, String uri)
- {
- try { // Jena applies XML rules to prerfixes.
- graph.getPrefixMapping().setNsPrefix(prefix, uri) ;
+ @Override
+ public void prefix(String prefix, String uri) {
+ try { // Some graphs applies XML rules to prefixes.
+ graph.getPrefixMapping().setNsPrefix(prefix, uri);
} catch (JenaException ex) {}
}
}
- private static class ParserOutputDataset extends StreamRDFBase
- {
- protected final DatasetGraph dsg ;
- protected final PrefixMapping prefixMapping ;
-
- public ParserOutputDataset(DatasetGraph dsg)
- {
- this.dsg = dsg ;
- this.prefixMapping = dsg.getDefaultGraph().getPrefixMapping() ;
- // = dsg.getPrefixMapping().setNsPrefix(prefix, uri) ;
+ private static class ParserOutputDataset extends StreamRDFBase {
+ protected final DatasetGraph dsg;
+ protected final PrefixMap prefixMap;
+
+ public ParserOutputDataset(DatasetGraph dsg) {
+ this.dsg = dsg;
+ this.prefixMap = dsg.prefixes();
}
- @Override public void triple(Triple triple)
- {
- dsg.add(Quad.defaultGraphNodeGenerated, triple.getSubject(), triple.getPredicate(), triple.getObject()) ;
- //throw new IllegalStateException("Triple passed to dataset parsing") ;
+ @Override
+ public void triple(Triple triple) {
+ dsg.add(Quad.defaultGraphNodeGenerated, triple.getSubject(), triple.getPredicate(), triple.getObject());
}
- @Override public void quad(Quad quad)
- {
+ @Override
+ public void quad(Quad quad) {
if ( quad.isTriple() )
- dsg.add(Quad.defaultGraphNodeGenerated, quad.getSubject(), quad.getPredicate(), quad.getObject()) ;
+ dsg.add(Quad.defaultGraphNodeGenerated, quad.getSubject(), quad.getPredicate(), quad.getObject());
else
- dsg.add(quad) ;
+ dsg.add(quad);
}
- @Override public void base(String base)
- { }
+ @Override
+ public void base(String base) {}
- @Override public void prefix(String prefix, String uri)
- {
- try { // Jena applies XML rules to prerfixes.
- prefixMapping.setNsPrefix(prefix, uri) ;
+ @Override
+ public void prefix(String prefix, String uri) {
+ try {
+ // Some datasets may be tied to PrefixMappings and may apply XML
+ // rules to prefixes.
+ prefixMap.add(prefix, uri);
} catch (JenaException ex) {}
}
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
index c61e751..0966efd 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
@@ -25,11 +25,12 @@ import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.query.Dataset ;
+import org.apache.jena.riot.system.PrefixMap;
import org.apache.jena.shared.Lock ;
import org.apache.jena.sparql.util.Context ;
/** DatasetGraph: The graph representation of an RDF Dataset. See {@link Dataset}
- * for the Model level of an RDF dataset.
+ * for the Model level of an RDF dataset.
* <p>
* Whether a dataset contains a graph if there are no triples
* is not defined; see the specific implementation.
@@ -42,25 +43,25 @@ public interface DatasetGraph extends Transactional, Closeable
/** Get the default graph as a Jena Graph */
public Graph getDefaultGraph() ;
- /** Get the graph named by graphNode : returns null when there is no such graph.
+ /** Get the graph named by graphNode : returns null when there is no such graph.
* NB Whether a dataset contains a graph if there are no triples is not defined - see the specific implementation.
* Some datasets are "open" - they have all graphs even if no triples.
*/
public Graph getGraph(Node graphNode) ;
-
+
/**
* Return a {@link Graph} that is the union of all named graphs in this dataset. This
* union graph is read-only (its prefix mapping in the current JVM may be changed but
* that may not persist).
*/
public Graph getUnionGraph();
-
+
/**
- * Does the DatasetGraph contain a specific named graph?
+ * Does the DatasetGraph contain a specific named graph?
* Whether a dataset contains a graph if there are no triples is
* not defined - see the specific implementation. Some datasets are "open" -
* they have all graphs even if no triples and this returns true always.
- *
+ *
* @param graphNode
* @return boolean
*/
@@ -68,15 +69,15 @@ public interface DatasetGraph extends Transactional, Closeable
/** Set the default graph. Set the active graph if it was null.
* This replaces the contents default graph, not merge data into it.
- * Do not assume that the same object is returned by {@link #getDefaultGraph}
+ * Do not assume that the same object is returned by {@link #getDefaultGraph}
*/
public void setDefaultGraph(Graph g) ;
- /**
+ /**
* Add the given graph to the dataset.
- * <em>Replaces</em> any existing data for the named graph; to add data,
+ * <em>Replaces</em> any existing data for the named graph; to add data,
* get the graph and add triples to it, or add quads to the dataset.
- * Do not assume that the same Java object is returned by {@link #getGraph}
+ * Do not assume that the same Java object is returned by {@link #getGraph}
*/
public void addGraph(Node graphName, Graph graph) ;
@@ -89,35 +90,35 @@ public interface DatasetGraph extends Transactional, Closeable
public Iterator<Node> listGraphNodes() ;
// ---- Quad view
-
+
/** Add a quad */
public void add(Quad quad) ;
-
+
/** Delete a quad */
public void delete(Quad quad) ;
-
+
/** Add a quad */
public void add(Node g, Node s, Node p, Node o) ;
/** Delete a quad */
public void delete(Node g, Node s, Node p, Node o) ;
-
+
/** Delete any quads matching the pattern */
public void deleteAny(Node g, Node s, Node p, Node o) ;
/** Iterate over all quads in the dataset graph */
public Iterator<Quad> find() ;
-
+
/** Find matching quads in the dataset - may include wildcards, Node.ANY or null
* @see Graph#find(Triple)
*/
public Iterator<Quad> find(Quad quad) ;
-
+
/** Find matching quads in the dataset (including default graph) - may include wildcards, Node.ANY or null
* @see Graph#find(Node,Node,Node)
*/
public Iterator<Quad> find(Node g, Node s, Node p , Node o) ;
-
+
/** Find matching quads in the dataset in named graphs only - may include wildcards, Node.ANY or null
* @see Graph#find(Node,Node,Node)
*/
@@ -134,25 +135,28 @@ public interface DatasetGraph extends Transactional, Closeable
/** Test whether the dataset is empty */
public boolean isEmpty() ;
-
+
/** Return a lock for the dataset to help with concurrency control
* @see Lock
*/
public Lock getLock() ;
-
+
/** Get the context associated with this object - may be null */
- public Context getContext() ;
-
- /** Get the size (number of named graphs) - may be -1 for unknown */
+ public Context getContext() ;
+
+ /** Get the size (number of named graphs) - may be -1 for unknown */
public long size() ;
-
+
/** Close the dataset */
@Override
public void close() ;
+ /** Prefixes for this DatasetGraph */
+ public PrefixMap prefixes();
+
/**
* A {@code DatasetGraph} supports transactions if it provides {@link #begin}/
- * {@link #commit}/{@link #end}. The core storage {@code DatasetGraph}s
+ * {@link #commit}/{@link #end}. The core storage {@code DatasetGraph}s
* provide fully serialized transactions. A {@code DatasetGraph} that provides
* functionality across independent systems can not provide such strong guarantees.
* For example, it may use MRSW locking and some isolation control.
@@ -162,7 +166,7 @@ public interface DatasetGraph extends Transactional, Closeable
* In addition, check details of a specific implementation.
*/
public boolean supportsTransactions() ;
-
+
/** Declare whether {@link #abort} is supported.
* This goes along with clearing up after exceptions inside application transaction code.
*/
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index 3991004..8d3e793 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -30,6 +30,8 @@ import org.apache.jena.graph.Triple ;
import org.apache.jena.query.ReadWrite ;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.sparql.ARQException ;
import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
import org.apache.jena.sparql.graph.GraphUnionRead ;
@@ -40,33 +42,36 @@ import org.apache.jena.sparql.graph.GraphUnionRead ;
* This implementation provides copy-in, copy-out for {@link #addGraph}.
* <p>See {@link DatasetGraphMapLink} for a {@code DatasetGraph}
* that holds graphs as provided.
- *
- * @see DatasetGraphMapLink
+ *
+ * @see DatasetGraphMapLink
*/
public class DatasetGraphMap extends DatasetGraphTriplesQuads
{
private final GraphMaker graphMaker ;
private final Map<Node, Graph> graphs = new HashMap<>() ;
- private Graph defaultGraph ;
-
+ private final Graph defaultGraph ;
+ private final PrefixMap prefixes ;
+
/** DatasetGraphMap defaulting to storage in memory.
*/
public DatasetGraphMap() {
- this(DatasetGraphFactory.graphMakerNamedGraphMem) ;
+ this(DatasetGraphFactory.graphMakerNamedGraphMem) ;
}
-
+
/** DatasetGraphMap with a specific policy for graph creation.
- * This allows control over the storage.
+ * This allows control over the storage.
*/
public DatasetGraphMap(GraphMaker graphMaker) {
this(graphMaker.create(null), graphMaker) ;
}
-
+
private DatasetGraphMap(Graph defaultGraph, GraphMaker graphMaker) {
this.defaultGraph = defaultGraph ;
this.graphMaker = graphMaker ;
+ // Preserves legacy behaviour of "getDefaultPraph" having prefixes.
+ this.prefixes = Prefixes.adapt(defaultGraph);
}
-
+
// ----
private final Transactional txn = TransactionalLock.createMRSW() ;
private final Transactional txn() { return txn; }
@@ -83,24 +88,29 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
@Override public boolean supportsTransactions() { return true; }
@Override public boolean supportsTransactionAbort() { return false; }
// ----
-
+
@Override
public Iterator<Node> listGraphNodes() {
- // Hide empty graphs.
+ // Hide empty graphs.
return graphs.entrySet().stream().filter(e->!e.getValue().isEmpty()).map(Entry::getKey).iterator();
}
@Override
+ public PrefixMap prefixes() {
+ return prefixes;
+ }
+
+ @Override
public boolean containsGraph(Node graphNode) {
- // Hide empty graphs.
+ // Hide empty graphs.
if ( Quad.isDefaultGraph(graphNode) )
return true;
if ( Quad.isUnionGraph(graphNode) )
return true;
Graph g = graphs.get(graphNode);
- return g != null && !g.isEmpty();
+ return g != null && !g.isEmpty();
}
-
+
@Override
protected void addToDftGraph(Node s, Node p, Node o) {
getDefaultGraph().add(Triple.create(s, p, o)) ;
@@ -155,7 +165,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
@Override
public Graph getGraph(Node graphNode) {
- if ( Quad.isUnionGraph(graphNode) )
+ if ( Quad.isUnionGraph(graphNode) )
return new GraphUnionRead(this) ;
if ( Quad.isDefaultGraph(graphNode))
return getDefaultGraph() ;
@@ -171,15 +181,15 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
/** Called from getGraph when a nonexistent graph is asked for.
* Return null for "nothing created as a graph".
- * Sub classes can reimplement this.
+ * Sub classes can reimplement this.
*/
- protected Graph getGraphCreate(Node graphNode) {
+ protected Graph getGraphCreate(Node graphNode) {
Graph g = graphMaker.create(graphNode) ;
if ( g == null )
throw new ARQException("Can't make new graphs") ;
return g ;
}
-
+
@Override
public long size() {
return graphs.size();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index 2933eee..b925c1e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -26,6 +26,8 @@ import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
import org.apache.jena.query.ReadWrite ;
import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.sparql.SystemARQ ;
import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
import org.apache.jena.sparql.graph.GraphUnionRead ;
@@ -34,12 +36,12 @@ import org.apache.jena.sparql.graph.GraphZero;
/** Implementation of a DatasetGraph as an extensible set of graphs where graphs are held by reference.
* Care is needed when manipulating their contents
* especially if they are also in another {@code DatasetGraph}.
- * <p>
+ * <p>
* See {@link DatasetGraphMap} for an implementation that copies graphs
* and so providing better isolation.
* <p>
- * This class is best used for creating views
- *
+ * This class is best used for creating views
+ *
* @see DatasetGraphMap
*/
public class DatasetGraphMapLink extends DatasetGraphCollection
@@ -48,6 +50,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
private final Map<Node, Graph> graphs = new HashMap<>() ;
private Graph defaultGraph ;
+ private PrefixMap prefixes ;
private final Transactional txn;
private final TxnDataset2Graph txnDsg2Graph;
private static GraphMaker dftGraphMaker = DatasetGraphFactory.graphMakerMem;
@@ -55,12 +58,12 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
/**
* Create a new {@code DatasetGraph} that copies the dataset structure of default
* graph and named graph and links to the graphs of the original {@code DatasetGraph}.
- * Any new graphs needed are separate from the original dataset and created in-memory.
+ * Any new graphs needed are separate from the original dataset and created in-memory.
*/
public static DatasetGraph cloneStructure(DatasetGraph dsg) {
return cloneStructure(dsg, dftGraphMaker);
}
-
+
/**
* Create a new {@code DatasetGraph} that copies the dataset structure of default
* graph and named graph and links to the graphs of the original {@code DatasetGraph}
@@ -74,7 +77,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
}
private static void linkGraphs(DatasetGraph srcDsg, DatasetGraphMapLink dstDsg) {
- dstDsg.defaultGraph = srcDsg.getDefaultGraph();
+ dstDsg.setDefaultGraph(srcDsg.getDefaultGraph());
for ( Iterator<Node> names = srcDsg.listGraphNodes() ; names.hasNext() ; ) {
Node gn = names.next() ;
dstDsg.addGraph(gn, srcDsg.getGraph(gn)) ;
@@ -88,10 +91,10 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
this(dftGraph, dftGraphMaker);
}
- // This is the root constructor.
+ // This is the root constructor.
/*package*/DatasetGraphMapLink(Graph dftGraph, GraphMaker graphMaker) {
this.graphMaker = graphMaker;
- this.defaultGraph = dftGraph;
+ this.setDefaultGraph(dftGraph);
txnDsg2Graph = new TxnDataset2Graph(dftGraph);
txn = txnDsg2Graph;
}
@@ -132,7 +135,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
@Override
public Graph getGraph(Node graphNode) {
// Same as DatasetGraphMap.getGraph but we inherit differently.
- if ( Quad.isUnionGraph(graphNode) )
+ if ( Quad.isUnionGraph(graphNode) )
return new GraphUnionRead(this) ;
if ( Quad.isDefaultGraph(graphNode))
return getDefaultGraph() ;
@@ -176,6 +179,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
if ( txnDsg2Graph != null )
txnDsg2Graph.addGraph(g);
defaultGraph = g;
+ prefixes = Prefixes.adapt(g.getPrefixMapping());
}
@Override
@@ -184,6 +188,11 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
}
@Override
+ public PrefixMap prefixes() {
+ return prefixes;
+ }
+
+ @Override
public long size() {
return graphs.size();
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
index b7acb8f..5365945 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
@@ -29,12 +29,14 @@ import org.apache.jena.query.ReadWrite;
import org.apache.jena.query.TxnType;
import org.apache.jena.reasoner.InfGraph;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.sparql.graph.GraphOps;
import org.apache.jena.sparql.graph.GraphZero;
/** DatasetGraph of a single graph as default graph.
* <p>
- * Fixed as one graph (the default) - named graphs can notbe added nor the default graph changed, only the contents modified.
+ * Fixed as one graph (the default) - named graphs can not be added nor the default graph changed, only the contents modified.
* <p>
* This dataset passes transactions down to a nominated backing {@link DatasetGraph}.
* <p>
@@ -42,6 +44,7 @@ import org.apache.jena.sparql.graph.GraphZero;
*/
public class DatasetGraphOne extends DatasetGraphBaseFind {
private final Graph graph;
+ private final PrefixMap prefixes;
private final DatasetGraph backingDGS;
private final Transactional txn;
private final boolean supportsAbort;
@@ -72,22 +75,22 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
}
private DatasetGraphOne(Graph graph, DatasetGraph backing) {
- this.graph = graph;
- backingDGS = backing;
- supportsAbort = backing.supportsTransactionAbort();
- txn = backing;
+ this(graph, backing, backing, backing.supportsTransactionAbort());
}
private DatasetGraphOne(Graph graph) {
- // Not GraphView which was handled in create(Graph).
- this.graph = graph;
- txn = new TxnDataset2Graph(graph);
- //txn = TransactionalLock.createMRSW();
- backingDGS = null;
// Don't advertise the fact but TxnDataset2Graph tries to provide abort.
// We can not guarantee it though because a plain, non-TIM,
// memory graph does not support abort.
- supportsAbort = false;
+ this(graph, null, new TxnDataset2Graph(graph), false);
+ }
+
+ private DatasetGraphOne(Graph graph, DatasetGraph backing, Transactional txn, boolean supportsAbort) {
+ this.graph = graph;
+ this.prefixes = Prefixes.adapt(graph);
+ this.txn = txn;
+ this.backingDGS = backing;
+ this.supportsAbort = supportsAbort;
}
@Override public void begin(TxnType txnType) { txn.begin(txnType); }
@@ -134,6 +137,11 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
}
@Override
+ public PrefixMap prefixes() {
+ return prefixes;
+ }
+
+ @Override
public long size() {
return 0;
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
index 7a5faa6..994b422 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
@@ -20,36 +20,38 @@ package org.apache.jena.sparql.core;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapSink;
import org.apache.jena.sparql.graph.GraphSink;
-/**
+/**
* An always empty {@link DatasetGraph} that accepts changes but ignores them.
- *
+ *
* @see DatasetGraphZero - a DSG that does not allow changes.
*/
public class DatasetGraphSink extends DatasetGraphNull {
public static DatasetGraph create() { return new DatasetGraphSink(); }
-
+
@Override
protected Graph createGraph() {
return GraphSink.instance();
}
-
+
public DatasetGraphSink() {}
-
+
// Ignore all updates.
-
+
@Override
- public void add(Quad quad) { /* ignore */ }
-
+ public void add(Quad quad) { /* ignore */ }
+
@Override
public void delete(Quad quad) { /* ignore */ }
-
+
@Override
public void deleteAny(Node g, Node s, Node p, Node o) { /* ignore */ }
-
+
@Override
public void setDefaultGraph(Graph g) { /* ignore */ }
@@ -58,4 +60,10 @@ public class DatasetGraphSink extends DatasetGraphNull {
@Override
public void removeGraph(Node graphName) { /* ignore */ }
+
+ @Override
+ public PrefixMap prefixes() {
+ return PrefixMapSink.sink;
+ }
+
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
index 4b5f219..91cdc61 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
@@ -25,22 +25,23 @@ import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
import org.apache.jena.shared.Lock;
import org.apache.jena.sparql.SystemARQ;
import org.apache.jena.sparql.util.Context;
import org.apache.jena.system.Txn;
-public class DatasetGraphWrapper implements DatasetGraph, Sync
+public class DatasetGraphWrapper implements DatasetGraph, Sync
{
// The wrapped DatasetGraph but all calls go via get() so this can be null.
private final DatasetGraph dsg;
private Context context;
-
+
/** Return the DatasetGraph being wrapped. */
- public final DatasetGraph getWrapped() {
+ public final DatasetGraph getWrapped() {
return get();
}
-
+
/**
* Recursively unwrap a {@link DatasetGraphWrapper}.
* <p>
@@ -48,11 +49,11 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
* the wrapped dataset stored in this object.
* <p>
* Note 2: TDB datasets require a transaction to unwrap.
- *
+ *
* @return the first found {@link DatasetGraph} that is not an instance of
* {@link DatasetGraphWrapper}
*/
- public final DatasetGraph getBase() {
+ public final DatasetGraph getBase() {
DatasetGraph dsgw = get();
while (dsgw instanceof DatasetGraphWrapper) {
dsgw = ((DatasetGraphWrapper)dsgw).getWrapped();
@@ -60,7 +61,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
return dsgw;
}
- /**
+ /**
* Unwrap a {@code DatasetGraph} to find the base {@code DatasetGraph}.
* Calls {@link #getBase} if the argument is a {@code DatasetGraphWrapper}.
* <p>
@@ -74,10 +75,10 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
return dsg;
return ((DatasetGraphWrapper)dsg).getBase();
}
-
+
/** Recursively unwrap a {@link DatasetGraphWrapper}, stopping at a {@link DatasetGraphWrapper}
- * that indicate it is "view changing", ie shows quads to the base dataset graph.
- *
+ * that indicate it is "view changing", ie shows quads to the base dataset graph.
+ *
* @return the first found {@link DatasetGraph} that is not an instance of {@link DatasetGraphWrapper}
*/
public final DatasetGraph getBaseForQuery() {
@@ -96,24 +97,24 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
* made based on that contract.
*/
protected DatasetGraph get() { return dsg; }
-
+
protected Context getCxt() { return context; }
- /** For operations that only read the DatasetGraph. */
+ /** For operations that only read the DatasetGraph. */
protected DatasetGraph getR() { return get(); }
-
- /** For operations that write the DatasetGraph. */
+
+ /** For operations that write the DatasetGraph. */
protected DatasetGraph getW() { return get(); }
-
+
/** For operations that get a handle on a graph. */
protected DatasetGraph getG() { return get(); }
-
+
/** For operations that pass on transaction actions. */
protected DatasetGraph getT() { return get(); }
/**
* Create a operations wrapper around {@code dsg}.
- * The {@link Context} of the wrapper is the context of the {@code dsg}.
+ * The {@link Context} of the wrapper is the context of the {@code dsg}.
*/
public DatasetGraphWrapper(DatasetGraph dsg) {
this(dsg, (dsg == null) ? null : dsg.getContext());
@@ -178,7 +179,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
@Override
public void delete(Node g, Node s, Node p, Node o)
{ getW().delete(g, s, p, o); }
-
+
@Override
public void deleteAny(Node g, Node s, Node p, Node o)
{ getW().deleteAny(g, s, p, o); }
@@ -186,11 +187,15 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
@Override
public void clear()
{ getW().clear(); }
-
+
@Override
public boolean isEmpty()
{ return getR().isEmpty(); }
-
+
+ @Override
+ public PrefixMap prefixes()
+ { return get().prefixes(); }
+
@Override
public Iterator<Quad> find()
{ return getR().find(); }
@@ -226,7 +231,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
@Override
public void close()
{ getW().close(); }
-
+
@Override
public String toString() {
DatasetGraph dsg = getR();
@@ -241,37 +246,37 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
@Override
public void begin() { getT().begin(); }
-
+
@Override
- public ReadWrite transactionMode()
+ public ReadWrite transactionMode()
{ return getT().transactionMode(); }
@Override
- public TxnType transactionType()
+ public TxnType transactionType()
{ return getT().transactionType(); }
-
+
@Override
public void begin(TxnType type)
{ getT().begin(type); }
@Override
- public void begin(ReadWrite readWrite)
+ public void begin(ReadWrite readWrite)
{ getT().begin(readWrite); }
@Override
public boolean promote()
{ return getT().promote(); }
-
+
@Override
public boolean promote(Promote type)
{ return getT().promote(type); }
-
+
@Override
- public void commit()
+ public void commit()
{ getT().commit(); }
@Override
- public void abort()
+ public void abort()
{ getT().abort(); }
@Override
@@ -279,15 +284,15 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
{ getT().end(); }
@Override
- public boolean isInTransaction()
- { return get().isInTransaction(); }
+ public boolean isInTransaction()
+ { return get().isInTransaction(); }
@Override
- public boolean supportsTransactions()
+ public boolean supportsTransactions()
{ return getT().supportsTransactions(); }
@Override
public boolean supportsTransactionAbort()
{ return getT().supportsTransactionAbort(); }
-
+
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
index 32f0469..07ec875 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
@@ -19,9 +19,11 @@
package org.apache.jena.sparql.core;
import org.apache.jena.graph.Graph;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapZero;
import org.apache.jena.sparql.graph.GraphZero;
-/** An always empty {@link DatasetGraph}.
+/** An always empty {@link DatasetGraph}.
* One graph (the default graph) with zero triples.
* No changes allowed - this is not a sink.
* @see DatasetGraphSink
@@ -34,6 +36,11 @@ public class DatasetGraphZero extends DatasetGraphNull {
protected Graph createGraph() {
return GraphZero.instance();
}
-
+
public DatasetGraphZero() {}
+
+ @Override
+ public PrefixMap prefixes() {
+ return PrefixMapZero.empty;
+ }
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
index f59e7b3..774dee7 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
@@ -22,36 +22,33 @@ import java.util.Iterator ;
import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.lib.Sync ;
-import org.apache.jena.graph.Capabilities;
-import org.apache.jena.graph.Node;
-import org.apache.jena.graph.TransactionHandler;
-import org.apache.jena.graph.Triple;
+import org.apache.jena.graph.*;
import org.apache.jena.graph.impl.GraphBase ;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.shared.AddDeniedException;
import org.apache.jena.shared.DeleteDeniedException;
import org.apache.jena.shared.JenaException ;
import org.apache.jena.shared.PrefixMapping ;
-import org.apache.jena.shared.impl.PrefixMappingImpl ;
import org.apache.jena.sparql.SystemARQ ;
import org.apache.jena.sparql.graph.GraphUnionRead ;
import org.apache.jena.util.iterator.ExtendedIterator ;
import org.apache.jena.util.iterator.WrappedIterator ;
/** Implement a Graph as a view of the DatasetGraph.
- *
- * It maps graph operations to quad operations.
- *
+ *
+ * It maps graph operations to quad operations.
+ *
* {@link GraphUnionRead} provides a union graph that does not assume quads, but loops on graphs.
- *
+ *
* @see GraphUnionRead
- */
+ */
public class GraphView extends GraphBase implements NamedGraph, Sync
{
// Beware this implements union graph - implementations may wish
// to do better so see protected method below.
-
+
static class GraphViewException extends JenaException
{
public GraphViewException() { super(); }
@@ -59,25 +56,25 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
public GraphViewException(Throwable cause) { super(cause) ; }
public GraphViewException(String message, Throwable cause) { super(message, cause) ; }
}
-
+
private final DatasetGraph dsg ;
// null for default graph.
- private final Node gn ;
+ private final Node graphName ;
private final TransactionHandlerView transactionHandler;
// Factory style.
public static GraphView createDefaultGraph(DatasetGraph dsg)
{ return new GraphView(dsg, Quad.defaultGraphNodeGenerated) ; }
-
+
public static GraphView createNamedGraph(DatasetGraph dsg, Node graphIRI)
{ return new GraphView(dsg, graphIRI) ; }
-
+
public static GraphView createUnionGraph(DatasetGraph dsg)
{ return new GraphView(dsg, Quad.unionGraph) ; }
protected GraphView(DatasetGraph dsg, Node gn) {
this.dsg = dsg ;
- this.gn = gn ;
+ this.graphName = gn ;
this.transactionHandler = new TransactionHandlerView(dsg);
}
@@ -87,24 +84,23 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
*/
@Override
public Node getGraphName() {
- return (gn == Quad.defaultGraphNodeGenerated) ? null : gn ;
+ return isDefaultGraph() ? null : graphName ;
}
/** Return the {@link DatasetGraph} we are viewing. */
public DatasetGraph getDataset() {
return dsg ;
}
-
- protected final boolean isDefaultGraph() { return isDefaultGraph(gn) ; }
- protected final boolean isUnionGraph() { return isUnionGraph(gn) ; }
+
+ protected final boolean isDefaultGraph() { return isDefaultGraph(graphName) ; }
+ protected final boolean isUnionGraph() { return isUnionGraph(graphName) ; }
protected static final boolean isDefaultGraph(Node gn) { return gn == null || Quad.isDefaultGraph(gn) ; }
protected static final boolean isUnionGraph(Node gn) { return Quad.isUnionGraph(gn) ; }
-
+
@Override
protected PrefixMapping createPrefixMapping() {
- // Subclasses should override this but in the absence of anything better ...
- return new PrefixMappingImpl() ;
+ return Prefixes.adapt(dsg.prefixes());
}
@Override
@@ -115,12 +111,12 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
Node o = m.getMatchObject() ;
return graphBaseFind(s, p, o) ;
}
-
+
@Override
protected ExtendedIterator<Triple> graphBaseFind(Node s, Node p, Node o) {
- if ( Quad.isUnionGraph(gn) )
+ if ( Quad.isUnionGraph(graphName) )
return graphUnionFind(s, p, o) ;
- Node g = graphNode(gn) ;
+ Node g = graphNode(graphName) ;
Iterator<Triple> iter = G.quads2triples(dsg.find(g, s, p, o)) ;
return WrappedIterator.createNoRemove(iter) ;
}
@@ -130,7 +126,7 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
}
protected ExtendedIterator<Triple> graphUnionFind(Node s, Node p, Node o) {
- Node g = graphNode(gn) ;
+ Node g = graphNode(graphName) ;
// Implementations may wish to do better so this is separated out.
// For example, Iter.distinctAdjacent is a lot cheaper than Iter.distinct
// but assumes things come back in a particular order
@@ -140,12 +136,12 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
iter = Iter.distinct(iter) ;
return WrappedIterator.createNoRemove(iter) ;
}
-
+
@Override
- public void performAdd( Triple t ) {
- Node g = graphNode(gn) ;
+ public void performAdd( Triple t ) {
+ Node g = graphNode(graphName) ;
if ( Quad.isUnionGraph(g) )
- throw new AddDeniedException("Can't update the union graph of a dataset") ;
+ throw new AddDeniedException("Can't update the union graph of a dataset") ;
Node s = t.getSubject() ;
Node p = t.getPredicate() ;
Node o = t.getObject() ;
@@ -154,15 +150,15 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
@Override
public void performDelete( Triple t ) {
- Node g = graphNode(gn) ;
+ Node g = graphNode(graphName) ;
if ( Quad.isUnionGraph(g) )
- throw new DeleteDeniedException("Can't update the union graph of a dataset") ;
+ throw new DeleteDeniedException("Can't update the union graph of a dataset") ;
Node s = t.getSubject() ;
Node p = t.getPredicate() ;
Node o = t.getObject() ;
dsg.delete(g, s, p, o) ;
}
-
+
@Override
public void remove(Node s, Node p, Node o) {
if ( getEventManager().listening() ) {
@@ -175,9 +171,18 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
// We know no one is listening ...
// getEventManager().notifyEvent(this, GraphEvents.remove(s, p, o) );
}
-
- /**
- * Subclasses may wish to provide {@code graphBaseSize} otherwise {@link GraphBase} uses {@code find()}.
+
+ @Override
+ public void clear() {
+ Node gn = getGraphName();
+ if ( gn == null )
+ gn = Quad.defaultGraphNodeGenerated;
+ getDataset().deleteAny(gn, Node.ANY, Node.ANY, Node.ANY);
+ getEventManager().notifyEvent(this, GraphEvents.removeAll);
+ }
+
+ /**
+ * Subclasses may wish to provide {@code graphBaseSize} otherwise {@link GraphBase} uses {@code find()}.
*/
@Override protected int graphBaseSize() { return super.graphBaseSize(); }
@@ -185,19 +190,19 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
public void sync() {
SystemARQ.sync(dsg);
}
-
+
@Override
public TransactionHandler getTransactionHandler() {
return new TransactionHandlerView(dsg);
}
-
+
@Override
- public Capabilities getCapabilities() {
- if (capabilities == null)
+ public Capabilities getCapabilities() {
+ if (capabilities == null)
capabilities = new GraphViewCapabilities();
return capabilities;
}
-
+
protected static class GraphViewCapabilities implements Capabilities {
@Override
public boolean sizeAccurate() {
@@ -231,7 +236,7 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
@Override
public boolean iteratorRemoveAllowed() {
- //Default for GraphViews is that iterators do not provide remove.
+ //Default for GraphViews is that iterators do not provide remove.
return false;
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
index 09ed4a3..b606f3a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
@@ -34,32 +34,26 @@ public class Prologue
protected PrefixMapping prefixMap = null ;
protected IRIResolver resolver = null ;
-
+
public Prologue() { prefixMap = new PrefixMappingImpl() ; }
-
+
public Prologue(PrefixMapping pmap)
- {
- this.prefixMap = pmap ;
+ {
+ this.prefixMap = pmap ;
this.resolver = null ;
}
-
+
public Prologue(PrefixMapping pmap, String base)
- {
+ {
this.prefixMap = pmap ;
setBaseURI(base) ;
}
-
+
public Prologue(PrefixMapping pmap, IRIResolver resolver)
{
- this.prefixMap = pmap ;
+ this.prefixMap = pmap ;
this.resolver = resolver ;
}
-
- public Prologue(Prologue other)
- {
- this.prefixMap = other.prefixMap ;
- this.resolver = other.resolver ;
- }
public Prologue copy()
{
@@ -68,10 +62,10 @@ public class Prologue
String baseURI = null ;
if ( resolver != null)
baseURI = resolver.getBaseIRIasString() ;
-
+
return new Prologue(prefixMap, baseURI) ;
}
-
+
// Reverse of sub()
public void usePrologueFrom(Prologue other)
{
@@ -80,10 +74,10 @@ public class Prologue
if ( other.resolver != null )
resolver = IRIResolver.create(getBaseURI()) ;
}
-
+
public Prologue sub(PrefixMapping newMappings) { return sub(newMappings, null) ; }
public Prologue sub(String base) { return sub(null, base) ; }
-
+
public Prologue sub(PrefixMapping newMappings, String base)
{
// New prefix mappings
@@ -96,9 +90,9 @@ public class Prologue
r = IRIResolver.create(base) ;
return new Prologue(ext, r) ;
}
-
+
/**
- * @return True if the query has an explicitly set base URI.
+ * @return True if the query has an explicitly set base URI.
*/
public boolean explicitlySetBaseURI() { return seenBaseURI ; }
@@ -122,9 +116,9 @@ public class Prologue
return ;
}
this.seenBaseURI = true ;
- this.resolver = IRIResolver.create(baseURI) ;
+ this.resolver = IRIResolver.create(baseURI) ;
}
-
+
/**
* @param resolver IRI resolver
*/
@@ -136,31 +130,31 @@ public class Prologue
return ;
}
this.seenBaseURI = true ;
- this.resolver = resolver ;
+ this.resolver = resolver ;
}
-
+
// ---- Query prefixes
-
+
/** Set a prefix for this query */
public void setPrefix(String prefix, String expansion)
{
try {
// Removal may involve regeneration of the reverse mapping
- // so only do if needed.
+ // so only do if needed.
String oldExpansion = prefixMap.getNsPrefixURI(prefix) ;
if ( Objects.equals(oldExpansion, expansion) )
return ;
if ( oldExpansion != null )
prefixMap.removeNsPrefix(prefix) ;
-
+
prefixMap.setNsPrefix(prefix, expansion) ;
} catch (PrefixMapping.IllegalPrefixException ex)
{
Log.warn(this, "Illegal prefix mapping(ignored): "+prefix+"=>"+expansion) ;
}
- }
+ }
- /** Return the prefix map from the parsed query */
+ /** Return the prefix map from the parsed query */
public PrefixMapping getPrefixMapping() { return prefixMap ; }
/** Set the mapping */
public void setPrefixMapping(PrefixMapping pmap ) { prefixMap = pmap ; }
@@ -173,12 +167,12 @@ public class Prologue
/** Get the IRI resolver */
public IRIResolver getResolver() { return resolver ; }
-
+
/** Set the IRI resolver */
public void setResolver(IRIResolver resolver) { this.resolver = resolver; }
-
- /** Expand prefixed name
- *
+
+ /** Expand prefixed name
+ *
* @param prefixed The prefixed name to be expanded
* @return URI, or null if not expanded.
*/
@@ -187,7 +181,7 @@ public class Prologue
{
//From PrefixMappingImpl.expandPrefix( String prefixed )
int colon = prefixed.indexOf( ':' );
- if (colon < 0)
+ if (colon < 0)
return null ;
else {
String prefix = prefixed.substring( 0, colon ) ;
@@ -197,35 +191,35 @@ public class Prologue
return uri + prefixed.substring( colon + 1 );
}
}
-
+
/** Use the prefix map to turn a URI into a qname, or return the original URI */
-
+
public String shortForm(String uri)
{
return prefixMap.shortForm(uri) ;
}
-
+
/** Test whether a Prologue will perform the same as this one. */
public boolean samePrologue(Prologue other) {
// Prologue are mutable and superclasses so .equals is left as the default.
String base1 = explicitlySetBaseURI() ? getBaseURI() : null ;
- String base2 = other.explicitlySetBaseURI() ? other.getBaseURI() : null ;
+ String base2 = other.explicitlySetBaseURI() ? other.getBaseURI() : null ;
if (! Objects.equals(base1, base2) )
return false ;
if ( getPrefixMapping() == null && other.getPrefixMapping() == null )
return true ;
if ( getPrefixMapping() == null )
return false ;
- return getPrefixMapping().samePrefixMappingAs(other.getPrefixMapping()) ;
+ return getPrefixMapping().samePrefixMappingAs(other.getPrefixMapping()) ;
}
// Caution.
// Prologues are inherited (historical).
// This is support code.
-
+
public static int hash(Prologue prologue) {
final int prime = 31 ;
- int x = 1 ;
+ int x = 1 ;
if ( prologue.seenBaseURI )
x = prime * x + prologue.getBaseURI().hashCode() ;
else
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
index ffacc0a..ceca76b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
@@ -39,10 +39,15 @@ import org.apache.jena.graph.Triple;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapStd;
import org.apache.jena.shared.Lock;
import org.apache.jena.shared.LockMRPlusSW;
import org.apache.jena.sparql.JenaTransactionException;
-import org.apache.jena.sparql.core.* ;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphTriplesQuads;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.core.Transactional;
import org.slf4j.Logger;
/**
@@ -53,7 +58,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
private static final Logger log = getLogger(DatasetGraphInMemory.class);
- private final DatasetPrefixStorage prefixes = new DatasetPrefixStorageInMemory();
+ private final PrefixMap prefixes = new PrefixMapStd();
/** This lock imposes the multiple-reader and single-writer policy of transactions */
private final Lock transactionLock = new LockMRPlusSW();
@@ -62,11 +67,11 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
* Transaction lifecycle operations must be atomic, especially
* {@link Transactional#begin} and {@link Transactional#commit}.
* <p>
- * There are changes to be made to several datastructures and this
+ * There are changes to be made to several datastructures and this
* insures that they are made consistently.
*/
private final ReentrantLock systemLock = new ReentrantLock(true);
-
+
/**
* Dataset version.
* A write transaction increments this in commit.
@@ -93,10 +98,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
* @return the current mode of the transaction in progress
*/
@Override
- public ReadWrite transactionMode() {
+ public ReadWrite transactionMode() {
return transactionMode.get();
}
-
+
@Override
public TxnType transactionType() {
return transactionType.get();
@@ -133,7 +138,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
this.quadsIndex = i;
this.defaultGraph = t;
}
-
+
@Override
public boolean supportsTransactions() { return true; }
@Override
@@ -146,12 +151,12 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
@Override
public void begin(TxnType txnType) {
- if (isInTransaction())
+ if (isInTransaction())
throw new JenaTransactionException("Transactions cannot be nested!");
transactionType.set(txnType);
_begin(txnType, TxnType.initial(txnType));
}
-
+
private void _begin(TxnType txnType, ReadWrite readWrite) {
// Takes transactionLock
startTransaction(txnType, readWrite);
@@ -161,8 +166,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
version.set(generation.get());
}) ;
}
-
- /** Called transaction start code at most once per transaction. */
+
+ /** Called transaction start code at most once per transaction. */
private void startTransaction(TxnType txnType, ReadWrite mode) {
transactionLock.enterCriticalSection(mode.equals(ReadWrite.READ)); // get the dataset write lock, if needed.
transactionType.set(txnType);
@@ -170,7 +175,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
isInTransaction(true);
}
- /** Called transaction ending code at most once per transaction. */
+ /** Called transaction ending code at most once per transaction. */
private void finishTransaction() {
isInTransaction.remove();
transactionType.remove();
@@ -185,12 +190,12 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
throw new JenaTransactionException("Tried to promote outside a transaction!");
if ( transactionMode().equals(ReadWrite.WRITE) )
return true;
-
+
if ( transactionType() == TxnType.READ )
return false;
-
+
boolean readCommitted = (promoteMode == Promote.READ_COMMITTED);
-
+
try {
_promote(readCommitted);
return true;
@@ -198,7 +203,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
return false ;
}
}
-
+
private void _promote(boolean readCommited) {
// Outside lock.
if ( ! readCommited && version.get() != generation.get() ) {
@@ -208,10 +213,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
// The final test is after we obtain the transactionLock.
throw new JenaTransactionException("Dataset changed - can't promote") ;
}
-
+
// Blocking on other writers.
transactionLock.enterCriticalSection(Lock.WRITE);
- // Check again now we are inside the lock.
+ // Check again now we are inside the lock.
if ( ! readCommited && version.get() != generation.get() ) {
// Can't promote - release the lock.
transactionLock.leaveCriticalSection();
@@ -245,10 +250,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
}
} ) ;
}
-
+
@Override
public void abort() {
- if (!isInTransaction())
+ if (!isInTransaction())
throw new JenaTransactionException("Tried to abort outside a transaction!");
if (transactionMode().equals(WRITE))
_abort();
@@ -263,7 +268,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
defaultGraph().end();
} ) ;
}
-
+
@Override
public void close() {
if (isInTransaction())
@@ -275,7 +280,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
if (isInTransaction()) {
if (transactionMode().equals(WRITE)) {
String msg = "end() called for WRITE transaction without commit or abort having been called. This causes a forced abort.";
- // _abort does _end actions inside the lock.
+ // _abort does _end actions inside the lock.
_abort() ;
finishTransaction();
throw new JenaTransactionException(msg);
@@ -285,14 +290,14 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
finishTransaction();
}
}
-
+
private void _end() {
withLock(systemLock, () -> {
quadsIndex().end();
defaultGraph().end();
} ) ;
}
-
+
private static void withLock(java.util.concurrent.locks.Lock lock, Runnable action) {
lock.lock();
try { action.run(); }
@@ -300,7 +305,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
lock.unlock();
}
}
-
+
private <T> T access(final Supplier<T> source) {
return isInTransaction() ? source.get() : calculateRead(this, source::get);
}
@@ -349,7 +354,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
public Graph getUnionGraph() {
return getGraph(Quad.unionGraph);
}
-
+
private Consumer<Graph> addGraph(final Node name) {
return g -> g.find().mapWith(t -> new Quad(name, t)).forEachRemaining(this::add);
}
@@ -364,7 +369,6 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
@Override
public void removeGraph(final Node graphName) {
mutate(removeGraph, getGraph(graphName));
- prefixes().removeAllFromPrefixMap(graphName.getURI()) ;
}
/**
@@ -396,7 +400,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
/**
* @return the prefixes in use in this dataset
*/
- public DatasetPrefixStorage prefixes() {
+ @Override
+ public PrefixMap prefixes() {
return prefixes;
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java
deleted file mode 100644
index de4a604..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.sparql.core.mem;
-
-import static org.apache.jena.sparql.core.Quad.defaultGraphIRI;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.shared.impl.PrefixMappingImpl;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
-
-/**
- * A simple {@link DatasetPrefixStorage} for in-memory datasets.
- */
-public class DatasetPrefixStorageInMemory implements DatasetPrefixStorage {
-
- private Map<String, PrefixMapping> prefixMappings = new ConcurrentHashMap<>();
-
- /**
- * A mapping from graph name to {@link PrefixMapping} for that graph.
- */
- private Map<String, PrefixMapping> prefixMappings() {
- return prefixMappings;
- }
-
- @Override
- public void close() {
- prefixMappings = null;
- }
-
- @Override
- public void sync() {
- // NO OP
- }
-
- @Override
- public Set<String> graphNames() {
- return prefixMappings().keySet();
- }
-
- @Override
- public String readPrefix(final String graphName, final String prefix) {
- return getPrefixMapping(graphName).getNsPrefixURI(prefix);
- }
-
- @Override
- public String readByURI(final String graphName, final String uriStr) {
- return getPrefixMapping(graphName).getNsURIPrefix(uriStr);
- }
-
- @Override
- public Map<String, String> readPrefixMap(final String graphName) {
- return getPrefixMapping(graphName).getNsPrefixMap();
- }
-
- @Override
- public void insertPrefix(final String graphName, final String prefix, final String uri) {
- getPrefixMapping(graphName).setNsPrefix(prefix, uri);
- }
-
- @Override
- public void loadPrefixMapping(final String graphName, final PrefixMapping pmap) {
- getPrefixMapping(graphName).setNsPrefixes(pmap);
- }
-
- @Override
- public void removeFromPrefixMap(final String graphName, final String prefix) {
- getPrefixMapping(graphName).removeNsPrefix(prefix);
- }
-
- @Override
- public void removeAllFromPrefixMap(String graphName) {
- getPrefixMapping(graphName).clearNsPrefixMap() ;
- }
-
- @Override
- public PrefixMapping getPrefixMapping() {
- return getPrefixMapping(defaultGraphIRI.getURI());
- }
-
- @Override
- public PrefixMapping getPrefixMapping(final String graphName) {
- return prefixMappings().computeIfAbsent(graphName, x -> new PrefixMappingImpl());
- }
-}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
index 53c864f..f6acc8b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
@@ -19,8 +19,8 @@
package org.apache.jena.sparql.core.mem;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
import org.apache.jena.sparql.core.GraphView;
/**
@@ -39,9 +39,7 @@ public class GraphInMemory extends GraphView {
@Override
protected PrefixMapping createPrefixMapping() {
- final DatasetPrefixStorage prefixes = datasetGraph().prefixes();
- return isDefaultGraph() || isUnionGraph() ? prefixes.getPrefixMapping() : prefixes
- .getPrefixMapping(getGraphName().getURI());
+ return Prefixes.adapt(datasetGraph.prefixes());
}
private DatasetGraphInMemory datasetGraph() {
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
index 5335eef..575783b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
@@ -42,7 +42,7 @@ import org.apache.jena.sparql.graph.NodeConst ;
/** Language for reading in a stream of bindings.
* See <a href="https://cwiki.apache.org/confluence/display/JENA/BindingIO">BindingIO</a>
- *
+ *
* <p>Summary:</p>
* <ul>
* <li>Directives:
@@ -50,7 +50,7 @@ import org.apache.jena.sparql.graph.NodeConst ;
* <li>VARS - list of variables.</li>
* <li>PREFIX</li>
* </ul>
- * </li>
+ * </li>
* <li>Lines of RDF terms (Turtle, no triple-quoted strings)</li>
* <li>Items on line align with last VARS declaration</li>
* <li>* for "same as last row"</li>
@@ -60,35 +60,35 @@ import org.apache.jena.sparql.graph.NodeConst ;
public class BindingInputStream extends LangEngine implements Iterator<Binding>, Closeable
{
// In effect, multiple Inheritance.
- // We implementation-inherit from LangEngine(no public methods)
- // and also IteratorTuples (redirecting calls to be object)
+ // We implementation-inherit from LangEngine(no public methods)
+ // and also IteratorTuples (redirecting calls to be object)
private final IteratorTuples iter ;
-
+
public BindingInputStream(InputStream in)
{
this(TokenizerText.create().source(in).build()) ;
}
-
+
public BindingInputStream(Tokenizer tokenizer)
{
this(tokenizer, profile()) ;
}
-
+
static ParserProfile profile()
{
// Don't do anything with IRIs or blank nodes.
- Prologue prologue = new Prologue(PrefixMapFactory.createForInput(), IRIResolver.createNoResolve()) ;
+ Prologue prologue = new Prologue(PrefixMapFactory.create(), IRIResolver.createNoResolve()) ;
ErrorHandler handler = ErrorHandlerFactory.getDefaultErrorHandler() ;
FactoryRDF factory = RiotLib.factoryRDF(LabelToNode.createUseLabelAsGiven()) ;
ParserProfile profile = RiotLib.createParserProfile(factory, handler, false);
return profile ;
}
-
+
/** Create an RDF Tuples parser.
- * No need to pass in a buffered InputStream; the code
+ * No need to pass in a buffered InputStream; the code
* will do its own buffering.
*/
-
+
private BindingInputStream(Tokenizer tokenizer, ParserProfile profile)
{
super(tokenizer, profile, profile.getErrorHandler()) ;
@@ -110,7 +110,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
@Override
public void remove()
{ iter.remove() ; }
-
+
public List<Var> vars()
{ return Collections.unmodifiableList(iter.vars) ; }
@@ -124,7 +124,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
{
directives() ;
}
-
+
private void directives()
{
while ( lookingAt(TokenType.KEYWORD) )
@@ -146,7 +146,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
break;
}
}
-
+
protected final static String KW_TRUE = "true" ;
protected final static String KW_FALSE = "false" ;
@@ -158,14 +158,14 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
BindingMap binding = BindingFactory.create() ;
int i = 0 ;
-
+
while( ! lookingAt(TokenType.DOT) )
{
if ( i >= vars.size() )
exception(peekToken(), "Too many items in a line. Expected "+vars.size()) ;
-
+
Var v = vars.get(i) ;
-
+
Token token = nextToken() ;
if ( ! token.hasType(TokenType.MINUS ) )
{
@@ -195,9 +195,9 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
}
if ( eof() )
exception(peekToken(), "Line does not end with a DOT") ;
-
+
Token dot = nextToken() ;
-
+
if ( i != vars.size() )
{
Var v = vars.get(vars.size()-1) ;
@@ -212,7 +212,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
{
return moreTokens() ;
}
-
+
private void directiveVars()
{
vars.clear() ;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
index f7ce736..c2af573 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
@@ -26,31 +26,31 @@ import org.apache.jena.sparql.engine.QueryIterator ;
import org.apache.jena.sparql.engine.binding.Binding ;
/** Repeatedly execute the subclass operation for each Binding in the input iterator. */
-
+
public abstract class QueryIterRepeatApply extends QueryIter1
{
- int count = 0 ;
- private QueryIterator currentStage ;
- private volatile boolean cancelRequested = false; // [CANCEL] needed? super.cancelRequest?
-
+ int count = 0 ;
+ private QueryIterator currentStage ;
+ private volatile boolean cancelRequested = false;
+
public QueryIterRepeatApply( QueryIterator input ,
ExecutionContext context)
{
super(input, context) ;
this.currentStage = null ;
-
+
if ( input == null )
{
Log.error(this, "[QueryIterRepeatApply] Repeated application to null input iterator") ;
return ;
}
}
-
+
protected QueryIterator getCurrentStage()
{
return currentStage ;
}
-
+
protected abstract QueryIterator nextStage(Binding binding) ;
@Override
@@ -58,22 +58,22 @@ public abstract class QueryIterRepeatApply extends QueryIter1
{
if ( isFinished() )
return false ;
-
+
for ( ;; )
{
if ( currentStage == null )
currentStage = makeNextStage() ;
-
+
if ( currentStage == null )
return false ;
-
+
if ( cancelRequested )
// Pass on the cancelRequest to the active stage.
performRequestCancel(currentStage);
-
+
if ( currentStage.hasNext() )
return true ;
-
+
// finish this step
currentStage.close() ;
currentStage = null ;
@@ -88,9 +88,9 @@ public abstract class QueryIterRepeatApply extends QueryIter1
if ( ! hasNextBinding() )
throw new NoSuchElementException(Lib.className(this)+".next()/finished") ;
return currentStage.nextBinding() ;
-
+
}
-
+
private QueryIterator makeNextStage()
{
count++ ;
@@ -101,21 +101,21 @@ public abstract class QueryIterRepeatApply extends QueryIter1
if ( !getInput().hasNext() )
{
getInput().close() ;
- return null ;
+ return null ;
}
-
+
Binding binding = getInput().next() ;
QueryIterator iter = nextStage(binding) ;
return iter ;
}
-
+
@Override
protected void closeSubIterator()
{
if ( currentStage != null )
currentStage.close() ;
}
-
+
@Override
protected void requestSubCancel()
{
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java
deleted file mode 100644
index 56b38ce..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.sparql.graph;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-
-import org.apache.jena.rdf.model.impl.Util;
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
-
-public class GraphPrefixesProjection implements PrefixMapping {
- private final String graphName;
- private final DatasetPrefixStorage prefixes;
-
- public GraphPrefixesProjection(String graphName, DatasetPrefixStorage prefixes)
- {
- this.graphName = graphName;
- this.prefixes = prefixes;
- }
-
- @Override
- public PrefixMapping setNsPrefix(String prefix, String uri) {
- prefixes.insertPrefix(graphName, prefix, uri);
- return this;
- }
-
- @Override
- public PrefixMapping removeNsPrefix(String prefix) {
- prefixes.removeFromPrefixMap(graphName, prefix);
- return this;
- }
-
- @Override
- public PrefixMapping clearNsPrefixMap() {
- prefixes.removeAllFromPrefixMap(graphName);
- return this;
- }
-
- @Override
- public PrefixMapping setNsPrefixes(PrefixMapping other) {
- setNsPrefixes(other.getNsPrefixMap());
- return this;
- }
-
- @Override
- public PrefixMapping setNsPrefixes(Map<String, String> map) {
- map.entrySet().forEach(entry->{
- setNsPrefix(entry.getKey(), entry.getValue());
- });
- return this;
- }
-
- @Override
- public PrefixMapping withDefaultMappings(PrefixMapping other) {
- other.getNsPrefixMap().entrySet().forEach(entry->{
- String prefix = entry.getKey();
- String uri = entry.getValue();
- if (getNsPrefixURI( prefix ) == null && getNsURIPrefix( uri ) == null)
- setNsPrefix( prefix, uri );
- });
- return this;
- }
-
- @Override
- public String getNsPrefixURI(String prefix) {
- return prefixes.readPrefix(graphName, prefix);
- }
-
- @Override
- public String getNsURIPrefix(String uri) {
- return prefixes.readByURI(graphName, uri);
- }
-
- @Override
- public Map<String, String> getNsPrefixMap() {
- return prefixes.readPrefixMap(graphName);
- }
-
- // From PrefixMappingImpl
- @Override
- public String expandPrefix(String prefixed) {
- {
- int colon = prefixed.indexOf(':');
- if ( colon < 0 )
- return prefixed;
- else {
- String prefix = prefixed.substring(0, colon);
- String uri = prefixes.readPrefix(graphName, prefix);
- return uri == null ? prefixed : uri + prefixed.substring(colon + 1);
- }
- }
- }
-
- @Override
- public String qnameFor(String uri) {
- int split = Util.splitNamespaceXML(uri);
- String ns = uri.substring(0, split);
- String local = uri.substring(split);
- if ( local.equals("") )
- return null;
- String prefix = prefixes.readByURI(graphName, ns);
- return prefix == null ? null : prefix + ":" + local;
- }
-
- @Override
- public String shortForm(String uri) {
- Optional<Entry<String, String>> e = findMapping(uri, true);
- if ( ! e.isPresent() )
- return uri;
- return e.get().getKey() + ":" + uri.substring((e.get().getValue()).length());
- }
-
- @Override
- public boolean hasNoMappings() {
- return getNsPrefixMap().isEmpty();
- }
-
- @Override
- public int numPrefixes() {
- return getNsPrefixMap().size();
- }
-
- private Optional<Entry<String, String>> findMapping( String uri, boolean partial )
- {
- return getNsPrefixMap().entrySet().stream().sequential().filter(e->{
- String ss = e.getValue();
- if (uri.startsWith( ss ) && (partial || ss.length() == uri.length()))
- return true;
- return false;
- }).findFirst();
- }
-
- @Override
- public PrefixMapping lock() {
- return this;
- }
-
- @Override
- public boolean samePrefixMappingAs(PrefixMapping other) {
- return this.getNsPrefixMap().equals(other.getNsPrefixMap());
- }
-
-}
-
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
index 0d0c236..76322c5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
@@ -24,50 +24,60 @@ import java.util.Objects;
import java.util.function.BiConsumer;
import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapAdapter;
import org.apache.jena.shared.PrefixMapping;
-/** Provided {@link PrefixMapping} for a {@link PrefixMap}. */
+/**
+ * Provided {@link PrefixMapping} for a {@link PrefixMap}.
+ *
+ * @see PrefixMapAdapter
+ */
+final
public class PrefixMappingAdapter extends PrefixMappingBase {
- private final PrefixMap pmap;
-
+ private final PrefixMap prefixMap;
+
public PrefixMappingAdapter(PrefixMap pmap) {
- this.pmap = pmap;
+ this.prefixMap = pmap;
}
-
+
+ public PrefixMap getPrefixMap() {
+ return prefixMap;
+ }
+
@Override
protected void add(String prefix, String uri) {
- pmap.add(prefix, uri);
+ prefixMap.add(prefix, uri);
}
@Override
protected void remove(String prefix) {
- pmap.delete(prefix);
+ prefixMap.delete(prefix);
}
@Override
protected void clear() {
- pmap.clear();
+ prefixMap.clear();
}
@Override
protected boolean isEmpty() {
- return pmap.isEmpty();
+ return prefixMap.isEmpty();
}
@Override
protected int size() {
- return pmap.size();
+ return prefixMap.size();
}
@Override
protected String prefixToUri(String prefix) {
- return pmap.getMapping().get(prefix);
+ return prefixMap.getMapping().get(prefix);
}
@Override
protected String uriToPrefix(String uri) {
- return pmap.getMapping().entrySet().stream()
+ return prefixMap.getMapping().entrySet().stream()
.filter(e->Objects.equals(uri, e.getValue().toString()))
.map(Entry::getKey)
.findFirst()
@@ -76,16 +86,16 @@ public class PrefixMappingAdapter extends PrefixMappingBase {
@Override
protected Map<String, String> asMap() {
- return pmap.getMapping();
+ return prefixMap.getMapping();
}
@Override
protected Map<String, String> asMapCopy() {
- return pmap.getMappingCopy();
+ return prefixMap.getMappingCopy();
}
@Override
protected void apply(BiConsumer<String, String> action) {
- pmap.forEach(action);
+ prefixMap.forEach(action);
}
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
index f7ad75c..5d4610d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
@@ -18,6 +18,8 @@
package org.apache.jena.sparql.graph;
+import static org.apache.jena.atlas.lib.Lib.unsupportedMethod;
+
import org.apache.jena.shared.PrefixMapping;
/** Immutable empty {@link PrefixMapping}. */
@@ -25,12 +27,12 @@ public class PrefixMappingZero extends PrefixMappingSink {
@Override
protected void add(String prefix, String uri) {
- throw new UnsupportedOperationException("add prefix");
+ throw unsupportedMethod(this, "add") ;
}
@Override
protected void remove(String prefix) {
- throw new UnsupportedOperationException("remove prefix");
+ throw unsupportedMethod(this, "remove") ;
}
@Override
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
index db165e5..39f3939 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
@@ -34,7 +34,7 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
public DifferenceDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) {
super(left, right, c);
}
-
+
private Graph difference(Function<DatasetGraph, Graph> op) {
return apply(DifferenceView::new, op);
}
@@ -73,7 +73,7 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
public long size() {
return getLeft().size();
}
-
+
static class DifferenceView extends Difference {
public DifferenceView(Graph L, Graph R) {
@@ -89,7 +89,13 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
public void performDelete(Triple t) {
throwNoMutationAllowed();
}
-
+
+ @Override
+ public void remove(Node s, Node p, Node o) {
+ throwNoMutationAllowed();
+ }
+
+
@Override
public void clear() {
throwNoMutationAllowed();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
index 063457c..ecd756b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
@@ -36,6 +36,8 @@ import org.apache.jena.graph.compose.MultiUnion;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapUnmodifiable;
import org.apache.jena.shared.Lock;
import org.apache.jena.sparql.JenaTransactionException;
import org.apache.jena.sparql.core.DatasetGraph;
@@ -57,6 +59,12 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
throw new UnsupportedOperationException("This view does not allow mutation!");
}
+
+ @Override
+ public PrefixMap prefixes() {
+ return new PrefixMapUnmodifiable(getLeft().prefixes());
+ }
+
@Override
public void commit() {
forEach(DatasetGraph::commit);
@@ -67,7 +75,7 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
begin(TxnType.READ);
}
-
+
@Override
public void begin(TxnType type) {
switch (type) {
@@ -84,11 +92,11 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
// no mutation allowed
return false;
}
-
+
@Override
public ReadWrite transactionMode() {
if ( ! isInTransaction() )
- return null;
+ return null;
return TxnType.convert(transactionType());
}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
index 469f64b..0ea7f33 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
@@ -30,7 +30,7 @@ import org.apache.jena.util.iterator.ExtendedIterator;
import org.apache.jena.util.iterator.NullIterator;
public class IntersectionDatasetGraph extends DyadicDatasetGraph {
-
+
public IntersectionDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) {
super(left, right, c);
}
@@ -79,7 +79,12 @@ public class IntersectionDatasetGraph extends DyadicDatasetGraph {
public void performDelete(Triple t) {
throwNoMutationAllowed();
}
-
+
+ @Override
+ public void remove(Node s, Node p, Node o) {
+ throwNoMutationAllowed();
+ }
+
@Override
public void clear() {
throwNoMutationAllowed();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
index 7cf1edb..2e564a3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
@@ -31,6 +31,7 @@ import org.apache.jena.query.QueryParseException ;
import org.apache.jena.riot.RiotException ;
import org.apache.jena.riot.system.PrefixMap ;
import org.apache.jena.riot.system.PrefixMapFactory ;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.riot.tokens.Token ;
import org.apache.jena.riot.tokens.Tokenizer ;
import org.apache.jena.riot.tokens.TokenizerText;
@@ -40,16 +41,16 @@ import org.apache.jena.sparql.sse.SSE ;
* Various convenience helper methods for converting to and from nodes
*/
public class NodeFactoryExtra {
- private static final PrefixMap prefixMappingDefault = PrefixMapFactory.createForInput(SSE.getPrefixMapRead()) ;
+ private static final PrefixMap prefixMappingDefault = Prefixes.adapt(SSE.getPrefixMapRead()) ;
/**
* Parse a node - with convenience prefix mapping
* <p>
* Allows surrounding white space
* </p>
- *
+ *
* @param nodeString Node string to parse
- *
+ *
*/
public static Node parseNode(String nodeString) {
return parseNode(nodeString, prefixMappingDefault) ;
@@ -62,7 +63,7 @@ public class NodeFactoryExtra {
* <p>
* Allows surrounding white space.
* </p>
- *
+ *
* @param nodeString Node string to parse
* @param pmap Prefix Map, null to use no prefix mappings
* @return Parsed Node
@@ -110,7 +111,7 @@ public class NodeFactoryExtra {
/**
* Node to int
- *
+ *
* @param node
* @return The int value or Integer.MIN_VALUE.
*/
@@ -125,7 +126,7 @@ public class NodeFactoryExtra {
/**
* Node to long
- *
+ *
* @param node
* @return The long value or Long.MIN_VALUE.
*/
@@ -140,7 +141,7 @@ public class NodeFactoryExtra {
/**
* Node to float
- *
+ *
* @param node
* @return The float value or Float.NaN
*/
@@ -156,7 +157,7 @@ public class NodeFactoryExtra {
/**
* Node to double
- *
+ *
* @param node
* @return The double value or Double.NaN
*/
@@ -171,7 +172,7 @@ public class NodeFactoryExtra {
/**
* int to Node
- *
+ *
* @param integer
* @return An xsd:integer
*/
@@ -181,7 +182,7 @@ public class NodeFactoryExtra {
/**
* long to Node
- *
+ *
* @param integer
* @return An xsd:integer
*/
@@ -191,7 +192,7 @@ public class NodeFactoryExtra {
/**
* float to Node
- *
+ *
* @param value
* @return An xsd:float
*/
@@ -201,7 +202,7 @@ public class NodeFactoryExtra {
/**
* double to Node
- *
+ *
* @param value
* @return An double
*/
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
index c76ed85..98321c9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
@@ -22,7 +22,9 @@ import java.util.Iterator;
import java.util.function.Function;
import org.apache.jena.atlas.iterator.Iter;
-import org.apache.jena.graph.*;
+import org.apache.jena.graph.Graph;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
import org.apache.jena.graph.compose.Union;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.Quad;
@@ -85,7 +87,7 @@ public class UnionDatasetGraph extends DyadicDatasetGraph {
public boolean isEmpty() {
return both(DatasetGraph::isEmpty);
}
-
+
static class UnionView extends Union {
public UnionView(Graph L, Graph R) {
@@ -101,7 +103,12 @@ public class UnionDatasetGraph extends DyadicDatasetGraph {
public void performDelete(Triple t) {
throwNoMutationAllowed();
}
-
+
+ @Override
+ public void remove(Node s, Node p, Node o) {
+ throwNoMutationAllowed();
+ }
+
@Override
public void clear() {
throwNoMutationAllowed();
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
index 7803faa..fcbb240 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
@@ -37,7 +37,7 @@ import org.junit.Test ;
/** System-level testing of the parsers - testing the parser plumbing, not the language details */
public class TestParserFactory
{
- @Test public void ntriples_01()
+ @Test public void ntriples_01()
{
{
String s = "<x> <p> <q> ." ;
@@ -51,7 +51,7 @@ public class TestParserFactory
}
// Old style, direct to LangRIOT -- very deprecated.
- // NQ version tests that relative URIs remain relative.
+ // NQ version tests that relative URIs remain relative.
Tokenizer tokenizer = TokenizerText.create().fromString("<x> <p> <q> .").build();
CatchParserOutput sink = new CatchParserOutput() ;
ParserProfile profile = makeParserProfile(IRIResolver.createNoResolve(), null, false);
@@ -64,7 +64,7 @@ public class TestParserFactory
assertEquals(SSE.parseTriple("(<x> <p> <q>)"), last(sink.triples)) ;
}
- @Test public void turtle_01()
+ @Test public void turtle_01()
{
// Verify the expected output works.
String s = "<x> <p> <q> ." ;
@@ -76,19 +76,19 @@ public class TestParserFactory
Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ;
assertEquals(t, last(sink.triples)) ;
}
-
+
private ParserProfile makeParserProfile(IRIResolver resolver, ErrorHandler errorHandler, boolean checking) {
if ( errorHandler == null )
errorHandler = ErrorHandlerFactory.errorHandlerStd;
- return new ParserProfileStd(RiotLib.factoryRDF(),
+ return new ParserProfileStd(RiotLib.factoryRDF(),
errorHandler,
resolver,
- PrefixMapFactory.createForInput(),
+ PrefixMapFactory.create(),
RIOT.getContext().copy(),
checking, false) ;
}
- @Test public void nquads_01()
+ @Test public void nquads_01()
{
String s = "<x> <p> <q> <g> ." ;
CatchParserOutput sink = parseCapture(s, Lang.NQ) ;
@@ -102,34 +102,34 @@ public class TestParserFactory
@Test public void nquads_dft_triple() {
// JENA-1854
- String s = "<x> <p> <q> ." ;
+ String s = "<x> <p> <q> ." ;
CatchParserOutput sink = parseCapture(s, Lang.NQ) ;
assertEquals(1, sink.startCalled) ;
assertEquals(1, sink.finishCalled) ;
assertEquals(0, sink.triples.size()) ;
assertEquals(1, sink.quads.size()) ;
-
+
Triple t = SSE.parseTriple("(<x> <p> <q>)") ;
Quad q = new Quad(Quad.defaultGraphNodeGenerated, t) ;
assertEquals(q, last(sink.quads)) ;
}
-
+
@Test public void trig_dft_triple() {
// JENA-1854
- String s = "{ <x> <p> <q> }" ;
+ String s = "{ <x> <p> <q> }" ;
CatchParserOutput sink = parseCapture(s, Lang.TRIG) ;
assertEquals(1, sink.startCalled) ;
assertEquals(1, sink.finishCalled) ;
assertEquals(0, sink.triples.size()) ;
assertEquals(1, sink.quads.size()) ;
-
+
Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ;
Quad q = new Quad(Quad.defaultGraphNodeGenerated, t) ;
assertEquals(q, last(sink.quads)) ;
}
-
- @Test public void trig_02()
+
+ @Test public void trig_02()
{
String s = "<g> { <x> <p> <q> }" ;
CatchParserOutput sink = parseCapture(s, Lang.TRIG) ;
@@ -148,8 +148,8 @@ public class TestParserFactory
return sink ;
}
- private static <T> T last(List<T> list)
- {
+ private static <T> T last(List<T> list)
+ {
if ( list.isEmpty() ) return null ;
return list.get(list.size()-1) ;
}
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java b/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
index 0556c5f..4f77e8b 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
@@ -27,7 +27,7 @@ import org.junit.runners.Suite.SuiteClasses ;
*
*/
@RunWith(Suite.class)
-@SuiteClasses({
+@SuiteClasses({
TestChecker.class
, TestStreamRDF.class
, TestFactoryRDF.class
@@ -37,8 +37,7 @@ import org.junit.runners.Suite.SuiteClasses ;
, TestPrefixMap.class
, TestPrefixMapWrapper.class
, TestPrefixMapOther.class
- , TestPrefixMapExtended1.class
-
+
, TestIO_JenaReaders.class
, TestIO_JenaWriters.class
, TestLangRegistration.class
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java b/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
index 6c9c9c8..6062f2e 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
@@ -26,6 +26,7 @@ import java.io.ByteArrayOutputStream ;
import java.util.Iterator ;
import java.util.Map ;
+import org.apache.jena.atlas.lib.Creator;
import org.apache.jena.query.Dataset ;
import org.apache.jena.query.DatasetFactory ;
import org.apache.jena.rdf.model.Model ;
@@ -39,8 +40,8 @@ import org.junit.Test ;
/** tests : JSONLD->RDF ; JSONLD->RDF->JSONLD */
public class TestJsonLDReadWrite
{
- private static String DIR = "testing/RIOT/jsonld/" ;
-
+ private static String DIR = "testing/RIOT/jsonld/" ;
+
@Test public void read_g01() { graphJ2R("graph1.jsonld", "graph1.ttl") ; }
@Test public void read_g02() { graphJ2R("graph2.jsonld", "graph2.ttl") ; }
@@ -80,59 +81,60 @@ public class TestJsonLDReadWrite
filename = DIR+filename ;
// Read in
Model model = RDFDataMgr.loadModel(filename) ;
-
+
// Write a JSON-LD
ByteArrayOutputStream out = new ByteArrayOutputStream() ;
RDFDataMgr.write(out, model, JSONLD) ;
ByteArrayInputStream r = new ByteArrayInputStream(out.toByteArray()) ;
-
+
// System.out.println();
// System.out.println(new String(out.toByteArray()));
// System.out.println();
-
- // Read as JSON-LD
+
+ // Read as JSON-LD
Model model2 = ModelFactory.createDefaultModel() ;
RDFDataMgr.read(model2, r, null, JSONLD) ;
-
+
// Compare
- if ( ! model.isIsomorphicWith(model2) )
+ if ( ! model.isIsomorphicWith(model2) )
System.out.println("## ---- DIFFERENT") ;
-
+
assertTrue(model.isIsomorphicWith(model2));
-
+
// Check namespaces in parsed graph match the original data
checkNamespaces(model2, model.getNsPrefixMap());
}
-
+
static void rtRJRds(String filename)
{
+ //Creator<Dataset> creator = ()->DatasetFactory.createTxnMem();
+ Creator<Dataset> creator = ()->DatasetFactory.createGeneral();
+
filename = DIR+filename ;
- Dataset ds1 = RDFDataMgr.loadDataset(filename) ;
-
+ Dataset ds1 = creator.create();
+ RDFDataMgr.read(ds1, filename) ;
+
// Write a JSON-LD
ByteArrayOutputStream out = new ByteArrayOutputStream() ;
RDFDataMgr.write(out, ds1, JSONLD) ;
ByteArrayInputStream r = new ByteArrayInputStream(out.toByteArray()) ;
-
-// System.out.println();
-// System.out.println(new String(out.toByteArray()));
-// System.out.println();
-
- // Read as JSON-LD
- @SuppressWarnings("deprecation")
- Dataset ds2 = DatasetFactory.createMem() ;
+
+ // Read as JSON-LD
+ // This must be the same kind of dataset as ds1 due to treatment of prefixes
+ // on individual graphs for legacy.
+ Dataset ds2 = creator.create();
RDFDataMgr.read(ds2, r, null, JSONLD) ;
-
+
if ( ! isIsomorphic(ds1, ds2) )
{
SSE.write(ds1) ;
SSE.write(ds2) ;
}
-
- assertTrue(isIsomorphic(ds1, ds2) ) ;
-
+
+ assertTrue(isIsomorphic(ds1, ds2) ) ;
+
// Check namespaces in the parsed dataset match those in the original data
- checkNamespaces(ds2.getDefaultModel(), ds1.getDefaultModel().getNsPrefixMap());
+ checkNamespaces(ds2.getDefaultModel(), ds1.getDefaultModel().getNsPrefixMap());
Iterator<String> graphNames = ds2.listNames();
while (graphNames.hasNext()) {
String gn = graphNames.next();
@@ -144,10 +146,10 @@ public class TestJsonLDReadWrite
{
return IsoMatcher.isomorphic(ds1.asDatasetGraph(), ds2.asDatasetGraph()) ;
}
-
+
private static void checkNamespaces(Model m, Map<String, String> namespaces) {
if (namespaces == null) return;
-
+
for (String prefix : namespaces.keySet()) {
if ( ! prefix.isEmpty() )
Assert.assertEquals("Model does contain expected namespace " + prefix + ": <" + namespaces.get(prefix) + ">", namespaces.get(prefix), m.getNsPrefixURI(prefix));
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
index 2affc61..35b3854 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
@@ -41,7 +41,6 @@ import org.apache.jena.riot.JsonLDWriteContext;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.riot.RDFWriter;
import org.apache.jena.riot.system.PrefixMap;
-import org.apache.jena.riot.system.RiotLib;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.util.Context;
import org.apache.jena.sparql.vocabulary.FOAF;
@@ -130,7 +129,7 @@ public class TestJsonLDWriter {
if (((RDFFormat.JSONLDVariant) f.getVariant()).isFrame()) continue;
String s = toString(m, f, null);
Model m2 = parse(s);
- assertTrue(m2.isIsomorphicWith(m));
+ assertTrue(m2.isIsomorphicWith(m));
}
}
@@ -170,7 +169,7 @@ public class TestJsonLDWriter {
// String js = "{\"p\":{\"@id\":\"http://www.a.com/foo/p\",\"@type\":\"@id\"},\"ex\":\"http://www.a.com/foo/\"}";
// constructing the js string ny hand:
- JsonObject obj = new JsonObject();
+ JsonObject obj = new JsonObject();
obj.put("@id", ns + "p");
obj.put("@type", "@id");
JsonObject json = new JsonObject();
@@ -184,7 +183,7 @@ public class TestJsonLDWriter {
// model wo prefix -> no more prefix string in result:
assertFalse(s2.contains(prefixStringInResult));
- // the model wo prefix, output as jsonld using a context that defines the prefix
+ // the model wo prefix, output as jsonld using a context that defines the prefix
JsonLDWriteContext jenaCtx = new JsonLDWriteContext();
jenaCtx.setJsonLDContext(js);
@@ -248,7 +247,7 @@ public class TestJsonLDWriter {
/**
* Checks that one can pass a context defined by its URI
- *
+ *
*/
@Test
public final void testContextByUri() {
@@ -367,7 +366,7 @@ public class TestJsonLDWriter {
String jsonld = toString(m, RDFFormat.JSONLD_FLAT, null);
- // without following line in JsonLDWriter, the test fails
+ // without following line in JsonLDWriter, the test fails
// if (! isLangString(o) && ! isSimpleString(o) )
String vv = "\"plangstring\":{\"@language\":\"fr\",\"@value\":\"a langstring\"}";
assertTrue(jsonld.contains(vv));
@@ -431,7 +430,7 @@ public class TestJsonLDWriter {
JsonLDWriteContext jenaCtx = new JsonLDWriteContext();
JsonLdOptions opts = new JsonLdOptions(null);
- opts.setCompactArrays(false);
+ opts.setCompactArrays(false);
jenaCtx.setOptions(opts);
@@ -484,7 +483,7 @@ public class TestJsonLDWriter {
m.setNsPrefix("", ns);
DatasetGraph g = DatasetFactory.wrap(m).asDatasetGraph();
- PrefixMap pm = RiotLib.prefixMap(g);
+ PrefixMap pm = g.prefixes();
String base = null;
Context jenaContext = null;
@@ -502,7 +501,7 @@ public class TestJsonLDWriter {
Object o = e.getValue();
if (o instanceof Map) {
o = ((Map<String, Object>) o).get("@id");
- }
+ }
if ((o != null) && (o instanceof String)) {
if (((String) o).equals(ns + e.getKey())) {
remove.add(e.getKey());
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
index e62527e..cf67432 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
@@ -35,6 +35,7 @@ import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.sparql.graph.GraphFactory ;
import org.apache.jena.sparql.sse.SSE ;
+import org.apache.jena.system.Txn;
import org.junit.Test ;
/** Test basic operations on a DatasetGraph
@@ -46,7 +47,7 @@ import org.junit.Test ;
public abstract class AbstractDatasetGraphTests
{
protected abstract DatasetGraph emptyDataset() ;
-
+
@Test public void create_1()
{
DatasetGraph dsg = emptyDataset() ;
@@ -54,8 +55,8 @@ public abstract class AbstractDatasetGraphTests
assertNotNull(dsg.getDefaultGraph()) ;
assertTrue(dsg.getDefaultGraph().isEmpty()) ;
}
-
- // Quad operations
+
+ // Quad operations
/*
* void add(Quad quad)
* void delete(Quad quad)
@@ -72,18 +73,18 @@ public abstract class AbstractDatasetGraphTests
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
dsg.add(quad) ;
assertTrue(dsg.contains(quad)) ;
-
+
Iterator<Quad> iter = dsg.find(quad) ;
assertTrue(iter.hasNext()) ;
Quad quad2 = iter.next();
assertFalse(iter.hasNext()) ;
assertEquals(quad, quad2) ;
-
+
// and the graph view.
assertTrue(dsg.getDefaultGraph().isEmpty()) ;
assertFalse(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
}
-
+
@Test public void quad_02()
{
DatasetGraph dsg = emptyDataset() ;
@@ -91,35 +92,35 @@ public abstract class AbstractDatasetGraphTests
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
dsg.add(quad) ;
dsg.containsGraph(NodeFactory.createURI("g")) ;
-
+
dsg.delete(quad) ;
assertTrue(dsg.isEmpty()) ;
assertTrue(dsg.getDefaultGraph().isEmpty()) ;
assertTrue(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
}
-
+
@Test public void quad_03()
{
DatasetGraph dsg = emptyDataset() ;
assertNotNull(dsg) ;
Quad quad1 = SSE.parseQuad("(quad <g> <s> <p> <o1>)") ;
Quad quad2 = SSE.parseQuad("(quad <g> <s> <p> <o2>)") ;
- dsg.add(quad1) ;
- dsg.add(quad2) ;
-
+ dsg.add(quad1) ;
+ dsg.add(quad2) ;
+
dsg.deleteAny(NodeFactory.createURI("g"), NodeFactory.createURI("s"), null, null) ;
- assertFalse(dsg.contains(quad1)) ;
- assertFalse(dsg.contains(quad2)) ;
+ assertFalse(dsg.contains(quad1)) ;
+ assertFalse(dsg.contains(quad2)) ;
}
-
+
@Test public void quad_04()
{
DatasetGraph dsg = emptyDataset() ;
assertNotNull(dsg) ;
Quad quad1 = SSE.parseQuad("(quad <g> <s> <p> <o1>)") ;
Quad quad2 = SSE.parseQuad("(quad <g> <s> <p> <o2>)") ;
- dsg.add(quad1) ;
- dsg.add(quad2) ;
+ dsg.add(quad1) ;
+ dsg.add(quad2) ;
Iterator<Quad> iter = dsg.find(NodeFactory.createURI("g"), NodeFactory.createURI("s"), null, null) ;
assertTrue(iter.hasNext()) ;
@@ -140,7 +141,7 @@ public abstract class AbstractDatasetGraphTests
Node p = SSE.parseNode("<p>") ;
Node o1 = SSE.parseNode("<o1>") ;
Node o2 = SSE.parseNode("<o2>") ;
-
+
dsg.add(g,s,p,o1) ;
assertTrue(dsg.contains(quad1)) ;
assertTrue(dsg.contains(g,s,p,o1)) ;
@@ -150,14 +151,14 @@ public abstract class AbstractDatasetGraphTests
/*
* getDefaultGraph()
- * getGraph(Node)
+ * getGraph(Node)
* containsGraph(Node)
- * ???? setDefaultGraph(Graph)
+ * ???? setDefaultGraph(Graph)
* addGraph(Node, Graph)
* removeGraph(Node)
* listGraphNodes()
*/
-
+
// Graph centric operations
@Test public void graph_00()
{
@@ -169,27 +170,27 @@ public abstract class AbstractDatasetGraphTests
dsg.addGraph(gn, g);
assertTrue(dsg.containsGraph(gn)) ;
}
-
+
// Graph centric operations
@Test public void graph_01()
{
DatasetGraph dsg = emptyDataset() ;
assertNotNull(dsg) ;
Node g = NodeFactory.createURI("g") ;
-
+
Triple t = SSE.parseTriple("(<s> <p> <o>)") ;
-
+
dsg.getGraph(g).add(t) ;
assertTrue(dsg.getGraph(g).contains(t)) ;
-
+
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
Iterator<Quad> iter = dsg.find(null, null, null, null) ;
-
+
assertTrue(iter.hasNext()) ;
Quad quad2 = iter.next();
assertFalse(iter.hasNext()) ;
assertEquals(quad, quad2) ;
-
+
assertTrue(dsg.getDefaultGraph().isEmpty()) ;
assertFalse(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
}
@@ -201,14 +202,14 @@ public abstract class AbstractDatasetGraphTests
assertNotNull(dsg) ;
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
dsg.add(quad) ;
-
+
Triple t = SSE.parseTriple("(<s> <p> <o>)") ;
dsg.getGraph(g).delete(t) ;
assertTrue(dsg.getDefaultGraph().isEmpty()) ;
assertTrue(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
- assertFalse(dsg.find(Node.ANY, Node.ANY, Node.ANY, Node.ANY).hasNext()) ;
+ assertFalse(dsg.find(Node.ANY, Node.ANY, Node.ANY, Node.ANY).hasNext()) ;
}
-
+
@Test public void graph_03()
{
Node g = NodeFactory.createURI("g") ;
@@ -218,7 +219,7 @@ public abstract class AbstractDatasetGraphTests
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
assertTrue(dsg.contains(quad)) ;
}
-
+
@Test public void find_01()
{
Node g1 = NodeFactory.createURI("g1") ;
@@ -227,13 +228,13 @@ public abstract class AbstractDatasetGraphTests
Quad quad2 = SSE.parseQuad("(quad <g2> <s2> <p2> <o2>)") ;
dsg.add(quad1) ;
dsg.add(quad2) ;
-
+
List<Quad> quads = Iter.toList(dsg.find(g1, null, null, null)) ;
assertEquals(1, quads.size()) ;
- Quad q = quads.get(0) ;
+ Quad q = quads.get(0) ;
assertEquals(quad1, q) ;
}
-
+
@Test public void deleteAny_01()
{
DatasetGraph dsg = emptyDataset() ;
@@ -243,7 +244,7 @@ public abstract class AbstractDatasetGraphTests
dsg.add(new Quad(Quad.defaultGraphIRI, subject, predicate, object));
dsg.deleteAny(Node.ANY, subject, null, null);
}
-
+
@Test public void deleteAny_02()
{
DatasetGraph dsg = emptyDataset() ;
@@ -251,20 +252,65 @@ public abstract class AbstractDatasetGraphTests
Node predicate = NodeFactory.createURI("http://example/p");
Node object1 = NodeFactory.createBlankNode();
Node object2 = NodeFactory.createBlankNode();
- Node graph = NodeFactory.createURI("http://example/g") ;
-
+ Node graph = NodeFactory.createURI("http://example/g") ;
+
dsg.add(graph, subject, predicate, object1);
dsg.add(graph, subject, predicate, object2);
-
+
dsg.deleteAny(Quad.defaultGraphIRI, null, null, null);
List<Quad> quads = Iter.toList(dsg.find(graph, null, null, null)) ;
assertEquals(2, quads.size()) ;
-
+
dsg.deleteAny(graph, null, null, null);
quads = Iter.toList(dsg.find(graph, null, null, null)) ;
assertEquals(0, quads.size()) ;
}
-
+ @Test public void deleteAny_03()
+ {
+ DatasetGraph dsg = emptyDataset() ;
+ Node subject = NodeFactory.createURI("http://example/s");
+ Node predicate = NodeFactory.createURI("http://example/p");
+ Node object1 = NodeFactory.createBlankNode();
+ Node object2 = NodeFactory.createBlankNode();
+ Node graph = NodeFactory.createURI("http://example/g") ;
+
+ dsg.getDefaultGraph().add(Triple.create(subject, predicate, object1));
+ dsg.getGraph(graph).add(Triple.create(subject, predicate, object2));
+
+ dsg.deleteAny(Quad.defaultGraphIRI, null, null, null);
+ List<Quad> quads = Iter.toList(dsg.find(Quad.defaultGraphIRI, null, null, null)) ;
+ assertEquals(0, quads.size()) ;
+
+ dsg.deleteAny(graph, null, null, null);
+ quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+ assertEquals(0, quads.size()) ;
+ }
+
+ @Test public void deleteAny_04()
+ {
+ DatasetGraph dsg = emptyDataset() ;
+
+ Node subject = NodeFactory.createURI("http://example/s");
+ Node predicate = NodeFactory.createURI("http://example/p");
+ Node object1 = NodeFactory.createBlankNode();
+ Node object2 = NodeFactory.createBlankNode();
+ Node graph = NodeFactory.createURI("http://example/g") ;
+ Node graph2 = NodeFactory.createURI("http://example/abc") ;
+
+ dsg.add(graph, subject, predicate, object1);
+ dsg.add(graph, subject, predicate, object2);
+
+ dsg.deleteAny(graph2, null, null, null);
+
+ List<Quad> quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+ assertEquals(2, quads.size()) ;
+
+ dsg.deleteAny(graph, null, null, null);
+
+ quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+ assertEquals(0, quads.size()) ;
+ }
+
@Test public void clear_01() {
DatasetGraph dsg = emptyDataset() ;
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
@@ -273,20 +319,49 @@ public abstract class AbstractDatasetGraphTests
dsg.add(quad) ;
assertFalse(dsg.isEmpty()) ;
assertTrue(dsg.containsGraph(gn)) ;
-
+
dsg.clear() ;
-
+
assertTrue(dsg.isEmpty()) ;
assertFalse(dsg.containsGraph(gn)) ;
}
-
- // Quad delete causes graph to not be visable.
+
+ @Test public void graph_clear_1() {
+ DatasetGraph dsg = emptyDataset() ;
+ if ( ! dsg.supportsTransactions() )
+ return;
+ Quad quad = SSE.parseQuad("(<g> <s> <p> 0)") ;
+ Node gn = quad.getGraph();
+ Txn.executeWrite(dsg, ()->{
+ dsg.add(quad);
+ dsg.getGraph(gn).clear();
+ assertTrue(dsg.isEmpty());
+ });
+ }
+
+ // Check that clear does not leak.
+ @Test public void graph_clear_2() {
+ DatasetGraph dsg = emptyDataset() ;
+ if ( ! dsg.supportsTransactions() )
+ return;
+ Quad quad = SSE.parseQuad("(<g> <s> <p> 0)") ;
+ Node gn = quad.getGraph();
+ Node gnx = NodeFactory.createURI("xyz");
+ Txn.executeWrite(dsg, ()->{
+ dsg.add(quad);
+ dsg.getGraph(gnx).clear();
+ assertFalse(dsg.isEmpty());
+ assertFalse(dsg.getGraph(gn).isEmpty());
+ });
+ }
+
+ // Quad delete causes graph to not be visible.
// Not valid for all datasets (e.g. DatasetGraphMapLink)
@Test public void emptyGraph_1() {
DatasetGraph dsg = emptyDataset() ;
Node gn = NodeFactory.createURI("http://example/g") ;
Quad q = SSE.parseQuad("(:g :s :p :o)");
-
+
dsg.add(q);
List<Node> nodes1 = Iter.toList(dsg.listGraphNodes());
assertEquals(1, nodes1.size());
@@ -294,19 +369,19 @@ public abstract class AbstractDatasetGraphTests
List<Node> nodes2 = Iter.toList(dsg.listGraphNodes());
assertEquals(0, nodes2.size());
}
-
+
@Test public void emptyGraph_2() {
DatasetGraph dsg = emptyDataset() ;
Node gn = NodeFactory.createURI("http://example/g") ;
Quad q = SSE.parseQuad("(:g :s :p :o)");
-
+
dsg.add(q);
assertTrue(dsg.containsGraph(gn));
-
+
dsg.delete(q);
assertFalse(dsg.containsGraph(gn));
}
-
+
@Test public void listGraphNodes_1() {
DatasetGraph dsg = emptyDataset();
Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
@@ -317,7 +392,7 @@ public abstract class AbstractDatasetGraphTests
Node gn2 = x.get(0);
assertEquals(gn, gn2);
}
-
+
@Test public void listGraphNodes_2() {
DatasetGraph dsg = emptyDataset();
Quad quad1 = SSE.parseQuad("(quad <g1> <s> <p> <o>)") ;
@@ -332,7 +407,7 @@ public abstract class AbstractDatasetGraphTests
boolean b = ListUtils.equalsUnordered(e, x);
assertTrue(b);
}
-
+
@Test public void listGraphNodes_3() {
DatasetGraph dsg = emptyDataset();
Quad quad1 = SSE.parseQuad("(quad _ <s> <p> <o>)") ;
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
index 1cea767..c58f341 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
@@ -24,18 +24,21 @@ import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.graph.impl.GraphBase ;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapStd;
import org.apache.jena.util.iterator.ExtendedIterator ;
import org.apache.jena.util.iterator.WrappedIterator ;
-/** Very simple, non-scalable DatasetGraph implementation
+/** Very simple, non-scalable DatasetGraph implementation
* of a triples+quads style for testing the {@link DatasetGraphTriplesQuads}
- * style implementation framework.
+ * style implementation framework.
*/
public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements TransactionalNotSupportedMixin
{
private MiniSet<Triple> triples = new MiniSet<>() ;
private MiniSet<Quad> quads = new MiniSet<>() ;
-
+ private PrefixMap prefixes = new PrefixMapStd();
+
/** Simple abstraction of a Set */
private static class MiniSet<T> implements Iterable<T> {
final Collection<T> store;
@@ -70,7 +73,7 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
return store.size();
}
}
-
+
public DatasetGraphSimpleMem() {}
@Override
@@ -109,7 +112,7 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
/** Convert null to Node.ANY */
public static Node nullAsAny(Node x) { return nullAsDft(x, Node.ANY) ; }
-
+
/** Convert null to some default Node */
public static Node nullAsDft(Node x, Node dft) { return x==null ? dft : x ; }
@@ -221,6 +224,11 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
return graphNodes().iterator();
}
+ @Override
+ public PrefixMap prefixes() {
+ return prefixes;
+ }
+
private Set<Node> graphNodes() {
Set<Node> x = new HashSet<>();
for ( Quad q : quads )
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java b/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
index ed29964..5d52f14 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.assertNotNull;
import org.apache.jena.shared.PrefixMapping ;
import org.junit.Test ;
-/** Tests for when the prefix mapping,of the graph it comes from, is view */
+/** Tests, for when the prefix mapping of the graph it comes from its view */
public abstract class AbstractTestPrefixMappingView
{
static final String defaultPrefixURI = "" ;
@@ -32,50 +32,50 @@ public abstract class AbstractTestPrefixMappingView
/** Create a fresh PrefixMapping */
protected abstract PrefixMapping create() ;
/** Create a fresh view over the same storage as last create() */
- protected abstract PrefixMapping view() ;
-
+ protected abstract PrefixMapping view() ;
+
@Test public void prefix1()
{
PrefixMapping pmap = create() ;
}
-
+
@Test public void prefix2()
{
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex", "http://example/") ;
assertNotNull(pmap.getNsPrefixURI("ex")) ;
}
-
+
@Test public void prefix3()
{
String uri = "http://example/" ;
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex", uri) ;
-
+
// Create a second view onto the same storage.
-
+
PrefixMapping pmap2 = view() ;
String x = pmap2.getNsPrefixURI("ex") ;
-
+
assertNotNull(x) ;
assertEquals(uri,x) ;
}
-
+
@Test public void prefix4()
{
String uri = "http://example/" ;
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex", uri) ;
-
+
assertEquals("ex", pmap.getNsURIPrefix("http://example/")) ;
}
-
+
@Test public void prefix5()
{
String uri = "http://example/" ;
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex", uri) ;
-
+
assertEquals(uri+"foo", pmap.expandPrefix("ex:foo")) ;
}
@@ -84,7 +84,7 @@ public abstract class AbstractTestPrefixMappingView
String uri = "http://example/" ;
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex", uri) ;
-
+
assertEquals("ex:foo", pmap.qnameFor("http://example/foo")) ;
}
@@ -92,21 +92,21 @@ public abstract class AbstractTestPrefixMappingView
{
String uri1 = "http://example/" ;
String uri2 = "http://example/ns#" ;
-
+
PrefixMapping pmap = create() ;
pmap.setNsPrefix("ex1", uri1) ;
pmap.setNsPrefix("ex2", uri2) ;
assertEquals("ex2:foo", pmap.qnameFor("http://example/ns#foo")) ;
}
-
+
@Test public void prefix8()
{
PrefixMapping pmap = create() ;
String x = "scheme:i_do_not_exist" ;
-
+
assertEquals(x, pmap.expandPrefix(x)) ;
- // Call again - used to cause problems.
+ // Call again - used to cause problems.
assertEquals(x, pmap.expandPrefix(x)) ;
}
-
+
}
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java b/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
index 3918a92..49e0086 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
@@ -90,44 +90,45 @@ public abstract class AbstractTestDyadicDatasetGraph {
public void noClearing() {
emptyDsg().clear();
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noAddingToDefaultGraph() {
emptyDsg().getDefaultGraph().add(null);
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noDeletingFromDefaultGraph() {
emptyDsg().getDefaultGraph().delete(null);
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noAddingToANamedGraph() {
Node graphName = NodeFactory.createBlankNode();
emptyDsg().getGraph(graphName).add(null);
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noDeletingFromANamedGraph() {
Node graphName = NodeFactory.createBlankNode();
emptyDsg().getGraph(graphName).delete(null);
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noClearingDefaultGraph() {
emptyDsg().getDefaultGraph().clear();
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noClearingANamedGraph() {
Node graphName = NodeFactory.createBlankNode();
emptyDsg().getGraph(graphName).clear();
}
-
+
@Test(expected = UnsupportedOperationException.class)
public void noRemovingFromANamedGraph() {
Node graphName = NodeFactory.createBlankNode();
- emptyDsg().getGraph(graphName).remove(null, null, null);
+ emptyDsg().getGraph(graphName)
+ .remove(null, null, null);
}
// Read lifecycle.
@@ -140,7 +141,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
dsg.commit();
dsg.end();
}
-
+
@Test
public void txnRead2() {
final DatasetGraph dsg = emptyDsg();
@@ -149,7 +150,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
assertTrue(dsg.isInTransaction());
dsg.end();
}
-
+
@Test
public void txnRead3() {
final DatasetGraph dsg = emptyDsg();
@@ -160,7 +161,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
assertEquals(TxnType.READ, dsg.transactionType());
dsg.end();
}
-
+
@Test(expected = JenaTransactionException.class)
public void noWriting1() {
emptyDsg().begin(ReadWrite.WRITE);
@@ -180,7 +181,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
public void noWriting4() {
emptyDsg().begin(TxnType.READ_COMMITTED_PROMOTE);
}
-
+
@Test
public void noPromoting() {
final DatasetGraph dsg = emptyDsg();
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
index 871c699..8a2d275 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
@@ -77,6 +77,11 @@ public class Lib
return "null" ;
return cls.getSimpleName() ;
}
+
+ /** Create {@link UnsupportedOperationException} with formatted message. */
+ static public UnsupportedOperationException unsupportedMethod(Object object, String method) {
+ return new UnsupportedOperationException(Lib.className(object) + "." + method);
+ }
/** Do two lists have the same elements? */
public static <T> boolean equalsListAsSet(List<T> list1, List<T> list2) {
diff --git a/jena-cmds/src/main/java/tdb/tdbconfig.java b/jena-cmds/src/main/java/tdb/tdbconfig.java
index 99aea15..4fd1e13 100644
--- a/jena-cmds/src/main/java/tdb/tdbconfig.java
+++ b/jena-cmds/src/main/java/tdb/tdbconfig.java
@@ -22,13 +22,12 @@ package tdb;
import java.util.List ;
import java.util.Map ;
+import arq.cmdline.CmdARQ ;
import jena.cmd.ModVersion;
-
import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.atlas.lib.DateTimeUtils ;
import org.apache.jena.graph.Node ;
-import org.apache.jena.shared.PrefixMapping ;
-import org.apache.jena.sparql.core.DatasetPrefixStorage ;
+import org.apache.jena.riot.system.PrefixMap;
import org.apache.jena.tdb.TDB ;
import org.apache.jena.tdb.base.file.FileFactory ;
import org.apache.jena.tdb.base.file.Location ;
@@ -37,12 +36,11 @@ import org.apache.jena.tdb.setup.Build ;
import org.apache.jena.tdb.solver.stats.Stats ;
import org.apache.jena.tdb.solver.stats.StatsResults ;
import org.apache.jena.tdb.store.DatasetGraphTDB ;
+import org.apache.jena.tdb.store.DatasetPrefixStorage;
import org.apache.jena.tdb.sys.DatasetControlNone ;
-
import tdb.cmdline.CmdSub ;
import tdb.cmdline.CmdTDB ;
import tdb.cmdline.CmdTDBGraph ;
-import arq.cmdline.CmdARQ ;
/** Tools to manage a TDB store. Subcommand based. */
public class tdbconfig extends CmdSub
@@ -53,7 +51,7 @@ public class tdbconfig extends CmdSub
static final String CMD_NODES = "nodes" ;
static final String CMD_INFO = "info" ;
static final String CMD_PREFIXES = "prefixes" ;
-
+
static public void main(String... argv)
{
CmdTDB.init() ;
@@ -65,30 +63,30 @@ public class tdbconfig extends CmdSub
super(argv) ;
// super.addSubCommand(CMD_CLEAN, new Exec()
// { @Override public void exec(String[] argv) { new tdbclean(argv).main() ; } }) ;
-
+
super.addSubCommand(CMD_HELP, new Exec()
{ /*@Override*/ @Override
public void exec(String[] argv) { new SubHelp(argv).mainRun() ; } }) ;
-
+
super.addSubCommand(CMD_STATS, new Exec()
{ /*@Override*/ @Override
public void exec(String[] argv) { new SubStats(argv).mainRun() ; } }) ;
-
+
super.addSubCommand(CMD_NODES, new Exec()
{ /*@Override*/ @Override
public void exec(String[] argv) { new SubNodes(argv).mainRun() ; } }) ;
-
+
super.addSubCommand(CMD_INFO, new Exec()
{ /*@Override*/ @Override
public void exec(String[] argv) { new SubInfo(argv).mainRun() ; } }) ;
-
+
super.addSubCommand(CMD_PREFIXES, new Exec()
{ /*@Override*/ @Override
public void exec(String[] argv) { new SubPrefixes(argv).mainRun() ; } }) ;
-
+
}
-
+
static class SubPrefixes extends CmdTDB
{
public SubPrefixes(String ... argv)
@@ -111,14 +109,14 @@ public class tdbconfig extends CmdSub
for ( String gn : prefixes.graphNames() )
{
System.out.println("Graph: "+gn) ;
- PrefixMapping pmap = prefixes.getPrefixMapping(gn) ;
- Map<String, String> x = pmap.getNsPrefixMap() ;
+ PrefixMap pmap = prefixes.getPrefixMap(gn) ;
+ Map<String, String> x = pmap.getMapping();
for ( String k : x.keySet() )
System.out.printf(" %-10s %s\n", k+":", x.get(k)) ;
}
}
}
-
+
// Subcommand : help
class SubHelp extends CmdARQ
{
@@ -127,7 +125,7 @@ public class tdbconfig extends CmdSub
super(argv) ;
//super.addModule(modSymbol) ;
}
-
+
@Override
protected String getSummary()
{
@@ -143,7 +141,7 @@ public class tdbconfig extends CmdSub
for ( String name : subCommandNames() )
{
- out.println(name) ;
+ out.println(name) ;
}
out.decIndent() ;
out.flush() ;
@@ -155,7 +153,7 @@ public class tdbconfig extends CmdSub
return "tdbconfig help" ;
}
}
-
+
static class SubStats extends CmdTDBGraph
{
public SubStats(String ... argv)
@@ -163,7 +161,7 @@ public class tdbconfig extends CmdSub
super(argv) ;
//super.addModule(modSymbol) ;
}
-
+
@Override
protected String getSummary()
{
@@ -185,14 +183,14 @@ public class tdbconfig extends CmdSub
return "tdbconfig stats" ;
}
}
-
+
static class SubNodes extends CmdTDB
{
public SubNodes(String ... argv)
{
super(argv) ;
}
-
+
@Override
protected String getSummary()
{
@@ -224,7 +222,7 @@ public class tdbconfig extends CmdSub
{
super(argv) ;
}
-
+
@Override
protected String getSummary()
{
@@ -246,5 +244,5 @@ public class tdbconfig extends CmdSub
return "tdbconfig info" ;
}
}
-
+
}
diff --git a/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java b/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
index 7e4572a..2353775 100644
--- a/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
+++ b/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
@@ -26,10 +26,10 @@ import org.apache.jena.rdf.model.impl.ModelCom ;
/**
* Model wrapper which provides normal access to an underlying model but
- * also maintains a snapshot of the triples it was last known to contain.
+ * also maintains a snapshot of the triples it was last known to contain.
* A snapshot action
* causes the set of changes between this and the previous snapshot to
- * be calculated and the cache updated. The snapshot process will also
+ * be calculated and the cache updated. The snapshot process will also
* fire change notification.
*/
@@ -41,7 +41,7 @@ public class MonitorModel extends ModelCom {
public MonitorModel(Model base) {
super(new MonitorGraph(base.getGraph()));
}
-
+
/**
* Compute the differences between the current monitored graph and the last
* snapshot. The changes will also be forwarded to any listeners.
@@ -66,7 +66,7 @@ public class MonitorModel extends ModelCom {
}
}
}
-
+
/**
* Compute the differences between the current monitored graph and the last
* snapshot, forward any changes to registered listeners, then take a new snapshot.
@@ -74,5 +74,5 @@ public class MonitorModel extends ModelCom {
public void snapshot() {
snapshot(null, null);
}
-
+
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
index 153b24e..c44aead 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
@@ -30,7 +30,7 @@ public interface DatabaseRDF {
/**
* @return the prefixes storage.
*/
- public StoragePrefixes getPrefixes();
+ public StoragePrefixes getStoragePrefixes();
/**
* @return the {@link Transactional} for this database.
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java
deleted file mode 100644
index 132825c..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.dboe.storage;
-
-import org.apache.jena.graph.Node;
-import org.apache.jena.graph.NodeFactory;
-
-public class Prefixes {
- //Distinguished nodes:
- // Default graph : Quad.defaultGraphNodeGenerated would have been preferred.
- // For compatibility reasons, in TDB2, this is the URI <> (empty string).
- // "whole dataset" : <urn:x-arq:Dataset> (maybe reserved NodeFactory.createLiteral("") or URI <$>
-
- // Name assigned to the default graph.
- // For backwards compatibility of TDB2 , this an (unresolved) URI <>.
- /** Name assigned to the default graph. */
- public static Node nodeDefaultGraph = NodeFactory.createURI("");
-
- /** Name for dataset prefixes. */
- public static Node nodeDataset = nodeDefaultGraph; //NodeFactory.createURI("urn:x-arq:Dataset");
-
-
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
index 3718558..3e343b6 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
@@ -21,8 +21,9 @@ import java.util.Iterator;
import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
+import org.apache.jena.riot.system.Prefixes;
/** Like PrefixMapping, only for a dataset which can have different prefix maps for different graphs.
* There is a distinguished name {@linkplain Prefixes#nodeDataset} that means the prefixes
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
index 905ed34..b28922f 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
@@ -44,14 +44,14 @@ import org.apache.jena.sparql.core.Quad;
* Various API operations work on "concrete" terms. For example, {@code add}. These are
* marked "concrete operation" in their javadoc. They are not matching operations. A
* concrete term is one of a URI, blank node or literal. It is not {@code null},
- * {@code Node#ANY} nor a named variable. Any {@code Triple} or {@code Quad} must be
+ * {@code Node.ANY} nor a named variable. Any {@code Triple} or {@code Quad} must be
* composed of concrete terms.
* <p>
* A pattern operation is one where the arguments are concrete terms or wildcard
* {@code ANY}. Such an operation will match zero or more triples or quads.
- * Any {@code Triple} or {@code Quad} can use {@code.ANY}.
+ * Any {@code Triple} or {@code Quad} can use {@code ANY}.
* <p>Pattern operations do not match named variables.
- * Using {@code Node#ANY} rather than {@code null} is preferred in pattern operations but
+ * Using {@code Node.ANY} rather than {@code null} is preferred in pattern operations but
* both are acceptable.
*/
public interface StorageRDF {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java
deleted file mode 100644
index 1a71853..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed 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.
- *
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.riot.system.PrefixMap;
-import org.apache.jena.shared.PrefixMapping;
-
-/**
- * Interface for lightweight prefix maps as an implementation and storage view. This
- * is similar to {@link PrefixMapping} from Jena Core but it omits any reverse lookup
- * functionality (URI to prefix) and does not impose XML-specific rules (e.g. local
- * names must start with a letter).
- * <p>
- * The contract does not require an implementation to do any validation unlike the
- * Jena Core {@link PrefixMapping} which requires validation of prefixes.
- * </p>
- *
- * @implNote The package {@code org.apache.jena.dboe.storage.prefixes} in module
- * {@code jena-dboe-storage} provides implementations that work with
- * {@code StoragePrefixes} which is dataset provision of prefixes on per-named
- * graph basis.
- */
-public interface PrefixMapI extends Iterable<PrefixEntry>, PrefixMap
-{
- /** Returns the underlying mapping.
- * Do not modify this map, call interface operations.
- */
- @Override
- public Map<String, String> getMapping();
-
- /** Returns a copy of the underlying mapping */
- @Override
- public default Map<String, String> getMappingCopy() {
- return this.stream().collect(Collectors.toMap((e) -> e.getPrefix(), (e) -> e.getUri()));
- }
-
- /* Return the underlying PrefixMapStorage - optional operation, may return null */
- public StoragePrefixMap getPrefixMapStorage();
-
- /** Add a prefix, overwrites any existing association */
- @Override
- public void add(String prefix, String iriString);
-
- /** Merge one {@code PrefixMap} into another. */
- @Override
- public default void putAll(PrefixMap pmap) {
- pmap.forEach(this::add);
- }
-
- @Override
- public default void putAll(PrefixMapping pmap) {
- pmap.getNsPrefixMap().forEach(this::add);
- }
-
- /** Merge all the entries from the map into this {@link PrefixMapI}. */
- @Override
- public default void putAll(Map<String, String> map) {
- map.forEach(this::add);
- }
-
- /** Delete a prefix */
- @Override
- public void delete(String prefix);
-
- /** Clear the prefix mappings. */
- @Override
- public void clear();
-
- /** Get the mapping for a prefix (or return null). */
- public String get(String prefix);
-
- @Override
- public boolean containsPrefix(String prefix);
-
- /** Abbreviate an IRI or return null */
- @Override
- public default String abbreviate(String uriStr) {
- return PrefixLib.abbreviate(this, uriStr);
- }
-
- /** Abbreviate an IRI or return null */
- @Override
- public default Pair<String, String> abbrev(String uriStr) {
- return PrefixLib.abbrev(this, uriStr);
- }
-
- /** Expand a prefixed name, return null if it can't be expanded */
- @Override
- public default String expand(String prefixedName) {
- return PrefixLib.expand(this, prefixedName);
- }
-
- /** Expand a prefix, return null if it can't be expanded */
- @Override
- public default String expand(String prefix, String localName) {
- return PrefixLib.expand(this, prefix, localName);
- }
-
- /** Iterator over all prefix entries. */
- @Override
- public default Iterator<PrefixEntry> iterator() {
- return stream().iterator();
- }
-
- /** Apply a {@link BiConsumer}{@code <String, String>} to each entry in the PrefixMap. */
- @Override
- public abstract void forEach(BiConsumer<String, String> action);
-
- /** Stream of over all prefix entries. */
- public Stream<PrefixEntry> stream();
-
- /** Stream all prefixes. */
- public default Stream<String> prefixes() {
- return stream().map(PrefixEntry::getPrefix);
- }
-
- /** Return whether there are any prefix mappings or not. */
- @Override
- public boolean isEmpty();
-
- /** Return the number of mappings. */
- @Override
- public int size();
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
similarity index 67%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
index aef2c55..9014785 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
@@ -17,18 +17,23 @@
package org.apache.jena.dboe.storage.prefixes;
+import static org.apache.jena.riot.system.PrefixLib.canonicalPrefix;
+
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
-/** {@link PrefixMapI} implemented using {@link StoragePrefixMap} */
-public class PrefixMapIOverStorage implements PrefixMapI {
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapBase;
+import org.apache.jena.riot.system.Prefixes;
+
+/** {@link PrefixMap} implemented using {@link StoragePrefixMap} */
+public class PrefixMapOverStorage extends PrefixMapBase {
private final StoragePrefixMap prefixes;
protected StoragePrefixMap spm() { return prefixes; }
- public PrefixMapIOverStorage(StoragePrefixMap storage) {
+ public PrefixMapOverStorage(StoragePrefixMap storage) {
this.prefixes = storage;
}
@@ -43,26 +48,21 @@ public class PrefixMapIOverStorage implements PrefixMapI {
}
@Override
- public StoragePrefixMap getPrefixMapStorage() {
- return prefixes;
- }
-
- @Override
public void add(String prefix, String iriString) {
- prefix = PrefixLib.canonicalPrefix(prefix);
+ prefix = canonicalPrefix(prefix);
spm().put(prefix, iriString);
}
@Override
public void delete(String prefix) {
- prefix = PrefixLib.canonicalPrefix(prefix);
+ prefix = canonicalPrefix(prefix);
spm().remove(prefix);
}
- @Override
- public Stream<PrefixEntry> stream() {
- return spm().stream();
- }
+// @Override
+// public Stream<PrefixEntry> stream() {
+// return spm().stream();
+// }
@Override
public void forEach(BiConsumer<String, String> action) {
@@ -86,32 +86,18 @@ public class PrefixMapIOverStorage implements PrefixMapI {
@Override
public String get(String prefix) {
- prefix = PrefixLib.canonicalPrefix(prefix);
+ prefix = canonicalPrefix(prefix);
return spm().get(prefix);
}
@Override
public boolean containsPrefix(String prefix) {
- prefix = PrefixLib.canonicalPrefix(prefix);
+ prefix = canonicalPrefix(prefix);
return spm().containsPrefix(prefix);
}
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("{ ");
- boolean first = true;
-
- for ( PrefixEntry e : prefixes ) {
- if ( first )
- first = false;
- else
- sb.append(" ,");
- sb.append(e.getPrefix());
- sb.append(":=");
- sb.append(e.getUri());
- }
- sb.append(" }");
- return sb.toString();
+ return Prefixes.toString(this);
}
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
index 2eed056..1fc98bb 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
@@ -22,6 +22,8 @@ import java.util.Iterator;
import java.util.Map;
import java.util.stream.Stream;
+import org.apache.jena.riot.system.PrefixEntry;
+
public class PrefixMapStorageSimple implements StoragePrefixMap {
private Map<String, String> map = new HashMap<>();
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java
deleted file mode 100644
index b237b13..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed 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.
- *
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import java.util.Map;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.shared.PrefixMapping;
-
-/**
- * Converted from PrefixMap (as used by the parsers) to Jena's interface PrefixMapping
- * (which is a bit XML-centric for historical reasons).
- */
-
-public class PrefixMappingOverPrefixMapI implements PrefixMapping {
- private PrefixMapI pmap;
-
- PrefixMappingOverPrefixMapI(PrefixMapI pmap) {
- this.pmap = pmap;
- }
-
- @Override
- public PrefixMapping setNsPrefix(String prefix, String uri) {
- pmap.add(prefix, uri);
- return this;
- }
-
- @Override
- public PrefixMapping removeNsPrefix(String prefix) {
- pmap.delete(prefix);
- return this;
- }
-
- @Override
- public PrefixMapping clearNsPrefixMap() {
- pmap.clear();
- return this;
- }
-
- @Override
- public PrefixMapping setNsPrefixes(PrefixMapping other) {
- return setNsPrefixes(other.getNsPrefixMap());
- }
-
- @Override
- public PrefixMapping setNsPrefixes(Map<String, String> map) {
- for ( Map.Entry<String, String> e : map.entrySet() ) {
- String prefix = e.getKey();
- String iriStr = e.getValue();
- pmap.add(prefix, iriStr);
- }
- return this;
- }
-
- @Override
- public PrefixMapping withDefaultMappings(PrefixMapping map) {
- Map<String, String> emap = map.getNsPrefixMap();
- for ( Map.Entry<String, String> e : emap.entrySet() ) {
- String prefix = e.getKey();
- String iriStr = e.getValue();
- if ( !pmap.containsPrefix(prefix) )
- pmap.add(prefix, iriStr);
- }
- return this;
- }
-
- @Override
- public String getNsPrefixURI(String prefix) {
- return pmap.get(prefix);
- }
-
- @Override
- public String getNsURIPrefix(String uri) {
- Pair<String, String> abbrev = pmap.abbrev(uri);
- if ( abbrev == null )
- return null;
- return abbrev.getLeft();
- }
-
- @Override
- public Map<String, String> getNsPrefixMap() {
- return pmap.getMappingCopy();
- }
-
- @Override
- public String expandPrefix(String prefixed) {
- String str = pmap.expand(prefixed);
- if ( str == null )
- return prefixed;
- return str;
- }
-
- @Override
- public String shortForm(String uri) {
- String s = pmap.abbreviate(uri);
- if ( s == null )
- return uri;
- return s;
- }
-
- @Override
- public String qnameFor(String uri) {
- return pmap.abbreviate(uri);
- }
-
- @Override
- public boolean hasNoMappings() {
- return pmap.isEmpty();
- }
-
- @Override
- public int numPrefixes() {
- return pmap.size();
- }
-
- @Override
- public PrefixMapping lock() {
- return this;
- }
-
- @Override
- public boolean samePrefixMappingAs(PrefixMapping other) {
- return this.getNsPrefixMap().equals(other.getNsPrefixMap());
- }
-
- @Override
- public String toString() {
- return "PrefixMappingOverPrefixMapI:"+pmap.toString();
- }
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java
new file mode 100644
index 0000000..6d14ce8
--- /dev/null
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed 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.
+ *
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+package org.apache.jena.dboe.storage.prefixes;
+
+import org.apache.jena.dboe.storage.StoragePrefixes;
+import org.apache.jena.dboe.storage.simple.StoragePrefixesSimpleMem;
+import org.apache.jena.riot.system.PrefixMap;
+
+/** Factory for DBOE impls */
+public class PrefixesDboeFactory
+{
+ /** Create a memory-backed {@link StoragePrefixes} */
+ public static StoragePrefixes newDatasetPrefixesMem()
+ { return new StoragePrefixesSimpleMem(); }
+
+// /** Create {@link StoragePrefixMap} for the default graph of a {@link StoragePrefixes}. */
+// public static StoragePrefixMap storagePrefixMapDataset(StoragePrefixes storage)
+// { return StoragePrefixesView.viewDataset(storage); }
+
+ // Not needed for dataset prefixes.
+// /** Create {@link StoragePrefixMap} for the named graph of a {@link StoragePrefixes}. */
+// public static StoragePrefixMap storagePrefixMapGraph(StoragePrefixes storage, Node graphName)
+// { return StoragePrefixesView.viewGraph(storage, graphName); }
+
+// /** Create a memory-backed {@link StoragePrefixMap} */
+// public static StoragePrefixMap newPrefixMapStorageMem()
+// { return new PrefixMapStorageSimple(); }
+//
+ /** Create a {@link PrefixMap} over a {@link StoragePrefixMap}. */
+ public static PrefixMap newPrefixMap(StoragePrefixMap storage)
+ { return new PrefixMapOverStorage(storage); }
+}
+
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java
deleted file mode 100644
index adf9012..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed 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.
- *
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.simple.StoragePrefixesMem;
-import org.apache.jena.graph.Node;
-import org.apache.jena.shared.PrefixMapping;
-
-/** Factory for some in-memory prefix impls */
-public class PrefixesFactory
-{
- public static PrefixMapI createMem() { return newPrefixMap(newPrefixMapStorageMem() ); }
-
- /** Create a memory-backed {@link StoragePrefixes} */
- public static StoragePrefixes newDatasetPrefixesMem()
- { return new StoragePrefixesMem(); }
-
- /** Create {@link PrefixMapping} using a {@link PrefixMapI}. */
- public static PrefixMapping newPrefixMappingOverPrefixMapI(PrefixMapI pmap)
- { return new PrefixMappingOverPrefixMapI(pmap); }
-
- /** Create {@link StoragePrefixMap} for the default graph of a {@link StoragePrefixes}. */
- public static StoragePrefixMap storagePrefixMapDft(StoragePrefixes storage)
- { return StoragePrefixesView.viewDefaultGraph(storage); }
-
- /** Create {@link StoragePrefixMap} for the named graph of a {@link StoragePrefixes}. */
- public static StoragePrefixMap storagePrefixMapGraph(StoragePrefixes storage, Node graphName)
- { return StoragePrefixesView.viewGraph(storage, graphName); }
-
- /** Create a memory-backed {@link StoragePrefixMap} */
- public static StoragePrefixMap newPrefixMapStorageMem()
- { return new PrefixMapStorageSimple(); }
-
- /** Create a {@link PrefixMapI} over a {@link StoragePrefixMap}. */
- public static PrefixMapI newPrefixMap(StoragePrefixMap storage)
- { return new PrefixMapIOverStorage(storage); }
-
- /** Return an empty immutable {@link PrefixMapI}. */
- public static PrefixMapI empty() { return emptyPrefixMap; }
-
- private static StoragePrefixes emptyDatasetPrefixes = new StoragePrefixesEmpty();
- private static PrefixMapI emptyPrefixMap = newPrefixMap(storagePrefixMapDft(emptyDatasetPrefixes));
-}
-
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
index 7e24c5f..7319a0f 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
@@ -20,6 +20,8 @@ package org.apache.jena.dboe.storage.prefixes;
import java.util.Iterator;
import java.util.stream.Stream;
+import org.apache.jena.riot.system.PrefixEntry;
+
/**
* Storage-oriented abstraction for one set of prefix mappings.
* The API features, such as expanding prefix names. are provided elsewhere.
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
index 707a3ff..f839191 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
@@ -24,6 +24,7 @@ import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.lib.Pair;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
public class StoragePrefixesEmpty implements StoragePrefixes {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
index 3b8b374..8236dbd 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
@@ -25,6 +25,7 @@ import java.util.stream.Stream;
import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
import org.apache.jena.sparql.core.Quad;
/**
@@ -36,10 +37,17 @@ public class StoragePrefixesView implements StoragePrefixMap
private final StoragePrefixes dsgPrefixes;
private final Node graphName;
- public static StoragePrefixMap viewDefaultGraph(StoragePrefixes dsgPrefixes)
+ public static StoragePrefixMap viewDataset(StoragePrefixes dsgPrefixes)
{ return new StoragePrefixesView(dsgPrefixes, Quad.defaultGraphNodeGenerated); }
- public static StoragePrefixMap viewGraph(StoragePrefixes dsgPrefixes, Node graphName)
+ // Used by tests only
+ // ** Not for dataset prefixes.
+ /*package*/ static StoragePrefixMap viewDefaultGraph(StoragePrefixes dsgPrefixes)
+ { return new StoragePrefixesView(dsgPrefixes, Quad.defaultGraphNodeGenerated); }
+
+ // Used by tests only
+ // ** Not for dataset prefixes.
+ /*package*/ static StoragePrefixMap viewGraph(StoragePrefixes dsgPrefixes, Node graphName)
{ return new StoragePrefixesView(dsgPrefixes, graphName); }
private StoragePrefixesView(StoragePrefixes dsgPrefixes, Node graphName) {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
index 484adf6..0791314 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
@@ -31,7 +31,7 @@ public class SimpleDB {
public static class DatasetGraphSimpleDB extends DatasetGraphStorage {
public DatasetGraphSimpleDB() {
- super(new StorageMem(), new StoragePrefixesMem(), TransactionalLock.createMRSW());
+ super(new StorageSimpleMem(), new StoragePrefixesSimpleMem(), TransactionalLock.createMRSW());
}
}
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
similarity index 71%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
index 1fb3db4..3dee0f7 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
@@ -17,7 +17,7 @@
package org.apache.jena.dboe.storage.simple;
-import static org.apache.jena.dboe.storage.prefixes.PrefixLib.canonicalGraphName;
+import static org.apache.jena.riot.system.PrefixLib.canonicalGraphName;
import java.util.HashMap;
import java.util.Iterator;
@@ -25,23 +25,23 @@ import java.util.Map;
import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
-import org.apache.jena.dboe.storage.prefixes.PrefixMapI;
-import org.apache.jena.dboe.storage.prefixes.PrefixesFactory;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapFactory;
+import org.apache.jena.riot.system.PrefixMapZero;
/** In-memory dataset prefixes */
-
-public class StoragePrefixesMem implements StoragePrefixes {
+public class StoragePrefixesSimpleMem implements StoragePrefixes {
// Effectively this a map of maps
- private Map<Node, PrefixMapI> map = new HashMap<Node, PrefixMapI>();
+ private Map<Node, PrefixMap> map = new HashMap<Node, PrefixMap>();
- public StoragePrefixesMem() {}
+ public StoragePrefixesSimpleMem() {}
@Override
public String get(Node graphNode, String prefix) {
graphNode = canonicalGraphName(graphNode);
- PrefixMapI pmap = map.get(graphNode);
+ PrefixMap pmap = map.get(graphNode);
if ( pmap == null )
return null;
return pmap.get(prefix);
@@ -50,13 +50,13 @@ public class StoragePrefixesMem implements StoragePrefixes {
@Override
public Iterator<PrefixEntry> get(Node graphNode) {
graphNode = canonicalGraphName(graphNode);
- PrefixMapI pmap = map.get(graphNode);
+ PrefixMap pmap = map.get(graphNode);
if ( pmap == null )
return Iter.nullIterator();
- if ( pmap.getPrefixMapStorage() != null )
- //If implemented as a map of other-implementation PrefixMapI
- return pmap.getPrefixMapStorage().iterator();
- return pmap.iterator();
+ return
+ pmap.getMapping().entrySet().stream()
+ .map(e->PrefixEntry.create(e.getKey(), e.getValue()))
+ .iterator();
}
@Override
@@ -94,14 +94,14 @@ public class StoragePrefixesMem implements StoragePrefixes {
return 0;
}
- protected PrefixMapI createPrefixMap() {
- return PrefixesFactory.createMem();
+ protected PrefixMap createPrefixMap() {
+ return PrefixMapFactory.create();
}
// Access or return a fresh, empty.
- private PrefixMapI accessForUpdate(Node graphName) {
+ private PrefixMap accessForUpdate(Node graphName) {
graphName = canonicalGraphName(graphName);
- PrefixMapI pmap = map.get(graphName);
+ PrefixMap pmap = map.get(graphName);
if ( pmap == null ) {
pmap = createPrefixMap();
map.put(graphName, pmap);
@@ -110,11 +110,11 @@ public class StoragePrefixesMem implements StoragePrefixes {
}
// Access or return the empty, dummy mapping.
- private PrefixMapI access(Node graphName) {
+ private PrefixMap access(Node graphName) {
graphName = canonicalGraphName(graphName);
- PrefixMapI pmap = map.get(graphName);
+ PrefixMap pmap = map.get(graphName);
if ( pmap == null )
- return PrefixesFactory.empty();
+ return PrefixMapZero.empty;
return pmap;
}
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
similarity index 91%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
index 32ffed2..1e30bc8 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
@@ -20,9 +20,9 @@ package org.apache.jena.dboe.storage.simple;
import org.apache.jena.dboe.storage.StorageRDF;
/** Very simple {@link StorageRDF} based on a set/scan implementation of tuple storage.*/
-public class StorageMem extends StorageTuples {
+public class StorageSimpleMem extends StorageTuples {
- public StorageMem() {
+ public StorageSimpleMem() {
super(new StorageTuplesN(3), new StorageTuplesN(4));
}
}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
index 932600b..a671f2d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
@@ -23,6 +23,9 @@ import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.dboe.storage.DatabaseRDF;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.dboe.storage.StorageRDF;
+import org.apache.jena.dboe.storage.prefixes.PrefixesDboeFactory;
+import org.apache.jena.dboe.storage.prefixes.StoragePrefixMap;
+import org.apache.jena.dboe.storage.prefixes.StoragePrefixesView;
import org.apache.jena.dboe.transaction.txn.IteratorTxnTracker;
import org.apache.jena.dboe.transaction.txn.TransactionalSystem;
import org.apache.jena.dboe.transaction.txn.TxnId;
@@ -31,7 +34,11 @@ import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.ReadWrite;
import org.apache.jena.query.TxnType;
-import org.apache.jena.sparql.core.*;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.sparql.core.DatasetGraphBaseFind;
+import org.apache.jena.sparql.core.DatasetGraphTriplesQuads;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.core.Transactional;
/** Alternative: DatasetGraph over RDFStorage, using DatasetGraphBaseFind
* Collapses DatasetGraphTriplesQuads into this adapter class.
@@ -70,16 +77,24 @@ public class DatasetGraphStorage extends DatasetGraphBaseFind implements Databas
private final StorageRDF storage;
private final StoragePrefixes prefixes;
+ private final PrefixMap prefixMap;
public DatasetGraphStorage(StorageRDF storage, StoragePrefixes prefixes, Transactional transactional) {
this.storage = storage;
this.prefixes = prefixes;
+ StoragePrefixMap spm = StoragePrefixesView.viewDataset(prefixes);
+ this.prefixMap = PrefixesDboeFactory.newPrefixMap(spm);
this.txn = transactional;
}
- @Override public StorageRDF getData() { return storage; }
- @Override public StoragePrefixes getPrefixes() { return prefixes; }
- @Override public Transactional getTransactional() { return txn; }
+ @Override public StorageRDF getData() { return storage; }
+ @Override public StoragePrefixes getStoragePrefixes() { return prefixes; }
+ @Override public Transactional getTransactional() { return txn; }
+
+ @Override
+ public PrefixMap prefixes() {
+ return prefixMap;
+ }
/**
* Provide a general implementation of "listGraphNodes". Implementations may wish
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
index 9349571..e82ea3d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
@@ -20,13 +20,7 @@ package org.apache.jena.dboe.storage.system;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.dboe.storage.StorageRDF;
-import org.apache.jena.dboe.storage.prefixes.PrefixMapI;
-import org.apache.jena.dboe.storage.prefixes.PrefixesFactory;
-import org.apache.jena.dboe.storage.prefixes.StoragePrefixMap;
-import org.apache.jena.dboe.storage.prefixes.StoragePrefixesView;
-import org.apache.jena.graph.GraphEvents;
import org.apache.jena.graph.Node;
-import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.GraphView;
import org.apache.jena.sparql.core.Quad;
@@ -34,9 +28,7 @@ import org.apache.jena.sparql.core.Quad;
/**
* General operations for graphs over datasets where the datasets are {@link StorageRDF} based.
*/
-// Can't merge into GraphView because of StoragePrefixes
public class GraphViewStorage extends GraphView {
- private final StoragePrefixMap prefixes;
public static GraphView createDefaultGraphStorage(DatasetGraph dsg, StoragePrefixes prefixes)
{ return new GraphViewStorage(dsg, Quad.defaultGraphNodeGenerated, prefixes); }
@@ -49,23 +41,5 @@ public class GraphViewStorage extends GraphView {
protected GraphViewStorage(DatasetGraph dataset, Node graphName, StoragePrefixes prefixes) {
super(dataset, graphName);
- this.prefixes = StoragePrefixesView.viewGraph(prefixes, graphName);
- }
-
- @Override
- protected PrefixMapping createPrefixMapping() {
- PrefixMapI x = PrefixesFactory.newPrefixMap(prefixes);
- PrefixMapping pm = PrefixesFactory.newPrefixMappingOverPrefixMapI(x);
- return pm;
- }
-
- @Override
- public void clear() {
- // GraphView uses null.
- Node gn = getGraphName();
- if ( gn == null )
- gn = Quad.defaultGraphNodeGenerated;
- getDataset().deleteAny(gn, Node.ANY, Node.ANY, Node.ANY);
- getEventManager().notifyEvent(this, GraphEvents.removeAll);
}
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
index 8d527f0..0627dfc 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
@@ -26,6 +26,7 @@ import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixEntry;
import org.junit.Test;
public abstract class AbstractTestDatasetPrefixesStorage
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
index 2e06284..abf2003 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
@@ -25,8 +25,6 @@ import org.junit.runners.Suite;
TestDatasetPrefixesMem.class
, TestPrefixMappingOverDatasetPrefixes.class
, TestPrefixMappingOverDatasetPrefixes2.class
- , TestPrefixMappingOverPrefixMap.class
- , TestPrefixMapOverPrefixMapI.class
, TestPrefixLib.class
})
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
index 40bb7f2..badca57 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
@@ -25,7 +25,7 @@ public class TestDatasetPrefixesMem extends AbstractTestDatasetPrefixesStorage {
@Override
protected StoragePrefixes create() {
- prefixes = PrefixesFactory.newDatasetPrefixesMem();
+ prefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
return view();
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
index 9dfcff4..495fa33 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
@@ -22,13 +22,14 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import org.apache.jena.atlas.lib.Pair;
+import org.apache.jena.riot.system.PrefixLib;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapFactory;
import org.junit.Test;
public class TestPrefixLib {
- // abbreviate
-
- private PrefixMapI create() {
- return PrefixesFactory.createMem();
+ private PrefixMap create() {
+ return PrefixMapFactory.create();
}
protected String pref1 = "pref1";
protected String pref1a = "pref1:";
@@ -36,7 +37,7 @@ public class TestPrefixLib {
@Test
public void abbreviate_1() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
String x = PrefixLib.abbreviate(prefixes, "http://example.net/ns#xyz");
@@ -45,7 +46,7 @@ public class TestPrefixLib {
@Test
public void abbreviate_2() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
String x = PrefixLib.abbreviate(prefixes, "http://other/ns#xyz");
@@ -54,7 +55,7 @@ public class TestPrefixLib {
@Test
public void abbrev_1() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
Pair<String, String> x = PrefixLib.abbrev(prefixes, "http://example.net/ns#xyz");
@@ -65,7 +66,7 @@ public class TestPrefixLib {
@Test
public void abbrev_2() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
Pair<String, String> x = PrefixLib.abbrev(prefixes, "http://other/ns#xyz");
assertNull(x);
@@ -73,7 +74,7 @@ public class TestPrefixLib {
@Test
public void expand_1() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
String x = PrefixLib.expand(prefixes, "pref1:abc");
assertEquals("http://example.net/ns#abc", x);
@@ -83,10 +84,9 @@ public class TestPrefixLib {
@Test
public void expand_2() {
- PrefixMapI prefixes = create();
+ PrefixMap prefixes = create();
prefixes.add(pref1, "http://example.net/ns#");
String x2 = PrefixLib.expand(prefixes, "pref1z:abc");
assertNull(x2);
}
-
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
index d99db99..89021c7 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
@@ -18,24 +18,27 @@
package org.apache.jena.dboe.storage.prefixes;
import org.apache.jena.dboe.storage.StoragePrefixes;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
+/** AbstractTestPrefixMappingView for default graph. */
public class TestPrefixMappingOverDatasetPrefixes extends AbstractTestPrefixMappingView
{
StoragePrefixes dsgprefixes;
@Override
protected PrefixMapping create() {
- dsgprefixes = PrefixesFactory.newDatasetPrefixesMem();
+ dsgprefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
return view();
}
@Override
protected PrefixMapping view() {
StoragePrefixMap view = StoragePrefixesView.viewDefaultGraph(dsgprefixes);
- PrefixMapI pmap = PrefixesFactory.newPrefixMap(view);
- return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
+ PrefixMap pmap = PrefixesDboeFactory.newPrefixMap(view);
+ return Prefixes.adapt(pmap);
}
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
index ca2d7c1..a2b3b54 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
@@ -20,9 +20,12 @@ package org.apache.jena.dboe.storage.prefixes;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
+/** AbstractTestPrefixMappingView for named graph. */
public class TestPrefixMappingOverDatasetPrefixes2 extends AbstractTestPrefixMappingView
{
static Node gn = NodeFactory.createURI("http://test/graphName");
@@ -30,15 +33,15 @@ public class TestPrefixMappingOverDatasetPrefixes2 extends AbstractTestPrefixMap
@Override
protected PrefixMapping create() {
- dsgprefixes = PrefixesFactory.newDatasetPrefixesMem();
+ dsgprefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
return view();
}
@Override
protected PrefixMapping view() {
StoragePrefixMap view = StoragePrefixesView.viewGraph(dsgprefixes, gn);
- PrefixMapI pmap = PrefixesFactory.newPrefixMap(view);
- return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
+ PrefixMap pmap = PrefixesDboeFactory.newPrefixMap(view);
+ return Prefixes.adapt(pmap);
}
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java
deleted file mode 100644
index 8a15086..0000000
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed 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.
- *
- * See the NOTICE file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
-
-public class TestPrefixMappingOverPrefixMap extends AbstractTestPrefixMappingView
-{
- // Via DatasetPrefixesStorageMem
- PrefixMapI lastPrefixMap;
-
- @Override
- protected PrefixMapping create() {
- lastPrefixMap = PrefixesFactory.createMem();
- return view();
- }
-
- @Override
- protected PrefixMapping view() {
- return PrefixesFactory.newPrefixMappingOverPrefixMapI(lastPrefixMap);
- }
-}
-
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
index 438434b..bcbf9e0 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
@@ -18,12 +18,12 @@
package org.apache.jena.dboe.storage.storage;
import org.apache.jena.dboe.storage.StorageRDF;
-import org.apache.jena.dboe.storage.simple.StorageMem;
+import org.apache.jena.dboe.storage.simple.StorageSimpleMem;
public class TestStorageSimple extends BaseTestStorageRDF {
@Override
protected StorageRDF create() {
- return new StorageMem();
+ return new StorageSimpleMem();
}
}
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
index 70bd0f2..8051325 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
@@ -164,17 +164,10 @@ public final class BPTreeNodeMgr extends PageBlockMgr<BPTreeNode>
BPlusTreeParams params = bpTree.getParams();
int ptrBuffLen = params.MaxPtr * params.getPtrLength();
- // Only store the key part of records in a B+Tree block
- // OLD - Node table has real value part - what's going on?
- // [Issue:FREC]
- // Allocate space for record, key and value, despite slight over
- // allocation.
+ // Allocate space for record, key and value, despite slight over allocation.
int recBuffLen = params.MaxRec * params.getRecordLength();
- // [Issue:FREC] Should be: key space only.
- // int recBuffLen = params.MaxRec * params.getKeyLength();
-
n.id = block.getId().intValue();
n.setParent(parent);
n.setCount(count);
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
index e99c51d..8a1d79e 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
@@ -95,16 +95,9 @@ class BPTreeNodeBuilder implements Iterator<Pair<Integer, Record>> {
System.out.println("** Item: " + pair);
Record r = pair.cdr();
- // [Issue: FREC]
- // The record buffer size is wrong.
- // Writes the whole record, only need to write the key part.
- // **** r = recordFactory.createKeyOnly(r);
-
- // [Issue: FREC]
// The record is key-only (which is correct) but until FREC fixed,
// we need key,value
r = recordFactory.create(r.getKey());
- // -- End FREC
// Always add - so ptrBuff is one ahead when we finish.
// There is always one more ptr than record in a B+Tree node.
@@ -114,12 +107,6 @@ class BPTreeNodeBuilder implements Iterator<Pair<Integer, Record>> {
// Add pointer.
ptrBuff.add(pair.car());
- // [Issue: FREC]
- // Either test shoudl work but due to the missetting of record
- // buffer size
- // testing recBuff does not work.
- // if ( recBuff.isFull() )
- // .... test ptrBuff
if ( ptrBuff.isFull() ) {
// End of this block.
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
index 2d2fbdf..ce39743 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
@@ -53,7 +53,7 @@ public class TransBinaryDataFile extends TransactionalComponentLifecycle<TransBi
// The current committed position and the limit as seen by readers.
// This is also the abort point.
- // Global.s
+ // Global.
private final AtomicLong committedLength;
// The state of the file visible outside the transaction.
@@ -164,7 +164,7 @@ public class TransBinaryDataFile extends TransactionalComponentLifecycle<TransBi
if ( isWriteTxn() ) {
long x = committedLength.get();
// Internal consistency check.
- // (Abort after commit would trigger the warning.)
+ // (Abort after commit would trigger the warning.)
if ( txnResetState.length != x )
Log.warn(this, format("Mismatch: state.length = %d, committedLength = %d", txnResetState.length != x));
binFile.truncate(x);
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
index ac32ef8..5a5629a 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
@@ -37,17 +37,20 @@ import org.apache.jena.query.ReadWrite;
public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobState> {
// The last committed state.
+ // The current writer view is data state held by TransactionalComponentLifecycle.
// Immutable ByteBuffer.
+
private final AtomicReference<ByteBuffer> blobRef = new AtomicReference<>();
private final BufferChannel file;
static class BlobState {
- boolean hasChanged = false;
- ByteBuffer $txnBlob;
+ private boolean hasChanged = false;
+ private ByteBuffer $txnBlob;
BlobState(ByteBuffer bb) {
setByteBuffer(bb);
}
+
void setByteBuffer(ByteBuffer bb) {
$txnBlob = bb;
// Could compare - seems like added complexity.
@@ -73,7 +76,7 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
blobRef.set(blob);
}
- private void write() {
+ private void writeBlobState() {
ByteBuffer blob = blobRef.get();
blob.rewind();
int x = blob.remaining();
@@ -152,7 +155,7 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
@Override
public void finishRecovery() {
if ( recoveryChange )
- write();
+ writeBlobState();
}
@Override
@@ -186,9 +189,12 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
protected void _commit(TxnId txnId, BlobState state) {
if ( ! state.hasChanged )
return;
- // NB Change reference.
+ // Change reference.
blobRef.set(state.getByteBuffer());
- write();
+ // Write to persistent storage.
+ // It's in the journal already, and is rewritten from the journal
+ // if there is a crash at this point.
+ writeBlobState();
}
@Override
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
index f5e4fe0..af9c45a 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
@@ -196,8 +196,6 @@ public class Transaction implements TransactionInfo {
}
public void end() {
- // [1746]
- // txnMgr.executeEnd(thus, ()->{});
txnMgr.notifyEndStart(this);
if ( isWriteTxn() && getState() == ACTIVE ) {
//Log.warn(this, "Write transaction with no commit() or abort() before end()");
@@ -209,7 +207,6 @@ public class Transaction implements TransactionInfo {
endInternal();
txnMgr.notifyEndFinish(this);
txnMgr = null;
- //components.clear();
}
private void endInternal() {
@@ -240,14 +237,14 @@ public class Transaction implements TransactionInfo {
setState(ACTIVE);
}
- /** Require a WRITE transaction - do not try to promote. */
+ /** Require a WRITE transaction - do not try to promote. */
public void requireWriteTxn() {
checkState(ACTIVE);
if ( mode != ReadWrite.WRITE )
throw new TransactionException("Not a write transaction");
}
- /** Require a WRITE transaction - includes trying to promote. */
+ /** Require a WRITE transaction - includes trying to promote. */
public void ensureWriteTxn() {
checkState(ACTIVE);
if ( mode != ReadWrite.WRITE ) {
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
index 659805b..54b2ab8 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
@@ -23,13 +23,13 @@ import java.util.List;
import org.apache.jena.atlas.lib.tuple.Tuple;
import org.apache.jena.atlas.lib.tuple.TupleFactory;
-import org.apache.jena.dboe.storage.Prefixes;
import org.apache.jena.dboe.transaction.txn.Transaction;
import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.lang.StreamRDFCounting;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.tdb2.loader.BulkLoaderException;
@@ -72,7 +72,7 @@ public class DataToTuplesInline implements StreamRDFCounting, BulkStartFinish {
this.dest4 = dest4;
this.output = output;
this.nodeTable = dsgtdb.getTripleTable().getNodeTupleTable().getNodeTable();
- this.prefixes = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+ this.prefixes = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
NodeTable nodeTable2 = dsgtdb.getQuadTable().getNodeTupleTable().getNodeTable();
if ( nodeTable != nodeTable2 )
throw new BulkLoaderException("Different node tables");
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
index 01503a0..2ebfd28 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
@@ -23,13 +23,13 @@ import java.util.function.Consumer;
import org.apache.jena.atlas.lib.tuple.Tuple;
import org.apache.jena.atlas.lib.tuple.TupleFactory;
-import org.apache.jena.dboe.storage.Prefixes;
import org.apache.jena.dboe.transaction.txn.Transaction;
import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.lang.StreamRDFCounting;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.tdb2.loader.BulkLoaderException;
@@ -73,7 +73,7 @@ public class DataToTuplesInlineSingle implements StreamRDFCounting, BulkStartFin
this.dest4 = dest4;
this.output = output;
this.nodeTable = dsgtdb.getTripleTable().getNodeTupleTable().getNodeTable();
- this.prefixes = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+ this.prefixes = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
NodeTable nodeTable2 = dsgtdb.getQuadTable().getNodeTupleTable().getNodeTable();
if ( nodeTable != nodeTable2 )
throw new BulkLoaderException("Different node tables");
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
index a5310dc..4c13453 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
@@ -139,7 +139,7 @@ public class LoaderMain extends LoaderBase implements DataLoader {
* Used by {@link InputStage#MULTI}.
*/
private static StreamRDFCounting executeData(LoaderPlan loaderPlan, DatasetGraphTDB dsgtdb, Map<String, TupleIndex> indexMap, List<BulkStartFinish> dataProcess, MonitorOutput output) {
- StoragePrefixesTDB dps = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+ StoragePrefixesTDB dps = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
PrefixHandlerBulk prefixHandler = new PrefixHandlerBulk(dps, output);
dataProcess.add(prefixHandler);
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
index d79d809..6316a4c 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
@@ -18,12 +18,12 @@
package org.apache.jena.tdb2.loader.main;
-import org.apache.jena.dboe.storage.Prefixes;
import org.apache.jena.dboe.transaction.txn.Transaction;
import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.tdb2.loader.base.BulkStartFinish;
import org.apache.jena.tdb2.loader.base.CoLib;
import org.apache.jena.tdb2.loader.base.MonitorOutput;
@@ -69,7 +69,7 @@ public class PrefixHandlerBulk implements BulkStartFinish {
return (prefix, uriStr) -> {
Node p = NodeFactory.createLiteral(prefix);
Node u = NodeFactory.createURI(uriStr);
- prefixes.add_ext(Prefixes.nodeDefaultGraph, prefix, uriStr);
+ prefixes.add_ext(Prefixes.nodeDataset, prefix, uriStr);
};
}
}
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
index 8d13680..4d44577 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
@@ -26,6 +26,7 @@ import org.apache.jena.atlas.lib.CacheFactory;
import org.apache.jena.dboe.base.file.Location;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixMap;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.DatasetGraphWrapper;
import org.apache.jena.sparql.core.Quad;
@@ -45,6 +46,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
// Null for in-memory datasets.
private final Path basePath;
private final Location location;
+ private final PrefixMapSwitchable prefixes;
public DatasetGraphSwitchable(Path base, Location location, DatasetGraph dsg) {
// Don't use the slot in datasetGraphWrapper - use the AtomicReference
@@ -52,6 +54,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
dsgx.set(dsg);
this.basePath = base;
this.location = location;
+ this.prefixes = new PrefixMapSwitchable(this);
}
/** Is this {@code DatasetGraphSwitchable} just a holder for a {@code DatasetGraph}?
@@ -78,6 +81,12 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
return dsgx.getAndSet(dsg);
}
+ @Override
+ public PrefixMap prefixes() {
+ return prefixes;
+ }
+
+
/** Don't do anything on close.
* This would not be safe across switches.
*/
@@ -88,7 +97,8 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
// @Override
// public void sync() { }
- /** If and only if the current value is the given old value, set the base {@link DatasetGraph}
+ /**
+ * If and only if the current value is the given old value, set the base {@link DatasetGraph}
* Returns true if a swap happened.
*/
public boolean change(DatasetGraph oldDSG, DatasetGraph newDSG) {
@@ -107,7 +117,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
public Graph getUnionGraph() {
return GraphViewSwitchable.createUnionGraphSwitchable(this);
}
-
+
// private Cache<Node, Graph> ngCache = CacheFactory.createCache(10);
private Cache<Node, Graph> ngCache = CacheFactory.createOneSlotCache();
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
index 5ba2771..08a7486 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
@@ -119,17 +119,17 @@ public class DatasetGraphTDB extends DatasetGraphStorage
public GraphTDB getDefaultGraphTDB() {
checkNotClosed();
- return GraphTDB.tdb_createDefaultGraph(this, getPrefixes());
+ return GraphTDB.tdb_createDefaultGraph(this, getStoragePrefixes());
}
public GraphTDB getGraphTDB(Node graphNode) {
checkNotClosed();
- return GraphTDB.tdb_createNamedGraph(this, graphNode, getPrefixes());
+ return GraphTDB.tdb_createNamedGraph(this, graphNode, getStoragePrefixes());
}
public GraphTDB getUnionGraphTDB() {
checkNotClosed();
- return GraphTDB.tdb_createUnionGraph(this, getPrefixes());
+ return GraphTDB.tdb_createUnionGraph(this, getStoragePrefixes());
}
@Override
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
index f200ca7..51d5e70 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
@@ -30,6 +30,7 @@ import org.apache.jena.dboe.storage.system.GraphViewStorage;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.riot.other.G;
+import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.tdb2.TDBException;
import org.apache.jena.tdb2.store.nodetupletable.NodeTupleTable;
@@ -67,6 +68,11 @@ public class GraphTDB extends GraphViewStorage {
return getDSG().chooseNodeTupleTable(getGraphName());
}
+ @Override
+ public PrefixMapping getPrefixMapping() {
+ return createPrefixMapping();
+ }
+
// Better ways to execute.
@Override
@@ -114,7 +120,7 @@ public class GraphTDB extends GraphViewStorage {
return WrappedIterator.createNoRemove(iter);
}
-
+
@Override
public final void sync() {
}
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
index c991b91..0f0610a 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
@@ -18,20 +18,16 @@
package org.apache.jena.tdb2.store;
-import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.*;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.shared.impl.PrefixMappingImpl;
import org.apache.jena.sparql.core.GraphView;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.util.iterator.ExtendedIterator;
/**
* A GraphView that is sensitive to {@link DatasetGraphSwitchable} switching.
- * This ensures that a graph object remains valid as the {@link DatasetGraphSwitchable} switchs.
+ * This ensures that a graph object remains valid as the {@link DatasetGraphSwitchable} switches.
*/
public class GraphViewSwitchable extends GraphView {
public static GraphViewSwitchable createDefaultGraphSwitchable(DatasetGraphSwitchable dsg)
@@ -51,25 +47,8 @@ public class GraphViewSwitchable extends GraphView {
this.dsgx = dsg;
}
- // Some operations need to be caught and switched here, some don't
+ // Some operations need to be caught and switched here, some don't
// Add/delete get switched because the DSG of the super class GraphView switches.
- // But we need a switching PrefixMapping.
- // We need a TransactionHandler.
-
- @Override
- protected PrefixMapping createPrefixMapping() {
- Node gn = super.getGraphName();
- if ( gn == Quad.defaultGraphNodeGenerated )
- gn = null;
- if ( Quad.isUnionGraph(gn) ) {
- // [TDBX] Union
- // Read-only wrapper would be better than a copy.
- PrefixMapping pmap = new PrefixMappingImpl();
- pmap.setNsPrefixes(prefixMapping(null));
- return pmap;
- }
- return prefixMapping(gn);
- }
/** Return the {@link DatasetGraphSwitchable} we are viewing. */
@Override
@@ -77,7 +56,7 @@ public class GraphViewSwitchable extends GraphView {
return getx();
}
- /**
+ /**
* Return the {@code Graph} from the underlying DatasetGraph
* Do not hold onto this reference across switches.
*/
@@ -98,48 +77,20 @@ public class GraphViewSwitchable extends GraphView {
public void clear() {
getBaseGraph().clear();
}
-
+
// Operations that GraphView provides but where the underlying switchable graph may be do better.
// As the underlying graph is not a subclass, it can not override by inheritance.
-
+
@Override
- public void sync() { }
-
+ public void sync() { }
+
@Override
protected ExtendedIterator<Triple> graphBaseFind(Node s, Node p, Node o) {
// This breaks the cycle because super.find will call here again.
- return getBaseGraph().find(s, p, o);
+ return getBaseGraph().find(s, p, o);
}
- // Not needed here because the union graph is a graph(unionGraph) so that redirects on use.
- // graphUnionFind(Node s, Node p, Node o) : see GraphTDB
-
private DatasetGraphTDB getDSG() {
return ((DatasetGraphTDB)(getx().get()));
}
-
- private PrefixMapping prefixMapping(Node graphName) {
- PrefixMapI pmap = new PrefixMapTDB2(graphName);
- return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
- }
-
- class PrefixMapTDB2 extends PrefixMapIOverStorage {
-
- private final Node graphName;
-
- PrefixMapTDB2(Node graphName) {
- super(null);
- graphName = PrefixLib.canonicalGraphName(graphName);
- this.graphName = graphName;
- }
-
- @Override
- protected StoragePrefixMap spm() {
- StoragePrefixes prefixes = getDSG().getPrefixes();
- StoragePrefixMap view = PrefixLib.isNodeDefaultGraph(graphName)
- ? StoragePrefixesView.viewDefaultGraph(prefixes)
- : StoragePrefixesView.viewGraph(prefixes, graphName);
- return view;
- }
- }
}
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
similarity index 54%
copy from jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java
copy to jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
index 12e5865..7e02f9d 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
@@ -16,16 +16,31 @@
* limitations under the License.
*/
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.tdb2.store;
-import org.apache.jena.riot.system.AbstractTestPrefixMap;
import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapWrapper;
-public class TestPrefixMapOverPrefixMapI extends AbstractTestPrefixMap {
+/**
+ * {@link PrefixMap} that goes to the current DatasetGraphTDB prefixes.
+ */
+public class PrefixMapSwitchable extends PrefixMapWrapper {
+ // PrefixMapProxy not needed. It calls a Supplier
+ // but in TDB2
- @Override
- protected PrefixMap getPrefixMap() {
- PrefixMapI pmapi = PrefixesFactory.createMem();
- return pmapi;
+ private final DatasetGraphSwitchable dsgx;
+ protected DatasetGraphSwitchable getx() { return dsgx; }
+
+ protected PrefixMapSwitchable(DatasetGraphSwitchable dsg) {
+ // We override get() so don't set the wrapped object
+ super(null);
+ this.dsgx = dsg;
}
+
+ @Override
+ protected PrefixMap getR() { return dsgx.get().prefixes(); }
+
+ @Override
+ protected PrefixMap getW() { return dsgx.get().prefixes(); }
+
}
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
index e431738..007afc7 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
@@ -18,6 +18,8 @@
package org.apache.jena.tdb2.store;
+import static org.apache.jena.riot.system.PrefixLib.canonicalGraphName;
+
import java.util.Iterator;
import java.util.List;
@@ -25,13 +27,12 @@ import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.lib.tuple.Tuple;
import org.apache.jena.dboe.base.record.RecordFactory;
import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
-import org.apache.jena.dboe.storage.prefixes.PrefixLib;
import org.apache.jena.dboe.transaction.txn.Transaction;
import org.apache.jena.dboe.transaction.txn.TransactionException;
import org.apache.jena.dboe.transaction.txn.TransactionalSystem;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixEntry;
import org.apache.jena.tdb2.store.nodetupletable.NodeTupleTable;
public class StoragePrefixesTDB implements StoragePrefixes {
@@ -52,7 +53,7 @@ public class StoragePrefixesTDB implements StoragePrefixes {
@Override
public String get(Node graphNode, String prefix) {
requireTxn();
- graphNode = PrefixLib.canonicalGraphName(graphNode);
+ graphNode = canonicalGraphName(graphNode);
Node p = NodeFactory.createLiteral(prefix);
Iterator<Tuple<Node>> iter = prefixTable.find(graphNode, p, null);
if ( ! iter.hasNext() )
@@ -65,7 +66,7 @@ public class StoragePrefixesTDB implements StoragePrefixes {
@Override
public Iterator<PrefixEntry> get(Node graphNode) {
requireTxn();
- graphNode = PrefixLib.canonicalGraphName(graphNode);
+ graphNode = canonicalGraphName(graphNode);
Iterator<Tuple<Node>> iter = prefixTable.find(graphNode, null, null);
return Iter.iter(iter).map(t->PrefixEntry.create(t.get(1).getLiteralLexicalForm(), t.get(2).getURI()));
}
@@ -83,12 +84,12 @@ public class StoragePrefixesTDB implements StoragePrefixes {
add_ext(graphNode, prefix, iriStr);
}
- /** Add without checks - used by the bulkloader when it takes control of the transaction. */
+ /** Add without checks - used by the bulkloader when it takes control of the transaction. */
public void add_ext(Node graphNode, String prefix, String iriStr) {
// By exposing the operation here, we use the rules (e.g. canonicalGraphName) on
// added prefixes. Going to the NodeTupleTable prefixTable would skip those and
// require node creation in the caller as well.
- graphNode = PrefixLib.canonicalGraphName(graphNode);
+ graphNode = canonicalGraphName(graphNode);
Node p = NodeFactory.createLiteral(prefix);
Node u = NodeFactory.createURI(iriStr);
// Delete any existing old mapping of prefix.
@@ -112,10 +113,10 @@ public class StoragePrefixesTDB implements StoragePrefixes {
remove_ext(g, p, u);
}
- /** Remove without checks - used by the bulkloader when it takes control of the transaction. */
+ /** Remove without checks - used by the bulkloader when it takes control of the transaction. */
private void remove_ext(Node g, Node p, Node u) {
// See add_ext
- g = PrefixLib.canonicalGraphName(g);
+ g = canonicalGraphName(g);
Iterator<Tuple<Node>> iter = prefixTable.find(g, p, u);
List<Tuple<Node>> list = Iter.toList(iter); // Materialize.
for ( Tuple<Node> tuple : list )
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
index 431ed60..410b153 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
@@ -24,8 +24,6 @@ import org.apache.jena.sparql.graph.GraphsTests;
import org.apache.jena.tdb2.sys.SystemTDB;
import org.junit.AfterClass;
import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
public abstract class AbstractTestGraphsTDB extends GraphsTests
{
@@ -38,14 +36,4 @@ public abstract class AbstractTestGraphsTDB extends GraphsTests
}
@AfterClass public static void afterClass() { SystemTDB.setDefaultReorderTransform(reorder); }
-
- // These don't pass ... not quite clear if the test is right. Investigate.
-
- @Override
- @Ignore @Test public void graph_count5() {}
-
- @Override
- @Ignore @Test public void graph_count6() {}
-
-
}
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
index 1fc4f06..32a335f 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
@@ -24,7 +24,6 @@ import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.tdb2.junit.TL;
import org.junit.After;
import org.junit.Before;
-import org.junit.Test;
// Quad tests
public class TestDatasetGraphTDB extends AbstractDatasetGraphTests
@@ -44,10 +43,4 @@ public class TestDatasetGraphTDB extends AbstractDatasetGraphTests
protected DatasetGraph emptyDataset() {
return dsg;
}
-
- @Override
- // Empty graph tests: N/A
- @Test public void graph_01()
- {}
-
}
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
index 55ee251..2abb355 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
@@ -110,7 +110,8 @@ public class TestDatasetTDB
load1(m);
Model m2 = ds.getNamedModel("http://example/graph/");
String x = m2.expandPrefix(":x");
- assertEquals(x, ":x");
+ // Shared prefixes.
+ assertEquals("http://example/x", x);
}
@Test public void query1()
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
index 0e7760b..c3b0631 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
@@ -137,7 +137,7 @@ public class TestDatabaseOps
// at org.apache.jena.tdb2.sys.TestDatabaseOps.compact_prefixes_3(TestDatabaseOps.java:135)
// (and now JDK15).
// The NPE is from java.nio.file.Files.provider.
- // It does not fail anywhere else ecept at ASF and it does not always fail.
+ // It does not fail anywhere else except at ASF and it does not always fail.
// This seems to be on specific, maybe just on, Jenkins build node.
try {
compact_prefixes_3_test();
@@ -162,8 +162,17 @@ public class TestDatabaseOps
DatasetGraph dsg1 = dsgs.get();
Location loc1 = ((DatasetGraphTDB)dsg1).getLocation();
+ // Before
+ int x1 = Txn.calculateRead(dsg, ()->dsg.prefixes().size());
+ assertTrue("Prefxies count", x1 > 0);
+
DatabaseMgr.compact(dsgs); // HERE
+ // After
+ int x2 = Txn.calculateRead(dsg, ()->dsg.prefixes().size());
+
+ assertEquals("Before and after prefix count", x1, x2);
+
Graph g2 = dsgs.getDefaultGraph();
Txn.executeRead(dsgs, ()-> {
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
index 2dd08b7..6565774 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
@@ -6,9 +6,9 @@
* 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.
@@ -47,11 +47,11 @@ import org.apache.jena.sparql.util.NodeFactoryExtra;
* types used in Query and Update construction.
*/
public class Converters {
-
- private Converters() {
+
+ private Converters() {
// do not make instance
}
-
+
/**
* Converts any Node_Variable nodes into Var nodes.
* @param n the node to check
@@ -65,7 +65,7 @@ public class Converters {
}
return n;
}
-
+
/**
* Creates a literal from an object.
* If the object type is registered with the TypeMapper the associated literal
@@ -76,17 +76,17 @@ public class Converters {
* @throws IllegalArgumentException if object type is not registered.
*/
public static Node makeLiteral(Object o) {
-
+
RDFDatatype dt = TypeMapper.getInstance().getTypeByValue( o );
if (dt == null) {
String msg = "No TypeDef defined for %s. Use TypeMapper.getInstance().register() to "
+ "register one or use makeLiteral() method in query builder instance.";
throw new IllegalArgumentException( String.format( msg, o.getClass()));
- }
+ }
return NodeFactory.createLiteral(LiteralLabelFactory.createTypedLiteral(o));
}
-
+
/**
* Creates a literal from the value and type URI.
* There are several possible outcomes:
@@ -98,10 +98,10 @@ public class Converters {
* will return a proper object.
* </li><li>
* If the URI is unregistered a Datatype is created but not registered
- * with the TypeMapper. The resulting node is properly constructed for
- * used in output serialization, queries, or updates. Calling
+ * with the TypeMapper. The resulting node is properly constructed for
+ * used in output serialization, queries, or updates. Calling
* {@code getLiteralValue()} on the returned node will throw DatatypeFormatException.
- * Note that if {@code JenaParameters.enableEagerLiteralValidation} is true the
+ * Note that if {@code JenaParameters.enableEagerLiteralValidation} is true the
* DatatypeFormatException will be thrown by this method.
* </li><li>
* If the URI is registered but the value is not a proper lexical form
@@ -124,7 +124,7 @@ public class Converters {
public boolean isValidValue(Object valueForm) {
return false;
}
-
+
@Override
public Object parse(String lexicalForm) throws DatatypeFormatException {
RDFDatatype dt = TypeMapper.getInstance().getTypeByName(uri);
@@ -134,7 +134,7 @@ public class Converters {
}
return dt.parse( lexicalForm );
}
-
+
};
} else {
oValue = dt.parse( value );
@@ -142,7 +142,7 @@ public class Converters {
LiteralLabel ll = LiteralLabelFactory.createByValue( oValue, null, dt );
return NodeFactory.createLiteral(ll);
}
-
+
/**
* Makes a node from an object while using the associated prefix mapping.
* <ul>
@@ -172,8 +172,7 @@ public class Converters {
}
if (o instanceof String) {
try {
- return checkVar(NodeFactoryExtra.parseNode((String) o, PrefixMapFactory
- .createForInput(pMapping)));
+ return checkVar(NodeFactoryExtra.parseNode((String) o, PrefixMapFactory.create(pMapping)));
} catch (final RiotException e) {
// expected in some cases -- do nothing
}
@@ -198,7 +197,7 @@ public class Converters {
* @param o the object that should be interpreted as a path or a node.
* @param pMapping the prefix mapping to resolve path or node with
* @return the Path or Node
- * @see #makeLiteral(Object)
+ * @see #makeLiteral(Object)
*/
public static Object makeNodeOrPath(Object o, PrefixMapping pMapping)
{
@@ -217,7 +216,7 @@ public class Converters {
return checkVar((Node)o);
}
if (o instanceof String) {
- try {
+ try {
final Path p = PathParser.parse((String) o, pMapping);
if (p instanceof P_Link)
{
@@ -225,14 +224,14 @@ public class Converters {
}
return p;
}
-
+
catch (final Exception e)
{
// expected in some cases -- do nothing
}
}
- return makeNode( o, pMapping );
+ return makeNode( o, pMapping );
}
/**
@@ -251,7 +250,7 @@ public class Converters {
* <li>For all other objects will return the "?" prefixed to the toString()
* value.</li>
* </ul>
- *
+ *
* @param o
* The object to convert.
* @return the Var value.
@@ -283,24 +282,24 @@ public class Converters {
/**
* A convenience method to quote a string.
* @param q the string to quote.
- *
- * Will use single quotes if there are no single quotes in the string or if the
+ *
+ * Will use single quotes if there are no single quotes in the string or if the
* double quote is before the single quote in the string.
- *
+ *
* Will use double quote otherwise.
- *
- * @return the quoted string.
+ *
+ * @return the quoted string.
*/
public static String quoted(String q) {
int qt = q.indexOf('"');
int sqt = q.indexOf("'");
- if (qt == -1) {
+ if (qt == -1) {
qt = Integer.MAX_VALUE;
}
if (sqt == -1) {
sqt = Integer.MAX_VALUE;
}
-
+
if (qt <= sqt)
{
return String.format( "'%s'", q);
@@ -328,7 +327,7 @@ public class Converters {
if (o == null)
{
values.add( null );
- } else
+ } else
{
values.add( makeNode( o, prefixMapping ));
}
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
index 8f3097f..2efe240 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
@@ -35,7 +35,7 @@ import org.apache.jena.web.HttpSC;
/** The ping servlet provides a low cost, uncached endpoint that can be used
* to determine if this component is running and responding. For example,
- * a nagios check should use this endpoint.
+ * a Nagios check should use this endpoint.
*/
public class ActionPing extends HttpServlet
{
@@ -54,7 +54,6 @@ public class ActionPing extends HttpServlet
doCommon(req, resp);
}
-
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) {
doCommon(req, resp);
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
index 5d3cd21..6c72a5a 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
@@ -190,20 +190,6 @@ public class Dispatcher {
return processor;
}
-
-
-// // Find the endpoints for an operation.
-// // This is GSP_R/GSP_RW aware.
-// // If asked for GSP_R and there are no endpoints for GSP_R, try GSP_RW.
-// private static Collection<Endpoint> getEndpoints(DataService dataService, Operation operation) {
-// Collection<Endpoint> x = dataService.getEndpoints(operation);
-// if ( x == null || x.isEmpty() ) {
-// if ( operation == GSP_R ) // [GSP Promote]
-// x = dataService.getEndpoints(GSP_RW);
-// }
-// return x;
-// }
-
/**
* Choose an endpoint.
* An endpoint is a name and an operation.
diff --git a/jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java b/jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
similarity index 63%
copy from jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java
copy to jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
index 9353cca..31fe74d 100644
--- a/jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
@@ -16,21 +16,22 @@
* limitations under the License.
*/
-package org.apache.jena.tdb.graph;
+package org.apache.jena.test;
-import org.junit.runner.RunWith ;
-import org.junit.runners.Suite ;
+import org.apache.jena.test.assembler.TS_Assembler;
+import org.apache.jena.test.integration.TS_Integration;
+import org.apache.jena.test.rdfconnection.TS_RDFConnectionIntegration;
+import org.apache.jena.test.txn.TS_TranactionIntegration;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses( {
- TestPrefixMappingTDB.class
- , TestDatasetGraphTDB.class
- , TestGraphsTDBnonTxn.class
- , TestGraphsTDBinsideTxn.class
- , TestDatasetGraphAccessorTDB.class
- , TestGraphOverDatasetTDB.class
+ TS_Integration.class
+ , TS_TranactionIntegration.class
+ , TS_RDFConnectionIntegration.class
+ , TS_Assembler.class
})
-public class TS_Graph
-{
-}
+public class TC_Integration { }
+
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
similarity index 72%
rename from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
rename to jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
index 1ee7efb..ddad9b6 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
@@ -16,17 +16,15 @@
* limitations under the License.
*/
-package org.apache.jena.riot.system;
+package org.apache.jena.test.integration;
-/**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
- */
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
- @Override
- protected PrefixMap getPrefixMap() {
- return new PrefixMapExtended(new PrefixMapStd());
- }
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {
+ TestDatasetPrefixes.class
+})
-}
+/** General system integration tests */
+public class TS_Integration {}
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java
new file mode 100644
index 0000000..d79f948
--- /dev/null
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java
@@ -0,0 +1,236 @@
+/*
+ * 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.test.integration;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.jena.atlas.lib.Creator;
+import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
+import org.apache.jena.shared.JenaException;
+import org.apache.jena.sparql.JenaTransactionException;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphFactory;
+import org.apache.jena.sparql.core.DatasetGraphMap;
+import org.apache.jena.sparql.core.DatasetGraphMapLink;
+import org.apache.jena.sparql.graph.GraphFactory;
+import org.apache.jena.system.Txn;
+import org.apache.jena.tdb.TDBFactory;
+import org.apache.jena.tdb.transaction.TDBTransactionException;
+import org.apache.jena.tdb2.DatabaseMgr;
+import org.junit.Assume;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+// Tests go simple -> complex
+// Does not matter ass to their execution, it does help pinpoint what has broken.
+/**
+ * Test of dataset prefixes.
+ * See {@code AbstractTestPrefixMap} for tests of prefix maps in general.
+ */
+
+
+@FixMethodOrder(MethodSorters.JVM)
+@RunWith(Parameterized.class)
+public class TestDatasetPrefixes {
+
+ @Parameters(name = "{index}: {0}")
+ public static Collection<Object[]> data(){
+ Creator<DatasetGraph> c1 = ()->DatasetGraphFactory.createTxnMem();
+ Creator<DatasetGraph> c2 = ()->TDBFactory.createDatasetGraph();
+ Creator<DatasetGraph> c3 = ()->DatabaseMgr.createDatasetGraph();
+ Creator<DatasetGraph> c4 = ()->new DatasetGraphMap(); //DatasetGraphFactory.create();
+ Creator<DatasetGraph> c5 = ()->new DatasetGraphMapLink(GraphFactory.createDefaultGraph()); //DatasetGraphFactory.createGeneral();
+
+ Object[] x1 = { "TIM", c1 , false, true, true };
+ Object[] x2 = { "TDB1", c2 , true, true, true };
+ Object[] x3 = { "TDB2", c3 , true, true, true };
+ Object[] x4 = { "Map", c4 , false, false, false };
+ Object[] x5 = { "MapLink", c5 , false, false, false };
+ return Arrays.asList(x1, x2, x3, x4,x5);
+ }
+
+ private final Creator<DatasetGraph> cdsg;
+ private final boolean txnIsolation;
+ private final boolean supportsPromote;
+ private final boolean unifiedPrefixMaps;
+
+ public TestDatasetPrefixes(String name, Creator<DatasetGraph> cdsg,
+ // Do the prefixes provide full isolation?
+ boolean txnIsolation,
+ // Do the prefixes work with transaction promote?
+ boolean supportsPromote,
+ // Single shared prefix map for all graphs and the dataset?
+ boolean unifiedPrefixMaps) {
+ this.cdsg = cdsg;
+ this.txnIsolation = txnIsolation;
+ this.supportsPromote = supportsPromote;
+ this.unifiedPrefixMaps = unifiedPrefixMaps;
+ }
+
+ private DatasetGraph create() {
+ DatasetGraph dsg = cdsg.create();
+ // Force into transactional (TDB1)
+ Txn.executeWrite(dsg, () -> {});
+ return dsg;
+ }
+
+ @Test
+ public void dsg_prefixes_basic_1() {
+ DatasetGraph dsg = create();
+ PrefixMap pmap = dsg.prefixes();
+ Txn.executeRead(dsg, ()->{
+ assertEquals(0, pmap.size());
+ assertTrue(pmap.isEmpty());
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_basic_2() {
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/");
+ String x = pmap.get("ex");
+ assertEquals("http://example/", x);
+ assertEquals(1, pmap.size());
+ assertFalse(pmap.isEmpty());
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_basic_3() {
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/");
+ pmap.add("ex", "http://example/1");
+ String x = pmap.get("ex");
+ assertEquals("http://example/1", x);
+ assertEquals(1, pmap.size());
+ assertFalse(pmap.isEmpty());
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_basic_4() {
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/");
+ pmap.delete("ex");
+ String x = pmap.get("ex");
+ assertNull(x);
+ assertEquals(0, pmap.size());
+ assertTrue(pmap.isEmpty());
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_basic_5() {
+ Assume.assumeTrue(unifiedPrefixMaps);
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/");
+ PrefixMap pmapDft = Prefixes.adapt(dsg.getDefaultGraph().getPrefixMapping());
+ String x1 = pmapDft.get("ex");
+ assertEquals("http://example/", x1);
+ pmapDft.add("ex", "http://example/ns2");
+
+ PrefixMap pmapUnion = Prefixes.adapt(dsg.getUnionGraph().getPrefixMapping());
+ String x2 = pmapUnion.get("ex");
+ assertEquals("http://example/ns2", x2);
+
+ String x3 = pmap.get("ex");
+ assertEquals("http://example/ns2", x2);
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_txn_1() {
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/");
+ });
+ Txn.executeRead(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ String x = pmap.get("ex");
+ assertEquals("http://example/", x);
+ });
+ }
+
+ // Legacy: TDBTransactionException is not under JenaTransactionException.
+ @Test(expected = JenaException.class)
+ public void dsg_prefixes_txn_2() {
+ Assume.assumeTrue(txnIsolation);
+ DatasetGraph dsg = create();
+ Txn.executeRead(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ try {
+ // Write inside read.
+ // TIM prefixes are standalone, MRSW so they are thread safe but not tied to the TIM transaction lifecycle.
+ // No Isolation.
+ pmap.add("ex", "http://example/2");
+ } catch (JenaTransactionException | TDBTransactionException ex) {
+ throw ex;
+ }
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_txn_3() {
+ Assume.assumeTrue(supportsPromote);
+ DatasetGraph dsg = create();
+ Assume.assumeTrue(dsg.supportsTransactionAbort());
+ Txn.exec(dsg, TxnType.READ_PROMOTE, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/2");
+ });
+ }
+
+ @Test
+ public void dsg_prefixes_txn_4() {
+ Assume.assumeTrue(txnIsolation);
+ DatasetGraph dsg = create();
+ Txn.executeWrite(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ pmap.add("ex", "http://example/2");
+ dsg.abort();
+ });
+ Txn.executeRead(dsg, () -> {
+ PrefixMap pmap = dsg.prefixes();
+ String x = pmap.get("ex");
+ assertNull(x);
+ });
+ }
+}
+
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java b/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
index 99949b3..7f9cb4f 100644
--- a/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
@@ -49,7 +49,7 @@ import org.junit.runners.Parameterized.Parameters;
// DatasetOne, DatasetGraphOne. <-- Flag needed.
// DatasetImpl
-/** Additional testing for "Dataset over Graph" transaction mapping */
+/** Additional testing for "Dataset over Graph" transaction mapping */
@RunWith(Parameterized.class)
public class TestDataset2Graph {
@@ -60,7 +60,9 @@ public class TestDataset2Graph {
Creator<Dataset> datasetTxnMemMaker = ()-> DatasetFactory.createTxnMem() ;
Creator<Dataset> datasetTDB1 = ()-> TDBFactory.createDataset();
Creator<Dataset> datasetTDB2 = ()-> TDB2Factory.createDataset();
- return Arrays.asList(new Object[][] {
+
+
+ return Arrays.asList(new Object[][] {
{ "Plain", datasetPlainMaker },
{ "TIM", datasetTxnMemMaker },
{ "TDB1", datasetTDB1 },
@@ -74,7 +76,7 @@ public class TestDataset2Graph {
this.creator = creator;
}
- @Test public void dsgGraphTxn_model() {
+ @Test public void dsgGraphTxn_infModel() {
testInfModel(creator.create());
}
@@ -88,28 +90,28 @@ public class TestDataset2Graph {
private static void testInfModel(Dataset ds0) {
Txn.executeWrite(ds0, ()->{});
- Model baseModel = ds0.getDefaultModel();
+ Model baseModel = ds0.getDefaultModel();
Model model = ModelFactory.createInfModel(RDFSRuleReasonerFactory.theInstance().create(null), baseModel);
if ( model.getGraph().getTransactionHandler().transactionsSupported() ) {
- // InfModels do not support transactions per se - they particpate if includes in a suitable dataset.
+ // InfModels do not support transactions per se - they participate if included in a suitable dataset.
model.begin();
long x = Iter.count(model.listStatements());
model.commit();
assertTrue(x > 10);
}
}
-
+
private static void testOverDS(Dataset ds0, boolean wrap) {
// Force to transactions / verify the DSG is transactional.
Txn.executeWrite(ds0, ()->{});
- Model baseModel = ds0.getDefaultModel();
+ Model baseModel = ds0.getDefaultModel();
Model model = ModelFactory.createInfModel(RDFSRuleReasonerFactory.theInstance().create(null), baseModel);
Dataset ds1 = wrap ? DatasetFactory.wrap(model) : DatasetFactory.create(model);
try ( RDFConnection conn = RDFConnectionFactory.connect(ds1) ) {
-
+
//conn.querySelect("SELECT (count(*) AS ?C) { ?s ?p ?o } HAVING (?C = 0)", (qs)-> fail("Didn't expect any query solutions"));
-
+
// Necessary
Txn.exec(conn, TxnType.READ, ()->{
try ( QueryExecution qExec = conn.query("SELECT * { ?s ?p ?o }") ) {
@@ -118,18 +120,18 @@ public class TestDataset2Graph {
}
});
}
-
+
Triple t = SSE.parseTriple("(:s :p :o)");
Quad q = Quad.create(Quad.defaultGraphIRI, t);
-
+
// Now write via top.
Txn.executeWrite(ds1, ()->{
ds1.asDatasetGraph().add(q);
});
-
+
// And get it back again from storage.
Txn.exec(ds0, TxnType.READ, ()->{
- assertEquals(1, ds0.asDatasetGraph().getDefaultGraph().size());
+ assertEquals(1, ds0.asDatasetGraph().getDefaultGraph().size());
assertTrue(ds0.getDefaultModel().getGraph().contains(t));
});
}
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
index a780424..ce173d8 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
@@ -27,6 +27,8 @@ import org.apache.jena.graph.Triple ;
import org.apache.jena.query.ReadWrite ;
import org.apache.jena.query.TxnType;
import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
import org.apache.jena.sdb.Store ;
import org.apache.jena.sdb.graph.GraphSDB ;
import org.apache.jena.sdb.util.StoreUtils ;
@@ -35,7 +37,7 @@ import org.apache.jena.shared.LockMRSW ;
import org.apache.jena.sparql.core.* ;
import org.apache.jena.sparql.util.Context ;
-public class DatasetGraphSDB extends DatasetGraphTriplesQuads
+public class DatasetGraphSDB extends DatasetGraphTriplesQuads
implements DatasetGraph, Closeable
/** SDB uses JDBC transactions, not Dataset transactions*/
{
@@ -43,7 +45,7 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
private Lock lock = new LockMRSW() ;
private final Context context ;
private GraphSDB defaultGraph;
-
+
public DatasetGraphSDB(Store store, Context context) {
this(store, new GraphSDB(store), context);
}
@@ -78,7 +80,13 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
public Graph getGraph(Node graphNode) {
return new GraphSDB(store, graphNode);
}
-
+
+ @Override
+ public PrefixMap prefixes() {
+ // Don't create when object is created - database may not be formatted yet.
+ return Prefixes.adapt(getDefaultGraph());
+ }
+
// Use unsubtle versions (the bulk loader copes with large additions).
@Override
protected void addToDftGraph(Node s, Node p, Node o)
@@ -102,17 +110,17 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
@Override
protected Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o)
- { return LibSDB.findInQuads(this, Node.ANY, s, p, o) ; }
+ { return LibSDB.findInQuads(this, Node.ANY, s, p, o) ; }
@Override
protected Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p, Node o)
{ return LibSDB.findInQuads(this, g, s, p, o) ; }
-
+
@Override
public void close()
{ store.close() ; }
- // Transactions for SDB are an aspect of the JDBC connection not the dataset.
+ // Transactions for SDB are an aspect of the JDBC connection not the dataset.
private final Transactional txn = new TransactionalNotSupported() ;
@Override public void begin() { txn.begin(); }
@Override public void begin(TxnType txnType) { txn.begin(txnType); }
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java b/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
index fcae4c6..2fc4be3 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
@@ -45,30 +45,30 @@ public final class BPTreeNode extends BPTreePage
// Assume package access.
private static Logger log = LoggerFactory.getLogger(BPTreeNode.class) ;
-
+
private Block block ;
private int id ;
- private short blockState = READ ;
-
+ private short blockState = READ ;
+
int parent ;
int count ; // Number of records. Number of pointers is +1
-
+
// "Leaf" of the BPTree is the lowest level of ptr/key splits, not the data blocks.
// We need to know this to know which block manager the block pointers refer to.
- boolean isLeaf ;
+ boolean isLeaf ;
private RecordBuffer records ;
void setRecordBuffer(RecordBuffer r) { records = r ; }
PtrBuffer ptrs ;
/* B+Tree
- *
- * Two block managers :
+ *
+ * Two block managers :
* one for Nodes (BPlusTreePages => BPlusTreeNode)
* one for Leaves (RecordBufferPages)
- * The split key is the held in the highest in the block
- *
- * A "leaf" node is a leaf of the B+Tree part, and points to
- * highest record in a RecordBuffer
+ * The split key is the held in the highest in the block
+ *
+ * A "leaf" node is a leaf of the B+Tree part, and points to
+ * highest record in a RecordBuffer
*
* The Gap is usually zero.
* N = 2, Gap = 1 =>
@@ -77,7 +77,7 @@ public final class BPTreeNode extends BPTreePage
* N-1: MinRec = 1, MinPtr = 2
*
* BPTreeNode:
- *
+ *
* +------------------------+
* |-| K0 | K1 | K2 | K3 |--|
* +------------------------+
@@ -89,44 +89,44 @@ public final class BPTreeNode extends BPTreePage
* +------------------------+
* | P0 | P1 | P2 | ** | ** |
* +------------------------+
- *
+ *
* BPTreeRecords -> RecordBuffer:
- *
+ *
* +------------------------+
* | K0 | K1 | K2 | ** | ** |
* +------------------------+
- *
+ *
* The size of records blocks and size of tree nodes don't have to be the same.
- * They use different page managers, and are in different files.
+ * They use different page managers, and are in different files.
*
* The minimal tree is one, leaf, root BPTreeNode and one BPTreeRecords page.
- *
- * Pictures:
+ *
+ * Pictures:
* /--\ \--\
* means a block with free space introduced between records[i] and records[i+1], ptrs[i+1]/ptrs[i+2]
- * Lower half is a valid structure (except for overall size)
- *
+ * Lower half is a valid structure (except for overall size)
+ *
* /--/ /--\
* means a block with free space introduced between records[i] and records[i+1], ptrs[i]/ptrs[i+1]
- * Upper half is a valid structure (except for overall size)
+ * Upper half is a valid structure (except for overall size)
*/
// Branch nodes only need create branch nodes (splitting sideways)
// Leaf nodes only create leaf nodes.
// The root is an exception.
-
+
private BPTreeNode create(int parent, boolean isLeaf)
{
return create(bpTree, parent, isLeaf) ;
}
-
+
private static BPTreeNode create(BPlusTree bpTree, int parent, boolean isLeaf)
{
BPTreeNode n = bpTree.getNodeManager().createNode(parent) ;
n.isLeaf = isLeaf ;
return n ;
}
-
+
/*package*/ BPTreeNode(BPlusTree bpTree, Block block)
{
super(bpTree) ;
@@ -135,14 +135,14 @@ public final class BPTreeNode extends BPTreePage
}
@Override
- public void reset(Block block)
- {
+ public void reset(Block block)
+ {
this.block = block ;
// reformat block (sets record and pointer buffers)
BPTreeNodeMgr.formatBPTreeNode(this, bpTree, block, isLeaf, parent, count) ;
}
-
- /** Get the page at slot idx - switch between B+Tree and records files */
+
+ /** Get the page at slot idx - switch between B+Tree and records files */
private BPTreePage get(int idx, short state)
{
int subId = ptrs.get(idx) ;
@@ -151,9 +151,9 @@ public final class BPTreeNode extends BPTreePage
if ( state == WRITE )
return getMgrWrite(subId) ;
log.error("Unknown state: "+state) ;
- return null ;
+ return null ;
}
-
+
private BPTreePage getMgrRead(int subId)
{
if ( isLeaf )
@@ -161,7 +161,7 @@ public final class BPTreeNode extends BPTreePage
else
return bpTree.getNodeManager().getRead(subId, this.id) ;
}
-
+
private BPTreePage getMgrWrite(int subId)
{
if ( isLeaf )
@@ -172,7 +172,7 @@ public final class BPTreeNode extends BPTreePage
// ---------- Public calls.
// None of these are called recursively.
-
+
/** Find a record, using the active comparator */
public static Record search(BPTreeNode root, Record rec)
{
@@ -191,22 +191,22 @@ public final class BPTreeNode extends BPTreePage
log.debug(format("** insert(%s) / start", record)) ;
if ( DumpTree ) root.dump() ;
}
-
+
if ( ! root.isRoot() )
throw new BPTreeException("Insert begins but this is not the root") ;
-
+
if ( root.isFull() )
{
// Root full - root split is a special case.
splitRoot(root) ;
if ( DumpTree ) root.dump() ;
}
-
+
// Root ready - call insert proper.
Record result = root.internalInsert(record) ;
-
+
root.internalCheckNodeDeep() ;
-
+
if ( logging() )
{
log.debug(format("** insert(%s) / finish", record)) ;
@@ -217,7 +217,7 @@ public final class BPTreeNode extends BPTreePage
/** Delete a record - return the old value if there was one, else null*/
public static Record delete(BPTreeNode root, Record rec)
- {
+ {
if ( logging() )
{
log.debug(format("** delete(%s) / start", rec)) ;
@@ -225,7 +225,7 @@ public final class BPTreeNode extends BPTreePage
}
if ( ! root.isRoot() )
throw new BPTreeException("Delete begins but this is not the root") ;
-
+
if ( root.isLeaf && root.count == 0 )
{
// Special case. Just a records block. Allow that to go too small.
@@ -236,7 +236,7 @@ public final class BPTreeNode extends BPTreePage
page.release() ;
return r ;
}
-
+
// Entry: checkNodeDeep() ;
Record v = root.internalDelete(rec) ;
@@ -246,7 +246,7 @@ public final class BPTreeNode extends BPTreePage
root.reduceRoot() ;
root.internalCheckNodeDeep() ;
}
-
+
if ( logging() )
{
log.debug(format("** delete(%s) / finish", rec)) ;
@@ -254,8 +254,8 @@ public final class BPTreeNode extends BPTreePage
}
return v ;
}
-
- /** Returns the id of the records buffer page for this record. Records Buffer Page NOT read; record may not exist */
+
+ /** Returns the id of the records buffer page for this record. Records Buffer Page NOT read; record may not exist */
static int recordsPageId(BPTreeNode node, Record fromRec)
{
// Walk down the B+tree part of the structure ...
@@ -269,7 +269,7 @@ public final class BPTreeNode extends BPTreePage
node.release() ;
node = n ;
}
- // ... then find the id of the next step down, but do not touch the records buffer page.
+ // ... then find the id of the next step down, but do not touch the records buffer page.
int id ;
if ( fromRec == null )
{
@@ -279,7 +279,7 @@ public final class BPTreeNode extends BPTreePage
else
{
// Get the right id based on starting record.
- int idx = node.findSlot(fromRec) ;
+ int idx = node.findSlot(fromRec) ;
idx = convert(idx) ;
id = node.getPtrBuffer().get(idx) ;
}
@@ -312,7 +312,7 @@ public final class BPTreeNode extends BPTreePage
// protected BPTreeRecords findPage(Record rec)
// {
// if ( CheckingNode ) internalCheckNode() ;
-//
+//
// BPTreePage page = findHere(rec) ;
// if ( page == null )
// return null ;
@@ -320,7 +320,7 @@ public final class BPTreeNode extends BPTreePage
// page.release() ;
// return bpr ;
// }
-//
+//
// // Find first page.
// @Override
// BPTreeRecords findFirstPage()
@@ -341,59 +341,59 @@ public final class BPTreeNode extends BPTreePage
@Override final
Record getHighRecord()
{
- return records.getHigh() ;
+ return records.getHigh() ;
}
-
+
// count is the number of pointers.
-
+
@Override
final int getMaxSize() { return params.getOrder() ; }
-
+
@Override
final int getCount() { return count ; }
-
+
@Override
final void setCount(int count) { this.count = count ; }
-
+
@Override
// public ByteBuffer getBackingByteBuffer() { return byteBuffer ; }
public Block getBackingBlock() { return block ; }
-
+
/** Do not use without great care */
RecordBuffer getRecordBuffer() { return records ; }
/** Do not use without great care */
PtrBuffer getPtrBuffer() { return ptrs ; }
-
+
void setIsLeaf(boolean isLeaf) { this.isLeaf = isLeaf ; }
boolean isLeaf() { return this.isLeaf ; }
-
+
@Override
public final int getId() { return id ; }
@Override
- final void write() { bpTree.getNodeManager().write(this) ; }
-
+ final void write() { bpTree.getNodeManager().write(this) ; }
+
@Override
final void promote() { bpTree.getNodeManager().promote(this) ; }
@Override
- final void release() { bpTree.getNodeManager().release(this) ; }
+ final void release() { bpTree.getNodeManager().release(this) ; }
@Override
- final void free() { bpTree.getNodeManager().free(this) ; }
-
-
+ final void free() { bpTree.getNodeManager().free(this) ; }
+
+
// ============ SEARCH
-
- /*
+
+ /*
* Do a (binary) search of the node to find the record.
- * Returns:
- * +ve or 0 => the index of the record
+ * Returns:
+ * +ve or 0 => the index of the record
* -ve => The insertion point : the immediate higher record or length as (-i-1)
- * Convert to +ve and decend to find the RecordBuffer with the record in it.
+ * Convert to +ve and decend to find the RecordBuffer with the record in it.
*/
-
+
@Override final
Record internalSearch(Record rec)
{
@@ -407,7 +407,7 @@ public final class BPTreeNode extends BPTreePage
/** Find the next page to look at as we walk down the tree */
private final BPTreePage findHere(Record rec)
{
- int idx = findSlot(rec) ;
+ int idx = findSlot(rec) ;
idx = convert(idx) ;
// Find index, or insertion point (immediate higher slot) as (-i-1)
// A key is the highest element of the records up to this point
@@ -416,33 +416,33 @@ public final class BPTreeNode extends BPTreePage
BPTreePage page = get(idx, READ) ;
return page ;
}
-
+
// ============ INSERT
-
+
/* Traverse this page, ensuring the node below is not full before
* decending. Therefore there is always space to do the actual insert.
*/
-
+
@Override final
Record internalInsert(Record record)
{
if ( logging() )
log.debug(format("internalInsert: %s [%s]", record, this)) ;
-
+
internalCheckNode() ;
-
+
int idx = findSlot(record) ;
if ( logging() )
log.debug(format("internalInsert: idx=%d=>%d", idx, convert(idx))) ;
-
+
idx = convert(idx) ;
-
+
BPTreePage page = get(idx, READ) ;
-
+
if ( logging() )
log.debug(format("internalInsert: next: %s",page));
-
+
if ( page.isFull() )
{
// Need to split the page before descending.
@@ -480,14 +480,14 @@ public final class BPTreeNode extends BPTreePage
*/
private void split(int idx, BPTreePage y)
{
- boolean logging = logging() ;
+ boolean logging = logging() ;
//logging = true ;
if ( logging )
{
log.debug(format("split >> y.id=%d this.id=%d idx=%d", y.getId(), this.id, idx)) ;
log.debug("split -- "+y) ;
}
-
+
internalCheckNode() ;
if ( CheckingNode )
{
@@ -500,13 +500,13 @@ public final class BPTreeNode extends BPTreePage
}
}
internalCheckNodeDeep() ;
-
+
promote() ;
y.promote() ;
-
+
Record splitKey = y.getSplitKey() ;
splitKey = keyRecord(splitKey) ;
-
+
if ( logging )
log.debug(format("Split key: %s", splitKey)) ;
@@ -516,30 +516,28 @@ public final class BPTreeNode extends BPTreePage
log.debug(format("Split: %s", y)) ;
log.debug(format("Split: %s", z)) ;
}
-
+
// Key only.
if ( splitKey.hasSeparateValue() )
{
- // [Issue: FREC]
- // This creates a empty (null-byte-initialized) value array.
splitKey = params.getKeyFactory().create(splitKey.getKey()) ;
// Better: but an on-disk change. This is key only.
// splitKey = params.getKeyFactory().createKeyOnly(splitKey) ;
- }
-
+ }
+
// Insert new node. "add" shuffle's up as well.
records.add(idx, splitKey) ;
ptrs.add(idx+1, z.getId()) ;
count++ ;
-
+
if ( logging )
{
log.debug("split << "+this) ;
log.debug("split << "+y) ;
log.debug("split << "+z) ;
}
-
+
y.write();
z.write();
z.release() ;
@@ -552,15 +550,15 @@ public final class BPTreeNode extends BPTreePage
internalCheckNodeDeep() ;
}
}
-
+
@Override final
Record getSplitKey()
{
int ix = params.SplitIndex ;
- Record split = records.get(ix) ;
+ Record split = records.get(ix) ;
return split ;
}
-
+
/** Split this block - return the split record (key only needed) */
@Override final
BPTreePage split()
@@ -570,17 +568,17 @@ public final class BPTreeNode extends BPTreePage
// New block.
BPTreeNode z = create(this.parent, isLeaf) ;
-
+
// Leave the low end untouched and copy, and clear the high end.
// z becomes the new upper node, not the lower node.
// 'this' is the lower block.
-
+
int maxRec = maxRecords() ;
- // Copy from top of y into z.
+ // Copy from top of y into z.
records.copy(ix+1, z.records, 0, maxRec-(ix+1)) ;
- records.clear(ix, maxRec-ix) ; // Clear copied and median slot
+ records.clear(ix, maxRec-ix) ; // Clear copied and median slot
records.setSize(ix) ; // Reset size
-
+
ptrs.copy(ix+1, z.ptrs, 0, params.MaxPtr-(ix+1)) ;
ptrs.clear(ix+1, params.MaxPtr-(ix+1)) ;
ptrs.setSize(ix+1) ;
@@ -588,15 +586,15 @@ public final class BPTreeNode extends BPTreePage
// Set sizes of subnodes
setCount(ix) ; // Median is ix
internalCheckNode() ; // y finished
-
- z.isLeaf = isLeaf ;
+
+ z.isLeaf = isLeaf ;
z.setCount(maxRec - (ix+1)) ; // Number copied into z
// Caller puts the blocks in split(int, BTreePage)
z.internalCheckNode() ;
return z ;
}
-
+
/* Split the root and leave the root block as the root.
* This is the only point the height of the tree increases.
*
@@ -604,7 +602,7 @@ public final class BPTreeNode extends BPTreePage
* Copy root low into left
* Copy root high into right
* Set counts.
- * Create new root settings (two pointers, one key record)
+ * Create new root settings (two pointers, one key record)
* WRITE(left)
* WRITE(right)
* WRITE(root)
@@ -612,16 +610,16 @@ public final class BPTreeNode extends BPTreePage
private static void splitRoot(BPTreeNode root)
{
BPlusTree bpTree = root.bpTree ;
-
+
if ( CheckingNode )
if ( root.id != 0 ) root.error("Not root: %d (root is id zero)", root.id) ;
root.internalCheckNode() ;
root.promote() ;
-
+
// Median record
int splitIdx = root.params.SplitIndex ;
Record rec = root.records.get(splitIdx) ;
-
+
if ( logging() )
{
log.debug(format("** Split root %d (%s)", splitIdx, rec)) ;
@@ -631,9 +629,9 @@ public final class BPTreeNode extends BPTreePage
// New blocks.
BPTreeNode left = create(bpTree, root.id, root.isLeaf) ;
BPTreeNode right = create(bpTree, root.id, root.isLeaf) ;
-
+
//int maxRecords = maxRecords() ;
-
+
// New left
root.records.copy(0, left.records, 0, splitIdx) ;
root.ptrs.copy(0, left.ptrs, 0, splitIdx+1) ;
@@ -643,27 +641,27 @@ public final class BPTreeNode extends BPTreePage
root.records.copy(splitIdx+1, right.records, 0, root.maxRecords()-(splitIdx+1)) ;
root.ptrs.copy(splitIdx+1, right.ptrs, 0, root.params.MaxPtr-(splitIdx+1)) ;
right.count = root.maxRecords()-(splitIdx+1) ;
-
+
if ( logging() )
{
log.debug("splitRoot -- left: "+left) ;
log.debug("splitRoot -- right: "+right) ;
}
-
+
// So left.count+right.count = bTree.NumRec-1
-
+
// Clear root by reformatting. New root not a leaf. Has count of 1 after formatting.
BPTreeNodeMgr.formatForRoot(root, false) ;
// Make a non-leaf.
-
+
// Insert two subnodes, divided by the median record
root.count = 1 ;
-
+
root.records.add(0, rec) ;
root.ptrs.setSize(2) ;
root.ptrs.set(0, left.id) ; // slot 0
root.ptrs.set(1, right.id) ; // slot 1
-
+
if ( logging())
{
log.debug("splitRoot << "+root) ;
@@ -694,22 +692,22 @@ public final class BPTreeNode extends BPTreePage
* Descend, making sure that the node is not minimum size at each descend.
* If it is, rebalenace.
*/
-
+
@Override final
Record internalDelete(Record rec)
{
internalCheckNode() ;
if ( logging() )
log.debug(format("internalDelete(%s) : %s", rec, this)) ;
-
+
int x = findSlot(rec) ;
- // If x is >= 0, may need to adjust this
+ // If x is >= 0, may need to adjust this
int y = convert(x) ;
BPTreePage page = get(y, READ) ;
-
+
boolean thisWriteNeeded = false ;
- if ( page.isMinSize() ) // Can't be root - we decended in the get().
+ if ( page.isMinSize() ) // Can't be root - we decended in the get().
{
promote() ;
page = rebalance(page, y) ;
@@ -723,7 +721,7 @@ public final class BPTreeNode extends BPTreePage
}
this.write() ;
}
-
+
// Go to bottom
// Need to return the new key.
Record r2 = page.internalDelete(rec) ;
@@ -744,15 +742,15 @@ public final class BPTreeNode extends BPTreePage
* WRITE(root)
* RELEASE(old child)
* This is the only point the height of the tree decreases.
- */
-
+ */
+
private void reduceRoot()
{
if ( logging() )
log.debug(format("reduceRoot >> %s", this)) ;
-
+
if ( CheckingNode && ( ! isRoot() || count != 0 ) ) error("Not an empty root") ;
-
+
... 3164 lines suppressed ...