Author: toad
Date: 2009-04-08 23:59:04 +0000 (Wed, 08 Apr 2009)
New Revision: 26670
Modified:
trunk/freenet/src/freenet/clients/http/QueueToadlet.java
Log:
Fix the build (doh), run request start for QueueToadlet on the database thread
(wait for it on the web handler thread)
Modified: trunk/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/QueueToadlet.java 2009-04-08
23:56:22 UTC (rev 26669)
+++ trunk/freenet/src/freenet/clients/http/QueueToadlet.java 2009-04-08
23:59:04 UTC (rev 26670)
@@ -53,6 +53,7 @@
import freenet.support.HTMLNode;
import freenet.support.Logger;
import freenet.support.MultiValueTable;
+import freenet.support.MutableBoolean;
import freenet.support.SizeUtil;
import freenet.support.api.Bucket;
import freenet.support.api.HTTPRequest;
@@ -97,7 +98,7 @@
}
@Override
- public void handlePost(URI uri, HTTPRequest request, ToadletContext
ctx) throws ToadletContextClosedException, IOException, RedirectException {
+ public void handlePost(URI uri, HTTPRequest request, final
ToadletContext ctx) throws ToadletContextClosedException, IOException,
RedirectException {
if(!core.hasLoadedQueue()) {
writeError(L10n.getString("QueueToadlet.notLoadedYetTitle"),
L10n.getString("QueueToadlet.notLoadedYet"), ctx, false);
@@ -271,8 +272,10 @@
fcp.modifyGlobalRequestBlocking(identifier,
null, newPriority);
writePermanentRedirect(ctx, "Done", "/queue/");
return;
+
+ // FIXME factor out the next 3 items, they are
very messy!
} else if (request.getPartAsString("insert",
128).length() > 0) {
- FreenetURI insertURI;
+ final FreenetURI insertURI;
String keyType =
request.getPartAsString("keytype", 3);
if ("chk".equals(keyType)) {
insertURI = new FreenetURI("CHK@");
@@ -287,61 +290,90 @@
return;
}
}
- HTTPUploadedFile file =
request.getUploadedFile("filename");
+ final HTTPUploadedFile file =
request.getUploadedFile("filename");
if (file == null ||
file.getFilename().trim().length() == 0) {
writeError(L10n.getString("QueueToadlet.errorNoFileSelected"),
L10n.getString("QueueToadlet.errorNoFileSelectedU"), ctx);
return;
}
- boolean compress =
request.getPartAsString("compress", 128).length() > 0;
- String identifier = file.getFilename() +
"-fred-" + System.currentTimeMillis();
- String fnam;
+ final boolean compress =
request.getPartAsString("compress", 128).length() > 0;
+ final String identifier = file.getFilename() +
"-fred-" + System.currentTimeMillis();
+ final String fnam;
if(insertURI.getKeyType().equals("CHK"))
fnam = file.getFilename();
else
fnam = null;
/* copy bucket data */
- Bucket copiedBucket =
core.persistentTempBucketFactory.makeBucket(file.getData().size());
+ final Bucket copiedBucket =
core.persistentTempBucketFactory.makeBucket(file.getData().size());
BucketTools.copy(file.getData(), copiedBucket);
- final ClientPut clientPut;
- try {
- clientPut = new
ClientPut(fcp.getGlobalForeverClient(), insertURI, identifier,
Integer.MAX_VALUE, RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS,
ClientRequest.PERSIST_FOREVER, null, false, !compress, -1,
ClientPutMessage.UPLOAD_FROM_DIRECT, null, file.getContentType(), copiedBucket,
null, fnam, false, fcp);
- } catch (IdentifierCollisionException e) {
- Logger.error(this, "Cannot put same
file twice in same millisecond");
- writePermanentRedirect(ctx, "Done",
"/queue/");
- return;
- } catch (NotAllowedException e) {
-
this.writeError(L10n.getString("QueueToadlet.errorAccessDenied"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getFilename() }), ctx);
- return;
- } catch (FileNotFoundException e) {
-
this.writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getFilename() }), ctx);
- return;
- } catch (MalformedURLException mue1) {
-
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
- return;
- } catch (MetadataUnresolvedException e) {
- Logger.error(this, "Unresolved metadata
in starting insert from data uploaded from browser: "+e, e);
- writePermanentRedirect(ctx, "Done",
"/queue/");
- return;
- // FIXME should this be a proper
localised message? It shouldn't happen... but we'd like to get reports if it
does.
+ final MutableBoolean done = new
MutableBoolean();
+ core.queue(new DBJob() {
+
+ public void run(ObjectContainer
container, ClientContext context) {
+ try {
+ final ClientPut clientPut;
+ try {
+ clientPut = new
ClientPut(fcp.getGlobalForeverClient(), insertURI, identifier,
Integer.MAX_VALUE, RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS,
ClientRequest.PERSIST_FOREVER, null, false, !compress, -1,
ClientPutMessage.UPLOAD_FROM_DIRECT, null, file.getContentType(), copiedBucket,
null, fnam, false, fcp, container);
+ if(clientPut != null)
+ try {
+
fcp.startBlocking(clientPut);
+ } catch
(IdentifierCollisionException e) {
+
Logger.error(this, "Cannot put same file twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ }
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch
(IdentifierCollisionException e) {
+ Logger.error(this,
"Cannot put same file twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch (NotAllowedException e)
{
+
writeError(L10n.getString("QueueToadlet.errorAccessDenied"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getFilename() }), ctx);
+ return;
+ } catch (FileNotFoundException
e) {
+
writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getFilename() }), ctx);
+ return;
+ } catch (MalformedURLException
mue1) {
+
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
+ return;
+ } catch
(MetadataUnresolvedException e) {
+ Logger.error(this,
"Unresolved metadata in starting insert from data uploaded from browser: "+e,
e);
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ // FIXME should this be
a proper localised message? It shouldn't happen... but we'd like to get reports
if it does.
+ } catch (Throwable t) {
+ writeInternalError(t,
ctx);
+ } finally {
+ synchronized(done) {
+ done.value =
true;
+
done.notifyAll();
+ }
+ }
+ } catch (IOException e) {
+ // Ignore
+ } catch
(ToadletContextClosedException e) {
+ // Ignore
+ }
+ }
+
+ }, NativeThread.HIGH_PRIORITY+1, false);
+ synchronized(done) {
+ while(!done.value)
+ try {
+ done.wait();
+ } catch (InterruptedException
e) {
+ // Ignore
+ }
}
- if(clientPut != null)
- try {
- fcp.startBlocking(clientPut);
- } catch (IdentifierCollisionException
e) {
- Logger.error(this, "Cannot put
same file twice in same millisecond");
- writePermanentRedirect(ctx,
"Done", "/queue/");
- return;
- }
- writePermanentRedirect(ctx, "Done", "/queue/");
return;
} else if (request.isPartSet("insert-local-file")) {
- String filename =
request.getPartAsString("filename", MAX_FILENAME_LENGTH);
+ final String filename =
request.getPartAsString("filename", MAX_FILENAME_LENGTH);
if(logMINOR) Logger.minor(this, "Inserting
local file: "+filename);
- File file = new File(filename);
- String identifier = file.getName() + "-fred-" +
System.currentTimeMillis();
- String contentType =
DefaultMIMETypes.guessMIMEType(filename, false);
- FreenetURI furi = new FreenetURI("CHK@");
- String key = request.getPartAsString("key",
128);
+ final File file = new File(filename);
+ final String identifier = file.getName() +
"-fred-" + System.currentTimeMillis();
+ final String contentType =
DefaultMIMETypes.guessMIMEType(filename, false);
+ final FreenetURI furi;
+ final String key =
request.getPartAsString("key", 128);
if(key != null) {
try {
furi = new FreenetURI(key);
@@ -349,50 +381,81 @@
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
return;
}
+ } else {
+ furi = new FreenetURI("CHK@");
}
- String target = file.getName();
+ final String target;
if(!furi.getKeyType().equals("CHK"))
target = null;
- final ClientPut clientPut;
- try {
- clientPut = new
ClientPut(fcp.getGlobalForeverClient(), furi, identifier, Integer.MAX_VALUE,
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, ClientRequest.PERSIST_FOREVER,
null, false, false, -1, ClientPutMessage.UPLOAD_FROM_DISK, file, contentType,
new FileBucket(file, true, false, false, false, false), null, target, false,
fcp);
- if(logMINOR) Logger.minor(this,
"Started global request to insert "+file+" to CHK@ as "+identifier);
- } catch (IdentifierCollisionException e) {
- Logger.error(this, "Cannot put same
file twice in same millisecond");
- writePermanentRedirect(ctx, "Done",
"/queue/");
- return;
- } catch (MalformedURLException e) {
-
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
- return;
- } catch (FileNotFoundException e) {
-
this.writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ target }), ctx);
- return;
- } catch (NotAllowedException e) {
-
this.writeError(L10n.getString("QueueToadlet.errorAccessDenied"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getName() }), ctx);
- return;
- } catch (MetadataUnresolvedException e) {
- Logger.error(this, "Unresolved metadata
in starting insert from data from file: "+e, e);
- writePermanentRedirect(ctx, "Done",
"/queue/");
- return;
- // FIXME should this be a proper
localised message? It shouldn't happen... but we'd like to get reports if it
does.
+ else
+ target = file.getName();
+ final MutableBoolean done = new
MutableBoolean();
+ core.queue(new DBJob() {
+
+ public void run(ObjectContainer
container, ClientContext context) {
+ final ClientPut clientPut;
+ try {
+ try {
+ clientPut = new
ClientPut(fcp.getGlobalForeverClient(), furi, identifier, Integer.MAX_VALUE,
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, ClientRequest.PERSIST_FOREVER,
null, false, false, -1, ClientPutMessage.UPLOAD_FROM_DISK, file, contentType,
new FileBucket(file, true, false, false, false, false), null, target, false,
fcp, container);
+
if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this, "Started global
request to insert "+file+" to CHK@ as "+identifier);
+ if(clientPut != null)
+ try {
+
fcp.startBlocking(clientPut);
+ } catch
(IdentifierCollisionException e) {
+
Logger.error(this, "Cannot put same file twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ }
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch
(IdentifierCollisionException e) {
+ Logger.error(this,
"Cannot put same file twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch (MalformedURLException
e) {
+
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
+ return;
+ } catch (FileNotFoundException
e) {
+
writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ target }), ctx);
+ return;
+ } catch (NotAllowedException e)
{
+
writeError(L10n.getString("QueueToadlet.errorAccessDenied"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.getName() }), ctx);
+ return;
+ } catch
(MetadataUnresolvedException e) {
+ Logger.error(this,
"Unresolved metadata in starting insert from data from file: "+e, e);
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ // FIXME should this be
a proper localised message? It shouldn't happen... but we'd like to get reports
if it does.
+ } finally {
+ synchronized(done) {
+ done.value =
true;
+
done.notifyAll();
+ }
+ }
+ } catch (IOException e) {
+ // Ignore
+ } catch
(ToadletContextClosedException e) {
+ // Ignore
+ }
+ }
+
+ }, NativeThread.HIGH_PRIORITY+1, false);
+ synchronized(done) {
+ while(!done.value)
+ try {
+ done.wait();
+ } catch (InterruptedException
e) {
+ // Ignore
+ }
}
- if(clientPut != null)
- try {
- fcp.startBlocking(clientPut);
- } catch (IdentifierCollisionException
e) {
- Logger.error(this, "Cannot put
same file twice in same millisecond");
- writePermanentRedirect(ctx,
"Done", "/queue/");
- return;
- }
- writePermanentRedirect(ctx, "Done", "/queue/");
return;
} else if (request.isPartSet("insert-local-dir")) {
- String filename =
request.getPartAsString("filename", MAX_FILENAME_LENGTH);
+ final String filename =
request.getPartAsString("filename", MAX_FILENAME_LENGTH);
if(logMINOR) Logger.minor(this, "Inserting
local directory: "+filename);
- File file = new File(filename);
- String identifier = file.getName() + "-fred-" +
System.currentTimeMillis();
- FreenetURI furi = new FreenetURI("CHK@");
- String key = request.getPartAsString("key",
128);
+ final File file = new File(filename);
+ final String identifier = file.getName() +
"-fred-" + System.currentTimeMillis();
+ final FreenetURI furi;
+ final String key =
request.getPartAsString("key", 128);
if(key != null) {
try {
furi = new FreenetURI(key);
@@ -400,31 +463,61 @@
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
return;
}
+ } else {
+ furi = new FreenetURI("CHK@");
}
- ClientPutDir clientPutDir;
- try {
- clientPutDir = new
ClientPutDir(fcp.getGlobalForeverClient(), furi, identifier, Integer.MAX_VALUE,
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, ClientRequest.PERSIST_FOREVER,
null, false, false, -1, file, null, false, true, false, fcp);
- if(logMINOR) Logger.minor(this,
"Started global request to insert dir "+file+" to "+furi+" as "+identifier);
- } catch (IdentifierCollisionException e) {
- Logger.error(this, "Cannot put same
directory twice in same millisecond");
- writePermanentRedirect(ctx, "Done",
"/queue/");
- return;
- } catch (MalformedURLException e) {
-
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
- return;
- } catch (FileNotFoundException e) {
-
this.writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.toString() }), ctx);
- return;
+ final MutableBoolean done = new
MutableBoolean();
+ core.queue(new DBJob() {
+
+ public void run(ObjectContainer
container, ClientContext context) {
+ ClientPutDir clientPutDir;
+ try {
+ try {
+ boolean logMINOR =
Logger.shouldLog(Logger.MINOR, this);
+ clientPutDir = new
ClientPutDir(fcp.getGlobalForeverClient(), furi, identifier, Integer.MAX_VALUE,
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, ClientRequest.PERSIST_FOREVER,
null, false, false, -1, file, null, false, true, false, fcp, container);
+ if(logMINOR)
Logger.minor(this, "Started global request to insert dir "+file+" to "+furi+"
as "+identifier);
+ if(clientPutDir != null)
+ try {
+
fcp.startBlocking(clientPutDir);
+ } catch
(IdentifierCollisionException e) {
+
Logger.error(this, "Cannot put same file twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ }
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch
(IdentifierCollisionException e) {
+ Logger.error(this,
"Cannot put same directory twice in same millisecond");
+
writePermanentRedirect(ctx, "Done", "/queue/");
+ return;
+ } catch (MalformedURLException
e) {
+
writeError(L10n.getString("QueueToadlet.errorInvalidURI"),
L10n.getString("QueueToadlet.errorInvalidURIToU"), ctx);
+ return;
+ } catch (FileNotFoundException
e) {
+
writeError(L10n.getString("QueueToadlet.errorNoFileOrCannotRead"),
L10n.getString("QueueToadlet.errorAccessDeniedFile", new String[]{ "file" },
new String[]{ file.toString() }), ctx);
+ return;
+ } finally {
+ synchronized(done) {
+ done.value =
true;
+
done.notifyAll();
+ }
+ }
+ } catch (IOException e) {
+ // Ignore
+ } catch
(ToadletContextClosedException e) {
+ // Ignore
+ }
+ }
+
+ }, NativeThread.HIGH_PRIORITY+1, false);
+ synchronized(done) {
+ while(!done.value)
+ try {
+ done.wait();
+ } catch (InterruptedException
e) {
+ // Ignore
+ }
}
- if(clientPutDir != null)
- try {
- fcp.startBlocking(clientPutDir);
- } catch (IdentifierCollisionException
e) {
- Logger.error(this, "Cannot put
same file twice in same millisecond");
- writePermanentRedirect(ctx,
"Done", "/queue/");
- return;
- }
- writePermanentRedirect(ctx, "Done", "/queue/");
return;
}
} finally {
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs