Author: toad
Date: 2006-01-25 22:02:03 +0000 (Wed, 25 Jan 2006)
New Revision: 7927

Added:
   branches/async-client/src/freenet/client/async/BaseClientPutter.java
   branches/async-client/src/freenet/client/async/SimpleManifestPutter.java
Removed:
   
branches/async-client/src/freenet/client/async/SplitPutCompletionCallback.java
Modified:
   branches/async-client/src/freenet/client/FetchWaiter.java
   branches/async-client/src/freenet/client/PutWaiter.java
   branches/async-client/src/freenet/client/async/ClientCallback.java
   branches/async-client/src/freenet/client/async/ClientGetter.java
   branches/async-client/src/freenet/client/async/ClientPutState.java
   branches/async-client/src/freenet/client/async/ClientPutter.java
   branches/async-client/src/freenet/client/async/ClientRequest.java
   
branches/async-client/src/freenet/client/async/MultiPutCompletionCallback.java
   branches/async-client/src/freenet/client/async/PutCompletionCallback.java
   branches/async-client/src/freenet/client/async/SingleBlockInserter.java
   branches/async-client/src/freenet/client/async/SingleFileInserter.java
   branches/async-client/src/freenet/client/async/SplitFileInserter.java
   branches/async-client/src/freenet/client/async/SplitFileInserterSegment.java
   branches/async-client/src/freenet/node/TextModeClientInterface.java
   branches/async-client/src/freenet/node/fcp/ClientGet.java
   branches/async-client/src/freenet/node/fcp/ClientPut.java
Log:
putdir support compiles, doesn't necessarily work

Modified: branches/async-client/src/freenet/client/FetchWaiter.java
===================================================================
--- branches/async-client/src/freenet/client/FetchWaiter.java   2006-01-25 
20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/FetchWaiter.java   2006-01-25 
22:02:03 UTC (rev 7927)
@@ -1,8 +1,8 @@
 package freenet.client;

+import freenet.client.async.BaseClientPutter;
 import freenet.client.async.ClientCallback;
 import freenet.client.async.ClientGetter;
-import freenet.client.async.ClientPutter;
 import freenet.keys.FreenetURI;

 public class FetchWaiter implements ClientCallback {
@@ -25,15 +25,15 @@
                notifyAll();
        }

