Author: toad
Date: 2006-03-10 18:33:19 +0000 (Fri, 10 Mar 2006)
New Revision: 8220
Modified:
trunk/freenet/src/freenet/client/Metadata.java
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/node/Version.java
Log:
521:
Support subdirs in PUTDIR.
Modified: trunk/freenet/src/freenet/client/Metadata.java
===================================================================
--- trunk/freenet/src/freenet/client/Metadata.java 2006-03-10 17:47:39 UTC
(rev 8219)
+++ trunk/freenet/src/freenet/client/Metadata.java 2006-03-10 18:33:19 UTC
(rev 8220)
@@ -385,7 +385,10 @@
}
/**
- * Create a Metadata object and add manifest entries from the given
array. */
+ * Create a Metadata object and add manifest entries from the given map.
+ * The map can contain either string -> byte[], or string -> map, the
latter
+ * indicating subdirs.
+ */
public static Metadata mkRedirectionManifestWithMetadata(HashMap dir) {
Metadata ret = new Metadata();
ret.addRedirectionManifestWithMetadata(dir);
@@ -403,11 +406,20 @@
int count = 0;
for(Iterator i = dir.keySet().iterator();i.hasNext();) {
String key = (String) i.next();
+ if(key.indexOf('/') != -1)
+ throw new IllegalArgumentException("Slashes in
simple redirect manifest filenames! (slashes denote sub-manifests)");
count++;
- byte[] data = (byte[]) dir.get(key);
- if(data == null)
- throw new NullPointerException();
- manifestEntries.put(key, data);
+ Object o = dir.get(key);
+ if(o instanceof byte[]) {
+ byte[] data = (byte[]) dir.get(key);
+ if(data == null)
+ throw new NullPointerException();
+ manifestEntries.put(key, data);
+ } else if(o instanceof HashMap) {
+ HashMap hm = (HashMap)o;
+ Metadata subMap =
mkRedirectionManifestWithMetadata(hm);
+ manifestEntries.put(key,
subMap.writeToByteArray());
+ }
}
manifestEntryCount = count;
}
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-10 17:47:39 UTC (rev 8219)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-10 18:33:19 UTC (rev 8220)
@@ -158,7 +158,7 @@
new String[] { "index.html", "index.htm", "default.html",
"default.htm" };
public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler
chkSched,
- ClientRequestScheduler sskSched, HashSet
manifestElements, short prioClass, FreenetURI target,
+ ClientRequestScheduler sskSched, HashMap
manifestElements, short prioClass, FreenetURI target,
String defaultName, InserterContext ctx, boolean
getCHKOnly, Object clientContext) throws InserterException {
super(prioClass, chkSched, sskSched, clientContext);
this.defaultName = defaultName;
@@ -170,32 +170,9 @@
runningPutHandlers = new HashSet();
putHandlersWaitingForMetadata = new HashSet();
waitingForBlockSets = new HashSet();
- Iterator it = manifestElements.iterator();
+ makePutHandlers(manifestElements, putHandlersByName);
+ Iterator it = runningPutHandlers.iterator();
while(it.hasNext()) {
- ManifestElement element = (ManifestElement) it.next();
- String name = element.name;
- Bucket data = element.data;
- String mimeType = element.mimeOverride;
- if(mimeType == null)
- 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 = putHandlersByName.values().iterator();
- while(it.hasNext()) {
PutHandler ph = (PutHandler) it.next();
try {
ph.start();
@@ -206,6 +183,40 @@
}
}
+ private void makePutHandlers(HashMap manifestElements, HashMap
putHandlersByName) throws InserterException {
+ Iterator it = manifestElements.keySet().iterator();
+ while(it.hasNext()) {
+ String name = (String) it.next();
+ Object o = manifestElements.get(name);
+ if(o instanceof HashMap) {
+ HashMap subMap = new HashMap();
+ putHandlersByName.put(name, subMap);
+ makePutHandlers((HashMap)o, subMap);
+ } else {
+ ManifestElement element = (ManifestElement) o;
+ Bucket data = element.data;
+ String mimeType = element.mimeOverride;
+ if(mimeType == null)
+ 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);
+ }
+ }
+ }
+
public FreenetURI getURI() {
return finalURI;
}
@@ -217,13 +228,7 @@
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);
- }
+ namesToByteArrays(putHandlersByName, namesToByteArrays);
if(defaultName != null) {
byte[] meta = (byte[])
namesToByteArrays.get(defaultName);
if(meta == null) {
@@ -262,6 +267,24 @@
}
}
+ private void namesToByteArrays(HashMap putHandlersByName, HashMap
namesToByteArrays) {
+ Iterator i = putHandlersByName.keySet().iterator();
+ while(i.hasNext()) {
+ String name = (String) i.next();
+ Object o = putHandlersByName.get(name);
+ if(o instanceof PutHandler) {
+ PutHandler ph = (PutHandler) o;
+ byte[] meta = ph.metadata;
+ namesToByteArrays.put(name, meta);
+ } else if(o instanceof HashMap) {
+ HashMap subMap = new HashMap();
+ namesToByteArrays.put(name, subMap);
+ namesToByteArrays((HashMap)o, subMap);
+ } else
+ throw new IllegalStateException();
+ }
+ }
+
private void insertedAllFiles() {
synchronized(this) {
insertedAllFiles = true;
@@ -343,13 +366,19 @@
* All are to have mimeOverride=null, i.e. we use the auto-detected
mime type
* from the filename.
*/
- public static HashSet bucketsByNameToManifestEntries(HashMap
bucketsByName) {
- HashSet manifestEntries = new HashSet();
+ public static HashMap bucketsByNameToManifestEntries(HashMap
bucketsByName) {
+ HashMap manifestEntries = new HashMap();
Iterator i = bucketsByName.keySet().iterator();
while(i.hasNext()) {
String name = (String) i.next();
- Bucket data = (Bucket) bucketsByName.get(name);
- manifestEntries.add(new ManifestElement(name, data,
null));
+ Object o = bucketsByName.get(name);
+ if(o instanceof Bucket) {
+ Bucket data = (Bucket) bucketsByName.get(name);
+ manifestEntries.put(name, new
ManifestElement(name, data, null));
+ } else if(o instanceof HashMap) {
+ manifestEntries.put(name,
bucketsByNameToManifestEntries((HashMap)o));
+ } else
+ throw new
IllegalArgumentException(String.valueOf(o));
}
return manifestEntries;
}
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2006-03-10
17:47:39 UTC (rev 8219)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2006-03-10
18:33:19 UTC (rev 8220)
@@ -568,12 +568,7 @@
ret.put(f.getName(), bucket);
} else if(filelist[i].isDirectory()) {
HashMap subdir = makeBucketsByName(directory +
filelist[i].getName());
- Iterator it = subdir.keySet().iterator();
- while(it.hasNext()) {
- String key = (String) it.next();
- Bucket bucket = (Bucket) subdir.get(key);
- ret.put(filelist[i].getName() + "/" + key,
bucket);
- }
+ ret.put(filelist[i].getName(), subdir);
}
}
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-10 17:47:39 UTC (rev
8219)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-10 18:33:19 UTC (rev
8220)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 520;
+ private static final int buildNumber = 521;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 507;