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;


Reply via email to