XCOS and ZCOS format : cleanup the format 88/17588/1
Clément DAVID [Tue, 15 Dec 2015 18:38:16 +0000 (19:38 +0100)]
 * Store valid matrices content
 * Share code for ZipEntry setup for all ZCOS Entries
 * Avoid storing '\n' on the XML as they will be discarded on reload

Change-Id: I18dbb58bbb5e3040862028866207392f88c3b303

scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/spec/ContentEntry.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/spec/DictionaryEntry.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/spec/XcosPackage.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/BlockWriter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/LinkWriter.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/RawDataWriter.java

index 0a436c8..ef17088 100644 (file)
@@ -77,13 +77,6 @@ public class ContentEntry implements Entry {
     @Override
     public void store(ZipOutputStream stream) throws IOException {
         /*
-         * Append a ZipEntry
-         */
-        final ZipEntry entry = new ZipEntry(getFullPath());
-        entry.setTime(pack.getTime());
-        stream.putNextEntry(entry);
-
-        /*
          * Store content
          */
         try {
index abbca34..e16886b 100644 (file)
@@ -49,31 +49,18 @@ public class DictionaryEntry implements Entry {
 
     @Override
     public void load(ZipEntry entry, InputStream stream) throws IOException {
-        ObjectInputStream ois = null;
-        try {
-            ois = new ObjectInputStream(stream);
+        try (ObjectInputStream ois = new ObjectInputStream(stream)) {
 
             pack.getDictionary().clear();
             pack.getDictionary().addAll((ScilabList) ois.readObject());
-        } catch (IOException e) {
+        } catch (IOException | ClassNotFoundException e) {
             Logger.getLogger(DictionaryEntry.class.getName()).severe(e.getMessage());
-        } catch (ClassNotFoundException e) {
-            Logger.getLogger(DictionaryEntry.class.getName()).severe(e.getMessage());
-        } finally {
-            ois.close();
         }
     }
 
     @Override
     public void store(ZipOutputStream stream) throws IOException {
         /*
-         * Append a ZipEntry
-         */
-        final ZipEntry entry = new ZipEntry(getFullPath());
-        entry.setTime(pack.getTime());
-        stream.putNextEntry(entry);
-
-        /*
          * Store content
          */
         LOG.entering("ObjectOutputStream", "writeObject");
index 2b06c8b..7bda208 100644 (file)
@@ -17,6 +17,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.zip.CRC32;
 import java.util.zip.ZipEntry;
@@ -39,7 +40,6 @@ import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 import org.scilab.modules.commons.ScilabCommons;
-import org.scilab.modules.commons.ScilabCommonsUtils;
 
 import org.scilab.modules.commons.xml.ScilabDocumentBuilderFactory;
 import org.scilab.modules.commons.xml.ScilabTransformerFactory;
@@ -112,7 +112,7 @@ public class XcosPackage {
      */
     private final File file;
     private Document manifest;
-    private long time;
+    private final long time;
 
     /**
      * Entries encoder/decoder stored in the encoding order
@@ -122,7 +122,7 @@ public class XcosPackage {
      * <li>the order is the encoding order (from start to end)
      * <li>decoding will be performed from the end to the start
      */
-    private Entry[] availableEntries = new Entry[] { new ContentEntry(), new DictionaryEntry() };
+    private final Entry[] availableEntries = new Entry[] { new ContentEntry(), new DictionaryEntry() };
 
     /*
      * Data to store or load into
@@ -181,9 +181,8 @@ public class XcosPackage {
             // open the file on each entry to manage non well ordered (but still
             // valid) zip files
             final FileInputStream fis = new FileInputStream(file);
-            final ZipInputStream zin = new ZipInputStream(fis);
+            try (ZipInputStream zin = new ZipInputStream(fis)) {
 
-            try {
                 ZipEntry entry;
                 while ((entry = zin.getNextEntry()) != null) {
                     final String path = entry.getName();
@@ -200,8 +199,7 @@ public class XcosPackage {
                         }
                     }
                 }
-            } finally {
-                zin.close();
+
             }
         }
     }
@@ -209,8 +207,6 @@ public class XcosPackage {
     /**
      * Check an xcos file as a ZIP package.
      *
-     * @param file
-     *            the file to read
      * @throws IOException
      *             on I/O Exception or invalid format
      * @throws TransformerException
@@ -218,10 +214,9 @@ public class XcosPackage {
      */
     public void checkHeader() throws IOException, TransformerException {
         final FileInputStream fis = new FileInputStream(file);
-        final ZipInputStream zin = new ZipInputStream(fis);
+        try (ZipInputStream zin = new ZipInputStream(fis)) {
 
-        ZipEntry entry;
-        try {
+            ZipEntry entry;
             while ((entry = zin.getNextEntry()) != null) {
                 // extract data
                 // open output streams
@@ -250,8 +245,6 @@ public class XcosPackage {
                     manifest = (Document) result.getNode();
                 }
             }
-        } finally {
-            zin.close();
         }
 
         if (hasInvalidManifest()) {
@@ -261,24 +254,31 @@ public class XcosPackage {
 
     public void store() throws IOException {
         final FileOutputStream fos = new FileOutputStream(file);
-        final ZipOutputStream zout = new ZipOutputStream(fos);
+        try (ZipOutputStream zout = new ZipOutputStream(fos,  Charset.forName("UTF-8"))) {
 
-        try {
             // add the header (standard package)
             storeHeader(zout);
+            zout.flush();
 
             // store the entries in encoding order
             for (final Entry entry : availableEntries) {
                 entry.setup(this);
+
+                final ZipEntry zentry = new ZipEntry(entry.getFullPath());
+                zentry.setTime(getTime());
+                zout.putNextEntry(zentry);
+                zout.flush();
+
                 entry.store(zout);
+                zout.flush();
             }
 
             // store the manifest file
             storeTrailer(zout);
+            zout.flush();
+
         } catch (Exception e) {
             e.printStackTrace();
-        } finally {
-            zout.close();
         }
     }
 
index 469ed9b..e76f8a0 100644 (file)
@@ -76,7 +76,9 @@ public class BlockWriter extends ScilabWriter {
 
         shared.controller.getObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, v);
         if (!v[0].isEmpty()) {
-            shared.stream.writeAttribute("value", v[0]);
+            // remove any '\n' character that will not be preserved by the XML Handlers on re-load
+            String escaped = v[0].replace('\n', ' ');
+            shared.stream.writeAttribute("value", escaped);
         }
 
         // delegate the sub-elements to their writers
index c488740..fd42726 100644 (file)
@@ -84,7 +84,9 @@ public class LinkWriter extends ScilabWriter {
             shared.stream.writeAttribute("source", src[0]);
             shared.stream.writeAttribute("target", dst[0]);
             shared.stream.writeAttribute("style", style[0]);
-            shared.stream.writeAttribute("value", value[0]);
+            // remove any '\n' character that will not be preserved by the XML Handlers on re-load
+            String escaped = value[0].replace('\n', ' ');
+            shared.stream.writeAttribute("value", escaped);
 
             shared.stream.writeEndElement(); // localName
         }
index b55f562..c3e61c6 100644 (file)
@@ -202,8 +202,8 @@ public class RawDataWriter extends ScilabWriter {
         /*
          * Emit the elements
          */
-        final int len = value.getHeight() * value.getWidth();
-        if (len > 0) {
+        final boolean isNotEmptyElement = value.getHeight() > 0 &&  value.getWidth() > 0;
+        if (isNotEmptyElement) {
             shared.stream.writeStartElement(localName);
         } else {
             shared.stream.writeEmptyElement(localName);
@@ -218,7 +218,7 @@ public class RawDataWriter extends ScilabWriter {
             writeMatrix(value, type, intPrecision);
         }
 
-        if (len > 0) {
+        if (isNotEmptyElement) {
             shared.stream.writeEndElement();
         }
     }
@@ -244,8 +244,8 @@ public class RawDataWriter extends ScilabWriter {
         for (int i = 0; i < value.getHeight(); i++) {
             for (int j = 0; j < value.getWidth(); j++) {
                 shared.stream.writeEmptyElement("data");
-                shared.stream.writeAttribute("column", Integer.toString(i));
-                shared.stream.writeAttribute("line", Integer.toString(j));
+                shared.stream.writeAttribute("line", Integer.toString(i));
+                shared.stream.writeAttribute("column", Integer.toString(j));
 
                 switch (type) {
                     case sci_boolean: