You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commonsrdf.apache.org by st...@apache.org on 2016/06/03 13:28:35 UTC

[1/7] incubator-commonsrdf git commit: commons-rdf-parent 0.3.0

Repository: incubator-commonsrdf
Updated Branches:
  refs/heads/rdf4j 6fd4ce5d9 -> 99bd16f65


commons-rdf-parent 0.3.0


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/a82949f6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/a82949f6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/a82949f6

Branch: refs/heads/rdf4j
Commit: a82949f6105f8b322dcd9c46278dd477c30f0e52
Parents: 6fd4ce5
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Thu Jun 2 18:03:42 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Thu Jun 2 18:03:42 2016 +0100

----------------------------------------------------------------------
 rdf4j/pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/a82949f6/rdf4j/pom.xml
----------------------------------------------------------------------
diff --git a/rdf4j/pom.xml b/rdf4j/pom.xml
index e02b519..204de4a 100644
--- a/rdf4j/pom.xml
+++ b/rdf4j/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-rdf-parent</artifactId>
-        <version>0.2.0-incubating-SNAPSHOT</version>
+        <version>0.3.0-incubating-SNAPSHOT</version>
     </parent>
 
     <artifactId>commons-rdf-rdf4j</artifactId>
@@ -68,7 +68,7 @@
         <dependency>
             <groupId>org.eclipse.rdf4j</groupId>
             <artifactId>rdf4j-bom</artifactId>
-            <version>${rdr4j.version}</version>
+            <version>${rdf4j.version}</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>


[7/7] incubator-commonsrdf git commit: Added RepositoryGraphImpl

Posted by st...@apache.org.
Added RepositoryGraphImpl


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/99bd16f6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/99bd16f6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/99bd16f6

Branch: refs/heads/rdf4j
Commit: 99bd16f6576ffed1efbbe3a734f77e7d82ac1157
Parents: 712eec6
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Jun 3 11:54:39 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Jun 3 11:54:39 2016 +0100

----------------------------------------------------------------------
 .../apache/commons/rdf/rdf4j/RDF4JGraph.java    |  24 ++-
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     | 132 +++++++++-------
 .../commons/rdf/rdf4j/impl/BlankNodeImpl.java   |  32 ++--
 .../commons/rdf/rdf4j/impl/GraphImpl.java       |  44 +++---
 .../apache/commons/rdf/rdf4j/impl/QuadImpl.java |  34 ++---
 .../rdf/rdf4j/impl/RepositoryGraphImpl.java     | 153 +++++++++++++++++++
 .../commons/rdf/rdf4j/impl/TripleImpl.java      |   4 +-
 7 files changed, 310 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java
index 2fcd2ea..abc4a98 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JGraph.java
@@ -17,8 +17,11 @@
  */
 package org.apache.commons.rdf.rdf4j;
 
+import java.util.Optional;
+
 import org.apache.commons.rdf.api.Graph;
 import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.repository.Repository;
 
 
 /**
@@ -28,12 +31,29 @@ import org.eclipse.rdf4j.model.Model;
 public interface RDF4JGraph extends Graph {
 	
 	/**
-	 * Return the corresponding RDF4J {@link Model}.
+	 * Return the corresponding RDF4J {@link Model}, if present.
+	 * <p>
+	 * The return value is {@link Optional#isPresent()} if this graph is
+	 * backed by a Model.
 	 * <p>
 	 * Changes to the Model are reflected in this Graph, and
 	 * vice versa.
 	 * 
 	 * @return The corresponding RDF4J Model.
 	 */
-	public Model asModel();
+	public Optional<Model> asModel();
+	
+	/**
+	 * Return the corresponding RDF4J {@link Repository}, if present.
+	 * <p>
+	 * The return value is {@link Optional#isPresent()} if this graph is
+	 * backed by a Repository.
+	 * <p>
+	 * Changes to the Repository are reflected in this Graph, and
+	 * vice versa.
+	 * 
+	 * @return The corresponding RDF4J Repository.
+	 */
+	public Optional<Repository> asRepository();
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index 3df7de9..125a46c 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -34,6 +34,7 @@ import org.apache.commons.rdf.rdf4j.impl.GraphImpl;
 import org.apache.commons.rdf.rdf4j.impl.IRIImpl;
 import org.apache.commons.rdf.rdf4j.impl.LiteralImpl;
 import org.apache.commons.rdf.rdf4j.impl.QuadImpl;
+import org.apache.commons.rdf.rdf4j.impl.RepositoryGraphImpl;
 import org.apache.commons.rdf.rdf4j.impl.TripleImpl;
 import org.eclipse.rdf4j.model.BNode;
 import org.eclipse.rdf4j.model.Model;
@@ -42,6 +43,7 @@ import org.eclipse.rdf4j.model.Value;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.LinkedHashModel;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.Repository;
 
 /**
  * RDF4J implementation of RDFTermFactory
@@ -72,18 +74,6 @@ import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
  */
 public class RDF4JTermFactory implements RDFTermFactory {
 		
-	private UUID salt = UUID.randomUUID();
-
-	private ValueFactory valueFactory;
-	
-	public RDF4JTermFactory() {
-		this.valueFactory = SimpleValueFactory.getInstance();
-	}
-	
-	public RDF4JTermFactory(ValueFactory valueFactory) { 
-		this.valueFactory = valueFactory;
-	}
-	
 	/**
 	 * 
 	 * Adapt a RDF4J {@link Value} as a Commons RDF 
@@ -102,11 +92,54 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	 * @param value
 	 * @return
 	 */
-	public RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value) {		
-		return asRDFTerm(value, salt);	
+	public static RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value, UUID salt) {		
+		if (value instanceof BNode) {
+			return new BlankNodeImpl((BNode) value, salt);
+		}
+		if (value instanceof org.eclipse.rdf4j.model.Literal) {
+			return new LiteralImpl((org.eclipse.rdf4j.model.Literal) value);
+		}
+		if (value instanceof org.eclipse.rdf4j.model.IRI) {
+			return new IRIImpl((org.eclipse.rdf4j.model.IRI) value);
+		}
+		throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass());		
 	}
 
 	/**
+	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
+	 * {@link Triple}.
+	 * 
+	 * @param statement
+	 * @return
+	 */
+	public static RDF4JTriple asTriple(final Statement statement, UUID salt) {
+		return new TripleImpl(statement, salt);
+	}
+	
+	private UUID salt = UUID.randomUUID();
+	
+	private ValueFactory valueFactory;
+	
+	public RDF4JTermFactory() {
+		this.valueFactory = SimpleValueFactory.getInstance();
+	}
+
+	public RDF4JTermFactory(ValueFactory valueFactory) { 
+		this.valueFactory = valueFactory;
+	}	
+	
+	/**
+	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
+	 * {@link Quad}.
+	 * 
+	 * @param statement
+	 * @return A {@link RDF4JQuad} that is equivalent to the statement
+	 */
+	public RDF4JQuad asQuad(final Statement statement) {
+		return new QuadImpl(statement, salt);
+	}
+	
+	/**
 	 * 
 	 * Adapt a RDF4J {@link Value} as a Commons RDF 
 	 * {@link RDFTerm}.
@@ -124,19 +157,10 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	 * @param value
 	 * @return
 	 */
-	public static RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value, UUID salt) {		
-		if (value instanceof BNode) {
-			return new BlankNodeImpl((BNode) value, salt);
-		}
-		if (value instanceof org.eclipse.rdf4j.model.Literal) {
-			return new LiteralImpl((org.eclipse.rdf4j.model.Literal) value);
-		}
-		if (value instanceof org.eclipse.rdf4j.model.IRI) {
-			return new IRIImpl((org.eclipse.rdf4j.model.IRI) value);
-		}
-		throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass());		
+	public RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value) {		
+		return asRDFTerm(value, salt);	
 	}	
-	
+
 	/**
 	 * Adapt an RDF4J {@link Model} as a 
 	 * Commons RDF {@link Graph}.
@@ -150,7 +174,30 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	public RDF4JGraph asRDFTermGraph(Model model) {
 		return new GraphImpl(model);
 	}
+
+	/**
+	 * Adapt an RDF4J {@link Repository} as a 
+	 * Commons RDF {@link Graph}.
+	 * <p>
+	 * Changes to the graph are reflected in the repository, and
+	 * vice versa. 
+	 * 
+	 * @param model RDF4J {@link Repository} to connect to.
+	 * @return Adapted {@link Graph}.
+	 */
+	public RDF4JGraph asRDFTermGraph(Repository repository) {
+		return new RepositoryGraphImpl(repository);
+	}	
 	
