Xcos writers: indent ".xcos" files 69/17469/2
Clément DAVID [Wed, 18 Nov 2015 09:55:13 +0000 (10:55 +0100)]
Change-Id: Ife0a0230dc7bb28fd2bd339fdb7155a9429b16b3

scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/XcosFileType.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/DelegatingXMLStreamWriter.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/IndentingXMLStreamWriter.java [new file with mode: 0644]
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/XcosWriter.java

index dca4c7c..1190102 100644 (file)
@@ -16,7 +16,6 @@ package org.scilab.modules.xcos.io;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-import java.net.MalformedURLException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
@@ -29,20 +28,16 @@ import javax.swing.filechooser.FileNameExtensionFilter;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
 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.sax.SAXResult;
-import javax.xml.transform.stax.StAXSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
 import org.scilab.modules.commons.xml.ScilabTransformerFactory;
 import org.scilab.modules.commons.xml.ScilabXMLOutputFactory;
-import org.scilab.modules.types.ScilabList;
 import org.scilab.modules.xcos.JavaController;
 import org.scilab.modules.xcos.View;
 import org.scilab.modules.xcos.Xcos;
@@ -51,9 +46,9 @@ import org.scilab.modules.xcos.graph.model.XcosCellFactory;
 import org.scilab.modules.xcos.io.sax.XcosSAXHandler;
 import org.scilab.modules.xcos.io.spec.ContentEntry;
 import org.scilab.modules.xcos.io.spec.XcosPackage;
+import org.scilab.modules.xcos.io.writer.IndentingXMLStreamWriter;
 import org.scilab.modules.xcos.io.writer.XcosWriter;
 import org.scilab.modules.xcos.utils.XcosMessages;
