@ -1,4 +1,4 @@
// BlogBoard.java
// BlogBoard.java
// -------------------------------------
// (C) by Michael Peter Christen; mc@yacy.net
// first published on http://www.anomic.de
@ -38,7 +38,9 @@ import java.util.Date;
import java.util.HashMap ;
import java.util.HashSet ;
import java.util.Iterator ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.TreeSet ;
import javax.xml.parsers.DocumentBuilder ;
@ -47,6 +49,7 @@ import javax.xml.parsers.ParserConfigurationException;
import net.yacy.cora.date.GenericFormatter ;
import net.yacy.cora.document.UTF8 ;
import net.yacy.cora.protocol.Domains ;
import net.yacy.kelondro.blob.MapHeap ;
import net.yacy.kelondro.index.RowSpaceExceededException ;
import net.yacy.kelondro.logging.Log ;
@ -60,50 +63,48 @@ import org.w3c.dom.NodeList;
import org.xml.sax.SAXException ;
import de.anomic.data.wiki.WikiBoard ;
import java.util.List ;
import java.util.Set ;
public class BlogBoard {
private static final int KEY_LENGTH = 64 ;
private MapHeap database = null ;
public BlogBoard ( final File actpath ) throws IOException {
new File ( actpath . getParent ( ) ) . mkdir ( ) ;
//database = new MapView(BLOBTree.toHeap(actpath, true, true, keyLength, recordSize, '_', NaturalOrder.naturalOrder, newFile), 500, '_');
database = new MapHeap ( actpath , KEY_LENGTH , NaturalOrder . naturalOrder , 1024 * 64 , 500 , '_' ) ;
this . database = new MapHeap ( actpath , KEY_LENGTH , NaturalOrder . naturalOrder , 1024 * 64 , 500 , '_' ) ;
}
public int size ( ) {
return database. size ( ) ;
return this . database. size ( ) ;
}
/ * *
* Tells if the database contains an element .
* @param key the ID of the element
* @return true if the database contains the element , else false
* /
public boolean contains ( final String key ) {
return database. containsKey ( UTF8 . getBytes ( key ) ) ;
return this . database. containsKey ( UTF8 . getBytes ( key ) ) ;
}
public synchronized void close ( ) {
database. close ( ) ;
this . database. close ( ) ;
}
private static String normalize ( final String key ) {
return ( key = = null ) ? "null" : key . trim ( ) . toLowerCase ( ) ;
}
public static String webalize ( final String key ) {
return ( key = = null ) ? "null" : key . trim ( ) . toLowerCase ( ) . replaceAll ( " " , "%20" ) ;
}
public String guessAuthor ( final String ip ) {
return WikiBoard . guessAuthor ( ip ) ;
}
/ * *
* Create a new BlogEntry and return it
* @param key
@ -126,7 +127,7 @@ public class BlogBoard {
public String writeBlogEntry ( final BlogEntry page ) {
String ret = null ;
try {
database. insert ( UTF8 . getBytes ( page . key ) , page . record ) ;
this . database. insert ( UTF8 . getBytes ( page . key ) , page . record ) ;
ret = page . key ;
} catch ( IOException ex ) {
Log . logException ( ex ) ;
@ -135,11 +136,11 @@ public class BlogBoard {
}
return ret ;
}
public BlogEntry readBlogEntry ( final String key ) {
return readBlogEntry ( key , database) ;
return readBlogEntry ( key , this . database) ;
}
private BlogEntry readBlogEntry ( final String key , final MapHeap base ) {
final String normalized = normalize ( key ) ;
Map < String , String > record ;
@ -153,10 +154,10 @@ public class BlogBoard {
record = null ;
}
return ( record = = null ) ?
newEntry ( key , new byte [ 0 ] , UTF8 . getBytes ( "anonymous" ) , "127.0.0.1" , new Date ( ) , new byte [ 0 ] , null , null ) :
newEntry ( key , new byte [ 0 ] , UTF8 . getBytes ( "anonymous" ) , Domains . LOCALHOST , new Date ( ) , new byte [ 0 ] , null , null ) :
new BlogEntry ( key , record ) ;
}
public boolean importXML ( final String input ) {
final DocumentBuilderFactory factory = DocumentBuilderFactory . newInstance ( ) ;
try {
@ -169,20 +170,20 @@ public class BlogBoard {
} catch ( final IOException ex ) {
Log . logException ( ex ) ;
}
return false ;
}
private boolean parseXMLimport ( final Document doc ) {
if ( ! "blog" . equals ( doc . getDocumentElement ( ) . getTagName ( ) ) ) {
return false ;
}
final NodeList items = doc . getDocumentElement ( ) . getElementsByTagName ( "item" ) ;
if ( items . getLength ( ) = = 0 ) {
return false ;
}
for ( int i = 0 , n = items . getLength ( ) ; i < n ; + + i ) {
String key = null , ip = null , StrSubject = null , StrAuthor = null , StrPage = null , StrDate = null ;
Date date = null ;
@ -207,7 +208,7 @@ public class BlogBoard {
StrPage = currentNode . getFirstChild ( ) . getNodeValue ( ) ;
}
}
try {
date = GenericFormatter . SHORT_SECOND_FORMATTER . parse ( StrDate ) ;
} catch ( final ParseException e1 ) {
@ -226,31 +227,32 @@ public class BlogBoard {
}
return true ;
}
public void deleteBlogEntry ( final String key ) {
try {
database. delete ( UTF8 . getBytes ( normalize ( key ) ) ) ;
this . database. delete ( UTF8 . getBytes ( normalize ( key ) ) ) ;
} catch ( final IOException e ) { }
}
public Iterator < byte [ ] > keys ( final boolean up ) throws IOException {
return database. keys ( up , false ) ;
return this . database. keys ( up , false ) ;
}
/ * *
* Comparator to sort objects of type Blog according to their timestamps
* /
public class BlogComparator implements Comparator < String > {
private final boolean newestFirst ;
/ * *
* @param newestFirst newest first , or oldest first ?
* /
public BlogComparator ( final boolean newestFirst ) {
this . newestFirst = newestFirst ;
}
@Override
public int compare ( final String obj1 , final String obj2 ) {
final BlogEntry blogEntry1 = readBlogEntry ( obj1 ) ;
final BlogEntry blogEntry2 = readBlogEntry ( obj2 ) ;
@ -268,7 +270,7 @@ public class BlogBoard {
return - 1 ;
}
}
public Iterator < String > getBlogIterator ( final boolean priv ) {
final Set < String > set = new TreeSet < String > ( new BlogComparator ( true ) ) ;
final Iterator < BlogEntry > iterator = blogIterator ( true ) ;
@ -281,7 +283,7 @@ public class BlogBoard {
}
return set . iterator ( ) ;
}
public Iterator < BlogEntry > blogIterator ( final boolean up ) {
try {
return new BlogIterator ( up ) ;
@ -289,7 +291,7 @@ public class BlogBoard {
return new HashSet < BlogEntry > ( ) . iterator ( ) ;
}
}
/ * *
* Subclass of blogBoard , which provides the blogIterator object - type
* /
@ -300,7 +302,8 @@ public class BlogBoard {
this . blogIter = BlogBoard . this . database . keys ( up , false ) ;
//this.nextEntry = null;
}
@Override
public boolean hasNext ( ) {
try {
return this . blogIter . hasNext ( ) ;
@ -309,7 +312,8 @@ public class BlogBoard {
return false ;
}
}
@Override
public BlogEntry next ( ) {
try {
return readBlogEntry ( UTF8 . String ( this . blogIter . next ( ) ) ) ;
@ -318,7 +322,8 @@ public class BlogBoard {
return null ;
}
}
@Override
public void remove ( ) {
// if (this.nextEntry != null) {
// try {
@ -331,14 +336,14 @@ public class BlogBoard {
throw new UnsupportedOperationException ( "Method not implemented yet." ) ;
}
}
public class BlogEntry {
String key ;
Map < String , String > record ;
public BlogEntry ( final String nkey , final byte [ ] subject , final byte [ ] author , final String ip , final Date date , final byte [ ] page , final List < String > comments , final String commentMode ) {
record = new HashMap < String , String > ( ) ;
this . record = new HashMap < String , String > ( ) ;
setKey ( nkey ) ;
setDate ( date ) ;
setSubject ( subject ) ;
@ -347,13 +352,13 @@ public class BlogBoard {
setPage ( page ) ;
setComments ( comments ) ;
setCommentMode ( commentMode ) ;
// TODO: implement this function
record. put ( "privacy" , "public" ) ;
this . record. put ( "privacy" , "public" ) ;
WikiBoard . setAuthor ( ip , UTF8 . String ( author ) ) ;
}
BlogEntry ( final String key , final Map < String , String > record ) {
this . key = key ;
this . record = record ;
@ -364,35 +369,35 @@ public class BlogBoard {
this . record . put ( "commentMode" , "2" ) ;
}
}
private void setKey ( final String key ) {
this . key = key . substring ( 0 , Math . min ( key . length ( ) , KEY_LENGTH ) ) ;
}
public String getKey ( ) {
return key;
return this . key;
}
public byte [ ] getSubject ( ) {
final String m = record. get ( "subject" ) ;
final String m = this . record. get ( "subject" ) ;
if ( m = = null ) {
return new byte [ 0 ] ;
}
final byte [ ] b = Base64Order . enhancedCoder . decode ( m ) ;
return ( b = = null ) ? new byte [ 0 ] : b ;
}
private void setSubject ( final byte [ ] subject ) {
if ( subject = = null ) {
record. put ( "subject" , "" ) ;
this . record. put ( "subject" , "" ) ;
} else {
record. put ( "subject" , Base64Order . enhancedCoder . encode ( subject ) ) ;
this . record. put ( "subject" , Base64Order . enhancedCoder . encode ( subject ) ) ;
}
}
public Date getDate ( ) {
try {
final String date = record. get ( "date" ) ;
final String date = this . record. get ( "date" ) ;
if ( date = = null ) {
if ( Log . isFinest ( "Blog" ) ) {
Log . logFinest ( "Blog" , "ERROR: date field missing in blogBoard" ) ;
@ -404,17 +409,17 @@ public class BlogBoard {
return new Date ( ) ;
}
}
private void setDate ( final Date date ) {
Date ret = date ;
if ( ret = = null ) {
ret = new Date ( ) ;
}
record. put ( "date" , GenericFormatter . SHORT_SECOND_FORMATTER . format ( ret ) ) ;
this . record. put ( "date" , GenericFormatter . SHORT_SECOND_FORMATTER . format ( ret ) ) ;
}
public String getTimestamp ( ) {
final String timestamp = record. get ( "date" ) ;
final String timestamp = this . record. get ( "date" ) ;
if ( timestamp = = null ) {
if ( Log . isFinest ( "Blog" ) ) {
Log . logFinest ( "Blog" , "ERROR: date field missing in blogBoard" ) ;
@ -423,87 +428,87 @@ public class BlogBoard {
}
return timestamp ;
}
public byte [ ] getAuthor ( ) {
final String author = record. get ( "author" ) ;
final String author = this . record. get ( "author" ) ;
if ( author = = null ) {
return new byte [ 0 ] ;
}
final byte [ ] b = Base64Order . enhancedCoder . decode ( author ) ;
return ( b = = null ) ? new byte [ 0 ] : b ;
}
private void setAuthor ( final byte [ ] author ) {
if ( author = = null )
record. put ( "author" , "" ) ;
this . record. put ( "author" , "" ) ;
else
record. put ( "author" , Base64Order . enhancedCoder . encode ( author ) ) ;
this . record. put ( "author" , Base64Order . enhancedCoder . encode ( author ) ) ;
}
public int getCommentsSize ( ) {
// This ist a Bugfix for Version older than 4443.
if ( record. get ( "comments" ) . startsWith ( "," ) ) {
record . put ( "comments" , record. get ( "comments" ) . substring ( 1 ) ) ;
if ( this . record. get ( "comments" ) . startsWith ( "," ) ) {
this . record . put ( "comments" , this . record. get ( "comments" ) . substring ( 1 ) ) ;
writeBlogEntry ( this ) ;
}
final List < String > commentsize = ListManager . string2arraylist ( record. get ( "comments" ) ) ;
final List < String > commentsize = ListManager . string2arraylist ( this . record. get ( "comments" ) ) ;
return commentsize . size ( ) ;
}
public List < String > getComments ( ) {
return ListManager . string2arraylist ( record. get ( "comments" ) ) ;
return ListManager . string2arraylist ( this . record. get ( "comments" ) ) ;
}
private void setComments ( final List < String > comments ) {
if ( comments = = null ) {
record. put ( "comments" , ListManager . collection2string ( new ArrayList < String > ( ) ) ) ;
this . record. put ( "comments" , ListManager . collection2string ( new ArrayList < String > ( ) ) ) ;
} else {
record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
this . record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
}
}
public String getIp ( ) {
final String ip = record. get ( "ip" ) ;
return ( ip = = null ) ? "127.0.0.1" : ip ;
final String ip = this . record. get ( "ip" ) ;
return ( ip = = null ) ? Domains . LOCALHOST : ip ;
}
private void setIp ( final String ip ) {
String ret = ip ;
if ( ( ret = = null ) | | ( ret . length ( ) = = 0 ) )
ret = "" ;
record. put ( "ip" , ret ) ;
this . record. put ( "ip" , ret ) ;
}
public byte [ ] getPage ( ) {
final String page = record. get ( "page" ) ;
final String page = this . record. get ( "page" ) ;
if ( page = = null ) {
return new byte [ 0 ] ;
}
final byte [ ] page_as_byte = Base64Order . enhancedCoder . decode ( page ) ;
return ( page_as_byte = = null ) ? new byte [ 0 ] : page_as_byte ;
}
}
private void setPage ( final byte [ ] page ) {
if ( page = = null ) {
record. put ( "page" , "" ) ;
this . record. put ( "page" , "" ) ;
} else {
record. put ( "page" , Base64Order . enhancedCoder . encode ( page ) ) ;
this . record. put ( "page" , Base64Order . enhancedCoder . encode ( page ) ) ;
}
}
public void addComment ( final String commentID ) {
final List < String > comments = ListManager . string2arraylist ( record. get ( "comments" ) ) ;
final List < String > comments = ListManager . string2arraylist ( this . record. get ( "comments" ) ) ;
comments . add ( commentID ) ;
record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
this . record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
}
public boolean removeComment ( final String commentID ) {
final List < String > comments = ListManager . string2arraylist ( record. get ( "comments" ) ) ;
final List < String > comments = ListManager . string2arraylist ( this . record. get ( "comments" ) ) ;
final boolean success = comments . remove ( commentID ) ;
record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
this . record. put ( "comments" , ListManager . collection2string ( comments ) ) ;
return success ;
}
/ * *
* returns the comment mode
* 0 - no comments allowed
@ -512,21 +517,21 @@ public class BlogBoard {
* @return comment mode
* /
public int getCommentMode ( ) {
return Integer . parseInt ( record. get ( "commentMode" ) ) ;
return Integer . parseInt ( this . record. get ( "commentMode" ) ) ;
}
private void setCommentMode ( final String mode ) {
if ( mode = = null ) {
record. put ( "commentMode" , "2" ) ;
this . record. put ( "commentMode" , "2" ) ;
} else {
record. put ( "commentMode" , mode ) ;
this . record. put ( "commentMode" , mode ) ;
}
}
public boolean isPublic ( ) {
final String privacy = record. get ( "privacy" ) ;
final String privacy = this . record. get ( "privacy" ) ;
return ( privacy = = null | | privacy . equalsIgnoreCase ( "public" ) ) ? true : false ;
}
}
}