You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/05/08 21:02:06 UTC

svn commit: r942448 [1/7] - in /incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer: ./ src/main/java/org/apache/clerezza/rdf/stable/serializer/ src/test/java/org/apache/clerezza/rdf/stable/serializer/ src/test/resources/ sr...

Author: reto
Date: Sat May  8 19:02:05 2010
New Revision: 942448

URL: http://svn.apache.org/viewvc?rev=942448&view=rev
Log:
CLEREZZA-20: fixed version of patch daniel 2010-05-29

Added:
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializer.java
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializerTest.java
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerGraphTest.java
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/Talks.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/agenda_62.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/amp-in-url-test001.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/css3deps.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/datatypes-test001.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/datatypes-test002.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/elvisimp.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/images.xrdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/libby.foaf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/rdf-charmod-literals-test001.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/rdf-charmod-uris-test001.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/rdf-charmod-uris-test002.rdf
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/resources/org/apache/clerezza/rdf/stable/serializer/xml-canon-test001.rdf
Removed:
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/RandomGraph.java
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProviderTest.java
Modified:
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/pom.xml
    incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProvider.java

Modified: incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/pom.xml?rev=942448&r1=942447&r2=942448&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/pom.xml (original)
+++ incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/pom.xml Sat May  8 19:02:05 2010
@@ -28,6 +28,17 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.jena.parser</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.utils</artifactId>
+		 <version>0.13-incubating-SNAPSHOT</version>
+		 <type>bundle</type>
+		</dependency>
+		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<scope>test</scope>
@@ -40,3 +51,4 @@
 		</dependency>
 	</dependencies>
 </project>
+

