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);
}