Xcos decode: load list on xcos files 67/17467/2
Clément DAVID [Wed, 18 Nov 2015 09:13:36 +0000 (10:13 +0100)]
Change-Id: I420c5d0a9e20fc88402dec3693bd38d96c62e1e0

scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/sax/RawDataHandler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/sax/XcosSAXHandler.java

index daf7b72..37681c1 100644 (file)
@@ -36,7 +36,6 @@ import org.scilab.modules.xcos.io.HandledElement;
 import org.scilab.modules.xcos.io.ScilabTypeCoder;
 import org.scilab.modules.xcos.io.scicos.DiagramElement;
 import org.scilab.modules.xcos.io.scicos.ScicosFormatException;
-import org.scilab.modules.xcos.io.writer.XcosWriter;
 import org.xml.sax.Attributes;
 
 import com.mxgraph.model.mxGeometry;
@@ -51,11 +50,6 @@ class RawDataHandler implements ScilabHandler {
         final Object value;
 
         public RawDataDescriptor(ObjectProperties as, HandledElement found, String scilabClass, Object container) {
-            // defensive programming
-            if (as == null) {
-                throw new IllegalArgumentException();
-            }
-
             this.as = as;
             this.found = found;
             this.scilabClass = scilabClass;
@@ -129,7 +123,8 @@ class RawDataHandler implements ScilabHandler {
                 if (binary &&
                         saxHandler.dictionary != null &&
                         (0 <= position && position < saxHandler.dictionary.size())) {
-                    return new RawDataDescriptor(propertyMap.get(as), found, null, saxHandler.dictionary.get(position));
+                    final ObjectProperties asProp = propertyMap.get(as);
+                    return new RawDataDescriptor(asProp, found, null, saxHandler.dictionary.get(position));
                 }
 
                 /*
@@ -154,7 +149,8 @@ class RawDataHandler implements ScilabHandler {
 
                 // allocate the right class and push it to a descriptor
                 final Object container = allocateDataType(found, atts, height, width, scilabClass);
-                return new RawDataDescriptor(propertyMap.get(as), found, scilabClass, container);
+                final ObjectProperties asProp = propertyMap.get(as);
+                return new RawDataDescriptor(asProp, found, scilabClass, container);
             }
             case add: {
                 // defensive programming
@@ -376,6 +372,19 @@ class RawDataHandler implements ScilabHandler {
                 RawDataDescriptor fieldValue = (RawDataDescriptor) saxHandler.parents.peek();
                 Object parent = saxHandler.parents.peek(1);
 
+                // when we are decoding data into a list "as" is null
+                if (fieldValue.as == null) {
+                    if ( !(parent instanceof ScilabList)) {
+                        return;
+                    }
+                    if ( !(fieldValue.value instanceof ScilabType)) {
+                        return;
+                    }
+
+                    ScilabList parentList = (ScilabList) parent;
+                    parentList.add((ScilabType) fieldValue.value);
+                }
+
                 switch (fieldValue.as) {
                     case CONTROL_POINTS: {
                         // defensive programming
index f126564..549b040 100644 (file)
@@ -35,6 +35,7 @@ import org.scilab.modules.xcos.io.HandledElementsCategory;
 import org.scilab.modules.xcos.utils.Stack;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 import org.xml.sax.helpers.DefaultHandler;
 
 /**
@@ -127,7 +128,7 @@ public class XcosSAXHandler extends DefaultHandler {
     }
 
     /*
-     * Implemented method
+     * Implemented methods for the reader
      */
 
     @Override
@@ -136,6 +137,7 @@ public class XcosSAXHandler extends DefaultHandler {
         if (LOG.isLoggable(Level.FINEST)) {
             char[] indent = new char[parents.size()];
             Arrays.fill(indent, ' ');
+            // System.err.println(new String(indent) + localName + " id=\"" + atts.getValue("id") + "\"");
             LOG.finest(new String(indent) + localName + " id=\"" + atts.getValue("id") + "\"");
         }
 
@@ -160,6 +162,10 @@ public class XcosSAXHandler extends DefaultHandler {
         parents.pop();
     }
 
+    /*
+     * Utilities
+     */
+
     /**
      * Insert a child into the current sub-diagram
      *