From 766a04bc061c7794bab5f934037cae884b2d46ae Mon Sep 17 00:00:00 2001 From: lulabad Date: Sun, 10 Feb 2008 18:35:28 +0000 Subject: [PATCH] fixed sort problem in Blog. see http://forum.yacy-websuche.de/viewtopic.php?f=6&t=639 git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@4474 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- htroot/Blog.java | 11 +-- htroot/BlogComments.java | 6 +- source/de/anomic/data/blogBoard.java | 120 ++++++++++++++++++++++++--- 3 files changed, 115 insertions(+), 22 deletions(-) diff --git a/htroot/Blog.java b/htroot/Blog.java index 4886bd225..4f924d041 100644 --- a/htroot/Blog.java +++ b/htroot/Blog.java @@ -46,7 +46,6 @@ // javac -classpath .:../classes Blog.java // if the shell's current path is HTROOT -import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -61,7 +60,6 @@ import de.anomic.http.httpc; import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverObjects; import de.anomic.server.serverSwitch; -import de.anomic.server.logging.serverLog; import de.anomic.yacy.yacyCore; import de.anomic.yacy.yacyNewsPool; import de.anomic.yacy.yacyNewsRecord; @@ -80,7 +78,7 @@ public class Blog { public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { final plasmaSwitchboard switchboard = (plasmaSwitchboard) env; final serverObjects prop = new serverObjects(); - blogBoard.entry page = null; + blogBoard.BlogEntry page = null; boolean hasRights = switchboard.verifyAuthentication(header, true); @@ -293,8 +291,8 @@ public class Blog { final boolean hasRights, final boolean xml) { - try { - final Iterator i = switchboard.blogDB.keys(false); + //final Iterator i = switchboard.blogDB.keys(false); + final Iterator i = switchboard.blogDB.getBlogIterator(false); String pageid; int count = 0; //counts how many entries are shown to the user if(xml) num = 0; @@ -331,13 +329,12 @@ public class Blog { } else prop.put("mode_preventries", "0"); - } catch (IOException e) { serverLog.logSevere("BLOG", "Error reading blog-DB", e); } return prop; } private static serverObjects putBlogEntry( final serverObjects prop, - final blogBoard.entry entry, + final blogBoard.BlogEntry entry, final String address, final int number, final boolean hasRights, diff --git a/htroot/BlogComments.java b/htroot/BlogComments.java index 63f2de9db..e0b6e4639 100644 --- a/htroot/BlogComments.java +++ b/htroot/BlogComments.java @@ -58,7 +58,7 @@ import de.anomic.data.blogBoard; import de.anomic.data.blogBoardComments; import de.anomic.data.messageBoard; import de.anomic.data.userDB; -import de.anomic.data.blogBoard.entry; +import de.anomic.data.blogBoard.BlogEntry; import de.anomic.http.httpHeader; import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverFileUtils; @@ -79,7 +79,7 @@ public class BlogComments { public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { plasmaSwitchboard switchboard = (plasmaSwitchboard) env; serverObjects prop = new serverObjects(); - blogBoard.entry page = null; + blogBoard.BlogEntry page = null; boolean hasRights = switchboard.verifyAuthentication(header, true); if (hasRights) prop.put("mode_admin", "1"); @@ -158,7 +158,7 @@ public class BlogComments { subject = StrSubject.getBytes(); } String commentID = String.valueOf(System.currentTimeMillis()); - entry blogEntry = switchboard.blogDB.read(pagename); + BlogEntry blogEntry = switchboard.blogDB.read(pagename); blogEntry.addComment(commentID); switchboard.blogDB.write(blogEntry); switchboard.blogCommentDB.write(switchboard.blogCommentDB.newEntry(commentID, subject, author, ip, date, content)); diff --git a/source/de/anomic/data/blogBoard.java b/source/de/anomic/data/blogBoard.java index c3127b236..6db03b90e 100644 --- a/source/de/anomic/data/blogBoard.java +++ b/source/de/anomic/data/blogBoard.java @@ -49,9 +49,12 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; +import java.util.TreeSet; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -64,6 +67,7 @@ import org.xml.sax.SAXException; import de.anomic.kelondro.kelondroBase64Order; import de.anomic.kelondro.kelondroDyn; +import de.anomic.kelondro.kelondroException; import de.anomic.kelondro.kelondroMapObjects; import de.anomic.kelondro.kelondroNaturalOrder; import de.anomic.server.serverDate; @@ -74,7 +78,7 @@ public class blogBoard { public static final int keyLength = 64; private static final int recordSize = 512; - private kelondroMapObjects datbase = null; + kelondroMapObjects datbase = null; public blogBoard(File actpath, long preloadTime) { new File(actpath.getParent()).mkdir(); @@ -109,16 +113,16 @@ public class blogBoard { return wikiBoard.guessAuthor(ip); } - public entry newEntry(String key, byte[] subject, byte[] author, String ip, Date date, byte[] page, ArrayList comments, String commentMode) { - return new entry(normalize(key), subject, author, ip, date, page, comments, commentMode); + public BlogEntry newEntry(String key, byte[] subject, byte[] author, String ip, Date date, byte[] page, ArrayList comments, String commentMode) { + return new BlogEntry(normalize(key), subject, author, ip, date, page, comments, commentMode); } - public class entry { + public class BlogEntry { String key; HashMap record; - public entry(String nkey, byte[] subject, byte[] author, String ip, Date date, byte[] page, ArrayList comments, String commentMode) { + public BlogEntry(String nkey, byte[] subject, byte[] author, String ip, Date date, byte[] page, ArrayList comments, String commentMode) { record = new HashMap(); key = nkey; if (key.length() > keyLength) key = key.substring(0, keyLength); @@ -137,11 +141,13 @@ public class blogBoard { if (commentMode == null) record.put("commentMode", "1"); else record.put("commentMode", commentMode); + // TODO: implement this function + record.put("privacy", "public"); + wikiBoard.setAuthor(ip, new String(author)); - //System.out.println("DEBUG: setting author " + author + " for ip = " + ip + ", authors = " + authors.toString()); } - private entry(String key, HashMap record) { + private BlogEntry(String key, HashMap record) { this.key = key; this.record = record; if (this.record.get("comments")==null) this.record.put("comments", listManager.collection2string(new ArrayList())); @@ -237,9 +243,12 @@ public class blogBoard { public int getCommentMode(){ return Integer.parseInt(record.get("commentMode")); } + public boolean isPublic() { + return true; + } } - public String write(entry page) { + public String write(BlogEntry page) { // writes a new page and returns key try { datbase.set(page.key, page.record); @@ -249,16 +258,16 @@ public class blogBoard { } } - public entry read(String key) { + public BlogEntry read(String key) { return read(key, datbase); } - private entry read(String key, kelondroMapObjects base) { + private BlogEntry read(String key, kelondroMapObjects base) { key = normalize(key); if (key.length() > keyLength) key = key.substring(0, keyLength); HashMap record = base.getMap(key); if (record == null) return newEntry(key, "".getBytes(), "anonymous".getBytes(), "127.0.0.1", new Date(), "".getBytes(), null, null); - return new entry(key, record); + return new BlogEntry(key, record); } public boolean importXML(String input) { @@ -348,5 +357,92 @@ public class blogBoard { public Iterator keys(boolean up) throws IOException { return datbase.keys(up, false); } - + /** + * Comparator to sort objects of type Blog according to their timestamps + */ + public class BlogComparator implements Comparator { + + private boolean newestFirst; + + /** + * @param newestFirst newest first, or oldest first? + */ + public BlogComparator(boolean newestFirst){ + this.newestFirst=newestFirst; + } + + public int compare(String obj1, String obj2) { + BlogEntry bm1=read(obj1); + BlogEntry bm2=read(obj2); + if(bm1==null || bm2==null) + return 0; //XXX: i think this should not happen? maybe this needs further tracing of the bug + if(this.newestFirst){ + if(Long.valueOf(bm2.timestamp()) - Long.valueOf(bm1.timestamp()) >0) return 1; + return -1; + } + if(Long.valueOf(bm1.timestamp()) - Long.valueOf(bm2.timestamp()) >0) return 1; + return -1; + } + } + public Iterator getBlogIterator(boolean priv){ + TreeSet set=new TreeSet(new BlogComparator(false)); + Iterator it=blogIterator(true); + BlogEntry bm; + while(it.hasNext()){ + bm=(BlogEntry)it.next(); + if(priv || bm.isPublic()){ + set.add(bm.key()); + } + } + return set.iterator(); + } + public Iterator blogIterator(boolean up){ + try { + return new BlogIterator(up); + } catch (IOException e) { + return new HashSet().iterator(); + } + } + /** + * Subclass of blogBoard, which provides the blogIterator object-type + */ + public class BlogIterator implements Iterator { + Iterator blogIter; + blogBoard.BlogEntry nextEntry; + public BlogIterator(boolean up) throws IOException { + //flushBookmarkCache(); //XXX: this will cost performance + this.blogIter = blogBoard.this.datbase.keys(up, false); + this.nextEntry = null; + } + + public boolean hasNext() { + try { + return this.blogIter.hasNext(); + } catch (kelondroException e) { + //resetDatabase(); + return false; + } + } + + public BlogEntry next() { + try { + return read((String) this.blogIter.next()); + } catch (kelondroException e) { + //resetDatabase(); + return null; + } + } + + public void remove() { + if (this.nextEntry != null) { + try { + Object blogKey = this.nextEntry.key(); + if (blogKey != null) delete((String) blogKey); + } catch (kelondroException e) { + //resetDatabase(); + } + } + } + } + }