+	public Statement asStatement(Quad quad) {
+		return valueFactory.createStatement(
+				(org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), 
+				(org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), 
+				asValue(quad.getObject()), 				
+				(org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null))
+				);
+	}
+
 	public Statement asStatement(Triple triple) {
 		if (triple instanceof RDF4JTripleLike) { 
 			// This covers both RDF4JQuad and RDF4JTriple
@@ -161,16 +208,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 				(org.eclipse.rdf4j.model.Resource) asValue(triple.getSubject()), 
 				(org.eclipse.rdf4j.model.IRI) asValue(triple.getPredicate()), 
 				asValue(triple.getObject()));
-	}	
-
-	public Statement asStatement(Quad quad) {
-		return valueFactory.createStatement(
-				(org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), 
-				(org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), 
-				asValue(quad.getObject()), 				
-				(org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null))
-				);
-	}	
+	}
 	
 	/**
 	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
@@ -182,28 +220,6 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	public RDF4JTriple asTriple(final Statement statement) {
 		return new TripleImpl(statement, salt);
 	}
-
-	/**
-	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
-	 * {@link Quad}.
-	 * 
-	 * @param statement
-	 * @return A {@link RDF4JQuad} that is equivalent to the statement
-	 */
-	public RDF4JQuad asQuad(final Statement statement) {
-		return new QuadImpl(statement, salt);
-	}
-	
-	/**
-	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
-	 * {@link Triple}.
-	 * 
-	 * @param statement
-	 * @return
-	 */
-	public static RDF4JTriple asTriple(final Statement statement, UUID salt) {
-		return new TripleImpl(statement, salt);
-	}
 	
 	/**
 	 * Adapt a Commons RDF {@link RDFTerm} as a RDF4J {@link Value}.

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
index 6921f45..625088a 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
@@ -29,8 +29,8 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode>
 	implements RDF4JBlankNode {
 	
 	private transient int hashCode = 0;
-	private long saltUUIDmost;
 	private long saltUUIDleast;
+	private long saltUUIDmost;
 	
 	public BlankNodeImpl(BNode bNode, UUID salt) {
 		super(bNode);			
@@ -60,21 +60,6 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode>
 		return hashCode = uniqueReference().hashCode();
 	}
 
-	@Override
-	public String ntriplesString() {
-		if (isValidBlankNodeLabel(value.getID())) { 
-			return "_:" + value.getID();
-		} else {
-			return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8));
-		}
-	}
-
-	@Override
-	public String uniqueReference() {
-		UUID uuid = new UUID(saltUUIDmost, saltUUIDleast);
-		return "urn:uuid:" + uuid + "#" + value.getID();
-	}
-
 	private boolean isValidBlankNodeLabel(String id) {
 		// FIXME: Replace with a regular expression?			
 		if (id.isEmpty()) { 
@@ -90,4 +75,19 @@ public final class BlankNodeImpl extends AbstractRDFTerm<BNode>
 		}
 		return true;
 	}
+
+	@Override
+	public String ntriplesString() {
+		if (isValidBlankNodeLabel(value.getID())) { 
+			return "_:" + value.getID();
+		} else {
+			return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8));
+		}
+	}
+
+	@Override
+	public String uniqueReference() {
+		UUID uuid = new UUID(saltUUIDmost, saltUUIDleast);
+		return "urn:uuid:" + uuid + "#" + value.getID();
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
index 966ac32..bf3aad2 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
@@ -17,6 +17,7 @@
  */
 package org.apache.commons.rdf.rdf4j.impl;
 
+import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.commons.rdf.api.BlankNodeOrIRI;
@@ -27,6 +28,7 @@ import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
 import org.apache.commons.rdf.rdf4j.RDF4JTriple;
 import org.eclipse.rdf4j.model.Model;
 import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.repository.Repository;
 
 public final class GraphImpl implements RDF4JGraph {
 	
@@ -56,11 +58,16 @@ public final class GraphImpl implements RDF4JGraph {
 		model.add(rdf4jTermFactory.asStatement(triple));
 	}
 
-	public Model asModel() { 
-		return model;
+	public Optional<Model> asModel() { 
+		return Optional.of(model);
 	}
 
 	@Override
+	public Optional<Repository> asRepository() {
+		return Optional.empty();
+	}
+	
+	@Override
 	public void clear() {
 		model.clear();
 	}
@@ -79,26 +86,11 @@ public final class GraphImpl implements RDF4JGraph {
 	}
 
 	@Override
-	public Stream<RDF4JTriple> stream() {
-		return model.parallelStream().map(rdf4jTermFactory::asTriple);
-	}
-
-	@Override
-	public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
-		return model.filter(
-				(Resource)rdf4jTermFactory.asValue(subject), 
-				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-				rdf4jTermFactory.asValue(object)).parallelStream()
-			.map(rdf4jTermFactory::asTriple);
-	}
-
-	@Override
 	public void remove(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
 		model.remove(
 				(Resource)rdf4jTermFactory.asValue(subject), 
 				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-				rdf4jTermFactory.asValue(object));
-		
+				rdf4jTermFactory.asValue(object));		
 	}
 
 	@Override
@@ -112,8 +104,24 @@ public final class GraphImpl implements RDF4JGraph {
 		if (size < Integer.MAX_VALUE) {
 			return size;
 		} else {
+			// TODO: Check if this can really happen with RDF4J models
 			// Collection.size() can't help us, we'll have to count
 			return model.parallelStream().count();
 		}				
 	}
