Author: rvesse
Date: Tue Nov 12 15:53:36 2013
New Revision: 1541118

URL: http://svn.apache.org/r1541118
Log:
Add some additional useful overloads and a blank node allocation policy with 
guaranteably reproducible hash based allocations

Added:
    
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorFixedSeedHash.java
Modified:
    
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorHash.java
    jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/LabelToNode.java
    
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerFactory.java

Added: 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorFixedSeedHash.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorFixedSeedHash.java?rev=1541118&view=auto
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorFixedSeedHash.java
 (added)
+++ 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorFixedSeedHash.java
 Tue Nov 12 15:53:36 2013
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.riot.lang;
+
+import java.util.UUID;
+
+/**
+ * A variant of {@link BlankNodeAllocatorHash} where a fixed seed is used so
+ * repeated runs produce identical allocations
+ * 
+ */
+public class BlankNodeAllocatorFixedSeedHash extends BlankNodeAllocatorHash {
+
+    private UUID seed;
+
+    /**
+     * Creates a new allocator which will use a new random seed but that seed
+     * will remain fixed
+     */
+    public BlankNodeAllocatorFixedSeedHash() {
+        this(UUID.randomUUID());
+    }
+
+    /**
+     * Creates a new allocator which will use a fixed seed
+     * 
+     * @param seed
+     *            Seed
+     */
+    public BlankNodeAllocatorFixedSeedHash(UUID seed) {
+        super();
+        if (seed == null)
+            throw new NullPointerException("seed cannot be null");
+        this.seed = seed;
+    }
+
+    protected UUID freshSeed() {
+        return this.seed;
+    }
+}

Modified: 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorHash.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorHash.java?rev=1541118&r1=1541117&r2=1541118&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorHash.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/BlankNodeAllocatorHash.java
 Tue Nov 12 15:53:36 2013
@@ -38,12 +38,12 @@ import com.hp.hpl.jena.rdf.model.AnonId 
  * This is the most scalable, always legal allocator.
  * <p>
  * New allocators must be created per parser run, or .reset() called. These are
- * fed to a digest to gve a bit string, (currently MD5, to get a 128bit bit
+ * fed to a digest to give a bit string, (currently MD5, to get a 128bit bit
  * string) that is used to form a bNode AnonId of hex digits.
  * <p>
  * In addition there is a cache of label->node allocations, using the natural
- * tendendency to locality in a database dump. (subject bNodes, bNodes in lists
- * and other datavalues structures like unit values).
+ * tendency to locality in a database dump. (subject bNodes, bNodes in lists
+ * and other data values structures like unit values).
  * <p>
  * Not thread safe.
  */
@@ -75,10 +75,18 @@ public class BlankNodeAllocatorHash impl
         Cache<String, Node> cache1 = CacheFactory.createCache(CacheSize) ;
         cache = CacheFactory.createCacheWithGetter(cache1, getter) ;
     }
+    
+    /**
+     * Gets a fresh seed value
+     * @return Seed value
+     */
+    protected UUID freshSeed() {
+        return UUID.randomUUID();
+    }
 
     @Override
     public void reset() {
-        UUID seed = UUID.randomUUID() ;
+        UUID seed = this.freshSeed();
         seedBytes = new byte[128 / 8] ;
         Bytes.setLong(seed.getMostSignificantBits(), seedBytes, 0) ;
         Bytes.setLong(seed.getLeastSignificantBits(), seedBytes, 8) ;

Modified: 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/LabelToNode.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/LabelToNode.java?rev=1541118&r1=1541117&r2=1541118&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/LabelToNode.java 
(original)
+++ 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/lang/LabelToNode.java 
Tue Nov 12 15:53:36 2013
@@ -19,6 +19,7 @@
 package org.apache.jena.riot.lang;
 import java.util.HashMap ;
 import java.util.Map ;
+import java.util.UUID;
 
 import org.apache.jena.riot.out.NodeFmtLib ;
 import org.apache.jena.riot.out.NodeToLabel ;
@@ -41,8 +42,15 @@ public class LabelToNode extends MapWith
      */
     public static LabelToNode createScopeByDocumentHash()
     { return new LabelToNode(new AllocScopePolicy(), nodeAllocatorHash()) ; }
+    
+    /**
+     * Allocation from a single scope; just the label matters.  Use this 
policy if repeated runs must give identical allocations
+     * @param seed Seed
+     */
+    public static LabelToNode createScopeByDocumentHash(UUID seed)
+    { return new LabelToNode(new AllocScopePolicy(), nodeAllocatorHash(seed)) 
; }
 
-    /** The policy upto jena 2.10.0 - problems at very large scale */
+    /** The policy up to jena 2.10.0 - problems at very large scale */
     public static LabelToNode createScopeByDocumentOld()
     { return new LabelToNode(new SingleScopePolicy(), 
nodeAllocatorTraditional()) ; }
 
@@ -86,6 +94,10 @@ public class LabelToNode extends MapWith
         return new Alloc(new BlankNodeAllocatorHash()) ; 
     } 
     
+    private static Allocator<String, Node, Node> nodeAllocatorHash(UUID seed) {
+        return new Alloc(new BlankNodeAllocatorFixedSeedHash(seed)) ;
+    }
+    
     private static Allocator<String, Node, Node> nodeAllocatorDeterministic() 
{ 
         return new Alloc(new BlankNodeAllocatorLabel()) ; 
     } 

Modified: 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerFactory.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerFactory.java?rev=1541118&r1=1541117&r2=1541118&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerFactory.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/org/apache/jena/riot/tokens/TokenizerFactory.java
 Tue Nov 12 15:53:36 2013
@@ -42,6 +42,13 @@ public class TokenizerFactory
         Tokenizer tokenizer = new TokenizerText(peekReader) ;
         return tokenizer ;
     }
+    
+    public static Tokenizer makeTokenizerUTF8(String string)
+    {
+        PeekReader peekReader = PeekReader.readString(string);
+        Tokenizer tokenizer = new TokenizerText(peekReader);
+        return tokenizer;
+    }
 
     public static Tokenizer makeTokenizerASCII(InputStream in)
     {


Reply via email to