Author: toad
Date: 2007-06-12 19:22:51 +0000 (Tue, 12 Jun 2007)
New Revision: 13536
Added:
trunk/freenet/src/freenet/client/async/BlockSet.java
trunk/freenet/src/freenet/client/async/SimpleBlockSet.java
Modified:
trunk/freenet/src/freenet/client/async/BinaryBlob.java
trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
Log:
Refactor BinaryBlobInserter into BinaryBlob.readBinaryBlob and *BlockSet.
Modified: trunk/freenet/src/freenet/client/async/BinaryBlob.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BinaryBlob.java 2007-06-12
17:32:13 UTC (rev 13535)
+++ trunk/freenet/src/freenet/client/async/BinaryBlob.java 2007-06-12
19:22:51 UTC (rev 13536)
@@ -1,10 +1,15 @@
package freenet.client.async;
+import java.io.DataInputStream;
import java.io.DataOutputStream;
+import java.io.EOFException;
import java.io.IOException;
+import com.onionnetworks.util.FileUtil;
+
import freenet.keys.Key;
import freenet.keys.KeyBlock;
+import freenet.keys.KeyVerifyException;
public abstract class BinaryBlob {
@@ -46,4 +51,70 @@
writeBlobHeader(binaryBlobStream, BinaryBlob.BLOB_END,
BinaryBlob.BLOB_END_VERSION, 0);
}
+ public static void readBinaryBlob(DataInputStream dis, BlockSet blocks,
boolean tolerant) throws IOException, BinaryBlobFormatException {
+ long magic = dis.readLong();
+ if(magic != BinaryBlob.BINARY_BLOB_MAGIC)
+ throw new BinaryBlobFormatException("Bad magic");
+ short version = dis.readShort();
+ if(version != BinaryBlob.BINARY_BLOB_OVERALL_VERSION)
+ throw new BinaryBlobFormatException("Unknown overall
version");
+
+ int i=0;
+ while(true) {
+ long blobLength;
+ try {
+ blobLength = dis.readInt() & 0xFFFFFFFFL;
+ } catch (EOFException e) {
+ // End of file
+ dis.close();
+ break;
+ }
+ short blobType = dis.readShort();
+ short blobVer = dis.readShort();
+
+ if(blobType == BinaryBlob.BLOB_END) {
+ dis.close();
+ break;
+ } else if(blobType == BinaryBlob.BLOB_BLOCK) {
+ if(blobVer != BinaryBlob.BLOB_BLOCK_VERSION)
+ // Even if tolerant, if we can't read a
blob there probably isn't much we can do.
+ throw new
BinaryBlobFormatException("Unknown block blob version");
+ if(blobLength < 9)
+ throw new
BinaryBlobFormatException("Block blob too short");
+ short keyType = dis.readShort();
+ int keyLen = dis.readUnsignedByte();
+ int headersLen = dis.readUnsignedShort();
+ int dataLen = dis.readUnsignedShort();
+ int pubkeyLen = dis.readUnsignedShort();
+ int total = 9 + keyLen + headersLen + dataLen +
pubkeyLen;
+ if(blobLength != total)
+ throw new
BinaryBlobFormatException("Binary blob not same length as data:
blobLength="+blobLength+" total="+total);
+ byte[] keyBytes = new byte[keyLen];
+ byte[] headersBytes = new byte[headersLen];
+ byte[] dataBytes = new byte[dataLen];
+ byte[] pubkeyBytes = new byte[pubkeyLen];
+ dis.readFully(keyBytes);
+ dis.readFully(headersBytes);
+ dis.readFully(dataBytes);
+ dis.readFully(pubkeyBytes);
+ KeyBlock block;
+ try {
+ block = Key.createBlock(keyType,
keyBytes, headersBytes, dataBytes, pubkeyBytes);
+ } catch (KeyVerifyException e) {
+ throw new
BinaryBlobFormatException("Invalid key: "+e.getMessage(), e);
+ }
+
+ blocks.add(block);
+
+ } else {
+ if(tolerant) {
+ FileUtil.skipFully(dis, blobLength);
+ } else {
+ throw new
BinaryBlobFormatException("Unknown blob type: "+blobType);
+ }
+ }
+ i++;
+ }
+
+ }
}
Modified: trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
2007-06-12 17:32:13 UTC (rev 13535)
+++ trunk/freenet/src/freenet/client/async/BinaryBlobInserter.java
2007-06-12 19:22:51 UTC (rev 13536)
@@ -1,19 +1,16 @@
package freenet.client.async;
import java.io.DataInputStream;
-import java.io.EOFException;
import java.io.IOException;
+import java.util.Iterator;
import java.util.Vector;
-import com.onionnetworks.util.FileUtil;
-
import freenet.client.FailureCodeTracker;
import freenet.client.InsertContext;
import freenet.client.InsertException;
import freenet.keys.CHKBlock;
import freenet.keys.Key;
import freenet.keys.KeyBlock;
-import freenet.keys.KeyVerifyException;
import freenet.keys.SSKBlock;
import freenet.node.LowLevelPutException;
import freenet.node.SimpleSendableInsert;
@@ -44,74 +41,24 @@
this.parent = parent;
this.clientContext = clientContext;
this.errors = new FailureCodeTracker(true);
- Vector myInserters = new Vector();
DataInputStream dis = new
DataInputStream(blob.getInputStream());
- long magic = dis.readLong();
- if(magic != BinaryBlob.BINARY_BLOB_MAGIC)
- throw new BinaryBlobFormatException("Bad magic");
- short version = dis.readShort();
- if(version != BinaryBlob.BINARY_BLOB_OVERALL_VERSION)
- throw new BinaryBlobFormatException("Unknown overall
version");
- int i=0;
- while(true) {
- long blobLength;
- try {
- blobLength = dis.readInt() & 0xFFFFFFFFL;
- } catch (EOFException e) {
- // End of file
- dis.close();
- break;
- }
- short blobType = dis.readShort();
- short blobVer = dis.readShort();
-
- if(blobType == BinaryBlob.BLOB_END) {
- dis.close();
- break;
- } else if(blobType == BinaryBlob.BLOB_BLOCK) {
- if(blobVer != BinaryBlob.BLOB_BLOCK_VERSION)
- // Even if tolerant, if we can't read a
blob there probably isn't much we can do.
- throw new
BinaryBlobFormatException("Unknown block blob version");
- if(blobLength < 9)
- throw new
BinaryBlobFormatException("Block blob too short");
- short keyType = dis.readShort();
- int keyLen = dis.readUnsignedByte();
- int headersLen = dis.readUnsignedShort();
- int dataLen = dis.readUnsignedShort();
- int pubkeyLen = dis.readUnsignedShort();
- int total = 9 + keyLen + headersLen + dataLen +
pubkeyLen;
- if(blobLength != total)
- throw new
BinaryBlobFormatException("Binary blob not same length as data:
blobLength="+blobLength+" total="+total);
- byte[] keyBytes = new byte[keyLen];
- byte[] headersBytes = new byte[headersLen];
- byte[] dataBytes = new byte[dataLen];
- byte[] pubkeyBytes = new byte[pubkeyLen];
- dis.readFully(keyBytes);
- dis.readFully(headersBytes);
- dis.readFully(dataBytes);
- dis.readFully(pubkeyBytes);
- KeyBlock block;
- try {
- block = Key.createBlock(keyType,
keyBytes, headersBytes, dataBytes, pubkeyBytes);
- } catch (KeyVerifyException e) {
- throw new
BinaryBlobFormatException("Invalid key: "+e.getMessage(), e);
- }
-
- MySendableInsert inserter =
- new MySendableInsert(i, block,
prioClass, getScheduler(block), clientContext);
-
- myInserters.add(inserter);
-
- } else {
- if(tolerant) {
- FileUtil.skipFully(dis, blobLength);
- } else {
- throw new
BinaryBlobFormatException("Unknown blob type: "+blobType);
- }
- }
- i++;
+ BlockSet blocks = new SimpleBlockSet();
+
+ BinaryBlob.readBinaryBlob(dis, blocks, tolerant);
+
+ Vector myInserters = new Vector();
+ Iterator i = blocks.keys().iterator();
+
+ int x=0;
+ while(i.hasNext()) {
+ Key key = (Key) i.next();
+ KeyBlock block = blocks.get(key);
+ MySendableInsert inserter =
+ new MySendableInsert(x++, block, prioClass,
getScheduler(block), clientContext);
+ myInserters.add(inserter);
}
+
inserters = (MySendableInsert[]) myInserters.toArray(new
MySendableInsert[myInserters.size()]);
parent.addMustSucceedBlocks(inserters.length);
parent.notifyClients();
Added: trunk/freenet/src/freenet/client/async/BlockSet.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BlockSet.java
(rev 0)
+++ trunk/freenet/src/freenet/client/async/BlockSet.java 2007-06-12
19:22:51 UTC (rev 13536)
@@ -0,0 +1,37 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.client.async;
+
+import java.util.Set;
+
+import freenet.keys.Key;
+import freenet.keys.KeyBlock;
+
+/**
+ * A set of KeyBlock's.
+ * @author toad
+ */
+public interface BlockSet {
+
+ /**
+ * Get a block by its key.
+ * @param key The key of the block to get.
+ * @return A block, or null if there is no block with that key.
+ */
+ public KeyBlock get(Key key);
+
+ /**
+ * Add a block.
+ * @param block The block to add.
+ */
+ public void add(KeyBlock block);
+
+ /**
+ * Get the set of all the keys of all the blocks.
+ * @return A set of the keys of the blocks in the BlockSet. Not
guaranteed to be
+ * kept up to date. Read only.
+ */
+ public Set keys();
+
+}
Added: trunk/freenet/src/freenet/client/async/SimpleBlockSet.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleBlockSet.java
(rev 0)
+++ trunk/freenet/src/freenet/client/async/SimpleBlockSet.java 2007-06-12
19:22:51 UTC (rev 13536)
@@ -0,0 +1,30 @@
+package freenet.client.async;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import freenet.keys.Key;
+import freenet.keys.KeyBlock;
+
+/**
+ * Simple BlockSet implementation, keeps all keys in RAM.
+ *
+ * @author toad
+ */
+public class SimpleBlockSet implements BlockSet {
+
+ private final HashMap blocksByKey = new HashMap();
+
+ public synchronized void add(KeyBlock block) {
+ blocksByKey.put(block.getKey(), block);
+ }
+
+ public KeyBlock get(Key key) {
+ return (KeyBlock) blocksByKey.get(key);
+ }
+
+ public Set keys() {
+ return blocksByKey.keySet();
+ }
+
+}