+
+	@Override
+	public Stream<RDF4JTriple> stream() {
+		return model.parallelStream().map(rdf4jTermFactory::asTriple);
+	}
+
+	@Override
+	public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
+		return model.filter(
+				(Resource)rdf4jTermFactory.asValue(subject), 
+				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+				rdf4jTermFactory.asValue(object)).parallelStream()
+			.map(rdf4jTermFactory::asTriple);
+	}
+	
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
index 0e11eb2..1d887a0 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
@@ -13,9 +13,9 @@ import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
 import org.eclipse.rdf4j.model.Statement;
 
 public final class QuadImpl implements Quad, RDF4JQuad {
-		private final Statement statement;	
+		private transient int hashCode = 0;	
 		private UUID salt;
-		private transient int hashCode = 0;
+		private final Statement statement;
 		
 		public QuadImpl(Statement statement, UUID salt) {
 			this.statement = statement;
@@ -27,6 +27,11 @@ public final class QuadImpl implements Quad, RDF4JQuad {
 		}
 		
 		@Override
+		public Triple asTriple() {
+			return new TripleImpl(statement, salt);
+		}
+	
+		@Override
 		public boolean equals(Object obj) {
 			if (obj instanceof Triple) {
 				Triple triple = (Triple) obj;
@@ -38,6 +43,15 @@ public final class QuadImpl implements Quad, RDF4JQuad {
 		}
 	
 		@Override
+		public Optional<BlankNodeOrIRI> getGraphName() {
+			if (statement.getContext() == null) { 
+				return Optional.empty();
+			}
+			BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt);
+			return Optional.of(g);
+		}
+		
+		@Override
 		public RDFTerm getObject() {
 			return RDF4JTermFactory.asRDFTerm(statement.getObject(), salt);
 		}
@@ -51,7 +65,7 @@ public final class QuadImpl implements Quad, RDF4JQuad {
 		public BlankNodeOrIRI getSubject() {
 			return (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getSubject(), salt);
 		}
-	
+
 		@Override
 		public int hashCode() {
 			if (hashCode  != 0) {
@@ -64,18 +78,4 @@ public final class QuadImpl implements Quad, RDF4JQuad {
 		public String toString() {
 			return statement.toString();
 		}
-
-		@Override
-		public Optional<BlankNodeOrIRI> getGraphName() {
-			if (statement.getContext() == null) { 
-				return Optional.empty();
-			}
-			BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt);
-			return Optional.of(g);
-		}
-		
-		@Override
-		public Triple asTriple() {
-			return new TripleImpl(statement, salt);
-		}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java
new file mode 100644
index 0000000..50ee2ee
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/RepositoryGraphImpl.java
@@ -0,0 +1,153 @@
+package org.apache.commons.rdf.rdf4j.impl;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.Graph;
+import org.apache.commons.rdf.api.IRI;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.rdf4j.RDF4JGraph;
+import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
+import org.apache.commons.rdf.rdf4j.RDF4JTriple;
+import org.eclipse.rdf4j.common.iteration.Iterations;
+import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryResult;
+
+public class RepositoryGraphImpl implements Graph, RDF4JGraph {
+
+	private Repository repository;
+	private boolean includeInferred;
+	boolean shouldWeShutdown = false;
+	private RDF4JTermFactory rdf4jTermFactory;
+
+	public RepositoryGraphImpl(Repository repository) {
+		this(repository, false);
+	}
+
+	public RepositoryGraphImpl(Repository repository, boolean includeInferred) {
+		this.repository = repository;
+		this.includeInferred = includeInferred;
+		if (! repository.isInitialized()) {
+			repository.initialize();
+			shouldWeShutdown = true;
+		}
+		rdf4jTermFactory = new RDF4JTermFactory(repository.getValueFactory());		
+	}
+
+	
+	@Override
+	public void close() throws Exception {
+		if (shouldWeShutdown) {		
+			repository.shutDown();
+		}
+		// else: repository was initialized outside, so we should not shut it down
+	}
+
+	@Override
+	public void add(Triple triple) {
+		Statement statement = rdf4jTermFactory.asStatement(triple);
+		try (RepositoryConnection conn = getRepositoryConnection()) {			
+			conn.add(statement);
+		}
+	}
+
+	@Override
+	public void add(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
+		Resource subj = (Resource) rdf4jTermFactory.asValue(subject);
+		org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate);
+		Value obj = rdf4jTermFactory.asValue(object);
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			conn.add(subj, pred, obj);
+		}
+	}
+
+	@Override
+	public boolean contains(Triple triple) {
+		Statement statement = rdf4jTermFactory.asStatement(triple);
+		try (RepositoryConnection conn = getRepositoryConnection()) {			
+			return conn.hasStatement(statement, includeInferred );
+		}
+	}
+
+	@Override
+	public boolean contains(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
+		Resource subj = (Resource) rdf4jTermFactory.asValue(subject);
+		org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate);
+		Value obj = rdf4jTermFactory.asValue(object);
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			return conn.hasStatement(subj, pred, obj, includeInferred);
+		}
+	}
+
+	@Override
+	public void remove(Triple triple) {
+		Statement statement = rdf4jTermFactory.asStatement(triple);
+		try (RepositoryConnection conn = getRepositoryConnection()) {			
+			conn.remove(statement);
+		}
+	}
+
+	@Override
+	public void remove(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
+		Resource subj = (Resource) rdf4jTermFactory.asValue(subject);
+		org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate);
+		Value obj = rdf4jTermFactory.asValue(object);
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			conn.remove(subj, pred, obj);
+		}
+	}
+
+	@Override
+	public void clear() {
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			conn.clear();
+		}
+	}
+
+	@Override
+	public long size() {
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			// FIXME: The below might contain duplicate statements across multiple contexts
+			return conn.size();
+		}
+		
+	}
+
+	@Override
+	public Stream<RDF4JTriple> stream() {
+		return stream(null, null, null);
+	}
+
+	@Override
+	public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
+		Resource subj = (Resource) rdf4jTermFactory.asValue(subject);
+		org.eclipse.rdf4j.model.IRI pred = (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate);
+		Value obj = rdf4jTermFactory.asValue(object);
+		try (RepositoryConnection conn = getRepositoryConnection()) {
+			// FIXME: Will the above close too early? (e.g. when returning iterator)
+			RepositoryResult<Statement> statements = conn.getStatements(subj, pred, obj);
+			return Iterations.stream(statements).map(rdf4jTermFactory::asTriple);
+		}		
+	}
+
+	private RepositoryConnection getRepositoryConnection() {
+		return repository.getConnection();
+	}
+
+	public Optional<Repository> asRepository() {
+		return Optional.of(repository);
+	}
+
+	@Override
+	public Optional<Model> asModel() {
+		return Optional.empty();
+	}	
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/99bd16f6/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
index 74564fb..c494006 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
@@ -11,8 +11,8 @@ import org.apache.commons.rdf.rdf4j.RDF4JTriple;
 import org.eclipse.rdf4j.model.Statement;
 
 public final class TripleImpl implements Triple, RDF4JTriple {
-		private final Statement statement;	
-		private UUID salt;
+		private UUID salt;	
+		private final Statement statement;
 		
 		public TripleImpl(Statement statement, UUID salt) {
 			this.statement = statement;


[3/7] incubator-commonsrdf git commit: GraphImpl also static class

Posted by st...@apache.org.
GraphImpl also static class


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/ed0213dd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/ed0213dd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/ed0213dd

Branch: refs/heads/rdf4j
Commit: ed0213ddc6ae5990052a1f0a7f0824dcb66b32b6
Parents: 2cde4c9
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Thu Jun 2 18:09:27 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Thu Jun 2 18:09:27 2016 +0100

----------------------------------------------------------------------
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     | 45 +++++++++++---------
 1 file changed, 26 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/ed0213dd/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index d8943db..b60c726 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -356,25 +356,32 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		}
 	}
 
-	private final class GraphImpl implements RDF4JGraph {
+	private final static class GraphImpl implements RDF4JGraph {
 		
 		private Model model;
+		private RDF4JTermFactory rdf4jTermFactory;
 	
 		GraphImpl(Model model) {
-			this.model = model;		
+			this.model = model;	
+			this.rdf4jTermFactory = new RDF4JTermFactory();
+		}
+
+		GraphImpl(Model model, RDF4JTermFactory rdf4jTermFactory) {
+			this.model = model;	
+			this.rdf4jTermFactory = rdf4jTermFactory;
 		}
 		
 		@Override
 		public void add(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
 			model.add(
-					(Resource)asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)asValue(predicate), 
-					asValue(object));				
+					(Resource)rdf4jTermFactory.asValue(subject), 
+					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+					rdf4jTermFactory.asValue(object));				
 		}
 		
 		@Override
 		public void add(Triple triple) {
-			model.add(asStatement(triple));
+			model.add(rdf4jTermFactory.asStatement(triple));
 		}
 	
 		public Model asModel() { 
@@ -389,42 +396,42 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		@Override
 		public boolean contains(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
 			return model.contains(
-					(Resource)asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)asValue(predicate), 
-					asValue(object));
+					(Resource)rdf4jTermFactory.asValue(subject), 
+					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+					rdf4jTermFactory.asValue(object));
 		}
 	
 		@Override
 		public boolean contains(Triple triple) {
-			return model.contains(asStatement(triple));
+			return model.contains(rdf4jTermFactory.asStatement(triple));
 		}
 	
 		@Override
 		public Stream<RDF4JTriple> stream() {
-			return model.parallelStream().map(RDF4JTermFactory.this::asTriple);
+			return model.parallelStream().map(rdf4jTermFactory::asTriple);
 		}
 	
 		@Override
 		public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
 			return model.filter(
-					(Resource)asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)asValue(predicate), 
-					asValue(object)).parallelStream()
-				.map(RDF4JTermFactory.this::asTriple);
+					(Resource)rdf4jTermFactory.asValue(subject), 
+					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+					rdf4jTermFactory.asValue(object)).parallelStream()
+				.map(rdf4jTermFactory::asTriple);
 		}
 	
 		@Override
 		public void remove(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
 			model.remove(
-					(Resource)asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)asValue(predicate), 
-					asValue(object));
+					(Resource)rdf4jTermFactory.asValue(subject), 
+					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+					rdf4jTermFactory.asValue(object));
 			
 		}
 	
 		@Override
 		public void remove(Triple triple) { 
-			model.remove(asStatement(triple));
+			model.remove(rdf4jTermFactory.asStatement(triple));
 		}
 	
 		@Override


[4/7] incubator-commonsrdf git commit: Exctracted rdf4j implementation classes

Posted by st...@apache.org.
Exctracted rdf4j implementation classes


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/16ff4466
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/16ff4466
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/16ff4466

Branch: refs/heads/rdf4j
Commit: 16ff4466cd5e01ec1d59dce55294a28d908e314c
Parents: ed0213d
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Thu Jun 2 18:43:46 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Thu Jun 2 18:43:46 2016 +0100

