package org.weblabs.wr.note; import java.io.File; import java.io.IOException; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.net.URI; import java.util.ArrayList; import java.util.prefs.Preferences; import java.util.logging.*; import org.weblabs.wr.util.Env; import org.weblabs.wr.util.Net; /** * handle note persistance by XML serialization. */ public class SimpleNoteConnection implements NoteConnection{ private static final Logger logger = Env.getLogger(SimpleNoteConnection.class); public static final String NOTES_DIR_KEY = "notesDir"; public static final String NOTES_DIR_DEFAULT = "data/notes"; private static Preferences prefs = Env.getPreferences(SimpleNoteConnection.class); private static String notesDirName = Env.getSetPref(prefs,NOTES_DIR_KEY,NOTES_DIR_DEFAULT); private static File notesDir; public NoteBox load(URI uri, int id) { File notesFile = getNotesFile(uri,id); NoteBox nb = null; try { XMLDecoder d = new XMLDecoder(new BufferedInputStream( new FileInputStream(notesFile))); nb = (NoteBox) d.readObject(); nb.setURI(uri.toString()); d.close(); } catch (Exception e) { logger.severe(e.toString()); } return nb; } public void save(URI uri, int id, NoteBox noteBox) throws IOException { File notesFile = getNotesFile(uri,id); File tmpFile = File.createTempFile("notes",null,notesDir); XMLEncoder d = new XMLEncoder(new BufferedOutputStream( new FileOutputStream(tmpFile))); d.writeObject(noteBox); d.close(); notesFile.delete(); //notesFile.createNewFile(); tmpFile.renameTo(notesFile); } public static final File getNotesFile(URI uri, int id){ init(); String fname = toString(uri,id) + ".notes"; return new File(notesDir,fname); } public static String toString(URI uri){ return uri.normalize().toASCIIString(); } public static String toString(URI uri, int id){ String scheme = uri.getScheme(); String host = uri.getHost(); StringBuffer sb = new StringBuffer(uri.normalize().toASCIIString()); sb.append("^"); sb.append(id); String s = sb.toString(); if (null != scheme && scheme.length() > 0) { s = s.substring(scheme.length()+2); if (null != host && host.length() > 0 && Net.isLocalHost(uri)) { s = s.substring(host.length()+1); int p = uri.getPort(); if (p > 0) { String ps = String.valueOf(p); s = s.substring(ps.length()+1); } } } s = s.replace('/','@').replace('\\','@'). replace(':','%').replace(' ','_'); return s; } private static final void init() { if (null != notesDir) return; notesDir = new File(Env.getRoot(),notesDirName); notesDir.mkdirs(); } protected File getNotesDir() { init(); return notesDir; } }