// BookmarkDate.java // ------------------------------------- // part of YACY // (C) by Michael Peter Christen; mc@yacy.net // first published on http://www.anomic.de // Frankfurt, Germany, 2004 // // $LastChangedDate$ // $LastChangedRevision$ // $LastChangedBy$ // // Methods from this file has been originally contributed by Alexander Schier // and had been refactored by Michael Christen for better a method structure 30.01.2010 // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package net.yacy.data; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.yacy.cora.document.encoding.UTF8; import net.yacy.cora.order.NaturalOrder; import net.yacy.cora.util.ConcurrentLog; import net.yacy.cora.util.SpaceExceededException; import net.yacy.data.BookmarksDB.Bookmark; import net.yacy.kelondro.blob.MapHeap; public class BookmarkDate { private MapHeap datesTable; public BookmarkDate(final File datesFile) throws IOException { this.datesTable = new MapHeap(datesFile, 20, NaturalOrder.naturalOrder, 1024 * 64, 500, '_'); } public synchronized void close() { this.datesTable.close(); } public Entry getDate(final String date) { Map<String, String> map; try { map = datesTable.get(UTF8.getBytes(date)); } catch (final IOException e) { map = null; } catch (final SpaceExceededException e) { map = null; } if (map == null) { return new Entry(date); } return new Entry(date, map); } // rebuilds the datesDB from the bookmarksDB public void init(final Iterator<Bookmark> it) { ConcurrentLog.info("BOOKMARKS", "start init dates.db from bookmarks.db..."); Bookmark bookmark; String date; Entry bmDate; int count = 0; while (it.hasNext()) { bookmark = it.next(); date = String.valueOf(bookmark.getTimeStamp()); bmDate=getDate(date); if (bmDate == null) { bmDate = new Entry(date); } bmDate.add(bookmark.getUrlHash()); bmDate.setDatesTable(); count++; } ConcurrentLog.info("BOOKMARKS", "finished init "+datesTable.size()+" dates using " + count + " bookmarks."); } /** * Subclass of bookmarksDB, which provide the bookmarksDate object-type */ public class Entry { public static final String URL_HASHES="urlHashes"; private final Map<String, String> mem; String date; public Entry(final String mydate){ //round to seconds, but store as milliseconds (java timestamp) date = String.valueOf(((mydate == null ? System.currentTimeMillis() : Long.parseLong(mydate))/1000)*1000); mem = new HashMap<String, String>(); mem.put(URL_HASHES, ""); } public Entry(final String mydate, final Map<String, String> map){ //round to seconds, but store as milliseconds (java timestamp) date = String.valueOf((Long.parseLong(mydate)/1000)*1000); mem = map; } public Entry(final String mydate, final List<String> entries){ //round to seconds, but store as milliseconds (java timestamp) date = String.valueOf((Long.parseLong(mydate)/1000)*1000); mem = new HashMap<String, String>(); mem.put(URL_HASHES, ListManager.collection2string(entries)); } public void add(final String urlHash){ final String urlHashes = mem.get(URL_HASHES); List<String> list; if(urlHashes != null && !"".equals(urlHashes)){ list = ListManager.string2arraylist(urlHashes); }else{ list = new ArrayList<String>(); } if(!list.contains(urlHash) && urlHash != null && !"".equals(urlHashes)){ list.add(urlHash); } this.mem.put(URL_HASHES, ListManager.collection2string(list)); } public void delete(final String urlHash){ final List<String> list = ListManager.string2arraylist(this.mem.get(URL_HASHES)); if(list.contains(urlHash)){ list.remove(urlHash); } this.mem.put(URL_HASHES, ListManager.collection2string(list)); } public void setDatesTable() { if (this.size() >0) { try { datesTable.insert(UTF8.getBytes(getDateString()), mem); } catch (final Exception e) { ConcurrentLog.logException(e); } } else { try { datesTable.delete(UTF8.getBytes(getDateString())); } catch (final IOException e) { ConcurrentLog.logException(e); } } } public String getDateString(){ return date; } public List<String> getBookmarkList(){ return ListManager.string2arraylist(this.mem.get(URL_HASHES)); } public int size(){ return ListManager.string2arraylist(this.mem.get(URL_HASHES)).size(); } } }