Added: incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializer.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializer.java?rev=942448&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializer.java (added)
+++ incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializer.java Sat May  8 19:02:05 2010
@@ -0,0 +1,186 @@
+/*
+ * 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.clerezza.rdf.stable.serializer;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.Literal;
+import org.apache.clerezza.rdf.core.PlainLiteral;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.TypedLiteral;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A serializer that can serialze RDF Graphs into N-Triples format.
+ *
+ * NOTE: This is a special purpose serializer to be used with
+ * {@link org.apache.clerezza.rdf.stable.serializer.StableSerializerProvider}.
+ * Instances are assumed to be short-lived and not used concurrently.
+ *
+ * @author Daniel Spicar (daniel.spicar@access.uzh.ch)
+ */
+class NTriplesSerializer {
+
+	private final Logger logger = LoggerFactory.getLogger(getClass());
+
+	private long genSymCounter = 0;
+	private HashMap<BNode, String> bNodeLabels;
+
+	/**
+	 * Resets the counter to zero that constitutes
+	 * the numerical part of blank node labels.
+	 */
+	void resetGenSymCounter() {
+		genSymCounter = 0;
+	}
+
+	/**
+	 * Serializes a given TripleCollection using the N-Triples format.
+	 *
+	 * @param os
+	 *				An outputstream.
+	 * @param tc
+	 *				the triples of the graph to be serialized.
+	 */
+	void serialize(OutputStream os, TripleCollection tc) {
+		try {
+			bNodeLabels = new HashMap<BNode, String>(tc.size() / 2);
+
+			for (Triple t : tc) {
+				if (t.getSubject() instanceof BNode) {
+					os.write(serializeBNode((BNode) t.getSubject()).getBytes());
+				} else {
+					os.write(serializeUriRef(
+							(UriRef) t.getSubject()).getBytes());
+				}
+
+				os.write((t.getPredicate().toString() + " ").getBytes());
+
+				if (t.getObject() instanceof BNode) {
+					os.write(serializeBNode((BNode) t.getObject()).getBytes());
+					os.write(".\n".getBytes());
+				} else {
+					if (t.getObject() instanceof Literal) {
+						os.write((serializeLiteral((Literal) t.getObject()) +
+								".\n").getBytes());
+					} else {
+						os.write((serializeUriRef((UriRef) t.getObject()) +
+								".\n").getBytes());
+					}
+				}
+			}
+		} catch (IOException ex) {
+			logger.error("Exception while serializing graph: {}", ex);
+		}
+	}
+
+	private String serializeUriRef(UriRef uriRef) {
+		StringBuffer sb = new StringBuffer("<");
+		escapeUtf8ToUsAscii(uriRef.getUnicodeString(), sb, true);
+		sb.append("> ");
+
+		return sb.toString() ;
+	}
+
+	private String serializeBNode(BNode bNode) {
+		if (bNodeLabels.containsKey(bNode)) {
+			return bNodeLabels.get(bNode) + " ";
+		} else {
+			String label = "_:b" + genSymCounter++;
+			bNodeLabels.put(bNode, label);
+			return label + " ";
+		}
+	}
+	
+	private String serializeLiteral(Literal literal) {
+		StringBuffer sb = new StringBuffer("\"");
+		escapeUtf8ToUsAscii(literal.getLexicalForm(), sb, false);
+		sb = sb.append("\"");
+
+		if(literal instanceof TypedLiteral) {
+			TypedLiteral typedLiteral = (TypedLiteral) literal;
+			sb.append("^^<");
+			escapeUtf8ToUsAscii(
+					typedLiteral.getDataType().getUnicodeString(), sb, false);
+			sb.append(">");
+		} else if(literal instanceof PlainLiteral) {
+			PlainLiteral plainLiteral = (PlainLiteral) literal;
+			if(plainLiteral.getLanguage() != null &&
+					!plainLiteral.getLanguage().toString().equals("")) {
+
+				sb.append("@");
+				sb.append(plainLiteral.getLanguage().toString());
+			}
+		}
+
+		sb.append(" ");
+
+		return sb.toString() ;
+	}
+
+	private void escapeUtf8ToUsAscii(String input, StringBuffer sb, boolean uri) {
+
+		for (int i = 0; i < input.length(); ++i) {
+			char c = input.charAt(i);
+			int val = (int) c;
+			if (c == '\t') {
+				sb.append("\\t");
+			} else if (c == '\n') {
+				sb.append("\\n");
+			} else if (c == '\r') {
+				sb.append("\\r");
+			} else if (c == '"') {
+				sb.append("\\\"");
+			} else if (c == '\\') {
+				sb.append("\\\\");
+			} else if ((val >= 0x0 && val <= 0x8) || (val >= 0xB && val <= 0xC) 
+					|| (val >= 0xE && val <= 0x1F)
+					|| (val >= 0x7F && val <= 0xFFFF)) {
+				sb.append("\\u");
+				sb.append(getIntegerHashString(val, 4));
+			} else if (val >= 0x10000 && val <= 0x10FFFF) {
+				sb.append("\\U");
+				sb.append(getIntegerHashString(val, 8));
+			} else {
+				if (uri && (c == '>' || c == '<')) {
+					sb.append("\\u");
+					sb.append(getIntegerHashString(val, 4));
+				} else {
+					sb.append(c);
+				}
+			}
+		}
+	}
+
+	private String getIntegerHashString(int val, int length) {
+		StringBuffer sb = new StringBuffer();
+		String hex = Integer.toHexString(val);
+		for(int i = 0; i < length - hex.length(); ++i) {
+			sb.append("0");
+		}
+		sb.append(hex);
+
+		return sb.toString().toUpperCase();
+	}
+}

Modified: incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProvider.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProvider.java?rev=942448&r1=942447&r2=942448&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProvider.java (original)
+++ incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/main/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerProvider.java Sat May  8 19:02:05 2010
@@ -27,11 +27,13 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.Graph;
 import org.apache.clerezza.rdf.core.Literal;
 import org.apache.clerezza.rdf.core.Triple;
 import org.apache.clerezza.rdf.core.TripleCollection;
@@ -39,9 +41,9 @@ import org.apache.clerezza.rdf.core.UriR
 import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
 import org.apache.clerezza.rdf.core.serializedform.SerializingProvider;
 import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
+import org.apache.clerezza.rdf.utils.GraphNode;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -80,12 +82,6 @@ public class StableSerializerProvider im
 			"(0 = no limit).", intValue=0)
 	public static final String MAX_LABELING_ITERATIONS = "max_labeling_iterations";
 
