[freenet-dev] [freenet-cvs] r15881 - in trunk/freenet/src/freenet: clients/http clients/http/bookmark node

Matthew Toseland toad at amphibian.dyndns.org
Tue Nov 20 23:14:00 UTC 2007


You should put each BookmarkItem as a sub-fieldset, not a string. Then you can 
cleanly extend it and record key, name, etc.

On Tuesday 20 November 2007 19:15, you 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 : http://emu.freenetproject.org/pipermail/devl/attachments/20071120/3c8b1b01/attachment.pgp 


More information about the Devl mailing list