-       public void onSuccess(ClientPutter state) {
+       public void onSuccess(BaseClientPutter state) {
                throw new UnsupportedOperationException();
        }

-       public void onFailure(InserterException e, ClientPutter state) {
+       public void onFailure(InserterException e, BaseClientPutter state) {
                throw new UnsupportedOperationException();
        }

-       public void onGeneratedURI(FreenetURI uri, ClientPutter state) {
+       public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
                throw new UnsupportedOperationException();
        }


Modified: branches/async-client/src/freenet/client/PutWaiter.java
===================================================================
--- branches/async-client/src/freenet/client/PutWaiter.java     2006-01-25 
20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/PutWaiter.java     2006-01-25 
22:02:03 UTC (rev 7927)
@@ -1,5 +1,6 @@
 package freenet.client;

+import freenet.client.async.BaseClientPutter;
 import freenet.client.async.ClientCallback;
 import freenet.client.async.ClientGetter;
 import freenet.client.async.ClientPutter;
@@ -21,19 +22,19 @@
                // Ignore
        }

-       public synchronized void onSuccess(ClientPutter state) {
+       public synchronized void onSuccess(BaseClientPutter state) {
                succeeded = true;
                finished = true;
                notifyAll();
        }

-       public synchronized void onFailure(InserterException e, ClientPutter 
state) {
+       public synchronized void onFailure(InserterException e, 
BaseClientPutter state) {
                error = e;
                finished = true;
                notifyAll();
        }

-       public synchronized void onGeneratedURI(FreenetURI uri, ClientPutter 
state) {
+       public synchronized void onGeneratedURI(FreenetURI uri, 
BaseClientPutter state) {
                Logger.minor(this, "URI: "+uri);
                if(this.uri == null)
                        this.uri = uri;

Added: branches/async-client/src/freenet/client/async/BaseClientPutter.java
===================================================================
--- branches/async-client/src/freenet/client/async/BaseClientPutter.java        
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/BaseClientPutter.java        
2006-01-25 22:02:03 UTC (rev 7927)
@@ -0,0 +1,11 @@
+package freenet.client.async;
+
+public abstract class BaseClientPutter extends ClientRequest {
+
+       protected BaseClientPutter(short priorityClass, ClientRequestScheduler 
scheduler) {
+               super(priorityClass, scheduler);
+       }
+
+       public abstract void setCurrentState(ClientPutState inserter);
+
+}

Modified: branches/async-client/src/freenet/client/async/ClientCallback.java
===================================================================
--- branches/async-client/src/freenet/client/async/ClientCallback.java  
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/ClientCallback.java  
2006-01-25 22:02:03 UTC (rev 7927)
@@ -16,10 +16,10 @@

        public void onFailure(FetchException e, ClientGetter state);

-       public void onSuccess(ClientPutter state);
+       public void onSuccess(BaseClientPutter state);

-       public void onFailure(InserterException e, ClientPutter state);
+       public void onFailure(InserterException e, BaseClientPutter state);

-       public void onGeneratedURI(FreenetURI uri, ClientPutter state);
+       public void onGeneratedURI(FreenetURI uri, BaseClientPutter state);

 }

Modified: branches/async-client/src/freenet/client/async/ClientGetter.java
===================================================================
--- branches/async-client/src/freenet/client/async/ClientGetter.java    
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/ClientGetter.java    
2006-01-25 22:02:03 UTC (rev 7927)
@@ -18,17 +18,15 @@
        final FreenetURI uri;
        final FetcherContext ctx;
        final ArchiveContext actx;
-       final ClientRequestScheduler scheduler;
        ClientGetState currentState;
        private boolean finished;
        private int archiveRestarts;

        public ClientGetter(ClientCallback client, ClientRequestScheduler 
sched, FreenetURI uri, FetcherContext ctx, short priorityClass) {
-               super(priorityClass);
+               super(priorityClass, sched);
                this.client = client;
                this.uri = uri;
                this.ctx = ctx;
-               this.scheduler = sched;
                this.finished = false;
                this.actx = new ArchiveContext();
                archiveRestarts = 0;

Modified: branches/async-client/src/freenet/client/async/ClientPutState.java
===================================================================
--- branches/async-client/src/freenet/client/async/ClientPutState.java  
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/ClientPutState.java  
2006-01-25 22:02:03 UTC (rev 7927)
@@ -7,7 +7,7 @@
  */
 public interface ClientPutState {

-       public abstract ClientPutter getParent();
+       public abstract BaseClientPutter getParent();

        public abstract void cancel();


Modified: branches/async-client/src/freenet/client/async/ClientPutter.java
===================================================================
--- branches/async-client/src/freenet/client/async/ClientPutter.java    
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/ClientPutter.java    
2006-01-25 22:02:03 UTC (rev 7927)
@@ -4,18 +4,19 @@
 import freenet.client.InsertBlock;
 import freenet.client.InserterContext;
 import freenet.client.InserterException;
+import freenet.client.Metadata;
 import freenet.keys.ClientKey;
 import freenet.keys.FreenetURI;
 import freenet.support.Bucket;
+import freenet.support.Logger;

-public class ClientPutter extends ClientRequest implements 
PutCompletionCallback {
+public class ClientPutter extends BaseClientPutter implements 
PutCompletionCallback {

        final ClientCallback client;
        final Bucket data;
        final FreenetURI targetURI;
        final ClientMetadata cm;
        final InserterContext ctx;
-       final ClientRequestScheduler scheduler;
        private ClientPutState currentState;
        private boolean finished;
        private final boolean getCHKOnly;
@@ -24,7 +25,7 @@

        public ClientPutter(ClientCallback client, Bucket data, FreenetURI 
targetURI, ClientMetadata cm, InserterContext ctx,
                        ClientRequestScheduler scheduler, short priorityClass, 
boolean getCHKOnly, boolean isMetadata) {
-               super(priorityClass);
+               super(priorityClass, scheduler);
                this.cm = cm;
                this.isMetadata = isMetadata;
                this.getCHKOnly = getCHKOnly;
@@ -32,7 +33,6 @@
                this.data = data;
                this.targetURI = targetURI;
                this.ctx = ctx;
-               this.scheduler = scheduler;
                this.finished = false;
                this.cancelled = false;
        }
@@ -40,7 +40,7 @@
        public void start() throws InserterException {
                try {
                        currentState =
-                               new SingleFileInserter(this, this, new 
InsertBlock(data, cm, targetURI), isMetadata, ctx, false, false, getCHKOnly);
+                               new SingleFileInserter(this, this, new 
InsertBlock(data, cm, targetURI), isMetadata, ctx, false, false, getCHKOnly, 
false);
                        ((SingleFileInserter)currentState).start();
                } catch (InserterException e) {
                        finished = true;
@@ -48,7 +48,7 @@
                }
        }

-       void setCurrentState(ClientPutState s) {
+       public void setCurrentState(ClientPutState s) {
                currentState = s;
        }

@@ -88,5 +88,9 @@
        public void onTransition(ClientPutState oldState, ClientPutState 
newState) {
                // Ignore
        }
+
+       public void onMetadata(Metadata m, ClientPutState state) {
+               Logger.error(this, "Got metadata on "+this+" from "+state+" 
(this means the metadata won't be inserted)");
+       }

 }

Modified: branches/async-client/src/freenet/client/async/ClientRequest.java
===================================================================
--- branches/async-client/src/freenet/client/async/ClientRequest.java   
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/ClientRequest.java   
2006-01-25 22:02:03 UTC (rev 7927)
@@ -10,15 +10,17 @@
 public abstract class ClientRequest {

        // FIXME move the priority classes from RequestStarter here
-       private short priorityClass;
+       protected short priorityClass;
        protected boolean cancelled;
+       final ClientRequestScheduler scheduler;

        public short getPriorityClass() {
                return priorityClass;
        }

-       protected ClientRequest(short priorityClass) {
+       protected ClientRequest(short priorityClass, ClientRequestScheduler 
scheduler) {
                this.priorityClass = priorityClass;
+               this.scheduler = scheduler;
        }

        public void cancel() {

Modified: 
branches/async-client/src/freenet/client/async/MultiPutCompletionCallback.java
===================================================================
--- 
branches/async-client/src/freenet/client/async/MultiPutCompletionCallback.java  
    2006-01-25 20:02:28 UTC (rev 7926)
+++ 
branches/async-client/src/freenet/client/async/MultiPutCompletionCallback.java  
    2006-01-25 22:02:03 UTC (rev 7927)
@@ -5,18 +5,20 @@
 import java.util.ListIterator;

 import freenet.client.InserterException;
+import freenet.client.Metadata;
 import freenet.keys.ClientKey;
+import freenet.support.Logger;

 public class MultiPutCompletionCallback implements PutCompletionCallback, 
ClientPutState {

        private final LinkedList waitingFor;
        private final PutCompletionCallback cb;
        private ClientPutState generator;
-       private final ClientPutter parent;
+       private final BaseClientPutter parent;
        private boolean finished;
        private boolean started;

-       public MultiPutCompletionCallback(PutCompletionCallback cb, 
ClientPutter parent, boolean dontTellParent) {
+       public MultiPutCompletionCallback(PutCompletionCallback cb, 
BaseClientPutter parent, boolean dontTellParent) {
                this.cb = cb;
                this.waitingFor = new LinkedList();
                this.parent = parent;
@@ -63,7 +65,7 @@
                started = true;
        }

-       public ClientPutter getParent() {
+       public BaseClientPutter getParent() {
                return parent;
        }

@@ -95,4 +97,12 @@
                }
        }

+       public void onMetadata(Metadata m, ClientPutState state) {
+               if(generator == state) {
+                       cb.onMetadata(m, this);
+               } else {
+                       Logger.error(this, "Got metadata for "+state);
+               }
+       }
+
 }

Modified: 
branches/async-client/src/freenet/client/async/PutCompletionCallback.java
===================================================================
--- branches/async-client/src/freenet/client/async/PutCompletionCallback.java   
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/PutCompletionCallback.java   
2006-01-25 22:02:03 UTC (rev 7927)
@@ -1,6 +1,7 @@
 package freenet.client.async;

 import freenet.client.InserterException;
+import freenet.client.Metadata;
 import freenet.keys.ClientKey;

 /**
@@ -16,4 +17,10 @@

        public void onTransition(ClientPutState oldState, ClientPutState 
newState);

+       /** Only called if explicitly asked for, in which case, generally
+        * the metadata won't be inserted. Won't be called if there isn't
+        * any!
+        */
+       public void onMetadata(Metadata m, ClientPutState state);
+       
 }

Added: branches/async-client/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- branches/async-client/src/freenet/client/async/SimpleManifestPutter.java    
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/SimpleManifestPutter.java    
2006-01-25 22:02:03 UTC (rev 7927)
@@ -0,0 +1,279 @@
+package freenet.client.async;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import freenet.client.ClientMetadata;
+import freenet.client.DefaultMIMETypes;
+import freenet.client.InsertBlock;
+import freenet.client.InserterContext;
+import freenet.client.InserterException;
+import freenet.client.Metadata;
+import freenet.keys.ClientKey;
+import freenet.keys.FreenetURI;
+import freenet.support.Bucket;
+import freenet.support.BucketTools;
+import freenet.support.Logger;
+
+public class SimpleManifestPutter extends BaseClientPutter implements 
PutCompletionCallback {
+       // Only implements PutCompletionCallback for the final metadata insert
+
+       private class PutHandler extends BaseClientPutter implements 
PutCompletionCallback {
+
+               protected PutHandler(String name, Bucket data, ClientMetadata 
cm, boolean getCHKOnly) throws InserterException {
+                       super(SimpleManifestPutter.this.getPriorityClass(), 
SimpleManifestPutter.this.scheduler);
+                       this.name = name;
+                       this.cm = cm;
+                       InsertBlock block = 
+                               new InsertBlock(data, cm, 
FreenetURI.EMPTY_CHK_URI);
+                       this.origSFI =
+                               new SingleFileInserter(this, this, block, 
false, ctx, false, true, getCHKOnly, false);
+                       currentState = origSFI;
+                       metadata = null;
+               }
+
+               private SingleFileInserter origSFI;
+               private ClientPutState currentState;
+               private ClientMetadata cm;
+               private final String name;
+               private byte[] metadata;
+               private boolean finished;
+               
+               public void start() throws InserterException {
+                       origSFI.start();
+                       origSFI = null;
+               }
+               
+               public FreenetURI getURI() {
+                       return null;
+               }
+
+               public boolean isFinished() {
+                       return finished || cancelled || 
SimpleManifestPutter.this.cancelled;
+               }
+
+               public void onSuccess(ClientPutState state) {
+                       Logger.minor(this, "Completed "+this);
+                       synchronized(SimpleManifestPutter.this) {
+                               runningPutHandlers.remove(this);
+                               if(!runningPutHandlers.isEmpty()) {
+                                       return;
+                               }
+                       }
+                       insertedAllFiles();
+               }
+
+               public void onFailure(InserterException e, ClientPutState 
state) {
+                       Logger.minor(this, "Failed: "+this+" - "+e, e);
+                       fail(e);
+               }
+
+               public void onEncode(ClientKey key, ClientPutState state) {
+                       if(metadata == null) {
+                               // Don't have metadata yet
+                               // Do have key
+                               // So make a redirect to the key
+                               Metadata m =
+                                       new Metadata(Metadata.SIMPLE_REDIRECT, 
key.getURI(), cm);
+                               onMetadata(m, null);
+                       }
+               }
+
+               public void onTransition(ClientPutState oldState, 
ClientPutState newState) {
+                       if(oldState == this) {
+                               // We do not need to have a hashtable of state 
-> PutHandler.
+                               // Because we can just pull the parent off the 
state!
+                               this.currentState = newState;
+                       }
+               }
+
+               public void onMetadata(Metadata m, ClientPutState state) {
+                       if(metadata != null) {
+                               Logger.error(this, "Reassigning metadata", new 
Exception("debug"));
+                               return;
+                       }
+                       metadata = m.writeToByteArray();
+                       synchronized(SimpleManifestPutter.this) {
+                               putHandlersWaitingForMetadata.remove(this);
+                               if(!putHandlersWaitingForMetadata.isEmpty()) 
return;
+                               gotAllMetadata();
+                       }
+               }
+
+               public void setCurrentState(ClientPutState inserter) {
+                       // Ignore
+               }
+
+       }
+
+       private final HashMap putHandlersByName;
+       private final HashSet runningPutHandlers;
+       private final HashSet putHandlersWaitingForMetadata;
+       private FreenetURI finalURI;
+       private FreenetURI targetURI;
+       private boolean finished;
+       private final InserterContext ctx;
+       private final ClientCallback cb;
+       private final boolean getCHKOnly;
+       private boolean insertedAllFiles;
+       private boolean insertedManifest;
+       private ClientPutState currentMetadataInserterState;
+       
+       public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler 
sched, 
+                       HashMap bucketsByName, short prioClass, FreenetURI 
target, 
+                       String defaultName, InserterContext ctx, boolean 
getCHKOnly) throws InserterException {
+               super(prioClass, sched);
+               this.targetURI = target;
+               this.cb = cb;
+               this.ctx = ctx;
+               this.getCHKOnly = getCHKOnly;
+               putHandlersByName = new HashMap();
+               runningPutHandlers = new HashSet();
+               putHandlersWaitingForMetadata = new HashSet();
+               Iterator it = bucketsByName.keySet().iterator();
+               while(it.hasNext()) {
+                       String name = (String) it.next();
+                       Bucket data = (Bucket) bucketsByName.get(name);
+                       String mimeType = DefaultMIMETypes.guessMIMEType(name);
+                       ClientMetadata cm;
+                       if(mimeType.equals(DefaultMIMETypes.DEFAULT_MIME_TYPE))
+                               cm = null;
+                       else
+                               cm = new ClientMetadata(mimeType);
+                       PutHandler ph;
+                       try {
+                               ph = new PutHandler(name, data, cm, getCHKOnly);
+                       } catch (InserterException e) {
+                               cancelAndFinish();
+                               throw e;
+                       }
+                       putHandlersByName.put(name, ph);
+                       runningPutHandlers.add(ph);
+                       putHandlersWaitingForMetadata.add(ph);
+               }
+               it = bucketsByName.keySet().iterator();
+               while(it.hasNext()) {
+                       PutHandler ph = (PutHandler) it.next();
+                       try {
+                               ph.start();
+                       } catch (InserterException e) {
+                               cancelAndFinish();
+                               throw e;
+                       }
+               }               
+       }
+       
+       public FreenetURI getURI() {
+               return finalURI;
+       }
+
+       public boolean isFinished() {
+               return finished || cancelled;
+       }
+
+       private void gotAllMetadata() {
+               Logger.minor(this, "Got all metadata");
+               HashMap namesToByteArrays = new HashMap();
+               Iterator i = putHandlersByName.values().iterator();
+               while(i.hasNext()) {
+                       PutHandler ph = (PutHandler) i.next();
+                       String name = ph.name;
+                       byte[] meta = ph.metadata;
+                       namesToByteArrays.put(name, meta);
+               }
+               Metadata meta =
+                       
Metadata.mkRedirectionManifestWithMetadata(namesToByteArrays);
+               Bucket bucket;
+               try {
+                       bucket = BucketTools.makeImmutableBucket(ctx.bf, 
meta.writeToByteArray());
+               } catch (IOException e) {
+                       fail(new 
InserterException(InserterException.BUCKET_ERROR, e, null));
+                       return;
+               }
+               InsertBlock block =
+                       new InsertBlock(bucket, null, targetURI);
+               try {
+                       SingleFileInserter metadataInserter = 
+                               new SingleFileInserter(this, this, block, true, 
ctx, false, false, getCHKOnly, false);
+                       this.currentMetadataInserterState = metadataInserter;
+                       metadataInserter.start();
+               } catch (InserterException e) {
+                       fail(e);
+               }
+       }
+       
+       private void insertedAllFiles() {
+               synchronized(this) {
+                       insertedAllFiles = true;
+                       if(finished || cancelled) return;
+                       if(!insertedManifest) return;
+                       finished = true;
+               }
+               complete();
+       }
+       
+       private void complete() {
+               cb.onSuccess(this);
+       }
+
+       private void fail(InserterException e) {
+               // Cancel all, then call the callback
+               cancelAndFinish();
+               
+               cb.onFailure(e, this);
+       }
+
+       private void cancelAndFinish() {
+               PutHandler[] running;
+               synchronized(this) {
+                       if(finished) return;
+                       running = (PutHandler[]) runningPutHandlers.toArray(new 
PutHandler[runningPutHandlers.size()]);
+                       finished = true;
+               }
+               
+               for(int i=0;i<running.length;i++) {
+                       running[i].cancel();
+               }
+       }
+       
+       public void onSuccess(ClientPutState state) {
+               synchronized(this) {
+                       insertedManifest = true;
+                       if(!finished) return;
+                       if(!insertedAllFiles) return;
+                       finished = true;
+               }
+               complete();
+       }
+       
+       public void onFailure(InserterException e, ClientPutState state) {
+               // FIXME check state == currentMetadataInserterState ??
+               fail(e);
+       }
+       
+       public void onEncode(ClientKey key, ClientPutState state) {
+               this.finalURI = key.getURI();
+               Logger.minor(this, "Got metadata key: "+finalURI);
+               cb.onGeneratedURI(finalURI, this);
+       }
+       
+       public void onTransition(ClientPutState oldState, ClientPutState 
newState) {
+               if(oldState == currentMetadataInserterState)
+                       currentMetadataInserterState = newState;
+               else
+                       Logger.error(this, "Current state = 
"+currentMetadataInserterState+" called onTransition(old="+oldState+", 
new="+newState+")", 
+                                       new Exception("debug"));
+       }
+       
+       public void onMetadata(Metadata m, ClientPutState state) {
+               Logger.error(this, "Got metadata from "+state+" on "+this+" 
(metadata inserter = "+currentMetadataInserterState);
+               fail(new InserterException(InserterException.INTERNAL_ERROR));
+       }
+
+       public void setCurrentState(ClientPutState inserter) {
+               // Ignore
+       }
+       
+}

Modified: 
branches/async-client/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- branches/async-client/src/freenet/client/async/SingleBlockInserter.java     
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/SingleBlockInserter.java     
2006-01-25 22:02:03 UTC (rev 7927)
@@ -29,7 +29,7 @@
        final FreenetURI uri; // uses essentially no RAM in the common case of 
a CHK because we use FreenetURI.EMPTY_CHK_URI
        FreenetURI resultingURI;
        final PutCompletionCallback cb;
-       final ClientPutter parent;
+       final BaseClientPutter parent;
        final InserterContext ctx;
        private int retries;
        private final FailureCodeTracker errors;
@@ -40,7 +40,7 @@
        final boolean isMetadata;
        final int sourceLength;

-       public SingleBlockInserter(ClientPutter parent, Bucket data, short 
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback 
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly) throws 
InserterException {
+       public SingleBlockInserter(BaseClientPutter parent, Bucket data, short 
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback 
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly) throws 
InserterException {
                this.token = token;
                this.parent = parent;
                this.retries = 0;
@@ -188,7 +188,7 @@
                cb.onSuccess(this);
        }

-       public ClientPutter getParent() {
+       public BaseClientPutter getParent() {
                return parent;
        }


Modified: branches/async-client/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/async-client/src/freenet/client/async/SingleFileInserter.java      
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/SingleFileInserter.java      
2006-01-25 22:02:03 UTC (rev 7927)
@@ -29,7 +29,7 @@
        // Config option???
        private static final long COMPRESS_OFF_THREAD_LIMIT = 65536;

-       final ClientPutter parent;
+       final BaseClientPutter parent;
        final InsertBlock block;
        final InserterContext ctx;
        final boolean metadata;
@@ -39,10 +39,24 @@
         * update our parent to point to us as current put-stage. */
        final boolean dontTellParent;
        private boolean cancelled = false;
+       private boolean reportMetadataOnly;

-       SingleFileInserter(ClientPutter parent, PutCompletionCallback cb, 
InsertBlock block, 
+       /**
+        * @param parent
+        * @param cb
+        * @param block
+        * @param metadata
+        * @param ctx
+        * @param dontCompress
+        * @param dontTellParent
+        * @param getCHKOnly
+        * @param reportMetadataOnly If true, don't insert the metadata, just 
report it.
+        * @throws InserterException
+        */
+       SingleFileInserter(BaseClientPutter parent, PutCompletionCallback cb, 
InsertBlock block, 
                        boolean metadata, InserterContext ctx, boolean 
dontCompress, 
-                       boolean dontTellParent, boolean getCHKOnly) throws 
InserterException {
+                       boolean dontTellParent, boolean getCHKOnly, boolean 
reportMetadataOnly) throws InserterException {
+               this.reportMetadataOnly = reportMetadataOnly;
                this.parent = parent;
                this.block = block;
                this.ctx = ctx;
@@ -151,24 +165,32 @@
                        }
                }
                if (data.size() < ClientCHKBlock.MAX_COMPRESSED_DATA_LENGTH) {
-                       MultiPutCompletionCallback mcb = 
-                               new MultiPutCompletionCallback(cb, parent, 
dontTellParent);
                        // Insert single block, then insert pointer to it
-                       SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
mcb, metadata, (int)origSize, -1, getCHKOnly);
-                       Metadata meta = new Metadata(Metadata.SIMPLE_REDIRECT, 
dataPutter.getURI(), block.clientMetadata);
-                       Bucket metadataBucket;
-                       try {
-                               metadataBucket = 
BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
-                       } catch (IOException e) {
-                               throw new 
InserterException(InserterException.BUCKET_ERROR, e, null);
+                       if(reportMetadataOnly) {
+                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
cb, metadata, (int)origSize, -1, getCHKOnly);
+                               Metadata meta = new 
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
+                               cb.onMetadata(meta, this);
+                               cb.onTransition(this, dataPutter);
+                               dataPutter.schedule();
+                       } else {
+                               MultiPutCompletionCallback mcb = 
+                                       new MultiPutCompletionCallback(cb, 
parent, dontTellParent);
+                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
mcb, metadata, (int)origSize, -1, getCHKOnly);
+                               Metadata meta = new 
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
+                               Bucket metadataBucket;
+                               try {
+                                       metadataBucket = 
BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
+                               } catch (IOException e) {
+                                       throw new 
InserterException(InserterException.BUCKET_ERROR, e, null);
+                               }
+                               SingleBlockInserter metaPutter = new 
SingleBlockInserter(parent, metadataBucket, (short) -1, block.desiredURI, ctx, 
mcb, true, (int)origSize, -1, getCHKOnly);
+                               mcb.addURIGenerator(metaPutter);
+                               mcb.add(dataPutter);
+                               cb.onTransition(this, mcb);
+                               mcb.arm();
+                               dataPutter.schedule();
+                               metaPutter.schedule();
                        }
-                       SingleBlockInserter metaPutter = new 
SingleBlockInserter(parent, metadataBucket, (short) -1, block.desiredURI, ctx, 
mcb, true, (int)origSize, -1, getCHKOnly);
-                       mcb.addURIGenerator(metaPutter);
-                       mcb.add(dataPutter);
-                       cb.onTransition(this, mcb);
-                       mcb.arm();
-                       dataPutter.schedule();
-                       metaPutter.schedule();
                        return;
                }
                // Otherwise the file is too big to fit into one block
@@ -176,13 +198,21 @@
                // Job of SplitHandler: when the splitinserter has the metadata,
                // insert it. Then when the splitinserter has finished, and the
                // metadata insert has finished too, tell the master callback.
-               SplitHandler sh = new SplitHandler();
-               SplitFileInserter sfi = new SplitFileInserter(parent, sh, data, 
bestCodec, block.clientMetadata, ctx, sh, getCHKOnly, metadata, true);
-               sh.sfi = sfi;
-               if(!dontTellParent)
-                       parent.setCurrentState(sh);
-               cb.onTransition(this, sh);
-               sfi.start();
+               if(reportMetadataOnly) {
+                       SplitFileInserter sfi = new SplitFileInserter(parent, 
cb, data, bestCodec, block.clientMetadata, ctx, getCHKOnly, metadata, true);
+                       cb.onTransition(this, sfi);
+                       if(!dontTellParent)
+                               parent.setCurrentState(sfi);
+                       sfi.start();
+               } else {
+                       SplitHandler sh = new SplitHandler();
+                       SplitFileInserter sfi = new SplitFileInserter(parent, 
sh, data, bestCodec, block.clientMetadata, ctx, getCHKOnly, metadata, true);
+                       sh.sfi = sfi;
+                       if(!dontTellParent)
+                               parent.setCurrentState(sh);
+                       cb.onTransition(this, sh);
+                       sfi.start();
+               }
                return;
        }

@@ -191,7 +221,7 @@
         * When we have inserted both the metadata and the splitfile,
         * call the master callback.
         */
-       class SplitHandler implements SplitPutCompletionCallback, 
ClientPutState {
+       class SplitHandler implements PutCompletionCallback, ClientPutState {

                ClientPutState sfi;
                ClientPutState metadataPutter;
@@ -233,32 +263,44 @@
                        fail(e);
                }

-               public void onGeneratedMetadata(Metadata meta) {
+               public void onMetadata(Metadata meta, ClientPutState state) {
                        if(finished) return;
-                       synchronized(this) {
-                               Bucket metadataBucket;
-                               try {
-                                       metadataBucket = 
BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
-                               } catch (IOException e) {
-                                       InserterException ex = new 
InserterException(InserterException.BUCKET_ERROR, e, null);
-                                       fail(ex);
-                                       return;
+                       if(state == metadataPutter) {
+                               Logger.error(this, "Got metadata for metadata");
+                               // FIXME kill?
+                       } else if(state != sfi) {
+                               Logger.error(this, "Got unknown metadata");
+                               // FIXME kill?
+                       }
+                       if(reportMetadataOnly) {
+                               cb.onMetadata(meta, this);
+                               metaInsertSuccess = true;
+                       } else {
+                               synchronized(this) {
+                                       Bucket metadataBucket;
+                                       try {
+                                               metadataBucket = 
BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
+                                       } catch (IOException e) {
+                                               InserterException ex = new 
InserterException(InserterException.BUCKET_ERROR, e, null);
+                                               fail(ex);
+                                               return;
+                                       }
+                                       InsertBlock newBlock = new 
InsertBlock(metadataBucket, null, block.desiredURI);
+                                       try {
+                                               metadataPutter = new 
SingleFileInserter(parent, this, newBlock, true, ctx, false, getCHKOnly, false, 
false);
+                                               Logger.minor(this, "Putting 
metadata on "+metadataPutter);
+                                       } catch (InserterException e) {
+                                               cb.onFailure(e, this);
+                                               return;
+                                       }
                                }
-                               InsertBlock newBlock = new 
InsertBlock(metadataBucket, null, block.desiredURI);
                                try {
-                                       metadataPutter = new 
SingleFileInserter(parent, this, newBlock, true, ctx, false, getCHKOnly, false);
-                                       Logger.minor(this, "Putting metadata on 
"+metadataPutter);
+                                       
((SingleFileInserter)metadataPutter).start();
                                } catch (InserterException e) {
-                                       cb.onFailure(e, this);
+                                       fail(e);
                                        return;
                                }
                        }
-                       try {
-                               ((SingleFileInserter)metadataPutter).start();
-                       } catch (InserterException e) {
-                               fail(e);
-                               return;
-                       }
                }

                private synchronized void fail(InserterException e) {
@@ -268,7 +310,7 @@
                        cb.onFailure(e, this);
                }

-               public ClientPutter getParent() {
+               public BaseClientPutter getParent() {
                        return parent;
                }

@@ -286,7 +328,7 @@

        }

-       public ClientPutter getParent() {
+       public BaseClientPutter getParent() {
                return parent;
        }


Modified: branches/async-client/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- branches/async-client/src/freenet/client/async/SplitFileInserter.java       
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/client/async/SplitFileInserter.java       
2006-01-25 22:02:03 UTC (rev 7927)
@@ -19,9 +19,9 @@

 public class SplitFileInserter implements ClientPutState {

-       final ClientPutter parent;
+       final BaseClientPutter parent;
        final InserterContext ctx;
-       final SplitPutCompletionCallback cb;
+       final PutCompletionCallback cb;
        final long dataLength;
        final short compressionCodec;
        final short splitfileAlgorithm;
@@ -36,7 +36,7 @@
        final boolean isMetadata;
        private boolean finished;

-       public SplitFileInserter(ClientPutter put, SplitPutCompletionCallback 
cb, Bucket data, Compressor bestCodec, ClientMetadata clientMetadata, 
InserterContext ctx, SplitHandler sh, boolean getCHKOnly, boolean isMetadata, 
boolean dontTellParent) throws InserterException {
+       public SplitFileInserter(BaseClientPutter put, PutCompletionCallback 
cb, Bucket data, Compressor bestCodec, ClientMetadata clientMetadata, 
InserterContext ctx, boolean getCHKOnly, boolean isMetadata, boolean 
dontTellParent) throws InserterException {
                this.parent = put;
                if(!dontTellParent)
                        parent.setCurrentState(this);
@@ -154,7 +154,7 @@
                                fail(new 
InserterException(InserterException.INTERNAL_ERROR, "Missing URIs after 
encoding", null));
                                return;
                        } else
-                               cb.onGeneratedMetadata(m);
+                               cb.onMetadata(m, this);
                }

        }
@@ -210,7 +210,7 @@
                return uris;
        }

-       public ClientPutter getParent() {
+       public BaseClientPutter getParent() {
                return parent;
        }


Modified: 
branches/async-client/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- 
branches/async-client/src/freenet/client/async/SplitFileInserterSegment.java    
    2006-01-25 20:02:28 UTC (rev 7926)
+++ 
branches/async-client/src/freenet/client/async/SplitFileInserterSegment.java    
    2006-01-25 22:02:03 UTC (rev 7927)
@@ -6,6 +6,7 @@
 import freenet.client.FailureCodeTracker;
 import freenet.client.InserterContext;
 import freenet.client.InserterException;
+import freenet.client.Metadata;
 import freenet.keys.ClientCHKBlock;
 import freenet.keys.ClientKey;
 import freenet.keys.FreenetURI;
@@ -229,4 +230,8 @@
        public void onTransition(ClientPutState oldState, ClientPutState 
newState) {
                Logger.error(this, "Illegal transition in 
SplitFileInserterSegment: "+oldState+" -> "+newState);
        }
+
+       public void onMetadata(Metadata m, ClientPutState state) {
+               Logger.error(this, "Got onMetadata from "+state);
+       }
 }

Deleted: 
branches/async-client/src/freenet/client/async/SplitPutCompletionCallback.java
===================================================================
--- 
branches/async-client/src/freenet/client/async/SplitPutCompletionCallback.java  
    2006-01-25 20:02:28 UTC (rev 7926)
+++ 
branches/async-client/src/freenet/client/async/SplitPutCompletionCallback.java  
    2006-01-25 22:02:03 UTC (rev 7927)
@@ -1,9 +0,0 @@
-package freenet.client.async;
-
-import freenet.client.Metadata;
-
-public interface SplitPutCompletionCallback extends PutCompletionCallback {
-
-       public void onGeneratedMetadata(Metadata meta);
-       
-}

Modified: branches/async-client/src/freenet/node/TextModeClientInterface.java
===================================================================
--- branches/async-client/src/freenet/node/TextModeClientInterface.java 
2006-01-25 20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/node/TextModeClientInterface.java 
2006-01-25 22:02:03 UTC (rev 7927)
@@ -1,10 +1,8 @@
 package freenet.node;

 import java.io.BufferedReader;
-import java.io.DataInputStream;
 import java.io.EOFException;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
@@ -503,6 +501,8 @@
        HashMap ret = new HashMap();

        File filelist[] = thisdir.listFiles();
+       if(filelist == null)
+               throw new IllegalArgumentException("No such directory");
        for(int i = 0 ; i < filelist.length ; i++) {
                if (filelist[i].isFile() && filelist[i].canRead()) {
                        File f = filelist[i];
@@ -523,102 +523,6 @@
        return ret;
        }

-       private String dirPutToList(HashMap dir, String basedir) {
-       String ret = "";
-               for(Iterator i = dir.keySet().iterator();i.hasNext();) {
-                       String key = (String) i.next();
-                       Object o = dir.get(key);
-                       Metadata target;
-                       if(o instanceof String) {
-                               // File
-                               ret += basedir + key + "\n";
-                       } else if(o instanceof HashMap) {
-                               ret += dirPutToList((HashMap)o, basedir + key + 
"//");
-                       } else throw new IllegalArgumentException("Not String 
nor HashMap: "+o);
-               }
-               return ret;
-    }
-    
-    private HashMap dirPut(String directory, boolean getCHKOnly) {
-       if (!directory.endsWith("/"))
-               directory = directory + "/";
-       File thisdir = new File(directory);
-       
-       System.out.println("Listing dir: "+thisdir);
-       
-       HashMap ret = new HashMap();
-       
-       File filelist[] = thisdir.listFiles();
-       for(int i = 0 ; i < filelist.length ; i++)
-               if (filelist[i].isFile()) {
-                       FreenetURI uri = null;
-                       File f = filelist[i];
-                       String line = f.getAbsolutePath(); 
-                       // To ease cleanup, the following code is taken from 
above
-                       // Except for the uri-declaration above.
-                       // Somelines is also commented out
-                       
//////////////////////////////////////////////////////////////////////////////////////
-                       System.out.println("Attempting to read file "+line);
-                long startTime = System.currentTimeMillis();
-                try {
-                       if(!(f.exists() && f.canRead())) {
-                               throw new FileNotFoundException();
-                       }
-                       
-                       // Guess MIME type
-                       String mimeType = DefaultMIMETypes.guessMIMEType(line);
-                       System.out.println("Using MIME type: "+mimeType);
-                       
-                       FileBucket fb = new FileBucket(f, true, false, false);
-                       InsertBlock block = new InsertBlock(fb, new 
ClientMetadata(mimeType), FreenetURI.EMPTY_CHK_URI);
-
-                       startTime = System.currentTimeMillis();
-                       // Declaration is moved out!!!!!!!!!!!!
-                       uri = client.insert(block, getCHKOnly);
-                       
-                       // FIXME depends on CHK's still being renamable
-                    //uri = uri.setDocName(f.getName());
-                       
-                    System.out.println("URI: "+uri);
-                       long endTime = System.currentTimeMillis();
-                    long sz = f.length();
-                    double rate = 1000.0 * sz / (endTime-startTime);
-                    System.out.println("Upload rate: "+rate+" bytes / second");
-                } catch (FileNotFoundException e1) {
-                    System.out.println("File not found");
-                } catch (InserterException e) {
-                       System.out.println("Finished insert but: 
"+e.getMessage());
-                       if(e.uri != null) {
-                               System.out.println("URI would have been: 
"+e.uri);
-                       long endTime = System.currentTimeMillis();
-                        long sz = f.length();
-                        double rate = 1000.0 * sz / (endTime-startTime);
-                        System.out.println("Upload rate: "+rate+" bytes / 
second");
-                       }
-                       if(e.errorCodes != null) {
-                               System.out.println("Splitfile errors 
breakdown:");
-                               
System.out.println(e.errorCodes.toVerboseString());
-                       }
-                } catch (Throwable t) {
-                    System.out.println("Insert threw: "+t);
-                    t.printStackTrace();
-                }
-                
//////////////////////////////////////////////////////////////////////////////////////
-                       
-                if (uri != null)
-                       ret.put(filelist[i].getName(), uri.toString(false));
-                else
-                       System.err.println("Could not insert file.");
-                //ret.put(filelist[i].getName(), null);
-               } else {
-                       HashMap subdir = dirPut(filelist[i].getAbsolutePath(), 
getCHKOnly);
-                       ret.put(filelist[i].getName(), subdir);
-               }
-       
-       return ret;
-       }
-    
-    
     /**
      * @return A block of text, input from stdin, ending with a
      * . on a line by itself. Does some mangling for a fieldset if 

Modified: branches/async-client/src/freenet/node/fcp/ClientGet.java
===================================================================
--- branches/async-client/src/freenet/node/fcp/ClientGet.java   2006-01-25 
20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/node/fcp/ClientGet.java   2006-01-25 
22:02:03 UTC (rev 7927)
@@ -4,6 +4,7 @@
 import freenet.client.FetchResult;
 import freenet.client.FetcherContext;
 import freenet.client.InserterException;
+import freenet.client.async.BaseClientPutter;
 import freenet.client.async.ClientCallback;
 import freenet.client.async.ClientGetter;
 import freenet.client.async.ClientPutter;
@@ -72,15 +73,15 @@
                handler.outputHandler.queue(msg);
        }

-       public void onSuccess(ClientPutter state) {
+       public void onSuccess(BaseClientPutter state) {
                // Ignore
        }

-       public void onFailure(InserterException e, ClientPutter state) {
+       public void onFailure(InserterException e, BaseClientPutter state) {
                // Ignore
        }

-       public void onGeneratedURI(FreenetURI uri, ClientPutter state) {
+       public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
                // Ignore
        }


Modified: branches/async-client/src/freenet/node/fcp/ClientPut.java
===================================================================
--- branches/async-client/src/freenet/node/fcp/ClientPut.java   2006-01-25 
20:02:28 UTC (rev 7926)
+++ branches/async-client/src/freenet/node/fcp/ClientPut.java   2006-01-25 
22:02:03 UTC (rev 7927)
@@ -6,6 +6,7 @@
 import freenet.client.InsertBlock;
 import freenet.client.InserterContext;
 import freenet.client.InserterException;
+import freenet.client.async.BaseClientPutter;
 import freenet.client.async.ClientCallback;
 import freenet.client.async.ClientGetter;
 import freenet.client.async.ClientPutter;
@@ -45,17 +46,17 @@
                inserter.cancel();
        }

-       public void onSuccess(ClientPutter state) {
+       public void onSuccess(BaseClientPutter state) {
                FCPMessage msg = new PutSuccessfulMessage(identifier, 
state.getURI());
                handler.outputHandler.queue(msg);
        }

-       public void onFailure(InserterException e, ClientPutter state) {
+       public void onFailure(InserterException e, BaseClientPutter state) {
                FCPMessage msg = new PutFailedMessage(e, identifier);
                handler.outputHandler.queue(msg);
        }

-       public void onGeneratedURI(FreenetURI uri, ClientPutter state) {
+       public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
                FCPMessage msg = new URIGeneratedMessage(uri, identifier);
                handler.outputHandler.queue(msg);
        }


Reply via email to