Author: toad
Date: 2006-12-19 13:57:34 +0000 (Tue, 19 Dec 2006)
New Revision: 11481

Added:
   trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
Modified:
   trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
   trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
   trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
   trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
Log:
Fix serialization again.

Added: trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java                 
        (rev 0)
+++ trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2006-12-19 
13:57:34 UTC (rev 11481)
@@ -0,0 +1,81 @@
+/**
+ * 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.support.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import freenet.crypt.RandomSource;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.Bucket;
+
+public class DelayedFreeBucket implements Bucket, SerializableToFieldSetBucket 
{
+
+       private final PersistentFileTracker factory;
+       Bucket bucket;
+       boolean freed;
+       
+       public DelayedFreeBucket(PersistentTempBucketFactory factory, 
PaddedEphemerallyEncryptedBucket bucket) {
+               this.factory = factory;
+               this.bucket = bucket;
+       }
+
+       public DelayedFreeBucket(SimpleFieldSet fs, RandomSource random, 
PersistentFileTracker f) throws CannotCreateFromFieldSetException {
+               factory = f;
+               freed = false;
+               bucket = SerializableToFieldSetBucketUtil.create(fs, random, f);
+       }
+
+       public OutputStream getOutputStream() throws IOException {
+               if(freed) throw new IOException("Already freed");
+               return bucket.getOutputStream();
+       }
+
+       public InputStream getInputStream() throws IOException {
+               if(freed) throw new IOException("Already freed");
+               return bucket.getInputStream();
+       }
+
+       public String getName() {
+               return bucket.getName();
+       }
+
+       public long size() {
+               return bucket.size();
+       }
+
+       public boolean isReadOnly() {
+               return bucket.isReadOnly();
+       }
+
+       public void setReadOnly() {
+               bucket.setReadOnly();
+       }
+
+       public void free() {
+               synchronized(this) { // mutex on just this method; make a 
separate lock if necessary to lock the above
+                       if(freed) return;
+                       this.factory.delayedFreeBucket(bucket);
+                       freed = true;
+               }
+       }
+
+       public SimpleFieldSet toFieldSet() {
+               if(freed) return null;
+               SimpleFieldSet fs = new SimpleFieldSet();
+               fs.put("Type", "DelayedFreeBucket");
+               if(bucket instanceof SerializableToFieldSetBucket) {
+                       fs.put("Underlying", 
((SerializableToFieldSetBucket)bucket).toFieldSet());
+               } else {
+                       Logger.error(this, "Cannot serialize underlying bucket: 
"+bucket);
+                       return null;
+               }
+               return fs;
+       }
+
+}
\ No newline at end of file

Modified: trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java
===================================================================
--- trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java 
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/NullPersistentFileTracker.java 
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,10 +5,17 @@

 import java.io.File;

+import freenet.support.api.Bucket;
+
 public class NullPersistentFileTracker implements PersistentFileTracker {

        public void register(File file) {
                // Do nothing
        }

+       public void delayedFreeBucket(Bucket bucket) {
+               // Free immediately
+               bucket.free();
+       }
+
 }

Modified: trunk/freenet/src/freenet/support/io/PersistentFileTracker.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentFileTracker.java     
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/PersistentFileTracker.java     
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,8 +5,16 @@

 import java.io.File;

+import freenet.support.api.Bucket;
+
 public interface PersistentFileTracker {

        public void register(File file);
+
+       /** Notify that we have finished with a bucket and it should be freed 
after the
+        * next serialization to disk.
+        * @param bucket The bucket to free. Should be a DelayedFreeBucket.
+        */
+       public void delayedFreeBucket(Bucket bucket);

 }

Modified: trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2006-12-19 13:57:34 UTC (rev 11481)
@@ -5,8 +5,6 @@

 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -113,12 +111,12 @@

        public Bucket makeBucket(long size) throws IOException {
                Bucket b = makeRawBucket(size);
-               return new DelayedFreeBucket(new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
        }

        public Bucket makeEncryptedBucket() throws IOException {
                Bucket b = makeRawBucket(-1);
-               return new DelayedFreeBucket(new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
        }

        /**
@@ -131,7 +129,7 @@
         */
        public Bucket registerEncryptedBucket(String filename, byte[] key, long 
len) throws IOException {
                Bucket fileBucket = register(filename, len > 0);
-               return new DelayedFreeBucket(new 
PaddedEphemerallyEncryptedBucket(fileBucket, 1024, len, key, rand));
+               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(fileBucket, 1024, len, key, rand));
        }

        /**
@@ -154,50 +152,5 @@
        public File getDir() {
                return dir;
        }
-       
-       public class DelayedFreeBucket implements Bucket {

-               Bucket bucket;
-               boolean freed;
-               
-               public DelayedFreeBucket(PaddedEphemerallyEncryptedBucket 
bucket) {
-                       this.bucket = bucket;
-               }
-
-               public OutputStream getOutputStream() throws IOException {
-                       if(freed) throw new IOException("Already freed");
-                       return bucket.getOutputStream();
-               }
-
-               public InputStream getInputStream() throws IOException {
-                       if(freed) throw new IOException("Already freed");
-                       return bucket.getInputStream();
-               }
-
-               public String getName() {
-                       return bucket.getName();
-               }
-
-               public long size() {
-                       return bucket.size();
-               }
-
-               public boolean isReadOnly() {
-                       return bucket.isReadOnly();
-               }
-
-               public void setReadOnly() {
-                       bucket.setReadOnly();
-               }
-
-               public void free() {
-                       synchronized(this) { // mutex on just this method; make 
a separate lock if necessary to lock the above
-                               if(freed) return;
-                               delayedFreeBucket(bucket);
-                               freed = true;
-                       }
-               }
-
-       }
-
 }

Modified: 
trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java
===================================================================
--- trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java  
2006-12-19 13:40:27 UTC (rev 11480)
+++ trunk/freenet/src/freenet/support/io/SerializableToFieldSetBucketUtil.java  
2006-12-19 13:57:34 UTC (rev 11481)
@@ -26,6 +26,8 @@
                        return new RandomAccessFileBucket(fs, f);
                } else if(type.equals("ReadOnlyFileSliceBucket")) {
                        return new ReadOnlyFileSliceBucket(fs);
+               } else if(type.equals("DelayedFreeBucket")) {
+                       return new DelayedFreeBucket(fs, random, f);
                } else
                        throw new 
CannotCreateFromFieldSetException("Unrecognized type "+type);
        }


Reply via email to