1 package org.columba.core.gui.docking; 2 3 import java.io.IOException ; 4 import java.io.InputStream ; 5 import java.io.OutputStream ; 6 import java.io.OutputStreamWriter ; 7 8 import javax.xml.parsers.DocumentBuilder ; 9 import javax.xml.parsers.DocumentBuilderFactory ; 10 import javax.xml.parsers.ParserConfigurationException ; 11 import javax.xml.transform.OutputKeys ; 12 import javax.xml.transform.Transformer ; 13 import javax.xml.transform.TransformerConfigurationException ; 14 import javax.xml.transform.TransformerException ; 15 import javax.xml.transform.TransformerFactory ; 16 import javax.xml.transform.dom.DOMSource ; 17 import javax.xml.transform.stream.StreamResult ; 18 19 import org.flexdock.docking.DockingPort; 20 import org.flexdock.docking.state.LayoutNode; 21 import org.flexdock.docking.state.PersistenceException; 22 import org.flexdock.perspective.persist.xml.ISerializer; 23 import org.flexdock.perspective.persist.xml.SerializerRegistry; 24 import org.flexdock.util.Utilities; 25 import org.w3c.dom.Document ; 26 import org.w3c.dom.Element ; 27 import org.xml.sax.InputSource ; 28 import org.xml.sax.SAXException ; 29 30 public class XMLPersister { 31 32 private DocumentBuilder createDocumentBuilder() throws PersistenceException { 33 try { 34 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 35 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 36 37 return documentBuilder; 38 } catch (ParserConfigurationException ex) { 39 throw new PersistenceException("Unable to create document builder", ex); 40 } 41 } 42 43 public boolean store(OutputStream os, DockingPort dockingPort) throws IOException , PersistenceException { 44 DocumentBuilder documentBuilder = createDocumentBuilder(); 45 Document document = documentBuilder.newDocument(); 46 47 ISerializer serializer = SerializerRegistry.getSerializer(LayoutNode.class); 48 Element layoutNodeElement = serializer.serialize(document, dockingPort.exportLayout()); 49 50 document.appendChild(layoutNodeElement); 51 52 TransformerFactory transformerFactory = TransformerFactory.newInstance(); 53 if(Utilities.JAVA_1_5) { 55 transformerFactory.setAttribute("indent-number", new Integer (4)); 56 } 57 58 try { 59 Transformer transformer = transformerFactory.newTransformer(); 60 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 62 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 63 64 DOMSource source = new DOMSource (document); 65 StreamResult result = new StreamResult (new OutputStreamWriter (os)); 66 67 transformer.transform(source, result); 68 } catch (TransformerConfigurationException ex) { 69 throw new PersistenceException("Unable to serialize perspectiveModel", ex); 70 } catch (TransformerException ex) { 71 throw new PersistenceException("Unable to serialize perspectiveModel", ex); 72 } 73 74 return true; 75 } 76 77 public void load(InputStream is, DockingPort dockingPort) throws IOException , PersistenceException { 78 try { 79 InputSource inputSource = new InputSource (is); 80 DocumentBuilder documentBuilder = createDocumentBuilder(); 81 Document document = documentBuilder.parse(inputSource); 82 83 ISerializer layoutNodeSerializer = SerializerRegistry.getSerializer(LayoutNode.class); 84 LayoutNode layoutNode = (LayoutNode) layoutNodeSerializer.deserialize(document.getDocumentElement()); 85 dockingPort.importLayout(layoutNode); 86 87 } catch (SAXException ex) { 88 throw new PersistenceException("Unable to deserialize perspectiveModel from xml", ex); 89 } 90 } 91 92 } 93 | Popular Tags |