/** * This software is GPLv2. * Take a look at the LICENSE file for more info. */ package de.tu.dresden.dud.dc; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; 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.Node; import org.w3c.dom.Text; import org.xml.sax.SAXException; /** * This class is responsible for saving user / participant preferences, so a * participant can use them the next time the program starts. * * This class implements the singleton pattern, so each running DC instance only * has one PreferenceSaver. * * This class is currently under development, and not ready for usage, yet. * * @author klobs * */ public class PreferenceSaver { private static PreferenceSaver ps; private DocumentBuilder docBuilder = null; private String prefFile; private Document doc = null; /** * This Constructor sets the default filename (dcrc.xml) for the preference * file, and tries to create it, if not already present. */ private PreferenceSaver() { this.setPathToPrefFile("dcrc.xml"); File f = new File(prefFile); if(!f.exists()) try { f.createNewFile(); XMLOutputFactory a = XMLOutputFactory.newInstance(); XMLStreamWriter w = a.createXMLStreamWriter(new FileWriter(prefFile)); w.writeStartDocument("1.0"); w.writeStartElement("userlist"); w.writeEndDocument(); w.flush(); w.close(); } catch (IOException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } try { DocumentBuilderFactory docFactory = DocumentBuilderFactory .newInstance(); docBuilder = docFactory.newDocumentBuilder(); } catch (ParserConfigurationException pce) { pce.printStackTrace(); } } /** * PreferenceSaver is implemented as singleton. * @return The instance of the PreferenceSaver. */ public static PreferenceSaver getInstance(){ if (ps == null){ ps = new PreferenceSaver(); } return ps; } /** * Standard getter. * @return The filename of the preferences file. */ public String getPathToPrefFile(){ return prefFile; } private Node prepareUserElement(String id, String username, byte [] publicKey, byte [] privateKey){ Element eleUser = doc.createElement("user"); Element eleID = doc.createElement("id"); Text textID = doc.createTextNode(id); eleID.appendChild(textID); eleUser.appendChild(eleID); Element eleUName = doc.createElement("username"); Text textUname = doc.createTextNode(username); eleUName.appendChild(textUname); eleUser.appendChild(eleUName); String publicKeyHex = Util.convertToHex(publicKey); Element elePubKey = doc.createElement("publicKey"); Text textPubKey = doc.createTextNode(publicKeyHex); elePubKey.appendChild(textPubKey); eleUser.appendChild(elePubKey); String privateKeyHex = Util.convertToHex(privateKey); Element elePrivKey = doc.createElement("privateKey"); Text textPrivKey = doc.createTextNode(privateKeyHex); elePrivKey.appendChild(textPrivKey); eleUser.appendChild(elePrivKey); return eleUser; } /** * Standard setter. * * Change the name / path of the preference file. * * @param p */ public void setPathToPrefFile(String p){ prefFile = p; } /** * Save preferences for a {@link Participant} p. * Those preferences currently contain p's id, username, public and private key. * @param p the participant p that you want to save. * @return Whether saving was successfull, or not. */ public boolean saveParticipant(Participant p){ if (p.getKeyPair() == null) return false; try { doc = docBuilder.parse(prefFile); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // TODO do some dupe checking here doc.appendChild(prepareUserElement(p.getId(), p.getUsername(), p.getKeyPair().getPublic().getEncoded(), p.getKeyPair().getPrivate().getEncoded())); savePrefFile(); return true; } private void savePrefFile() { TransformerFactory transformerFactory = TransformerFactory .newInstance(); Transformer transformer; try { transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(prefFile)); transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }