// RecentFileStorage.java package net.sf.gogui.unfinished; import java.net.URI; import java.io.File; import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** Recent file storage according to the Freedesktop standard. http://standards.freedesktop.org/recent-file-spec/0.2/ @todo Implementation not finished yet. Don't use this class. */ public final class RecentFileStorage { public static final int MAX_ITEMS = 500; public static void add(URI uri, String mimetype) { add(uri, mimetype, null, false); } /** @todo create empty document, if read document is invalid (e.g. no RecentFiles element)? */ public static void add(URI uri, String mimetype, String group, boolean isPrivate) { updateFromFile(); NodeList list = s_document.getElementsByTagName("RecentFiles"); int length = list.getLength(); if (length == 0) { System.err.println("error: no tag RecentFiles"); return; } if (length > 1) System.err.println("warning: multiple tags RecentFiles"); Node recentFiles = list.item(0); Element recentItem = s_document.createElement("RecentItem"); recentFiles.appendChild(recentItem); Element uriElement = s_document.createElement("URI"); uriElement.appendChild(s_document.createTextNode(uri.toString())); recentItem.appendChild(uriElement); Element timestampElement = s_document.createElement("Timestamp"); String timestamp = Long.toString(System.currentTimeMillis() / 1000); timestampElement.appendChild(s_document.createTextNode(timestamp)); recentItem.appendChild(timestampElement); writeFile(); } public static ArrayList<String> getAllMimeType(String mimeType) { updateFromFile(); ArrayList<String> result = new ArrayList<String>(); NodeList nodeList = s_document.getElementsByTagName("RecentItem"); for (int i = 0; i < nodeList.getLength(); ++i) { Node element = nodeList.item(i); NamedNodeMap attributes = element.getAttributes(); Node nodeMimeType = attributes.getNamedItem("Mime-Type"); if (nodeMimeType == null) continue; String value = nodeMimeType.getNodeValue(); if (! value.equals(mimeType)) continue; result.add(value); } return result; } /** @todo Implement */ public static URI[] getAllGroup(String group) { return new URI[0]; } /** Check if file was changed by another application. @return True if file was changed since the last invocation of one of the getAll methods or if it was not read yet. */ public static boolean wasChanged() { if (s_document == null) return true; if (! s_file.exists()) return true; long currentTime = System.currentTimeMillis(); return s_file.lastModified() > currentTime; } /** For temporary testing. @todo Remove later */ public static void main(String[] args) { ArrayList<String> uriList = getAllMimeType("application/x-go-sgf"); for (int i = 0; i < uriList.size(); ++i) System.err.println(uriList.get(i)); //add(FileUtil.getURI(new File("foobar")), "application/x-go-sgf"); } //private static long m_timestamp; /** Content of the recent files file. */ private static Document s_document; private static DocumentBuilder s_builder; private static File s_file = new File(System.getProperties().getProperty("user.home"), ".recently-used"); static { try { s_builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); } catch (ParserConfigurationException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } /** Make constructor unavailable; class is for namespace only. */ private RecentFileStorage() { } private static void updateFromFile() { if (! wasChanged()) return; if (s_builder == null) return; //m_timestamp = System.currentTimeMillis(); if (! s_file.exists()) { createEmptyDocument(); return; } try { s_document = s_builder.parse(s_file); return; } catch (SAXException saxe) { Exception e = saxe; if (saxe.getException() != null) e = saxe.getException(); e.printStackTrace(); } catch (IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); } createEmptyDocument(); } private static void createEmptyDocument() { assert s_builder != null; s_document = s_builder.newDocument(); Element recentFiles = s_document.createElement("RecentFiles"); s_document.appendChild(recentFiles); } private static void writeFile() { try { s_document.normalize(); Source source = new DOMSource(s_document); Result result = new StreamResult(s_file); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.transform(source, result); } catch (TransformerConfigurationException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (TransformerException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } }