diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/graph/GraphUtils.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/graph/GraphUtils.java index c72c737abf0..9dc06908beb 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/util/graph/GraphUtils.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/graph/GraphUtils.java @@ -142,7 +142,41 @@ public static List multiValueURI(Resource r, Property p) { return values; } + /** @deprecated */ + @Deprecated(forRemoval=true) public static boolean exactlyOneProperty(Resource r, Property p) { + StmtIterator sIter = r.listProperties(p); + try { + if ( !sIter.hasNext() ) + return false; + sIter.next(); + if ( sIter.hasNext() ) + return false; + } + finally { + sIter.close(); + } + return true; + } + + /** Returns for exactly one object of a subject-property, else return false. */ + public static boolean checkExactlyOneProperty(Resource r, Property p) { + StmtIterator sIter = r.listProperties(p); + try { + if ( !sIter.hasNext() ) + return false; + sIter.next(); + if ( sIter.hasNext() ) + return false; + } + finally { + sIter.close(); + } + return true; + } + + /** Check for exactly one object of a subject-property. Throw an exception is this condition is not correct. */ + public static void exactlyOnePropertyEx(Resource r, Property p) { StmtIterator sIter = r.listProperties(p); try { if ( !sIter.hasNext() ) @@ -154,9 +188,10 @@ public static boolean exactlyOneProperty(Resource r, Property p) { finally { sIter.close(); } - return true; } + /** @deprecated Use {@link #atMostOneProperty} which always returns a boolean and does not throw exceptions. */ + @Deprecated(forRemoval = true) public static boolean atmostOneProperty(Resource r, Property p) { StmtIterator sIter = r.listProperties(p); try { @@ -172,8 +207,24 @@ public static boolean atmostOneProperty(Resource r, Property p) { return true; } + /** Check whether the resource-property pair has zero or one values. Return true or false. */ + public static boolean atMostOneProperty(Resource r, Property p) { + StmtIterator sIter = r.listProperties(p); + try { + if ( !sIter.hasNext() ) + return true; + sIter.next(); + if ( sIter.hasNext() ) + return false; + } + finally { + sIter.close(); + } + return true; + } + public static boolean getBooleanValue(Resource r, Property p) { - if ( !GraphUtils.atmostOneProperty(r, p) ) + if ( !GraphUtils.atMostOneProperty(r, p) ) throw new NotUniqueException(r, p); Statement s = r.getProperty(p); if ( s == null ) @@ -249,7 +300,7 @@ private static String asFilename(Resource r) { } public static RDFNode getAsRDFNode(Resource r, Property p) { - if ( !atmostOneProperty(r, p) ) + if ( !atMostOneProperty(r, p) ) throw new NotUniqueException(r, p); Statement s = r.getProperty(p); if ( s == null ) @@ -258,7 +309,7 @@ public static RDFNode getAsRDFNode(Resource r, Property p) { } public static Resource getResourceValue(Resource r, Property p) { - if ( !atmostOneProperty(r, p) ) + if ( !atMostOneProperty(r, p) ) throw new NotUniqueException(r, p); Statement s = r.getProperty(p); if ( s == null ) @@ -319,7 +370,7 @@ public static Iterator allNodes(Graph graph) { return distinctIterator; } - static class IterSO extends NiceIterator { + private static class IterSO extends NiceIterator { private ExtendedIterator it; private boolean tripleConsumed; private Triple triple; diff --git a/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerAccessDataset.java b/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerAccessDataset.java index ec3431d5ef8..12a1a049a10 100644 --- a/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerAccessDataset.java +++ b/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerAccessDataset.java @@ -42,9 +42,9 @@ public class AssemblerAccessDataset extends AssemblerBase { */ @Override public Dataset open(Assembler a, Resource root, Mode mode) { - if ( ! GraphUtils.exactlyOneProperty(root, VocabSecurity.pSecurityRegistry) ) + if ( ! GraphUtils.checkExactlyOneProperty(root, VocabSecurity.pSecurityRegistry) ) throw new AssemblerException(root, "Expected exactly one access:registry property"); - if ( ! GraphUtils.exactlyOneProperty(root, VocabSecurity.pDataset) ) + if ( ! GraphUtils.checkExactlyOneProperty(root, VocabSecurity.pDataset) ) throw new AssemblerException(root, "Expected exactly one access:dataset property"); RDFNode rnRegistry = root.getProperty(VocabSecurity.pSecurityRegistry).getObject(); diff --git a/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerSecurityRegistry.java b/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerSecurityRegistry.java index 3e734a177fc..1ee932f8507 100644 --- a/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerSecurityRegistry.java +++ b/jena-fuseki2/jena-fuseki-access/src/main/java/org/apache/jena/fuseki/access/AssemblerSecurityRegistry.java @@ -109,9 +109,9 @@ private void parseList(MultiValuedMap map, Resource root, GNode en /** Format:: access:entry [ :user "user2"; :graphs ( ) ] */ private void parseStruct(MultiValuedMap map, Resource root, Resource r) { - if ( ! GraphUtils.exactlyOneProperty(r, VocabSecurity.pUser) ) + if ( ! GraphUtils.checkExactlyOneProperty(r, VocabSecurity.pUser) ) throw new AssemblerException(root, "Expected exactly one access:user property for "+r); - if ( ! GraphUtils.exactlyOneProperty(r, VocabSecurity.pGraphs) ) + if ( ! GraphUtils.checkExactlyOneProperty(r, VocabSecurity.pGraphs) ) throw new AssemblerException(root, "Expected exactly one access:graphs property for "+r); String user = GraphUtils.getStringValue(r, VocabSecurity.pUser); diff --git a/jena-rdfpatch/src/main/java/org/apache/jena/rdfpatch/filelog/AssemblerFileLog.java b/jena-rdfpatch/src/main/java/org/apache/jena/rdfpatch/filelog/AssemblerFileLog.java index 4961b533c3c..7878291be75 100644 --- a/jena-rdfpatch/src/main/java/org/apache/jena/rdfpatch/filelog/AssemblerFileLog.java +++ b/jena-rdfpatch/src/main/java/org/apache/jena/rdfpatch/filelog/AssemblerFileLog.java @@ -21,7 +21,7 @@ package org.apache.jena.rdfpatch.filelog; -import static org.apache.jena.sparql.util.graph.GraphUtils.exactlyOneProperty; +import static org.apache.jena.sparql.util.graph.GraphUtils.checkExactlyOneProperty; import java.util.List; @@ -69,7 +69,7 @@ public AssemblerFileLog() {} @Override public Object open(Assembler a, Resource root, Mode mode) { - if ( !exactlyOneProperty(root, VocabPatch.pDataset) ) + if ( !checkExactlyOneProperty(root, VocabPatch.pDataset) ) throw new AssemblerException(root, "No dataset to be logged"); if ( !root.hasProperty(VocabPatch.pLogFile) ) throw new AssemblerException(root, "No log file"); diff --git a/jena-tdb2/src/main/java/org/apache/jena/tdb2/assembler/DatasetAssemblerTDB2.java b/jena-tdb2/src/main/java/org/apache/jena/tdb2/assembler/DatasetAssemblerTDB2.java index f1466ca036d..39d7e3838bc 100644 --- a/jena-tdb2/src/main/java/org/apache/jena/tdb2/assembler/DatasetAssemblerTDB2.java +++ b/jena-tdb2/src/main/java/org/apache/jena/tdb2/assembler/DatasetAssemblerTDB2.java @@ -21,7 +21,7 @@ package org.apache.jena.tdb2.assembler; -import static org.apache.jena.sparql.util.graph.GraphUtils.exactlyOneProperty; +import static org.apache.jena.sparql.util.graph.GraphUtils.checkExactlyOneProperty; import static org.apache.jena.sparql.util.graph.GraphUtils.getAsFilename; import static org.apache.jena.tdb2.assembler.VocabTDB2.pLocation; import static org.apache.jena.tdb2.assembler.VocabTDB2.pUnionDefaultGraph; @@ -54,7 +54,7 @@ public DatasetGraph createDataset(Assembler a, Resource root) { } public static DatasetGraph make(Assembler a, Resource root) { - if ( !exactlyOneProperty(root, pLocation) ) + if ( !checkExactlyOneProperty(root, pLocation) ) throw new AssemblerException(root, "No location given"); String dir = getAsFilename(root, pLocation); diff --git a/jena-text/src/main/java/org/apache/jena/query/text/assembler/TextIndexLuceneAssembler.java b/jena-text/src/main/java/org/apache/jena/query/text/assembler/TextIndexLuceneAssembler.java index 2316289530c..bea441a670f 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/assembler/TextIndexLuceneAssembler.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/assembler/TextIndexLuceneAssembler.java @@ -34,11 +34,12 @@ import org.apache.jena.rdf.model.RDFNode ; import org.apache.jena.rdf.model.Resource ; import org.apache.jena.rdf.model.Statement ; -import org.apache.jena.sparql.util.graph.GraphUtils ; import org.apache.lucene.analysis.Analyzer ; import org.apache.lucene.store.*; import static org.apache.jena.query.text.assembler.TextVocab.*; +import static org.apache.jena.sparql.util.graph.GraphUtils.checkExactlyOneProperty; +import static org.apache.jena.sparql.util.graph.GraphUtils.getResourceValue; public class TextIndexLuceneAssembler extends AssemblerBase { /* @@ -53,7 +54,7 @@ public class TextIndexLuceneAssembler extends AssemblerBase { @Override public TextIndex open(Assembler a, Resource root, Mode mode) { try { - if ( !GraphUtils.exactlyOneProperty(root, pDirectory) ) + if ( !checkExactlyOneProperty(root, pDirectory) ) throw new TextIndexException("No 'text:directory' property on " + root) ; Directory directory ; @@ -200,7 +201,7 @@ public TextIndex open(Assembler a, Resource root, Mode mode) { cacheQueries = cqNode.asLiteral().getBoolean(); } - Resource r = GraphUtils.getResourceValue(root, pEntityMap) ; + Resource r = getResourceValue(root, pEntityMap) ; EntityDefinition docDef = (EntityDefinition)a.open(r) ; TextIndexConfig config = new TextIndexConfig(docDef); config.setAnalyzer(analyzer);