Please keep reindents separate from core changes if at all possible. Even if 
that means committing code with bizarre indenting and fixing it in the next 
commit.

On Tuesday 20 November 2007 19:15, nextgens at freenetproject.org wrote:
> Author: nextgens
> Date: 2007-11-20 19:15:58 +0000 (Tue, 20 Nov 2007)
> New Revision: 15881
> 
> Modified:
>    trunk/freenet/src/freenet/clients/http/BookmarkEditorToadlet.java
>    trunk/freenet/src/freenet/clients/http/StartupToadletServer.java
>    trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
>    trunk/freenet/src/freenet/clients/http/bookmark/Bookmark.java
>    trunk/freenet/src/freenet/clients/http/bookmark/BookmarkCategory.java
>    trunk/freenet/src/freenet/clients/http/bookmark/BookmarkItem.java
>    trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java
>    trunk/freenet/src/freenet/node/Node.java
>    trunk/freenet/src/freenet/node/NodeClientCore.java
> Log:
> BookmarkToadlet: Save bookmarks in a different file so that they don't get 
clobbered for no reason anymore.
> 
> THE MIGRATION TOOL DOESN'T WORK... yet.
> 
> Modified: trunk/freenet/src/freenet/clients/http/BookmarkEditorToadlet.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/BookmarkEditorToadlet.java 
2007-11-20 19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/BookmarkEditorToadlet.java 
2007-11-20 19:15:58 UTC (rev 15881)
> @@ -129,7 +129,7 @@
>                       
actions.addChild("a", "href", "?action=paste&bookmark=/").addChild("img", new 
String[] {"src", "alt", "title"}, new String[] {"/static/icon/paste.png", 
paste, paste});
>  
>               root.addChild(actions);
> -             addCategoryToList(bookmarkManager.getMainCategory(), "/", 
root.addChild("ul"));
> +             addCategoryToList(BookmarkManager.MAIN_CATEGORY, "/", 
root.addChild("ul"));
>  
>               return bookmarks;
>       }
> 
> Modified: trunk/freenet/src/freenet/clients/http/StartupToadletServer.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/StartupToadletServer.java  
2007-11-20 19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/StartupToadletServer.java  
2007-11-20 19:15:58 UTC (rev 15881)
> @@ -118,13 +118,12 @@
>        * Create a SimpleToadletServer, using the settings from the SubConfig 
(the fproxy.*
>        * config).
>        */
> -    public StartupToadletServer(Executor executor, PersistentConfig conf) {
> +    public StartupToadletServer(Executor executor, SimpleFieldSet config) {
>          this.executor = executor;
>          formPassword = String.valueOf(this.getClass().hashCode());
>  
>          // hack ... we don't have the config framework yet
>          try {
> -            SimpleFieldSet config = conf.getSimpleFieldSet();
>              port = config.getInt("fproxy.port");
>              bindTo = config.get("fproxy.bindTo");
>              // Yeah, only FullAccess hosts here, it's on purpose.
> 
> Modified: trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java        
> 2007-11-20 
19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java        
> 2007-11-20 
19:15:58 UTC (rev 15881)
> @@ -540,7 +540,8 @@
>  
>               HTMLNode bookmarkBoxContent = 
bookmarkBox.addChild("div", "class", "infobox-content");
>               HTMLNode bookmarksList = 
bookmarkBoxContent.addChild("ul", "id", "bookmarks");
> -             addCategoryToList(bookmarkManager.getMainCategory(), 
> bookmarksList);
> +             addCategoryToList(BookmarkManager.PROTECTED_CATEGORY, 
> bookmarksList);
> +                addCategoryToList(BookmarkManager.MAIN_CATEGORY, 
bookmarksList);
>  
>               // Fetch-a-key box
>               HTMLNode fetchKeyBox = 
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-normal", 
l10n("fetchKeyLabel")));
> 
> Modified: trunk/freenet/src/freenet/clients/http/bookmark/Bookmark.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/bookmark/Bookmark.java     
> 2007-11-20 
19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/bookmark/Bookmark.java     
> 2007-11-20 
19:15:58 UTC (rev 15881)
> @@ -33,6 +33,7 @@
>               if(o == this) return true;
>               if(o instanceof Bookmark) {
>                       Bookmark b = (Bookmark) o;
> +                        if(b.name == null || b.desc == null) return false;
>                       if(!b.name.equals(name)) return false;
>                       // Compensate for nulls
>                       
> if(!String.valueOf(b.desc).equals(String.valueOf(desc))) return false;
> 
> Modified: 
trunk/freenet/src/freenet/clients/http/bookmark/BookmarkCategory.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/bookmark/BookmarkCategory.java     
2007-11-20 19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/bookmark/BookmarkCategory.java     
2007-11-20 19:15:58 UTC (rev 15881)
> @@ -1,5 +1,6 @@
>  package freenet.clients.http.bookmark;
>  
> +import freenet.support.SimpleFieldSet;
>  import java.util.Vector;
>  
>  import freenet.support.StringArray;
> @@ -18,6 +19,7 @@
>       }
>  
>       protected synchronized Bookmark addBookmark(Bookmark b) {
> +                if(b == null) return null;
>               int x = bookmarks.indexOf(b);
>               if(x >= 0) return (Bookmark) bookmarks.get(x);
>               bookmarks.add(b);
> @@ -118,6 +120,26 @@
>  
>       }
>  
> +        public SimpleFieldSet toSimpleFieldSet() {
> +            SimpleFieldSet sfs = new SimpleFieldSet(true);
> +
> +            BookmarkItems items = getItems();
> +            for (int i = 0; i < items.size(); i++) {
> +                BookmarkItem item = items.get(i);
> +                sfs.putSingle(String.valueOf(i), item.toString());
> +            }
> +
> +            BookmarkCategories subCategories = getSubCategories();
> +            for (int i = 0; i < subCategories.size(); i++) {
> +                BookmarkCategory category = subCategories.get(i);
> +                SimpleFieldSet toPut = category.toSimpleFieldSet();
> +                if("".equals(category.name) || toPut.isEmpty()) continue;
> +                sfs.put(category.name, toPut);
> +            }
> +
> +            return sfs;
> +        }
> +
>       public void setPrivate(boolean bool) {
>               privateBookmark = bool;
>  
> 
> Modified: trunk/freenet/src/freenet/clients/http/bookmark/BookmarkItem.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/bookmark/BookmarkItem.java 
2007-11-20 19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/bookmark/BookmarkItem.java 
2007-11-20 19:15:58 UTC (rev 15881)
> @@ -10,9 +10,11 @@
>  import freenet.node.useralerts.AbstractUserAlert;
>  import freenet.node.useralerts.UserAlert;
>  import freenet.node.useralerts.UserAlertManager;
> +import freenet.support.Fields;
>  import freenet.support.HTMLEncoder;
>  import freenet.support.HTMLNode;
>  
> +import freenet.support.SimpleFieldSet;
>  import java.net.MalformedURLException;
>  
>  public class BookmarkItem extends Bookmark {
> @@ -42,6 +44,16 @@
>               this.alerts = uam;
>               alert = new BookmarkUpdatedUserAlert();
>       }
> +        
> +        public BookmarkItem(String line, UserAlertManager uam) throws 
MalformedURLException {
> +            String[] result = line.split("###");
> +            this.name = result[0];
> +            this.desc = result[1];
> +            this.hasAnActivelink = Fields.stringToBool(result[2], false);
> +            this.key = new FreenetURI(result[3]);
> +            this.alerts = uam;
> +            this.alert = new BookmarkUpdatedUserAlert();
> +        }
>  
>       private class BookmarkUpdatedUserAlert extends AbstractUserAlert {
>  
> @@ -137,7 +149,7 @@
>       }
>  
>       public String toString() {
> -             return this.name + '=' + (hasAnActivelink ? "|=" : "=") + 
this.key.toString();
> +             return this.name + "###" + this.desc + "###" + 
> this.hasAnActivelink 
+ "###" + this.key.toString();
>       }
>  
>       public synchronized void setEdition(long ed, NodeClientCore node) {
> 
> Modified: 
trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java      
2007-11-20 19:05:06 UTC (rev 15880)
> +++ trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java      
2007-11-20 19:15:58 UTC (rev 15881)
> @@ -1,7 +1,6 @@
>  /* This code is part of Freenet. It is distributed under the GNU General
>   * Public License, version 2 (or at your option any later version). See
>   * http://www.gnu.org/ for further details of the GPL. */
> -
>  package freenet.clients.http.bookmark;
>  
>  import java.net.MalformedURLException;
> @@ -10,332 +9,390 @@
>  import java.util.regex.Pattern;
>  
>  import freenet.client.async.USKCallback;
> -import freenet.config.InvalidConfigValueException;
> -import freenet.config.SubConfig;
>  import freenet.keys.FreenetURI;
>  import freenet.keys.USK;
>  import freenet.l10n.L10n;
>  import freenet.node.NodeClientCore;
> -import freenet.support.api.StringArrCallback;
> +import freenet.support.Logger;
> +import freenet.support.SimpleFieldSet;
> +import java.io.File;
> +import java.io.FileWriter;
> +import java.io.IOException;
> +import java.util.Iterator;
>  
>  public class BookmarkManager {
>  
> -     private final NodeClientCore node;
> -     private final USKUpdatedCallback uskCB = new USKUpdatedCallback();
> -     private final StringArrCallback configCB = new BookmarkCallback();
> -     private static final BookmarkCategory MAIN_CATEGORY = new 
BookmarkCategory("/");;
> -     private final HashMap bookmarks = new HashMap();
> +    private final NodeClientCore node;
> +    private final USKUpdatedCallback uskCB = new USKUpdatedCallback();
> +    public static final BookmarkCategory MAIN_CATEGORY = new 
BookmarkCategory("/");
> +    public static final BookmarkCategory PROTECTED_CATEGORY = new 
BookmarkCategory("/protected");
> +    private final HashMap bookmarks = new HashMap();
> +    private final File bookmarksFile = new 
File("bookmarks.dat").getAbsoluteFile();
> +    private boolean isSavingBookmarks = false;
>  
> -     public BookmarkManager(NodeClientCore n, SubConfig sc) {
> -             bookmarks.put("/", MAIN_CATEGORY);
> -             this.node = n;
> +    public BookmarkManager(NodeClientCore n, SimpleFieldSet oldConfig) {
> +        bookmarks.put("/", MAIN_CATEGORY);
> +        this.node = n;
>  
> -             try {
> -                     BookmarkCategory defaultRoot = new 
> BookmarkCategory("/");
> -                     BookmarkCategory indexes = (BookmarkCategory) 
defaultRoot.addBookmark(new BookmarkCategory("Indexes"));
> -                     indexes.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> zQyF2O1o8B4y40w7Twz8y2I9haW3d2DTlxjTHPu7zc8,h2mhQNNE9aQvF~2yKAmKV1uorr7141-QOroBf5hrlbw,AQACAAE/AnotherIndex/33/"),
> -                                                     "Another Index (large 
> categorised index, many sites have no 
description)", false,
> -                                                     node.alerts));
> +        try {
> +            BookmarkCategory indexes = (BookmarkCategory) 
PROTECTED_CATEGORY.addBookmark(new BookmarkCategory("Indexes"));
> +            indexes.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
zQyF2O1o8B4y40w7Twz8y2I9haW3d2DTlxjTHPu7zc8,h2mhQNNE9aQvF~2yKAmKV1uorr7141-QOroBf5hrlbw,AQACAAE/AnotherIndex/33/"),
> +                    "Another Index (large categorised index, many sites 
have no description)", false,
> +                    node.alerts));
>  
> -                     indexes.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/21/"),
> -                                                     "Index des sites 
> Fran?ais (small French index with descriptions)", 
false,
> -                                                     node.alerts));
> +            indexes.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/21/"),
> +                    "Index des sites Fran?ais (small French index with 
descriptions)", false,
> +                    node.alerts));
>  
> -                     indexes.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> cvZEZFWynx~4hmakaimts4Ruusl9mEUpU6mSvNvZ9p8,K2Xopc6GWPkKrs27EDuqzTcca2bE5H2YAXw0qKnkON4,AQACAAE/TSOF/2/"),
> -                                                     "The Start Of Freenet 
> (another human-maintained index, so far 
relatively small)", true,
> -                                                     node.alerts));
> +            indexes.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
cvZEZFWynx~4hmakaimts4Ruusl9mEUpU6mSvNvZ9p8,K2Xopc6GWPkKrs27EDuqzTcca2bE5H2YAXw0qKnkON4,AQACAAE/TSOF/2/"),
> +                    "The Start Of Freenet (another human-maintained index, 
so far relatively small)", true,
> +                    node.alerts));
>  
> -                     indexes.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> 7H66rhYmxIFgMyw5Dl11JazXGHPhp7dSN7WMa1pbtEo,jQHUQUPTkeRcjmjgrc7t5cDRdDkK3uKkrSzuw5CO9uk,AQACAAE/ENTRY.POINT/36/"),
> -                                                     "Entry point (old, 
> large index, hasn't been updated for a while)", 
true,
> -                                                     node.alerts));
> -                     
> -                     indexes.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> 0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/1/"),
> -                                                     "The Ultimate FreeNet 
> Index (new one page index)", false,
> -                                                     node.alerts));
> +            indexes.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
7H66rhYmxIFgMyw5Dl11JazXGHPhp7dSN7WMa1pbtEo,jQHUQUPTkeRcjmjgrc7t5cDRdDkK3uKkrSzuw5CO9uk,AQACAAE/ENTRY.POINT/36/"),
> +                    "Entry point (old, large index, hasn't been updated for 
a while)", true,
> +                    node.alerts));
>  
> -                     
> -                     BookmarkCategory flog = (BookmarkCategory) 
> defaultRoot.addBookmark(new 
BookmarkCategory("Freenet devel's flogs"));
> -                     flog.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> yGvITGZzrY1vUZK-4AaYLgcjZ7ysRqNTMfdcO8gS-LY,-ab5bJVD3Lp-LXEQqBAhJpMKrKJ19RnNaZMIkusU79s,AQACAAE/toad/7/"),
> -                                                     "Toad", true, 
> node.alerts));
> -                     flog.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> hM9XRwjXIzU8xTSBXNZvTn2KuvTSRFnVn4EER9FQnpM,gsth24O7ud4gL4NwNuYJDUqfaWASOG2zxZY~ChtgPxc,AQACAAE/Flog/7/"),
> -                                                     "Nextgen$", true, 
> node.alerts));
> +            indexes.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/1/"),
> +                    "The Ultimate FreeNet Index (new one page index)", 
false,
> +                    node.alerts));
>  
> -                     BookmarkCategory apps = (BookmarkCategory) 
> defaultRoot.addBookmark(new 
BookmarkCategory("Freenet related software"));
> -                     apps.addBookmark(new BookmarkItem(
> -                                     new FreenetURI(
> -                                                     "USK at 
> QRZAI1nSm~dAY2hTdzVWXmEhkaI~dso0OadnppBR7kE,wq5rHGBI7kpChBe4yRmgBChIGDug7Xa5SG9vYGXdxR0,AQACAAE/frost/4"),
> -                                                     "Frost", true, 
> node.alerts));
>  
> -                     sc.register("bookmarks", defaultRoot.toStrings(), 0, 
> true, 
false,"BookmarkManager.list", "BookmarkManager.listLong", configCB);
> -                     configCB.set(sc.getStringArr("bookmarks"));
> -             } catch (MalformedURLException mue) {
> -             } catch (InvalidConfigValueException icve) {
> -                     icve.printStackTrace();
> -             }
> -     }
> +            BookmarkCategory flog = (BookmarkCategory) 
PROTECTED_CATEGORY.addBookmark(new BookmarkCategory("Freenet devel's 
flogs"));
> +            flog.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
yGvITGZzrY1vUZK-4AaYLgcjZ7ysRqNTMfdcO8gS-LY,-ab5bJVD3Lp-LXEQqBAhJpMKrKJ19RnNaZMIkusU79s,AQACAAE/toad/7/"),
> +                    "Toad", true, node.alerts));
> +            flog.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
hM9XRwjXIzU8xTSBXNZvTn2KuvTSRFnVn4EER9FQnpM,gsth24O7ud4gL4NwNuYJDUqfaWASOG2zxZY~ChtgPxc,AQACAAE/Flog/7/"),
> +                    "Nextgen$", true, node.alerts));
>  
> -     public class BookmarkCallback implements StringArrCallback {
> -             private final Pattern pattern = 
> Pattern.compile("/(.*/)([^/]*)=([A-Z]
{3}@.*).*");
> +            BookmarkCategory apps = (BookmarkCategory) 
PROTECTED_CATEGORY.addBookmark(new BookmarkCategory("Freenet related 
software"));
> +            apps.addBookmark(new BookmarkItem(new 
FreenetURI("USK at 
QRZAI1nSm~dAY2hTdzVWXmEhkaI~dso0OadnppBR7kE,wq5rHGBI7kpChBe4yRmgBChIGDug7Xa5SG9vYGXdxR0,AQACAAE/frost/4"),
> +                    "Frost", true, node.alerts));
>  
> -             public String[] get() {
> -                     synchronized (BookmarkManager.this) {
> -                             return MAIN_CATEGORY.toStrings();
> -                     }
> -             }
> +            //TODO: remove
> +            String[] oldBookmarks = oldConfig.getAll("bookmarks");
> +            if (oldBookmarks != null) {
> +                migrateOldBookmarks(oldBookmarks);
> +            }
>  
> -             public void set(String[] newVals) throws 
> InvalidConfigValueException {
> -                     FreenetURI key;
> -                     clear();
> -                     for (int i = 0; i < newVals.length; i++) {
> -                             try {
> -                                     Matcher matcher = 
> pattern.matcher(newVals[i]);
> -                                     // FIXME: remove
> -                                     if (matcher.matches() && 
> matcher.groupCount() == 3) {
> -                                             
> -                                             boolean hasAnActiveLink = false;
> -                                             makeParents(matcher.group(1));
> -                                             key = new 
> FreenetURI(matcher.group(3));
> -                                             String title = matcher.group(2);
> -                                             if(title.endsWith("=|")) {
> -                                                     title = 
> title.substring(0, title.length()-2);
> -                                                     hasAnActiveLink = true;
> -                                             } else if(title.endsWith("=")) {
> -                                                     title = 
> title.substring(0, title.length()-1);
> -                                             }
> -                                             addBookmark(matcher.group(1), 
> new BookmarkItem(key,
> -                                                             title, 
> hasAnActiveLink, node.alerts), false);
> -                                             
> -                                     } else {
> -                                             throw new 
> InvalidConfigValueException(l10n("malformedBookmark"));
> -                                     }
> +            if (bookmarksFile.exists() && bookmarksFile.canRead() && 
bookmarksFile.length() > 0) {
> +                Logger.normal(this, "Attempting to read the bookmark file 
from " + bookmarksFile.toString());
> +                SimpleFieldSet sfs = SimpleFieldSet.readFrom(bookmarksFile, 
false, true);
> +                readBookmarks(MAIN_CATEGORY, sfs);
> +            }
>  
> -                             } catch (MalformedURLException mue) {
> -                                     throw new 
> InvalidConfigValueException(mue.getMessage());
> -                             }
> -                     }
> -             }
> -     }
> +        } catch (MalformedURLException mue) {
> +        } catch (IOException ioe) {
> +            Logger.error(this, "Error reading the bookmark file (" + 
bookmarksFile.toString() + "):" + ioe.getMessage(), ioe);
> +        }
> +    }
>  
> -     private class USKUpdatedCallback implements USKCallback {
> -             public void onFoundEdition(long edition, USK key) {
> -                     BookmarkItems items = MAIN_CATEGORY.getAllItems();
> -                     for (int i = 0; i < items.size(); i++) {
> -                             if (!"USK".equals(items.get(i).getKeyType()))
> -                                     continue;
> +    private void migrateOldBookmarks(String[] newVals) {
> +        //FIXME: for some reason that doesn't work... if someone wants to 
fix it ;)
> +        Pattern pattern = Pattern.compile("/(.*/)([^/]*)=(|=)*([A-Z]
{3}@.*).*");
> +        FreenetURI key;
> +        clear();
> +        for (int i = 0; i < newVals.length; i++) {
> +            try {
> +                Matcher matcher = pattern.matcher(newVals[i]);
> +                if (matcher.matches() && matcher.groupCount() == 4) {
> +                    makeParents(matcher.group(1));
> +                    key = new FreenetURI(matcher.group(4));
> +                    String title = matcher.group(2);
> +                    boolean hasAnActiveLink = matcher.group(3).indexOf('|') 
> -1;
> +                    addBookmark(matcher.group(1), new BookmarkItem(key,
> +                            title, hasAnActiveLink, node.alerts), false);
> +                }
> +            } catch (MalformedURLException e) {}
> +        }
> +    }
>  
> -                             try {
> -                                     FreenetURI furi = new 
> FreenetURI(items.get(i).getKey());
> -                                     USK usk = USK.create(furi);
> +    private class USKUpdatedCallback implements USKCallback {
>  
> -                                     if (usk.equals(key, false)) {
> -                                             
> items.get(i).setEdition(key.suggestedEdition, node);
> -                                             break;
> -                                     }
> -                             } catch (MalformedURLException mue) {
> -                             }
> -                     }
> -                     node.storeConfig();
> -             }
> -     }
> +        public void onFoundEdition(long edition, USK key) {
> +            BookmarkItems items = MAIN_CATEGORY.getAllItems();
> +            for (int i = 0; i < items.size(); i++) {
> +                if (!"USK".equals(items.get(i).getKeyType())) {
> +                    continue;
> +                }
>  
> -     public String l10n(String key) {
> -             return L10n.getString("BookmarkManager."+key);
> -     }
> +                try {
> +                    FreenetURI furi = new 
FreenetURI(items.get(i).getKey());
> +                    USK usk = USK.create(furi);
>  
> -     public BookmarkCategory getMainCategory() {
> -             return MAIN_CATEGORY;
> -     }
> +                    if (usk.equals(key, false)) {
> +                        items.get(i).setEdition(key.suggestedEdition, 
node);
> +                        break;
> +                    }
> +                } catch (MalformedURLException mue) {
> +                }
> +            }
> +            storeBookmarks();
> +        }
> +    }
>  
> -     public String parentPath(String path) {
> -             if (path.equals("/"))
> -                     return "/";
> +    public String l10n(String key) {
> +        return L10n.getString("BookmarkManager." + key);
> +    }
>  
> -             return path.substring(0, path.substring(0, path.length() - 1)
> -                             .lastIndexOf("/"))
> -                             + "/";
> -     }
> +    public String parentPath(String path) {
> +        if (path.equals("/")) {
> +            return "/";
> +        }
>  
> -     public Bookmark getBookmarkByPath(String path) {
> -             return (Bookmark) bookmarks.get(path);
> -     }
> +        return path.substring(0, path.substring(0, path.length() - 
1).lastIndexOf("/")) + "/";
> +    }
>  
> -     public BookmarkCategory getCategoryByPath(String path) {
> -             if (getBookmarkByPath(path) instanceof BookmarkCategory)
> -                     return (BookmarkCategory) getBookmarkByPath(path);
> +    public Bookmark getBookmarkByPath(String path) {
> +        synchronized (bookmarks) {
> +            return (Bookmark) bookmarks.get(path);
> +        }
> +    }
>  
> -             return null;
> -     }
> +    public BookmarkCategory getCategoryByPath(String path) {
> +        if (getBookmarkByPath(path.trim()) instanceof BookmarkCategory)
> +            return (BookmarkCategory) getBookmarkByPath(path);
>  
> -     public BookmarkItem getItemByPath(String path) {
> -             if (getBookmarkByPath(path) instanceof BookmarkItem)
> -                     return (BookmarkItem) getBookmarkByPath(path);
> +        return null;
> +    }
>  
> -             return null;
> -     }
> +    public BookmarkItem getItemByPath(String path) {
> +        if (getBookmarkByPath(path.trim()) instanceof BookmarkItem) {
> +            return (BookmarkItem) getBookmarkByPath(path);
> +        }
>  
> -     public void addBookmark(String parentPath, Bookmark bookmark, boolean 
store) {
> -             BookmarkCategory parent = getCategoryByPath(parentPath);
> -             parent.addBookmark(bookmark);
> -             putPaths(parentPath + bookmark.getName()
> -                             + ((bookmark instanceof BookmarkCategory) ? "/" 
> : ""),
> -                             bookmark);
> +        return null;
> +    }
>  
> -             if (bookmark instanceof BookmarkItem && ((BookmarkItem) 
bookmark).getKeyType().equals("USK")) {
> -                     try {
> -                             USK u = ((BookmarkItem) bookmark).getUSK();
> -                             this.node.uskManager.subscribe(u, this.uskCB, 
> true, this);
> -                     } catch (MalformedURLException mue) {
> -                     }
> -             }
> -             if (store)
> -                     node.storeConfig();
> -     }
> +    public void addBookmark(BookmarkCategory parent, Bookmark bookmark, 
boolean store) {
> +        if (bookmark instanceof BookmarkItem && ((BookmarkItem) 
bookmark).getKeyType().equals("USK")) {
> +            try {
> +                USK u = ((BookmarkItem) bookmark).getUSK();
> +                this.node.uskManager.subscribe(u, this.uskCB, true, this);
> +            } catch (MalformedURLException mue) {
> +            }
> +        }
> +        if (store) {
> +            storeBookmarks();
> +        }
> +    }
> +    
> +    public void addBookmark(String parentPath, Bookmark bookmark, boolean 
store) {
> +        BookmarkCategory parent = getCategoryByPath(parentPath);
> +        parent.addBookmark(bookmark);
> +        putPaths(parentPath + bookmark.getName() + ((bookmark instanceof 
BookmarkCategory) ? "/" : ""),
> +                bookmark);
> +        addBookmark(parent, bookmark, store);
> +    }
>  
> -     public void renameBookmark(String path, String newName) {
> -             Bookmark bookmark = getBookmarkByPath(path);
> -             
> -             String oldName = bookmark.getName();
> -             String oldPath = '/' + oldName + '/';
> -             String newPath = oldPath.substring(0, oldPath.indexOf(oldName)) 
> + 
newName;
> +    public void renameBookmark(String path, String newName) {
> +        Bookmark bookmark = getBookmarkByPath(path);
>  
> -             bookmark.setName(newName);
> -             bookmarks.remove(path);
> -                if(path.charAt(path.length()-1) != '/') {
> -                    int lastIndexOfSlash = path.lastIndexOf('/');
> -                    newPath = path.substring(0,lastIndexOfSlash)+newPath;
> -                } else
> -                    newPath += '/';
> +        String oldName = bookmark.getName();
> +        String oldPath = '/' + oldName + '/';
> +        String newPath = oldPath.substring(0, oldPath.indexOf(oldName)) + 
newName;
>  
> -                bookmarks.put(newPath, bookmark);
> -                
> -             node.storeConfig();
> -     }
> +        bookmark.setName(newName);
> +        synchronized (bookmarks) {
> +            bookmarks.remove(path);
> +        }
> +        if (path.charAt(path.length() - 1) != '/') {
> +            int lastIndexOfSlash = path.lastIndexOf('/');
> +            newPath = path.substring(0, lastIndexOfSlash) + newPath;
> +        } else {
> +            newPath += '/';
> +        }
> +        synchronized (bookmarks) {
> +            bookmarks.put(newPath, bookmark);
> +        }
> +        storeBookmarks();
> +    }
>  
> -     public void moveBookmark(String bookmarkPath, String newParentPath, 
boolean store) {
> -             Bookmark b = getBookmarkByPath(bookmarkPath);
> -             addBookmark(newParentPath, b, false);
> +    public void moveBookmark(String bookmarkPath, String newParentPath, 
boolean store) {
> +        Bookmark b = getBookmarkByPath(bookmarkPath);
> +        addBookmark(newParentPath, b, false);
>  
> -             getCategoryByPath(parentPath(bookmarkPath)).removeBookmark(b);
> -             removePaths(bookmarkPath);
> +        getCategoryByPath(parentPath(bookmarkPath)).removeBookmark(b);
> +        removePaths(bookmarkPath);
>  
> -             if (store)
> -                     node.storeConfig();
> -     }
> +        if (store) {
> +            storeBookmarks();
> +        }
> +    }
>  
> -     public void removeBookmark(String path, boolean store) {
> -             Bookmark bookmark = getBookmarkByPath(path);
> -             if (bookmark == null)
> -                     return;
> +    public void removeBookmark(String path, boolean store) {
> +        Bookmark bookmark = getBookmarkByPath(path);
> +        if (bookmark == null) {
> +            return;
> +        }
>  
> -             if (bookmark instanceof BookmarkCategory) {
> -                     BookmarkCategory cat = (BookmarkCategory) bookmark;
> -                     for (int i = 0; i < cat.size(); i++) {
> -                             removeBookmark(
> -                                             path
> -                                             + cat.get(i).getName()
> -                                             + ((cat.get(i) instanceof 
> BookmarkCategory) ? "/"
> -                                                             : ""), false);
> -                     }
> -             } else {
> -                     if (((BookmarkItem) 
> bookmark).getKeyType().equals("USK")) {
> -                             try {
> -                                     USK u = ((BookmarkItem) 
> bookmark).getUSK();
> -                                     this.node.uskManager.unsubscribe(u, 
> this.uskCB, true);
> -                             } catch (MalformedURLException mue) {
> -                             }
> -                     }
> -             }
> +        if (bookmark instanceof BookmarkCategory) {
> +            BookmarkCategory cat = (BookmarkCategory) bookmark;
> +            for (int i = 0; i < cat.size(); i++) {
> +                removeBookmark(path + cat.get(i).getName() + ((cat.get(i) 
instanceof BookmarkCategory) ? "/"
> +                        : ""), false);
> +            }
> +        } else {
> +            if (((BookmarkItem) bookmark).getKeyType().equals("USK")) {
> +                try {
> +                    USK u = ((BookmarkItem) bookmark).getUSK();
> +                    this.node.uskManager.unsubscribe(u, this.uskCB, true);
> +                } catch (MalformedURLException mue) {
> +                }
> +            }
> +        }
>  
> -             getCategoryByPath(parentPath(path)).removeBookmark(bookmark);
> -             bookmarks.remove(path);
> +        getCategoryByPath(parentPath(path)).removeBookmark(bookmark);
> +        synchronized (bookmarks) {
> +            bookmarks.remove(path);
> +        }
>  
> -             if (store)
> -                     node.storeConfig();
> -     }
> +        if (store) {
> +            storeBookmarks();
> +        }
> +    }
>  
> -     public void moveBookmarkUp(String path, boolean store) {
> -             BookmarkCategory parent = getCategoryByPath(parentPath(path));
> -             parent.moveBookmarkUp(getBookmarkByPath(path));
> +    public void moveBookmarkUp(String path, boolean store) {
> +        BookmarkCategory parent = getCategoryByPath(parentPath(path));
> +        parent.moveBookmarkUp(getBookmarkByPath(path));
>  
> -             if (store)
> -                     node.storeConfig();
> -     }
> +        if (store) {
> +            storeBookmarks();
> +        }
> +    }
>  
> -     public void moveBookmarkDown(String path, boolean store) {
> -             BookmarkCategory parent = getCategoryByPath(parentPath(path));
> -             parent.moveBookmarkDown(getBookmarkByPath(path));
> +    public void moveBookmarkDown(String path, boolean store) {
> +        BookmarkCategory parent = getCategoryByPath(parentPath(path));
> +        parent.moveBookmarkDown(getBookmarkByPath(path));
>  
> -             if (store)
> -                     node.storeConfig();
> -     }
> +        if (store) {
> +            storeBookmarks();
> +        }
> +    }
>  
> -     private BookmarkCategory makeParents(String path) {
> -             if (bookmarks.containsKey(path))
> -                     return getCategoryByPath(path);
> -             else {
> +    private BookmarkCategory makeParents(String path) {
> +        boolean isInPath = false;
> +        synchronized (bookmarks) {
> +            isInPath = bookmarks.containsKey(path);
> +        }
> +        if (isInPath) {
> +            return getCategoryByPath(path);
> +        } else {
>  
> -                     int index = path.substring(0, path.length() - 
> 1).lastIndexOf("/");
> -                     String name = path.substring(index + 1, path.length() - 
> 1);
> +            int index = path.substring(0, path.length() - 
1).lastIndexOf("/");
> +            String name = path.substring(index + 1, path.length() - 1);
>  
> -                     BookmarkCategory cat = new BookmarkCategory(name);
> -                     makeParents(parentPath(path));
> -                     addBookmark(parentPath(path), cat, false);
> +            BookmarkCategory cat = new BookmarkCategory(name);
> +            makeParents(parentPath(path));
> +            addBookmark(parentPath(path), cat, false);
>  
> -                     return cat;
> -             }
> -     }
> +            return cat;
> +        }
> +    }
>  
> -     private void putPaths(String path, Bookmark b) {
> +    private void putPaths(String path, Bookmark b) {
> +        synchronized (bookmarks) {
> +            bookmarks.put(path, b);
> +        }
> +        if (b instanceof BookmarkCategory) {
> +            for (int i = 0; i < ((BookmarkCategory) b).size(); i++) {
> +                Bookmark child = ((BookmarkCategory) b).get(i);
> +                putPaths(path + child.getName() + (child instanceof 
BookmarkItem ? "" : "/"), child);
> +            }
> +        }
>  
> -             bookmarks.put(path, b);
> -             if (b instanceof BookmarkCategory) {
> -                     for (int i = 0; i < ((BookmarkCategory) b).size(); i++) 
> {
> -                             Bookmark child = ((BookmarkCategory) b).get(i);
> -                             putPaths(path + child.getName()
> -                                             + (child instanceof 
> BookmarkItem ? "" : "/"), child);
> -                     }
> -             }
> +    }
>  
> -     }
> +    private void removePaths(String path) {
> +        if (getBookmarkByPath(path) instanceof BookmarkCategory) {
> +            BookmarkCategory cat = getCategoryByPath(path);
> +            for (int i = 0; i < cat.size(); i++) {
> +                removePaths(path + cat.get(i).getName() + (cat.get(i) 
instanceof BookmarkCategory ? "/" : ""));
> +            }
> +        }
> +        bookmarks.remove(path);
> +    }
>  
> -     private void removePaths(String path) {
> -             if (getBookmarkByPath(path) instanceof BookmarkCategory) {
> -                     BookmarkCategory cat = getCategoryByPath(path);
> -                     for (int i = 0; i < cat.size(); i++) {
> -                             removePaths(path + cat.get(i).getName()
> -                                             + (cat.get(i) instanceof 
> BookmarkCategory ? "/" : ""));
> -                     }
> -             }
> -             bookmarks.remove(path);
> -     }
> +    public void clear() {
> +        removeBookmark("/", false);
> +        synchronized (bookmarks) {
> +            bookmarks.clear();
> +            bookmarks.put("/", MAIN_CATEGORY);
> +        }
> +    }
>  
> -     public void clear() {
> -             removeBookmark("/", false);
> -             bookmarks.clear();
> -             bookmarks.put("/", MAIN_CATEGORY);
> -     }
> +    public FreenetURI[] getBookmarkURIs() {
> +        BookmarkItems items = MAIN_CATEGORY.getAllItems();
> +        FreenetURI[] uris = new FreenetURI[items.size()];
> +        for (int i = 0; i < items.size(); i++) {
> +            uris[i] = items.get(i).getURI();
> +        }
>  
> -     public FreenetURI[] getBookmarkURIs() {
> -             BookmarkItems items = MAIN_CATEGORY.getAllItems();
> -             FreenetURI[] uris = new FreenetURI[items.size()];
> -             for (int i = 0; i < items.size(); i++) {
> -                     uris[i] = items.get(i).getURI();
> -             }
> +        return uris;
> +    }
>  
> -             return uris;
> -     }
> +    private void storeBookmarks() {
> +        Logger.normal(this, "Attempting to save bookmarks to " + 
bookmarksFile.toString());
> +        SimpleFieldSet sfs;
> +        synchronized (bookmarks) {
> +            if (isSavingBookmarks) {
> +                return;
> +            }
> +            isSavingBookmarks = true;
> +            
> +            SimpleFieldSet toSave = MAIN_CATEGORY.toSimpleFieldSet();
> +            if(toSave.isEmpty()) {
> +                isSavingBookmarks = false;
> +                return;
> +            }
> +            sfs = toSave;
> +        }
> +        FileWriter fw = null;
> +        try {
> +            File tmp = File.createTempFile("bookmark", ".bak", 
bookmarksFile.getParentFile());
> +            fw = new FileWriter(tmp);
> +            sfs.writeTo(fw);
> +            if (!tmp.renameTo(bookmarksFile)) {
> +                Logger.error(this, "Unable to rename " + tmp.toString() + " 
to " + bookmarksFile.toString());
> +            }
> +        } catch (IOException ioe) {
> +            Logger.error(this, "An error has occured saving the bookmark 
file :" + ioe.getMessage(), ioe);
> +        } finally {
> +            try {
> +                if (fw != null) {
> +                    fw.close();
> +                }
> +            } catch (IOException e) {
> +            }
> +        }
> +
> +        synchronized (bookmarks) {
> +            isSavingBookmarks = false;
> +        }
> +    }
> +
> +    private void readBookmarks(BookmarkCategory category, SimpleFieldSet 
sfs) {
> +        synchronized (bookmarks) {
> +            String[] categories = sfs.namesOfDirectSubsets();
> +            for (int i = 0; i < categories.length; i++) {
> +                SimpleFieldSet subset = sfs.subset(categories[i]);
> +                BookmarkCategory currentCategory = new 
BookmarkCategory(categories[i]);
> +                category.addBookmark(currentCategory);
> +                addBookmark(currentCategory, currentCategory, false);
> +                readBookmarks(currentCategory, subset);
> +            }
> +
> +            Iterator it = sfs.keyIterator();
> +            while (it.hasNext()) {
> +                String key = (String) it.next();
> +                String line = sfs.get(key);
> +                try {
> +                    BookmarkItem item = new BookmarkItem(line, 
node.alerts);
> +                    category.addBookmark(item);
> +                    addBookmark(category, item, false);
> +                } catch (MalformedURLException e) {
> +                    Logger.error(this, "Error while adding one of the 
bookmarks :"+e.getMessage(), e);
> +                }
> +            }
> +        }
> +        storeBookmarks();
> +    }
>  }
> 
> Modified: trunk/freenet/src/freenet/node/Node.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/Node.java  2007-11-20 19:05:06 UTC (rev 
15880)
> +++ trunk/freenet/src/freenet/node/Node.java  2007-11-20 19:15:58 UTC (rev 
15881)
> @@ -547,7 +547,8 @@
>               startupTime = System.currentTimeMillis();
>                  // Will be set up properly afterwards
>                  L10n.setLanguage(L10n.FALLBACK_DEFAULT);
> -                startupPageHolder = new StartupToadletServer(executor, 
config);
> +                SimpleFieldSet oldConfig = config.getSimpleFieldSet();
> +                startupPageHolder = new StartupToadletServer(executor, 
oldConfig);
>               nodeNameUserAlert = new MeaningfulNodeNameUserAlert(this);
>               recentlyCompletedIDs = new LRUQueue();
>               this.config = config;
> @@ -1265,7 +1266,7 @@
>               
>               nodeStats = new NodeStats(this, sortOrder, new 
> SubConfig("node.load", 
config), oldThrottleFS, obwLimit, ibwLimit);
>               
> -             clientCore = new NodeClientCore(this, config, nodeConfig, 
> nodeDir, 
getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"));
> +             clientCore = new NodeClientCore(this, config, nodeConfig, 
> nodeDir, 
getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"), oldConfig);
>  
>               nodeConfig.register("disableHangCheckers", false, sortOrder++, 
> true, 
false, "Node.disableHangCheckers", "Node.disableHangCheckersLong", new 
BooleanCallback() {
>  
> 
> Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/NodeClientCore.java        2007-11-20 
> 19:05:06 
UTC (rev 15880)
> +++ trunk/freenet/src/freenet/node/NodeClientCore.java        2007-11-20 
> 19:15:58 
UTC (rev 15881)
> @@ -113,7 +113,7 @@
>       static final long MAX_ARCHIVED_FILE_SIZE = 1024*1024; // arbitrary... 
FIXME
>       static final int MAX_CACHED_ELEMENTS = 256*1024; // equally arbitrary! 
FIXME hopefully we can cache many of these though
>  
> -     NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldThrottleFS) throws 
NodeInitException {
> +     NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldThrottleFS, 
SimpleFieldSet oldConfig) throws NodeInitException {
>               this.node = node;
>               this.nodeStats = node.nodeStats;
>               this.random = node.random;
> @@ -346,7 +346,7 @@
>               }
>               
>               SubConfig fproxyConfig = new SubConfig("fproxy", config);
> -             bookmarkManager = new BookmarkManager(this, fproxyConfig);
> +             bookmarkManager = new BookmarkManager(this, oldConfig);
>               
>               // FProxy
>               // FIXME this is a hack, the real way to do this is plugins
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20071120/c0e7ce82/attachment.pgp>

Reply via email to