----------------------------------------------------------------------
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     | 346 +------------------
 .../commons/rdf/rdf4j/impl/AbstractRDFTerm.java |  16 +
 .../commons/rdf/rdf4j/impl/BlankNodeImpl.java   |  93 +++++
 .../commons/rdf/rdf4j/impl/GraphImpl.java       | 119 +++++++
 .../apache/commons/rdf/rdf4j/impl/IRIImpl.java  |  61 ++++
 .../commons/rdf/rdf4j/impl/LiteralImpl.java     |  85 +++++
 .../commons/rdf/rdf4j/impl/TripleImpl.java      |  61 ++++
 7 files changed, 446 insertions(+), 335 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index b60c726..e258497 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -17,12 +17,7 @@
  */
 package org.apache.commons.rdf.rdf4j;
 
-import java.nio.charset.StandardCharsets;
-import java.util.Objects;
-import java.util.Optional;
 import java.util.UUID;
-import java.util.stream.Stream;
-
 
 // To avoid confusion, avoid importing 
 // classes that are in both
@@ -33,16 +28,18 @@ import org.apache.commons.rdf.api.Graph;
 import org.apache.commons.rdf.api.RDFTerm;
 import org.apache.commons.rdf.api.RDFTermFactory;
 import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.rdf4j.impl.BlankNodeImpl;
+import org.apache.commons.rdf.rdf4j.impl.GraphImpl;
+import org.apache.commons.rdf.rdf4j.impl.IRIImpl;
+import org.apache.commons.rdf.rdf4j.impl.LiteralImpl;
+import org.apache.commons.rdf.rdf4j.impl.TripleImpl;
 import org.eclipse.rdf4j.model.BNode;
 import org.eclipse.rdf4j.model.Model;