-import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
 /**
@@ -136,7 +131,7 @@ public enum XcosFileType {
             final XMLStreamWriter writer = factory.createXMLStreamWriter(result);
             try {
                 LOG.entering("XMLStreamWriter", "write");
-                new XcosWriter(null, writer).write(from.getUID(), from.getKind());
+                new XcosWriter(null, new IndentingXMLStreamWriter(writer)).write(from.getUID(), from.getKind());
                 LOG.exiting("XMLStreamWriter", "write");
             } finally {
                 writer.close();
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/DelegatingXMLStreamWriter.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/DelegatingXMLStreamWriter.java
new file mode 100644 (file)
index 0000000..70781a9
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.scilab.modules.xcos.io.writer;
+
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.namespace.NamespaceContext;
+
+/**
+ * Delegating {@link XMLStreamWriter}.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+abstract class DelegatingXMLStreamWriter implements XMLStreamWriter {
+    private final XMLStreamWriter writer;
+
+    public DelegatingXMLStreamWriter(XMLStreamWriter writer) {
+        this.writer = writer;
+    }
+
+    public void writeStartElement(String localName) throws XMLStreamException {
+        writer.writeStartElement(localName);
+    }
+
+    public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
+        writer.writeStartElement(namespaceURI, localName);
+    }
+
+    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
+        writer.writeStartElement(prefix, localName, namespaceURI);
+    }
+
+    public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
+        writer.writeEmptyElement(namespaceURI, localName);
+    }
+
+    public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
+        writer.writeEmptyElement(prefix, localName, namespaceURI);
+    }
+
+    public void writeEmptyElement(String localName) throws XMLStreamException {
+        writer.writeEmptyElement(localName);
+    }
+
+    public void writeEndElement() throws XMLStreamException {
+        writer.writeEndElement();
+    }
+
+    public void writeEndDocument() throws XMLStreamException {
+        writer.writeEndDocument();
+    }
+
+    public void close() throws XMLStreamException {
+        writer.close();
+    }
+
+    public void flush() throws XMLStreamException {
+        writer.flush();
+    }
+
+    public void writeAttribute(String localName, String value) throws XMLStreamException {
+        writer.writeAttribute(localName, value);
+    }
+
+    public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException {
+        writer.writeAttribute(prefix, namespaceURI, localName, value);
+    }
+
+    public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException {
+        writer.writeAttribute(namespaceURI, localName, value);
+    }
+
+    public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
+        writer.writeNamespace(prefix, namespaceURI);
+    }
+
+    public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {
+        writer.writeDefaultNamespace(namespaceURI);
+    }
+
+    public void writeComment(String data) throws XMLStreamException {
+        writer.writeComment(data);
+    }
+
+    public void writeProcessingInstruction(String target) throws XMLStreamException {
+        writer.writeProcessingInstruction(target);
+    }
+
+    public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
+        writer.writeProcessingInstruction(target, data);
+    }
+
+    public void writeCData(String data) throws XMLStreamException {
+        writer.writeCData(data);
+    }
+
+    public void writeDTD(String dtd) throws XMLStreamException {
+        writer.writeDTD(dtd);
+    }
+
+    public void writeEntityRef(String name) throws XMLStreamException {
+        writer.writeEntityRef(name);
+    }
+
+    public void writeStartDocument() throws XMLStreamException {
+        writer.writeStartDocument();
+    }
+
+    public void writeStartDocument(String version) throws XMLStreamException {
+        writer.writeStartDocument(version);
+    }
+
+    public void writeStartDocument(String encoding, String version) throws XMLStreamException {
+        writer.writeStartDocument(encoding, version);
+    }
+
+    public void writeCharacters(String text) throws XMLStreamException {
+        writer.writeCharacters(text);
+    }
+
+    public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
+        writer.writeCharacters(text, start, len);
+    }
+
+    public String getPrefix(String uri) throws XMLStreamException {
+        return writer.getPrefix(uri);
+    }
+
+    public void setPrefix(String prefix, String uri) throws XMLStreamException {
+        writer.setPrefix(prefix, uri);
+    }
+
+    public void setDefaultNamespace(String uri) throws XMLStreamException {
+        writer.setDefaultNamespace(uri);
+    }
+
+    public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {
+        writer.setNamespaceContext(context);
+    }
+
+    public NamespaceContext getNamespaceContext() {
+        return writer.getNamespaceContext();
+    }
+
+    public Object getProperty(String name) throws IllegalArgumentException {
+        return writer.getProperty(name);
+    }
+}
diff --git a/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/IndentingXMLStreamWriter.java b/scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/IndentingXMLStreamWriter.java
new file mode 100644 (file)
index 0000000..37daa89
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.scilab.modules.xcos.io.writer;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import java.util.Stack;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+public class IndentingXMLStreamWriter extends DelegatingXMLStreamWriter {
+    private final static Object SEEN_NOTHING = new Object();
+    private final static Object SEEN_ELEMENT = new Object();
+    private final static Object SEEN_DATA = new Object();
+
+    private Object state = SEEN_NOTHING;
+    private Stack<Object> stateStack = new Stack<Object>();
+
+    private String indentStep = "  ";
+    private int depth = 0;
+
+    public IndentingXMLStreamWriter(XMLStreamWriter writer) {
+        super(writer);
+    }
+
+    /**
+     * Return the current indent step.
+     *
+     * <p>Return the current indent step: each start tag will be
+     * indented by this number of spaces times the number of
+     * ancestors that the element has.</p>
+     *
+     * @return The number of spaces in each indentation step,
+     *         or 0 or less for no indentation.
+     * @see #setIndentStep(int)
+     *
+     * @deprecated
+     *      Only return the length of the indent string.
+     */
+    public int getIndentStep() {
+        return indentStep.length();
+    }
+
+
+    /**
+     * Set the current indent step.
+     *
+     * @param indentStep The new indent step (0 or less for no
+     *        indentation).
+     * @see #getIndentStep()
+     *
+     * @deprecated
+     *      Should use the version that takes string.
+     */
+    public void setIndentStep(int indentStep) {
+        StringBuilder s = new StringBuilder();
+        for (; indentStep > 0; indentStep--) {
+            s.append(' ');
+        }
+        setIndentStep(s.toString());
+    }
+
+    public void setIndentStep(String s) {
+        this.indentStep = s;
+    }
+
+    private void onStartElement() throws XMLStreamException {
+        stateStack.push(SEEN_ELEMENT);
+        state = SEEN_NOTHING;
+        if (depth > 0) {
+            super.writeCharacters("\n");
+        }
+        doIndent();
+        depth++;
+    }
+
+    private void onEndElement() throws XMLStreamException {
+        depth--;
+        if (state == SEEN_ELEMENT) {
+            super.writeCharacters("\n");
+            doIndent();
+        }
+        state = stateStack.pop();
+    }
+
+    private void onEmptyElement() throws XMLStreamException {
+        state = SEEN_ELEMENT;
+        if (depth > 0) {
+            super.writeCharacters("\n");
+        }
+        doIndent();
+    }
+
+    /**
+     * Print indentation for the current level.
+     *
+     * @exception org.xml.sax.SAXException If there is an error
+     *            writing the indentation characters, or if a filter
+     *            further down the chain raises an exception.
+     */
+    private void doIndent() throws XMLStreamException {
+        if (depth > 0) {
+            for (int i = 0; i < depth; i++) {
+                super.writeCharacters(indentStep);
+            }
+        }
+    }
+
+
+    public void writeStartDocument() throws XMLStreamException {
+        super.writeStartDocument();
+        super.writeCharacters("\n");
+    }
+
+    public void writeStartDocument(String version) throws XMLStreamException {
+        super.writeStartDocument(version);
+        super.writeCharacters("\n");
+    }
+
+    public void writeStartDocument(String encoding, String version) throws XMLStreamException {
+        super.writeStartDocument(encoding, version);
+        super.writeCharacters("\n");
+    }
+
+    public void writeStartElement(String localName) throws XMLStreamException {
+        onStartElement();
+        super.writeStartElement(localName);
+    }
+
+    public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
+        onStartElement();
+        super.writeStartElement(namespaceURI, localName);
+    }
+
+    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
+        onStartElement();
+        super.writeStartElement(prefix, localName, namespaceURI);
+    }
+
+    public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
+        onEmptyElement();
+        super.writeEmptyElement(namespaceURI, localName);
+    }
+
+    public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
+        onEmptyElement();
+        super.writeEmptyElement(prefix, localName, namespaceURI);
+    }
+
+    public void writeEmptyElement(String localName) throws XMLStreamException {
+        onEmptyElement();
+        super.writeEmptyElement(localName);
+    }
+
+    public void writeEndElement() throws XMLStreamException {
+        onEndElement();
+        super.writeEndElement();
+    }
+
+    public void writeCharacters(String text) throws XMLStreamException {
+        state = SEEN_DATA;
+        super.writeCharacters(text);
+    }
+
+    public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
+        state = SEEN_DATA;
+        super.writeCharacters(text, start, len);
+    }
+
+    public void writeCData(String data) throws XMLStreamException {
+        state = SEEN_DATA;
+        super.writeCData(data);
+    }
+}
index c210e8e..7550614 100644 (file)
@@ -26,7 +26,6 @@ import org.scilab.modules.xcos.utils.Stack;
  * Implement an XML writer for any kind of model object
  */
 public class XcosWriter {
-
     protected static final Logger LOG = Logger.getLogger("org.scilab.modules.xcos.io.writer");
 
     /*