/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package feuille.drawing.adf; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import org.xml.sax.ContentHandler; import org.xml.sax.DTDHandler; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.helpers.AttributesImpl; /** * * @author The Wingate 2940 */ public class XmlDrawingWriter { /* Structure à écrire : * <drawing> * <layers> * <layer name="" color="">commands</layer> * <layer name="" color="">commands</layer> * <layer name="" color="">commands</layer> * ... * </layers> * <image>IMAGE EN BASE64</image> * <photo x="" y="">PHOTO EN BASE64</photo> * </drawing> */ DrawingObject dro = new DrawingObject(); public XmlDrawingWriter(){ } public class DROSource extends org.xml.sax.InputSource{ DrawingObject dro = new DrawingObject(); public DROSource(DrawingObject dro){ super(); this.dro = dro; } public DrawingObject getDrawingObject(){ return dro; } } public class DROReader implements org.xml.sax.XMLReader{ private ContentHandler chandler; private AttributesImpl attributes = new AttributesImpl(); private Map<String,Boolean> features = new HashMap<String,Boolean>(); private Map<String,Object> properties = new HashMap<String,Object>(); private EntityResolver resolver; private DTDHandler dhandler; private ErrorHandler ehandler; @Override public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return features.get(name).booleanValue(); } @Override public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { try{ features.put(name, value); }catch(Exception ex){ } } @Override public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return properties.get(name); } @Override public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { try{ properties.put(name, value); }catch(Exception ex){ } } @Override public void setEntityResolver(EntityResolver resolver) { this.resolver = resolver; } @Override public EntityResolver getEntityResolver() { return resolver; } @Override public void setDTDHandler(DTDHandler handler) { this.dhandler = handler; } @Override public DTDHandler getDTDHandler() { return dhandler; } @Override public void setContentHandler(ContentHandler handler) { this.chandler = handler; } @Override public ContentHandler getContentHandler() { return chandler; } @Override public void setErrorHandler(ErrorHandler handler) { this.ehandler = handler; } @Override public ErrorHandler getErrorHandler() { return ehandler; } @Override public void parse(InputSource input) throws IOException, SAXException { if(!(input instanceof DROSource)){ throw new SAXException("The object isn't a DROSource"); } if(chandler == null){ throw new SAXException("ContentHandler not defined"); } DROSource source = (DROSource)input; DrawingObject dro = source.getDrawingObject(); // Main element - beginning chandler.startDocument(); chandler.startElement("", "drawing", "drawing", attributes); // Layers element - beginning chandler.startElement("", "layers", "layers", attributes); for(LayerContent lc : dro.getLayers()){ // Layer block attributes.addAttribute("", "", "name", "string", lc.getName()); attributes.addAttribute("", "", "color", "string", lc.toHTMLColor()); chandler.startElement("", "layer", "layer", attributes); char[] commands = lc.getAssCommands().toCharArray(); chandler.characters(commands,0,commands.length); chandler.endElement("", "layer", "layer"); attributes.clear(); } chandler.endElement("", "layers", "layers"); // Image block chandler.startElement("", "image", "image", attributes); char[] image = dro.imageToBase64().toCharArray(); chandler.characters(image,0,image.length); chandler.endElement("", "image", "image"); // Image block attributes.addAttribute("", "", "x", "string", Integer.toString(dro.getIconPositionX())); attributes.addAttribute("", "", "y", "string", Integer.toString(dro.getIconPositionY())); chandler.startElement("", "photo", "photo", attributes); char[] photo = dro.iconToBase64().toCharArray(); chandler.characters(photo,0,photo.length); chandler.endElement("", "photo", "photo"); attributes.clear(); chandler.endElement("", "drawing", "drawing"); chandler.endDocument(); } @Override public void parse(String systemId) throws IOException, SAXException { throw new UnsupportedOperationException("Not supported yet."); } } public boolean createDrawing(String path){ org.xml.sax.XMLReader pread = new DROReader(); InputSource psource = new DROSource(dro); Source source = new SAXSource(pread, psource); File file = new File(path); Result resultat = new StreamResult(file); try { TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer; transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.transform(source, resultat); } catch (TransformerConfigurationException ex) { return false; } catch (TransformerException ex) { return false; } return true; } public void setDrawingObject(DrawingObject dro){ this.dro = dro; } }