-import org.eclipse.rdf4j.model.Resource;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.Value;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.LinkedHashModel;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
-import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
-import org.eclipse.rdf4j.rio.turtle.TurtleUtil;
 
 /**
  * RDF4J implementation of RDFTermFactory
@@ -236,15 +233,15 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	}
 
 	@Override
-	public BlankNodeImpl createBlankNode() throws UnsupportedOperationException {
+	public RDF4JBlankNode createBlankNode() throws UnsupportedOperationException {
 		BNode bnode = valueFactory.createBNode();
-		return (BlankNodeImpl)asRDFTerm(bnode);
+		return (RDF4JBlankNode)asRDFTerm(bnode);
 	}
 
 	@Override
-	public BlankNodeImpl createBlankNode(String name) throws UnsupportedOperationException {
+	public RDF4JBlankNode createBlankNode(String name) throws UnsupportedOperationException {
 		BNode bnode = valueFactory.createBNode(name);
-		return (BlankNodeImpl)asRDFTerm(bnode);
+		return (RDF4JBlankNode)asRDFTerm(bnode);
 	}
 
 	@Override
@@ -258,9 +255,9 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	}
 
 	@Override
-	public LiteralImpl createLiteral(String lexicalForm) throws IllegalArgumentException, UnsupportedOperationException {
+	public RDF4JLiteral createLiteral(String lexicalForm) throws IllegalArgumentException, UnsupportedOperationException {
 		org.eclipse.rdf4j.model.Literal lit = valueFactory.createLiteral(lexicalForm);
-		return (LiteralImpl)asRDFTerm(lit);
+		return (RDF4JLiteral)asRDFTerm(lit);
 	}
 
 	@Override
@@ -289,325 +286,4 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	}
 
 	
-	private static final class BlankNodeImpl extends RDFTermImpl<BNode>
-		implements RDF4JBlankNode {
-		
-		private transient int hashCode = 0;
-		private long saltUUIDmost;
-		private long saltUUIDleast;
-		
-		BlankNodeImpl(BNode bNode, UUID salt) {
-			super(bNode);			
-			// Space-efficient storage of salt UUID
-			saltUUIDmost = salt.getMostSignificantBits();
-			saltUUIDleast = salt.getLeastSignificantBits();
-		}
-		
-		public boolean equals(Object obj) { 
-			if (obj == this) { 
-				return true;
-			}
-			// NOTE: Do NOT use Bnode.equals() as it has a more generous
-			// equality based only on the value.getID();			
-			if (obj instanceof BlankNode) {
-				BlankNode blankNode = (BlankNode) obj;
-				return uniqueReference().equals(blankNode.uniqueReference());								
-			}
-			return false;
-		}
-	
-		@Override
-		public int hashCode() {
-			if (hashCode != 0) {
-				return hashCode;
-			}
-			return hashCode = uniqueReference().hashCode();
-		}
-	
-		@Override
-		public String ntriplesString() {
-			if (isValidBlankNodeLabel(value.getID())) { 
-				return "_:" + value.getID();
-			} else {
-				return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8));
-			}
-		}
-	
-		@Override
-		public String uniqueReference() {
-			UUID uuid = new UUID(saltUUIDmost, saltUUIDleast);
-			return "urn:uuid:" + uuid + "#" + value.getID();
-		}
-	
-		private boolean isValidBlankNodeLabel(String id) {
-			// FIXME: Replace with a regular expression?			
-			if (id.isEmpty()) { 
-				return false;
-			}
-			if (! TurtleUtil.isBLANK_NODE_LABEL_StartChar(id.codePointAt(0)))  {
-				return false;
-			}
-			for (int i=1; i<id.length(); i++) { 
-				if (! TurtleUtil.isBLANK_NODE_LABEL_Char(id.codePointAt(i))) { 
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-	private final static class GraphImpl implements RDF4JGraph {
-		
-		private Model model;
-		private RDF4JTermFactory rdf4jTermFactory;
-	
-		GraphImpl(Model model) {
-			this.model = model;	
-			this.rdf4jTermFactory = new RDF4JTermFactory();
-		}
-
-		GraphImpl(Model model, RDF4JTermFactory rdf4jTermFactory) {
-			this.model = model;	
-			this.rdf4jTermFactory = rdf4jTermFactory;
-		}
-		
-		@Override
-		public void add(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
-			model.add(
-					(Resource)rdf4jTermFactory.asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-					rdf4jTermFactory.asValue(object));				
-		}
-		
-		@Override
-		public void add(Triple triple) {
-			model.add(rdf4jTermFactory.asStatement(triple));
-		}
-	
-		public Model asModel() { 
-			return model;
-		}
-	
-		@Override
-		public void clear() {
-			model.clear();
-		}
-	
-		@Override
-		public boolean contains(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
-			return model.contains(
-					(Resource)rdf4jTermFactory.asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-					rdf4jTermFactory.asValue(object));
-		}
-	
-		@Override
-		public boolean contains(Triple triple) {
-			return model.contains(rdf4jTermFactory.asStatement(triple));
-		}
-	
-		@Override
-		public Stream<RDF4JTriple> stream() {
-			return model.parallelStream().map(rdf4jTermFactory::asTriple);
-		}
-	
-		@Override
-		public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
-			return model.filter(
-					(Resource)rdf4jTermFactory.asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-					rdf4jTermFactory.asValue(object)).parallelStream()
-				.map(rdf4jTermFactory::asTriple);
-		}
-	
-		@Override
-		public void remove(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
-			model.remove(
-					(Resource)rdf4jTermFactory.asValue(subject), 
-					(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
-					rdf4jTermFactory.asValue(object));
-			
-		}
-	
-		@Override
-		public void remove(Triple triple) { 
-			model.remove(rdf4jTermFactory.asStatement(triple));
-		}
-	
-		@Override
-		public long size() {
-			int size = model.size();
-			if (size < Integer.MAX_VALUE) {
-				return size;
-			} else {
-				// Collection.size() can't help us, we'll have to count
-				return model.parallelStream().count();
-			}				
-		}
-	}
-
-	private final static class IRIImpl extends RDFTermImpl<org.eclipse.rdf4j.model.IRI> 
-		implements RDF4JIRI {
-	
-		IRIImpl(org.eclipse.rdf4j.model.IRI iri) {
-			super(iri);			
-		}
-		@Override
-		public boolean equals(Object obj) {
-			if (obj == this) { return true; }
-			if (obj instanceof IRIImpl) {
-				IRIImpl impl = (IRIImpl) obj; 
-				return asValue().equals(impl.asValue());
-			}
-			if (obj instanceof org.apache.commons.rdf.api.IRI) {
-				org.apache.commons.rdf.api.IRI iri = (org.apache.commons.rdf.api.IRI) obj;
-				return value.toString().equals(iri.getIRIString());
-			}
-			return false;
-		}
-	
-		@Override
-		public String getIRIString() {
-			return value.toString();
-		}
-	
-		public int hashCode() {
-			// Same definition
-			return value.hashCode();
-		}
-	
-		@Override
-		public String ntriplesString() {
-			return "<" + value.toString() +  ">";
-		}
-		@Override
-		public String toString() {
-			return value.toString();
-		}
-		
-	}
-
-	private final static class LiteralImpl 
-		extends RDFTermImpl<org.eclipse.rdf4j.model.Literal>
-	    implements RDF4JLiteral {		
-	
-		private static final String QUOTE = "\"";
-		
-		LiteralImpl(org.eclipse.rdf4j.model.Literal literal) {
-			super(literal);			
-		}
-		@Override
-		public boolean equals(Object obj) {
-			if (obj == this) { return true; }
-			if (obj instanceof org.apache.commons.rdf.api.Literal) {
-				org.apache.commons.rdf.api.Literal other = (org.apache.commons.rdf.api.Literal) obj;
-				return getLexicalForm().equals(other.getLexicalForm()) &&
-						getDatatype().equals(other.getDatatype()) && 
-						getLanguageTag().equals(other.getLanguageTag());
-				
-			}
-			return false;
-		}
-	
-		@Override
-		public org.apache.commons.rdf.api.IRI getDatatype() {
-			return new IRIImpl(value.getDatatype());
-		}
-	
-		@Override
-		public Optional<String> getLanguageTag() {
-			return value.getLanguage();
-		}
-	
-		@Override
-		public String getLexicalForm() {
-			return value.getLabel();
-		}
-	
-		public int hashCode() {
-			return Objects.hash(value.getLabel(), value.getDatatype(), value.getLanguage());
-		}
-	
-		@Override
-		public String ntriplesString() {
-			// TODO: Use a more efficient StringBuffer
-			String escaped = QUOTE + TurtleUtil.encodeString(value.getLabel()) + QUOTE;
-			if (value.getLanguage().isPresent()) {
-				return escaped + "@" + value.getLanguage().get();
-			}
-			if (value.getDatatype().equals(XMLSchema.STRING)) { 
-				return escaped;
-			}
-			return escaped + "^^<" + TurtleUtil.encodeURIString(value.getDatatype().toString()) + ">";
-		}
-	
-		@Override
-		public String toString() {
-			return ntriplesString();
-		}
-	}	
-
-	private static abstract class RDFTermImpl<T extends Value> implements RDF4JTerm<T> {
-		T value;
-	
-		RDFTermImpl(T value) {
-			this.value = value;			
-		}
-		
-		public T asValue() { 
-			return value;
-		}
-	}
-	
-	private final static class TripleImpl implements Triple, RDF4JTriple {
-		private final Statement statement;	
-		private UUID salt;
-		
-		TripleImpl(Statement statement, UUID salt) {
-			this.statement = statement;
-			this.salt = salt;
-		}
-	
-		public Statement asStatement() { 
-			return statement;
-		}
-		
-		@Override
-		public boolean equals(Object obj) {
-			if (obj instanceof Triple) {
-				Triple triple = (Triple) obj;
-				return getSubject().equals(triple.getSubject()) &&
-						getPredicate().equals(triple.getPredicate()) && 
-						getObject().equals(triple.getObject());
-			}
-			return false;
-		}
-	
-		@Override
-		public RDFTerm getObject() {
-			return asRDFTerm(statement.getObject(), salt);
-		}
-	
-		@Override
-		public org.apache.commons.rdf.api.IRI getPredicate() {
-			return (org.apache.commons.rdf.api.IRI) asRDFTerm(statement.getPredicate(), null);
-		}
-		
-		@Override
-		public BlankNodeOrIRI getSubject() {
-			return (BlankNodeOrIRI) asRDFTerm(statement.getSubject(), salt);
-		}
-	
-		@Override
-		public int hashCode() {
-			return Objects.hash(getSubject(), getPredicate(), getObject());
-		}
-		
-		@Override
-		public String toString() {
-			return statement.toString();
-		}
-}
-
-	
 }

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/AbstractRDFTerm.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/AbstractRDFTerm.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/AbstractRDFTerm.java
new file mode 100644
index 0000000..a5d5367
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/AbstractRDFTerm.java
@@ -0,0 +1,16 @@
+package org.apache.commons.rdf.rdf4j.impl;
+
+import org.apache.commons.rdf.rdf4j.RDF4JTerm;
+import org.eclipse.rdf4j.model.Value;
+
+abstract class AbstractRDFTerm<T extends Value> implements RDF4JTerm<T> {
+	T value;
+
+	AbstractRDFTerm(T value) {
+		this.value = value;			
+	}
+	
+	public T asValue() { 
+		return value;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
new file mode 100644
index 0000000..6921f45
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/BlankNodeImpl.java
@@ -0,0 +1,93 @@
+/**
+ * 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.commons.rdf.rdf4j.impl;
+
+import java.nio.charset.StandardCharsets;
+import java.util.UUID;
+
+import org.apache.commons.rdf.api.BlankNode;
+import org.apache.commons.rdf.rdf4j.RDF4JBlankNode;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.rio.turtle.TurtleUtil;
+
+public final class BlankNodeImpl extends AbstractRDFTerm<BNode>
+	implements RDF4JBlankNode {
+	
+	private transient int hashCode = 0;
+	private long saltUUIDmost;
+	private long saltUUIDleast;
+	
+	public BlankNodeImpl(BNode bNode, UUID salt) {
+		super(bNode);			
+		// Space-efficient storage of salt UUID
+		saltUUIDmost = salt.getMostSignificantBits();
+		saltUUIDleast = salt.getLeastSignificantBits();
+	}
+	
+	public boolean equals(Object obj) { 
+		if (obj == this) { 
+			return true;
+		}
+		// NOTE: Do NOT use Bnode.equals() as it has a more generous
+		// equality based only on the value.getID();			
+		if (obj instanceof BlankNode) {
+			BlankNode blankNode = (BlankNode) obj;
+			return uniqueReference().equals(blankNode.uniqueReference());								
+		}
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		if (hashCode != 0) {
+			return hashCode;
+		}
+		return hashCode = uniqueReference().hashCode();
+	}
+
+	@Override
+	public String ntriplesString() {
+		if (isValidBlankNodeLabel(value.getID())) { 
+			return "_:" + value.getID();
+		} else {
+			return "_:" + UUID.nameUUIDFromBytes(value.getID().getBytes(StandardCharsets.UTF_8));
+		}
+	}
+
+	@Override
+	public String uniqueReference() {
+		UUID uuid = new UUID(saltUUIDmost, saltUUIDleast);
+		return "urn:uuid:" + uuid + "#" + value.getID();
+	}
+
+	private boolean isValidBlankNodeLabel(String id) {
+		// FIXME: Replace with a regular expression?			
+		if (id.isEmpty()) { 
+			return false;
+		}
+		if (! TurtleUtil.isBLANK_NODE_LABEL_StartChar(id.codePointAt(0)))  {
+			return false;
+		}
+		for (int i=1; i<id.length(); i++) { 
+			if (! TurtleUtil.isBLANK_NODE_LABEL_Char(id.codePointAt(i))) { 
+				return false;
+			}
+		}
+		return true;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
new file mode 100644
index 0000000..966ac32
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/GraphImpl.java
@@ -0,0 +1,119 @@
+/**
+ * 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.commons.rdf.rdf4j.impl;
+
+import java.util.stream.Stream;
+
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.rdf4j.RDF4JGraph;
+import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
+import org.apache.commons.rdf.rdf4j.RDF4JTriple;
+import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.model.Resource;
+
+public final class GraphImpl implements RDF4JGraph {
+	
+	private Model model;
+	private RDF4JTermFactory rdf4jTermFactory;
+
+	public GraphImpl(Model model) {
+		this.model = model;	
+		this.rdf4jTermFactory = new RDF4JTermFactory();
+	}
+
+	public GraphImpl(Model model, RDF4JTermFactory rdf4jTermFactory) {
+		this.model = model;	
+		this.rdf4jTermFactory = rdf4jTermFactory;
+	}
+	
+	@Override
+	public void add(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
+		model.add(
+				(Resource)rdf4jTermFactory.asValue(subject), 
+				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+				rdf4jTermFactory.asValue(object));				
+	}
+	
+	@Override
+	public void add(Triple triple) {
+		model.add(rdf4jTermFactory.asStatement(triple));
+	}
+
+	public Model asModel() { 
+		return model;
+	}
+
+	@Override
+	public void clear() {
+		model.clear();
+	}
+
+	@Override
+	public boolean contains(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
+		return model.contains(
+				(Resource)rdf4jTermFactory.asValue(subject), 
+				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+				rdf4jTermFactory.asValue(object));
+	}
+
+	@Override
+	public boolean contains(Triple triple) {
+		return model.contains(rdf4jTermFactory.asStatement(triple));
+	}
+
+	@Override
+	public Stream<RDF4JTriple> stream() {
+		return model.parallelStream().map(rdf4jTermFactory::asTriple);
+	}
+
+	@Override
+	public Stream<RDF4JTriple> stream(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
+		return model.filter(
+				(Resource)rdf4jTermFactory.asValue(subject), 
+				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+				rdf4jTermFactory.asValue(object)).parallelStream()
+			.map(rdf4jTermFactory::asTriple);
+	}
+
+	@Override
+	public void remove(BlankNodeOrIRI subject, org.apache.commons.rdf.api.IRI predicate, RDFTerm object) {
+		model.remove(
+				(Resource)rdf4jTermFactory.asValue(subject), 
+				(org.eclipse.rdf4j.model.IRI)rdf4jTermFactory.asValue(predicate), 
+				rdf4jTermFactory.asValue(object));
+		
+	}
+
+	@Override
+	public void remove(Triple triple) { 
+		model.remove(rdf4jTermFactory.asStatement(triple));
+	}
+
+	@Override
+	public long size() {
+		int size = model.size();
+		if (size < Integer.MAX_VALUE) {
+			return size;
+		} else {
+			// Collection.size() can't help us, we'll have to count
+			return model.parallelStream().count();
+		}				
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/IRIImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/IRIImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/IRIImpl.java
new file mode 100644
index 0000000..9ae6741
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/IRIImpl.java
@@ -0,0 +1,61 @@
+/**
+ * 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.commons.rdf.rdf4j.impl;
+
+import org.apache.commons.rdf.rdf4j.RDF4JIRI;
+
+public final class IRIImpl extends AbstractRDFTerm<org.eclipse.rdf4j.model.IRI> 
+	implements RDF4JIRI {
+
+	public IRIImpl(org.eclipse.rdf4j.model.IRI iri) {
+		super(iri);			
+	}
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) { return true; }
+		if (obj instanceof IRIImpl) {
+			IRIImpl impl = (IRIImpl) obj; 
+			return asValue().equals(impl.asValue());
+		}
+		if (obj instanceof org.apache.commons.rdf.api.IRI) {
+			org.apache.commons.rdf.api.IRI iri = (org.apache.commons.rdf.api.IRI) obj;
+			return value.toString().equals(iri.getIRIString());
+		}
+		return false;
+	}
+
+	@Override
+	public String getIRIString() {
+		return value.toString();
+	}
+
+	public int hashCode() {
+		// Same definition
+		return value.hashCode();
+	}
+
+	@Override
+	public String ntriplesString() {
+		return "<" + value.toString() +  ">";
+	}
+	@Override
+	public String toString() {
+		return value.toString();
+	}
+	
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/LiteralImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/LiteralImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/LiteralImpl.java
new file mode 100644
index 0000000..0305059
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/LiteralImpl.java
@@ -0,0 +1,85 @@
+/**
+ * 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.commons.rdf.rdf4j.impl;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.commons.rdf.rdf4j.RDF4JLiteral;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.rio.turtle.TurtleUtil;
+
+public final class LiteralImpl 
+	extends AbstractRDFTerm<org.eclipse.rdf4j.model.Literal>
+    implements RDF4JLiteral {		
+
+	private static final String QUOTE = "\"";
+	
+	public LiteralImpl(org.eclipse.rdf4j.model.Literal literal) {
+		super(literal);			
+	}
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == this) { return true; }
+		if (obj instanceof org.apache.commons.rdf.api.Literal) {
+			org.apache.commons.rdf.api.Literal other = (org.apache.commons.rdf.api.Literal) obj;
+			return getLexicalForm().equals(other.getLexicalForm()) &&
+					getDatatype().equals(other.getDatatype()) && 
+					getLanguageTag().equals(other.getLanguageTag());
+			
+		}
+		return false;
+	}
+
+	@Override
+	public org.apache.commons.rdf.api.IRI getDatatype() {
+		return new IRIImpl(value.getDatatype());
+	}
+
+	@Override
+	public Optional<String> getLanguageTag() {
+		return value.getLanguage();
+	}
+
+	@Override
+	public String getLexicalForm() {
+		return value.getLabel();
+	}
+
+	public int hashCode() {
+		return Objects.hash(value.getLabel(), value.getDatatype(), value.getLanguage());
+	}
+
+	@Override
+	public String ntriplesString() {
+		// TODO: Use a more efficient StringBuffer
+		String escaped = QUOTE + TurtleUtil.encodeString(value.getLabel()) + QUOTE;
+		if (value.getLanguage().isPresent()) {
+			return escaped + "@" + value.getLanguage().get();
+		}
+		if (value.getDatatype().equals(XMLSchema.STRING)) { 
+			return escaped;
+		}
+		return escaped + "^^<" + TurtleUtil.encodeURIString(value.getDatatype().toString()) + ">";
+	}
+
+	@Override
+	public String toString() {
+		return ntriplesString();
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/16ff4466/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
new file mode 100644
index 0000000..74564fb
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/TripleImpl.java
@@ -0,0 +1,61 @@
+package org.apache.commons.rdf.rdf4j.impl;
+
+import java.util.Objects;
+import java.util.UUID;
+
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
+import org.apache.commons.rdf.rdf4j.RDF4JTriple;
+import org.eclipse.rdf4j.model.Statement;
+
+public final class TripleImpl implements Triple, RDF4JTriple {
+		private final Statement statement;	
+		private UUID salt;
+		
+		public TripleImpl(Statement statement, UUID salt) {
+			this.statement = statement;
+			this.salt = salt;
+		}
+	
+		public Statement asStatement() { 
+			return statement;
+		}
+		
+		@Override
+		public boolean equals(Object obj) {
+			if (obj instanceof Triple) {
+				Triple triple = (Triple) obj;
+				return getSubject().equals(triple.getSubject()) &&
+						getPredicate().equals(triple.getPredicate()) && 
+						getObject().equals(triple.getObject());
+			}
+			return false;
+		}
+	
+		@Override
+		public RDFTerm getObject() {
+			return RDF4JTermFactory.asRDFTerm(statement.getObject(), salt);
+		}
+	
+		@Override
+		public org.apache.commons.rdf.api.IRI getPredicate() {
+			return (org.apache.commons.rdf.api.IRI) RDF4JTermFactory.asRDFTerm(statement.getPredicate(), null);
+		}
+		
+		@Override
+		public BlankNodeOrIRI getSubject() {
+			return (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getSubject(), salt);
+		}
+	
+		@Override
+		public int hashCode() {
+			return Objects.hash(getSubject(), getPredicate(), getObject());
+		}
+		
+		@Override
+		public String toString() {
+			return statement.toString();
+		}
+}
\ No newline at end of file


[5/7] incubator-commonsrdf git commit: Added RDF4JQuad

Posted by st...@apache.org.
Added RDF4JQuad


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/b90f9fc1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/b90f9fc1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/b90f9fc1

Branch: refs/heads/rdf4j
Commit: b90f9fc122197b81b1af2235af03db780811a559
Parents: 16ff446
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Jun 3 10:26:57 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Jun 3 10:26:57 2016 +0100

----------------------------------------------------------------------
 .../org/apache/commons/rdf/rdf4j/RDF4JQuad.java | 35 +++++++++
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     | 24 ++++++-
 .../apache/commons/rdf/rdf4j/impl/QuadImpl.java | 76 ++++++++++++++++++++
 3 files changed, 134 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/b90f9fc1/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
new file mode 100644
index 0000000..acbcedc
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
@@ -0,0 +1,35 @@
+/**
+ * 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.commons.rdf.rdf4j;
+
+import org.apache.commons.rdf.api.Quad;
+import org.eclipse.rdf4j.model.Statement;
+
+/**
+ * Marker interface for RDF4J implementations of Quad.
+ * 
+ */
+public interface RDF4JQuad extends Quad {
+	
+	/**
+	 * Return the corresponding RDF4J {@link Statement}.
+	 * 
+	 * @return The corresponding RDF4J Statement.
+	 */
+	public Statement asStatement();
+}

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/b90f9fc1/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index e258497..24d2d86 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -25,6 +25,7 @@ import java.util.UUID;
 import org.apache.commons.rdf.api.BlankNode;
 import org.apache.commons.rdf.api.BlankNodeOrIRI;
 import org.apache.commons.rdf.api.Graph;
