package freenet.clients.http.bookmark; import java.util.ArrayList; import java.util.List; import freenet.node.FSParseException; import freenet.support.SimpleFieldSet; public class BookmarkCategory extends Bookmark { public static final String NAME = "BookmarkCategory"; private final List<Bookmark> bookmarks = new ArrayList<Bookmark>(); public BookmarkCategory(String name) { setName(name); } public BookmarkCategory(SimpleFieldSet sfs) throws FSParseException { String aName = sfs.get("Name"); if(aName == null) throw new FSParseException("No Name!"); setName(aName); } protected synchronized Bookmark addBookmark(Bookmark b) { if (b == null) { return null; } // Overwrite any existing bookmark int x = bookmarks.indexOf(b); if (x >= 0) { return bookmarks.get(x); } bookmarks.add(b); return b; } protected synchronized void removeBookmark(Bookmark b) { bookmarks.remove(b); } public synchronized Bookmark get(int i) { return bookmarks.get(i); } protected synchronized void moveBookmarkUp(Bookmark b) { int index = bookmarks.indexOf(b); if (index == -1) { return; } Bookmark bk = bookmarks.remove(index); bookmarks.add((--index < 0) ? 0 : index, bk); } protected synchronized void moveBookmarkDown(Bookmark b) { int index = bookmarks.indexOf(b); if (index == -1) { return; } Bookmark bk = bookmarks.remove(index); bookmarks.add((++index > size()) ? size() : index, bk); } public synchronized int size() { return bookmarks.size(); } public synchronized List<BookmarkItem> getItems() { List<BookmarkItem> items = new ArrayList<BookmarkItem>(); for (Bookmark b: bookmarks) { if (b instanceof BookmarkItem) { items.add((BookmarkItem)b); } } return items; } public synchronized List<BookmarkItem> getAllItems() { List<BookmarkItem> items = getItems(); for (BookmarkCategory cat : getSubCategories()) { items.addAll(cat.getAllItems()); } return items; } public synchronized List<BookmarkCategory> getSubCategories() { List<BookmarkCategory> categories = new ArrayList<BookmarkCategory>(); for (Bookmark b: bookmarks) { if (b instanceof BookmarkCategory) { categories.add((BookmarkCategory)b); } } return categories; } public synchronized List<BookmarkCategory> getAllSubCategories() { List<BookmarkCategory> categories = getSubCategories(); for (BookmarkCategory cat: getSubCategories()) { categories.addAll(cat.getAllSubCategories()); } return categories; } public String[] toStrings() { return toStrings("").toArray(new String[0]); } // Internal use only private List<String> toStrings(String prefix) { List<String> strings = new ArrayList<String>(); List<BookmarkItem> items = getItems(); List<BookmarkCategory> subCategories = getSubCategories(); prefix += this.name + "/"; for (int i = 0; i < items.size(); i++) { strings.add(prefix + items.get(i).toString()); } for (int i = 0; i < subCategories.size(); i++) { strings.addAll(subCategories.get(i).toStrings(prefix)); } return strings; } @Override public synchronized SimpleFieldSet getSimpleFieldSet() { SimpleFieldSet sfs = new SimpleFieldSet(true); sfs.putSingle("Name", name); sfs.put("Content", BookmarkManager.toSimpleFieldSet(this)); return sfs; } // Don't override equals(), two categories are equal if they have the same name and description. }