-	public static final String PARSER_FILTER =
-			"(supportedFormat=" + SupportedFormat.N3 +")";
-
-	@Reference(target=PARSER_FILTER)
-	SerializingProvider serializer;
-
 	private int maxLabelingIterations = -1;
 
 	private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -102,67 +98,80 @@ public class StableSerializerProvider im
 
 		try {
 			List<String> lines = new Vector<String>();
+			List<MSG> msgs = decomposeGraphToMSGs(tc);
+			NTriplesSerializer serializer = new NTriplesSerializer();
 
-			for (TripleCollection msg : decomposeGraphToMSGs(tc)) {
-				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			computeMsgHashes(msgs, "MD5");
 
-				serializer.
-						serialize(baos, msg, formatIdentifier);
+			for (MSG msg : msgs) {
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				serializer.serialize(baos, msg.tc);
 				BufferedReader serializedGraph =
 						new BufferedReader(new StringReader(baos.toString()));
-				lines.addAll(labelBlankNodes(serializedGraph,
-						getMDHexString(msg, "MD5")));
+				lines.addAll(labelBlankNodes(serializedGraph, msg.hash));
 			}
+
 			Collections.sort(lines);
 			for (String l : lines) {
 				os.write((l + "\n").getBytes());
 			}
 		} catch (IOException ex) {
-			logger.error("Exception while parsing serilaized graph: {}", ex);
+			logger.error("Exception while parsing serialized graph: {}", ex);
 		} catch (NoSuchAlgorithmException ex) {
 			logger.error("Exception while trying to generate graph hash: {}", ex);
 		}
 	}
 