+import org.apache.commons.rdf.api.Quad;
 import org.apache.commons.rdf.api.RDFTerm;
 import org.apache.commons.rdf.api.RDFTermFactory;
 import org.apache.commons.rdf.api.Triple;
@@ -32,6 +33,7 @@ import org.apache.commons.rdf.rdf4j.impl.BlankNodeImpl;
 import org.apache.commons.rdf.rdf4j.impl.GraphImpl;
 import org.apache.commons.rdf.rdf4j.impl.IRIImpl;
 import org.apache.commons.rdf.rdf4j.impl.LiteralImpl;
+import org.apache.commons.rdf.rdf4j.impl.QuadImpl;
 import org.apache.commons.rdf.rdf4j.impl.TripleImpl;
 import org.eclipse.rdf4j.model.BNode;
 import org.eclipse.rdf4j.model.Model;
@@ -155,13 +157,22 @@ public class RDF4JTermFactory implements RDFTermFactory {
 				(org.eclipse.rdf4j.model.IRI) asValue(triple.getPredicate()), 
 				asValue(triple.getObject()));
 	}	
+
+	public Statement asStatement(Quad quad) {
+		return valueFactory.createStatement(
+				(org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), 
+				(org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), 
+				asValue(quad.getObject()), 
+				(org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null))
+				);
+	}	
 	
 	/**
 	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
 	 * {@link Triple}.
 	 * 
 	 * @param statement
-	 * @return
+	 * @return A {@link RDF4JTriple} that is equivalent to the statement
 	 */
 	public RDF4JTriple asTriple(final Statement statement) {
 		return new TripleImpl(statement, salt);
@@ -169,6 +180,17 @@ public class RDF4JTermFactory implements RDFTermFactory {
 
 	/**
 	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
+	 * {@link Quad}.
+	 * 
+	 * @param statement
+	 * @return A {@link RDF4JQuad} that is equivalent to the statement
+	 */
+	public RDF4JQuad asQuad(final Statement statement) {
+		return new QuadImpl(statement, salt);
+	}
+	
+	/**
+	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
 	 * {@link Triple}.
 	 * 
 	 * @param statement

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/b90f9fc1/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
new file mode 100644
index 0000000..7111fd2
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
@@ -0,0 +1,76 @@
+package org.apache.commons.rdf.rdf4j.impl;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.UUID;
+
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.Quad;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.rdf4j.RDF4JQuad;
+import org.apache.commons.rdf.rdf4j.RDF4JTermFactory;
+import org.eclipse.rdf4j.model.Statement;
+
+public final class QuadImpl implements Quad, RDF4JQuad {
+		private final Statement statement;	
+		private UUID salt;
+		private transient int hashCode = 0;
+		
+		public QuadImpl(Statement statement, UUID salt) {
+			this.statement = statement;
+			this.salt = salt;
+		}
+	
+		public Statement asStatement() { 
+			return statement;
+		}
+		
+		@Override
+		public boolean equals(Object obj) {
+			if (obj instanceof Triple) {
+				Triple triple = (Triple) obj;
+				return getSubject().equals(triple.getSubject()) &&
+						getPredicate().equals(triple.getPredicate()) && 
+						getObject().equals(triple.getObject());
+			}
+			return false;
+		}
+	
+		@Override
+		public RDFTerm getObject() {
+			return RDF4JTermFactory.asRDFTerm(statement.getObject(), salt);
+		}
+	
+		@Override
+		public org.apache.commons.rdf.api.IRI getPredicate() {
+			return (org.apache.commons.rdf.api.IRI) RDF4JTermFactory.asRDFTerm(statement.getPredicate(), null);
+		}
+		
+		@Override
+		public BlankNodeOrIRI getSubject() {
+			return (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getSubject(), salt);
+		}
+	
+		@Override
+		public int hashCode() {
+			if (hashCode  != 0) {
+				return hashCode;
+			}
+			return hashCode = Objects.hash(getSubject(), getPredicate(), getObject(), getGraphName());
+		}
+		
+		@Override
+		public String toString() {
+			return statement.toString();
+		}
+
+		@Override
+		public Optional<BlankNodeOrIRI> getGraphName() {
+			if (statement.getContext() == null) { 
+				return Optional.empty();
+			}
+			BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt);
+			return Optional.of(g);
+		}
+}
\ No newline at end of file


[6/7] incubator-commonsrdf git commit: Add RDF4JTripleLike

Posted by st...@apache.org.
Add RDF4JTripleLike

recognized by asStatement to return original statement


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/712eec6f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/712eec6f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/712eec6f

Branch: refs/heads/rdf4j
Commit: 712eec6fa18bf779cc56d1296d539a350858da1f
Parents: b90f9fc
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Jun 3 10:37:21 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Jun 3 10:37:21 2016 +0100

----------------------------------------------------------------------
 .../org/apache/commons/rdf/rdf4j/RDF4JQuad.java |  9 +----
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     |  9 ++++-
 .../apache/commons/rdf/rdf4j/RDF4JTriple.java   |  9 +----
 .../commons/rdf/rdf4j/RDF4JTripleLike.java      | 42 ++++++++++++++++++++
 .../apache/commons/rdf/rdf4j/impl/QuadImpl.java |  5 +++
 5 files changed, 56 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/712eec6f/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
index acbcedc..621d34f 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JQuad.java
@@ -18,18 +18,11 @@
 package org.apache.commons.rdf.rdf4j;
 
 import org.apache.commons.rdf.api.Quad;
-import org.eclipse.rdf4j.model.Statement;
 
 /**
  * Marker interface for RDF4J implementations of Quad.
  * 
  */
-public interface RDF4JQuad extends Quad {
+public interface RDF4JQuad extends Quad, RDF4JTripleLike {
 	
-	/**
-	 * Return the corresponding RDF4J {@link Statement}.
-	 * 
-	 * @return The corresponding RDF4J Statement.
-	 */
-	public Statement asStatement();
 }

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/712eec6f/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index 24d2d86..3df7de9 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -152,6 +152,11 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	}
 	
 	public Statement asStatement(Triple triple) {
+		if (triple instanceof RDF4JTripleLike) { 
+			// This covers both RDF4JQuad and RDF4JTriple
+			RDF4JTripleLike rdf4jTriple = (RDF4JTriple) triple;
+			return rdf4jTriple.asStatement();
+		}
 		return valueFactory.createStatement(
 				(org.eclipse.rdf4j.model.Resource) asValue(triple.getSubject()), 
 				(org.eclipse.rdf4j.model.IRI) asValue(triple.getPredicate()), 
@@ -162,7 +167,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		return valueFactory.createStatement(
 				(org.eclipse.rdf4j.model.Resource) asValue(quad.getSubject()), 
 				(org.eclipse.rdf4j.model.IRI) asValue(quad.getPredicate()), 
-				asValue(quad.getObject()), 
+				asValue(quad.getObject()), 				
 				(org.eclipse.rdf4j.model.Resource) asValue(quad.getGraphName().orElse(null))
 				);
 	}	
@@ -248,7 +253,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 			// This is where it gets tricky to support round trips!			
 			BlankNode blankNode = (BlankNode) term;
 			// FIXME: The uniqueReference might not be a valid BlankNode identifier..
-			// does it have to be?
+			// does it have to be in RDF4J?
 			return valueFactory.createBNode(blankNode.uniqueReference());
 		}
 		throw new IllegalArgumentException("RDFTerm was not an IRI, Literal or BlankNode: " + term.getClass());

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/712eec6f/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTriple.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTriple.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTriple.java
index ed0b4b0..4e09f19 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTriple.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTriple.java
@@ -18,18 +18,11 @@
 package org.apache.commons.rdf.rdf4j;
 
 import org.apache.commons.rdf.api.Triple;
-import org.eclipse.rdf4j.model.Statement;
 
 /**
  * Marker interface for RDF4J implementations of Triple.
  * 
  */
-public interface RDF4JTriple extends Triple {
+public interface RDF4JTriple extends Triple, RDF4JTripleLike {
 	
-	/**
-	 * Return the corresponding RDF4J {@link Statement}.
-	 * 
-	 * @return The corresponding RDF4J Statement.
-	 */
-	public Statement asStatement();
 }

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/712eec6f/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTripleLike.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTripleLike.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTripleLike.java
new file mode 100644
index 0000000..36f4fa7
--- /dev/null
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTripleLike.java
@@ -0,0 +1,42 @@
+/**
+ * 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.commons.rdf.rdf4j;
+
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.IRI;
+import org.apache.commons.rdf.api.RDFTerm;
+import org.apache.commons.rdf.api.TripleLike;
+import org.eclipse.rdf4j.model.Statement;
+
+/**
+ * Marker interface for RDF4J implementations of TripleLike statements.
+ * <p>
+ * This is backed by a {@link Statement} retrievable with {@link #asStatement()}.
+ * 
+ * @see RDF4JTriple
+ * @see RDF4JQuad
+ */
+public interface RDF4JTripleLike extends TripleLike<BlankNodeOrIRI, IRI, RDFTerm> {
+	
+	/**
+	 * Return the corresponding RDF4J {@link Statement}.
+	 * 
+	 * @return The corresponding RDF4J Statement.
+	 */
+	public Statement asStatement();
+}

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/712eec6f/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
index 7111fd2..0e11eb2 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/impl/QuadImpl.java
@@ -73,4 +73,9 @@ public final class QuadImpl implements Quad, RDF4JQuad {
 			BlankNodeOrIRI g = (BlankNodeOrIRI) RDF4JTermFactory.asRDFTerm(statement.getContext(), salt);
 			return Optional.of(g);
 		}
+		
+		@Override
+		public Triple asTriple() {
+			return new TripleImpl(statement, salt);
+		}
 }
\ No newline at end of file


[2/7] incubator-commonsrdf git commit: static classes, pass UUID salt

Posted by st...@apache.org.
static classes, pass UUID salt


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

Branch: refs/heads/rdf4j
Commit: 2cde4c93d584059d0e1d1da91b136e3062809cb2
Parents: a82949f
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Thu Jun 2 18:04:02 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Thu Jun 2 18:04:02 2016 +0100

----------------------------------------------------------------------
 .../commons/rdf/rdf4j/RDF4JTermFactory.java     | 82 +++++++++++++++-----
 1 file changed, 64 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/2cde4c93/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
----------------------------------------------------------------------
diff --git a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
index dc8bd2d..d8943db 100644
--- a/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
+++ b/rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4JTermFactory.java
@@ -73,7 +73,7 @@ import org.eclipse.rdf4j.rio.turtle.TurtleUtil;
  */
 public class RDF4JTermFactory implements RDFTermFactory {
 		
-	private String salt = "urn:uuid:" + UUID.randomUUID() + "#";
+	private UUID salt = UUID.randomUUID();
 
 	private ValueFactory valueFactory;
 	
@@ -104,8 +104,30 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	 * @return
 	 */
 	public RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value) {		
+		return asRDFTerm(value, salt);	
+	}
+
+	/**
+	 * 
+	 * Adapt a RDF4J {@link Value} as a Commons RDF 
+	 * {@link RDFTerm}.
+	 * <p>
+	 * <p>
+	 * The value will be of the same kind as the term, e.g. a
+	 * {@link org.eclipse.rdf4j.model.BNode} is converted to a
+	 * {@link org.apache.commons.rdf.api.BlankNode}, 
+	 * a {@link org.eclipse.rdf4j.model.IRI}
+	 * is converted to a {@link org.apache.commons.rdf.api.IRI}
+	 * and a {@link org.eclipse.rdf4j.model.Literal}.
+	 * is converted to a 
+	 * {@link org.apache.commons.rdf.api.Literal} 
+	 * 
+	 * @param value
+	 * @return
+	 */
+	public static RDF4JTerm<?> asRDFTerm(final org.eclipse.rdf4j.model.Value value, UUID salt) {		
 		if (value instanceof BNode) {
-			return new BlankNodeImpl((BNode) value);
+			return new BlankNodeImpl((BNode) value, salt);
 		}
 		if (value instanceof org.eclipse.rdf4j.model.Literal) {
 			return new LiteralImpl((org.eclipse.rdf4j.model.Literal) value);
@@ -114,7 +136,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 			return new IRIImpl((org.eclipse.rdf4j.model.IRI) value);
 		}
 		throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass());		
-	}
+	}	
 	
 	/**
 	 * Adapt an RDF4J {@link Model} as a 
@@ -145,10 +167,21 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	 * @return
 	 */
 	public RDF4JTriple asTriple(final Statement statement) {
-		return new TripleImpl(statement);
+		return new TripleImpl(statement, salt);
 	}
 
 	/**
+	 * Adapt a RDF4J {@link Statement} as a Commons RDF 
+	 * {@link Triple}.
+	 * 
+	 * @param statement
+	 * @return
+	 */
+	public static RDF4JTriple asTriple(final Statement statement, UUID salt) {
+		return new TripleImpl(statement, salt);
+	}
+	
+	/**
 	 * Adapt a Commons RDF {@link RDFTerm} as a RDF4J {@link Value}.
 	 * <p>
 	 * The value will be of the same kind as the term, e.g. a
@@ -256,11 +289,18 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	}
 
 	
-	private final class BlankNodeImpl extends RDFTermImpl<BNode>
+	private static final class BlankNodeImpl extends RDFTermImpl<BNode>
 		implements RDF4JBlankNode {
 		
-		BlankNodeImpl(BNode bNode) {
+		private transient int hashCode = 0;
+		private long saltUUIDmost;
+		private long saltUUIDleast;
+		
+		BlankNodeImpl(BNode bNode, UUID salt) {
 			super(bNode);			
+			// Space-efficient storage of salt UUID
+			saltUUIDmost = salt.getMostSignificantBits();
+			saltUUIDleast = salt.getLeastSignificantBits();
 		}
 		
 		public boolean equals(Object obj) { 
@@ -278,7 +318,10 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	
 		@Override
 		public int hashCode() {
-			return uniqueReference().hashCode();
+			if (hashCode != 0) {
+				return hashCode;
+			}
+			return hashCode = uniqueReference().hashCode();
 		}
 	
 		@Override
@@ -292,7 +335,8 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	
 		@Override
 		public String uniqueReference() {
-			return salt + value.getID();
+			UUID uuid = new UUID(saltUUIDmost, saltUUIDleast);
+			return "urn:uuid:" + uuid + "#" + value.getID();
 		}
 	
 		private boolean isValidBlankNodeLabel(String id) {
@@ -395,7 +439,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		}
 	}
 
-	private final class IRIImpl extends RDFTermImpl<org.eclipse.rdf4j.model.IRI> 
+	private final static class IRIImpl extends RDFTermImpl<org.eclipse.rdf4j.model.IRI> 
 		implements RDF4JIRI {
 	
 		IRIImpl(org.eclipse.rdf4j.model.IRI iri) {
@@ -436,7 +480,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		
 	}
 
-	private final class LiteralImpl 
+	private final static class LiteralImpl 
 		extends RDFTermImpl<org.eclipse.rdf4j.model.Literal>
 	    implements RDF4JLiteral {		
 	
@@ -460,7 +504,7 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	
 		@Override
 		public org.apache.commons.rdf.api.IRI getDatatype() {
-			return (org.apache.commons.rdf.api.IRI) asRDFTerm(value.getDatatype());
+			return new IRIImpl(value.getDatatype());
 		}
 	
 		@Override
@@ -508,11 +552,13 @@ public class RDF4JTermFactory implements RDFTermFactory {
 		}
 	}
 	
-	private final class TripleImpl implements Triple, RDF4JTriple {
-		private final Statement statement;
-	
-		TripleImpl(Statement statement) {
+	private final static class TripleImpl implements Triple, RDF4JTriple {
+		private final Statement statement;	
+		private UUID salt;
+		
+		TripleImpl(Statement statement, UUID salt) {
 			this.statement = statement;
+			this.salt = salt;
 		}
 	
 		public Statement asStatement() { 
@@ -532,17 +578,17 @@ public class RDF4JTermFactory implements RDFTermFactory {
 	
 		@Override
 		public RDFTerm getObject() {
-			return asRDFTerm(statement.getObject());
+			return asRDFTerm(statement.getObject(), salt);
 		}
 	
 		@Override
 		public org.apache.commons.rdf.api.IRI getPredicate() {
-			return (org.apache.commons.rdf.api.IRI) asRDFTerm(statement.getPredicate());
+			return (org.apache.commons.rdf.api.IRI) asRDFTerm(statement.getPredicate(), null);
 		}
 		
 		@Override
 		public BlankNodeOrIRI getSubject() {
-			return (BlankNodeOrIRI) asRDFTerm(statement.getSubject());
+			return (BlankNodeOrIRI) asRDFTerm(statement.getSubject(), salt);
 		}
 	
 		@Override