package com.hawkbrowser.app; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.io.Serializable; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.util.Log; import com.hawkbrowser.base.Tree; import com.hawkbrowser.util.CommonUtil; public class Bookmark { final private String BOOKMARK_FILE_NAME = "bookmark.dat"; private Tree<Item> mTree; private int mCurrentId; private Context mContext; public static enum Type { Folder, Link } public static class Item implements Serializable { transient private int mId; private String mName; private String mFolderName; private String mUrl; private Type mType; public Item(String name, String url, Type type) { mName = name; mUrl = url; mType = type; mId = 0; } public boolean equals(Object obj) { if(null == obj) { return false; } if(!(obj instanceof Item)) { return false; } Item r = (Item) obj; Log.d("Bookmark", String.format("this: %s; right: %s", toString(), obj.toString())); return mUrl.equals(r.mUrl); } public int hashCode() { return mId; } public String title() { return mName; } public String url() { return mUrl; } public Type type() { return mType; } public int id() { return mId; } @Override public String toString() { return String.format("id: %d, type: %s, name: %s, " + "folderName: %s, url %s", mId, mType, mName, mFolderName, mUrl ); } } public Bookmark(Context context) { mCurrentId = 0; mContext = context; Load(); } public List<Item> getChildren(Item parent) { Tree.Node<Item> node = null; if(null == parent) { node = mTree.root(); } else { node = mTree.find(parent); } ArrayList<Item> items = new ArrayList<Item>(); if((null != node) && (null != node.children())) { for(Tree.Node<Item> child : node.children()) { items.add(child.data()); } } return items; } public boolean Add(Item item) { Tree.Node<Item> parent = mTree.find(item, new Tree.FindMatcher() { @Override public boolean isMatch(Object l, Object r) { if((null == l) && (null == r)) { return true; } if((null != l) && (null != r)) { Item li = (Item)l; Item ri = (Item)r; return (Type.Folder == li.mType) && (li.mName == ri.mFolderName); } return false; } }); return mTree.add(parent, item); } private void Load() { mTree = new Tree<Item>(null); FileInputStream fileInputStream = null; ObjectInputStream objInputStream = null; try { File file = new File(mContext.getFilesDir(), BOOKMARK_FILE_NAME); if(file.isFile()) { fileInputStream = new FileInputStream(file); objInputStream = new ObjectInputStream(fileInputStream); do { Item item = (Item) objInputStream.readObject(); if(null != item) { item.mId = ++mCurrentId; Log.d("Bookmark", String.format("Read Bookmark: %s", item.toString())); Add(item); } else { break; } } while(true); } } catch(Exception e) { Log.e("Bookmark", CommonUtil.getExceptionStackTrace(e)); try { if(null != objInputStream) { objInputStream.close(); objInputStream = null; fileInputStream = null; } else if(null != fileInputStream) { fileInputStream.close(); fileInputStream = null; } } catch(Exception eInner) { } } } class BookmarkTreeSerializer implements Tree.Iterator { private ObjectOutputStream mOutStream = null; private FileOutputStream mFileOutStream = null; public BookmarkTreeSerializer() { try { File file = new File(mContext.getFilesDir(), BOOKMARK_FILE_NAME); mFileOutStream = new FileOutputStream(file); mOutStream = new ObjectOutputStream(mFileOutStream); } catch(Exception e) { Log.e("Bookmark", CommonUtil.getExceptionStackTrace(e)); } } public void finalize() { try { if(null != mOutStream) { mOutStream.close(); mOutStream = null; mFileOutStream = null; } else if(null != mFileOutStream) { mFileOutStream.close(); mFileOutStream = null; } } catch(Exception e) { } } public ObjectOutputStream getStream() { return mOutStream; } @Override public void iterate(Object l, Object r) { ObjectOutputStream outStream = (ObjectOutputStream) r; try { Item item = (Item)l; if(null != item) { outStream.writeObject(item); Log.d("Bookmark", String.format("Serialize Bookmark: %s", item.toString())); } } catch(Exception e) { Log.e("Bookmark", CommonUtil.getExceptionStackTrace(e)); } } } public void Flush() { BookmarkTreeSerializer ts = new BookmarkTreeSerializer(); ObjectOutputStream outStream = ts.getStream(); if(null != outStream) { mTree.iterate(outStream, ts); } } }