-	private List<TripleCollection> decomposeGraphToMSGs(TripleCollection tc) {
+	private List<MSG> decomposeGraphToMSGs(TripleCollection tc) {
 
 		TripleCollection tmp = new SimpleMGraph();
 		tmp.addAll(tc);
 
-		List<TripleCollection> msgSet = new Vector<TripleCollection>();
+		List<MSG> msgSet = new Vector<MSG>();
 
 		while (tmp.size() > 0) {
 			Triple triple = tmp.iterator().next();
-			TripleCollection msg = new SimpleMGraph();
+			TripleCollection msgTc = new SimpleMGraph();
 
-			fillMSG(triple, tmp, msg);
+			boolean containsBNode = fillMSG(triple, tmp, msgTc);
+			MSG msg = new MSG(msgTc);
+			msg.containsBlankNodes = containsBNode;
 			msgSet.add(msg);
 		}
 
 		return msgSet;
 	}
 
-	private void fillMSG(Triple triple, TripleCollection tc,
+	private boolean fillMSG(Triple triple, TripleCollection tc,
 			TripleCollection msg) {
 
-		msg.add(triple);
-		tc.remove(triple);
+		boolean containsBNode = false;
 
 		if (triple.getSubject() instanceof BNode) {
-			Iterator<Triple> it = tc.filter(null, null, triple.getSubject());
-			while (it.hasNext()) {
-				fillMSG(it.next(), tc, msg);
-			}
-		}
-		if (triple.getObject() instanceof BNode) {
-			Iterator<Triple> it =
-					tc.filter((BNode) triple.getObject(), null, null);
-			while (it.hasNext()) {
-				fillMSG(it.next(), tc, msg);
+			containsBNode = true;
+			GraphNode gn = new GraphNode(triple.getSubject(), tc);
+			Graph context = gn.getNodeContext();
+			msg.addAll(context);
+			tc.removeAll(context);
+		} else {
+			if ((triple.getObject() instanceof BNode)
+					&& (triple.getSubject() != triple.getObject())) {
+				containsBNode = true;
+				GraphNode gn = new GraphNode(triple.getObject(), tc);
+				Graph context = gn.getNodeContext();
+				msg.addAll(context);
+				tc.removeAll(context);
+			} else {
+				msg.add(triple);
+				tc.remove(triple);
 			}
 		}
+
+		return containsBNode;
 	}
 
+
+
 	private List<String> labelBlankNodes(BufferedReader serializedGraph,
 			String prefix) throws IOException {
 
@@ -209,8 +218,8 @@ public class StableSerializerProvider im
 			Map<String, Long> labels, long genSymCounter, long comments,
 			String prefix) {
 
-		for (int i = 2; i <= lines.size(); ++i) {
-			StringBuilder previousLine = new StringBuilder(lines.get(i - 2));
+		for (int i = 1; i <= lines.size(); ++i) {
+			StringBuilder previousLine = i > 1 ?new StringBuilder(lines.get(i - 2)) : new StringBuilder();
 			StringBuilder currentLine = new StringBuilder(lines.get(i - 1));
 			StringBuilder nextLine = new StringBuilder();
 			if (i < lines.size()) {
@@ -321,7 +330,7 @@ public class StableSerializerProvider im
 
 		int index = currentLine.lastIndexOf("#_:");
 		String identifier =
-				currentLine.substring(index + 1, currentLine.length());
+				currentLine.substring(index + 1, currentLine.length()).trim();
 		currentLine.delete(index, currentLine.length());
 		if (!labels.containsKey(identifier)) {
 			labels.put(identifier, genSymCounter++);
@@ -384,38 +393,71 @@ public class StableSerializerProvider im
 		return line.substring(0, line.lastIndexOf(" .") + 2);
 	}
 
-	private String getMDHexString(TripleCollection tc, String algorithm)
+	private void computeMsgHashes(List<MSG> msgs, String algorithm)
 			throws NoSuchAlgorithmException {
 
 		MessageDigest md = MessageDigest.getInstance(algorithm);
-		StringBuffer input = new StringBuffer();
-		for (Triple t : tc) {
-			if (!(t.getSubject() instanceof BNode)) {
-				input.append(((UriRef) t.getSubject()).hashCode());
-			}
-			input.append(t.getPredicate().hashCode());
-			if (!(t.getObject() instanceof BNode)) {
-				if (t.getObject() instanceof Literal) {
-					input.append(((Literal) t.getObject()).getLexicalForm());
-				} else {
-					input.append(((UriRef) t.getObject()).hashCode());
+		HashSet<String> computedHashes = new HashSet<String>(msgs.size());
+
+		for(MSG msg : msgs) {
+			if(!msg.containsBlankNodes) {
+				//hash is needed only for b-node labelling
+				continue;
+			}
+			StringBuffer input = new StringBuffer();
+			for (Triple t : msg.tc) {
+				if (!(t.getSubject() instanceof BNode)) {
+					input.append(((UriRef) t.getSubject()).hashCode());
+				}
+				input.append(t.getPredicate().hashCode());
+				if (!(t.getObject() instanceof BNode)) {
+					if (t.getObject() instanceof Literal) {
+						input.append(((Literal) t.getObject()).
+								toString().hashCode());
+					} else {
+						input.append(((UriRef) t.getObject()).hashCode());
+					}
 				}
 			}
+			md.update(input.toString().getBytes());
+
+			String hexString;
+			if(computedHashes.add((hexString = getHashHexString(md.digest())))){
+				msg.hash = hexString;
+			} else {
+				md.update(String.valueOf(
+						System.currentTimeMillis()).getBytes());
+				while(!computedHashes.add(
+						(hexString = getHashHexString(md.digest())))) {
+					md.update(String.valueOf(
+							System.currentTimeMillis()).getBytes());
+				}
+				msg.hash = hexString;
+			}
 		}
+	}
 
-		md.update(input.toString().getBytes());
-		byte[] hash = md.digest();
 
+	private String getHashHexString(byte[] hash) {
 		StringBuffer hexString = new StringBuffer();
 		for (int i = 0; i < hash.length; i++) {
 			String hex = Integer.toHexString(0xFF & hash[i]);
 			if (hex.length() == 1) {
 				hexString.append('0');
 			}
-
 			hexString.append(hex);
 		}
-
 		return hexString.toString();
 	}
+
+	private static class MSG {
+
+		final TripleCollection tc;
+		String hash = null;
+		boolean containsBlankNodes = false;
+
+		MSG(TripleCollection tc) {
+			this.tc = tc;
+		}
+	}
 }
\ No newline at end of file

Added: incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializerTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializerTest.java?rev=942448&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializerTest.java (added)
+++ incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/NTriplesSerializerTest.java Sat May  8 19:02:05 2010
@@ -0,0 +1,90 @@
+/*
+ * 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.clerezza.rdf.stable.serializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import junit.framework.Assert;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.serializedform.ParsingProvider;
+import org.apache.clerezza.rdf.jena.parser.JenaParserProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * @author daniel
+ */
+@RunWith(Parameterized.class)
+public class NTriplesSerializerTest {
+
+	private String inputFileName;
+	private String format;
+
+	public NTriplesSerializerTest(String inputFileName, String format) {
+		this.inputFileName = inputFileName;
+		this.format = format;
+	}
+
+	@Parameterized.Parameters
+	public static Collection inputFileNames() {
+		return Arrays.asList(new Object[][] {
+			{"amp-in-url-test001.rdf", "application/rdf+xml"},
+			{"datatypes-test001.rdf", "application/rdf+xml"},
+			{"datatypes-test002.rdf", "application/rdf+xml"},
+			{"rdf-charmod-literals-test001.rdf", "application/rdf+xml"},
+			{"rdf-charmod-uris-test001.rdf", "application/rdf+xml"},
+			{"rdf-charmod-uris-test002.rdf", "application/rdf+xml"},
+			{"xml-canon-test001.rdf", "application/rdf+xml"},
+			{"css3deps.rdf", "application/rdf+xml"},
+			{"agenda_62.rdf", "application/rdf+xml"},
+			{"Talks.rdf", "application/rdf+xml"},
+			{"elvisimp.rdf", "application/rdf+xml"},
+			//{"images.xrdf", "application/rdf+xml"}, //large
+			{"libby.foaf", "application/rdf+xml"}
+		});
+	}
+
+	@Test
+	public void RDFTestCases() {
+		NTriplesSerializer nts = new NTriplesSerializer();
+
+		ParsingProvider parser = new JenaParserProvider();
+		Graph deserializedGraphOld = parser.parse(
+				getClass().getResourceAsStream(inputFileName), format);
+
+		TripleCollection tc = new SimpleMGraph();
+		tc.addAll(deserializedGraphOld);
+
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		nts.serialize(baos, tc);
+
+		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+		Graph deserializedGraphNew = parser.parse(bais, "text/rdf+nt");
+
+		Assert.assertEquals(deserializedGraphNew, deserializedGraphOld);
+	}
+
+}

Added: incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerGraphTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerGraphTest.java?rev=942448&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerGraphTest.java (added)
+++ incubator/clerezza/issues/CLEREZZA-20/org.apache.clerezza.rdf.stable.serializer/src/test/java/org/apache/clerezza/rdf/stable/serializer/StableSerializerGraphTest.java Sat May  8 19:02:05 2010
@@ -0,0 +1,88 @@
+/*
+ * 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.clerezza.rdf.stable.serializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.serializedform.Parser;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * @author daniel
+ */
+@RunWith(Parameterized.class)
+public class StableSerializerGraphTest {
+	private String inputFileName;
+	private String format;
+
+	public StableSerializerGraphTest(String inputFileName, String format) {
+		this.inputFileName = inputFileName;
+		this.format = format;
+	}
+
+	@Parameterized.Parameters
+	public static Collection inputFileNames() {
+		return Arrays.asList(new Object[][]{
+					{"amp-in-url-test001.rdf", "application/rdf+xml"},
+					{"datatypes-test001.rdf", "application/rdf+xml"},
+					{"datatypes-test002.rdf", "application/rdf+xml"},
+					{"rdf-charmod-literals-test001.rdf", "application/rdf+xml"},
+					{"rdf-charmod-uris-test001.rdf", "application/rdf+xml"},
+					{"rdf-charmod-uris-test002.rdf", "application/rdf+xml"},
+					{"xml-canon-test001.rdf", "application/rdf+xml"},
+					{"css3deps.rdf", "application/rdf+xml"},
+					{"agenda_62.rdf", "application/rdf+xml"},
+					{"Talks.rdf", "application/rdf+xml"},
+					{"elvisimp.rdf", "application/rdf+xml"}, 
+					//{"images.xrdf", "application/rdf+xml"}, //large
+					{"libby.foaf", "application/rdf+xml"}
+				});
+	}
+
+	@Test
+	public void RDFTestCases() {
+		StableSerializerProvider ssp = new StableSerializerProvider();
+
+		Parser parser = Parser.getInstance();
+		Graph deserializedGraphOld = parser.parse(
+				getClass().getResourceAsStream(inputFileName), format);
+
+		TripleCollection tc = new SimpleMGraph();
+		tc.addAll(deserializedGraphOld);
+
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		ssp.serialize(baos, tc, "text/rdf+nt");
+
+		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+		Graph deserializedGraphNew = parser.parse(bais, "text/rdf+nt");
+
+		Assert.assertEquals(deserializedGraphOld, deserializedGraphNew);
+
+	}
+}