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:
<https://emu.freenetproject.org/pipermail/devl/attachments/20071120/3c8b1b01/attachment.pgp>