Xcos load: do not duplicate children 56/17556/3
Clément DAVID [Wed, 9 Dec 2015 10:13:13 +0000 (11:13 +0100)]
Change-Id: I169e431de5e1cad290f31203512e7a72bb53ae84

scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosCellFactory.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/writer/PortWriter.java

index a8729c0..a8ce59a 100644 (file)
@@ -145,7 +145,7 @@ public final class XcosCellFactory {
      */
     public static void insertChildren(JavaController controller, XcosDiagram diagram) {
         /*
-         * Retrieve then clear the children to avoid inserting the UIDs twice
+         * Retrieve the children
          */
         VectorOfScicosID children = new VectorOfScicosID();
         controller.getObjectProperty(diagram.getUID(), diagram.getKind(), ObjectProperties.CHILDREN, children);
@@ -212,8 +212,14 @@ public final class XcosCellFactory {
             }
         }
 
-        // re-add the children cells
+        // re-add the children cells without duplicating them
+        children.clear();
+        controller.setObjectProperty(diagram.getUID(), diagram.getKind(), ObjectProperties.CHILDREN, children);
+
         diagram.addCells(cells);
+
+        // each cell has been referenced twice (CHILDREN insert and addCells), derefence them all by one
+        Arrays.stream(cells).forEach(c -> controller.deleteObject(c.getUID()));
     }
 
     /*
@@ -497,7 +503,13 @@ public final class XcosCellFactory {
             children[i] = child;
         }
 
-        Arrays.stream(children).forEach(c -> parent.insert(c));
+        modelChildren.clear();
+        controller.setObjectProperty(parent.getUID(), parent.getKind(), property, modelChildren);
+
+        Arrays.stream(children).forEach(c -> {
+            parent.insert(c);
+            controller.deleteObject(c.getUID());
+        });
 
         return children.length;
     }
index 39363f3..836ce67 100644 (file)
@@ -657,7 +657,7 @@ public class ScilabTypeCoder {
      * @param vec the vector to convert
      * @return a representative string
      */
-    private static String toString(VectorOfDouble vec) {
+    public static String toString(VectorOfDouble vec) {
         int len = vec.size();
         double[] copy = new double[len];
         DoubleBuffer.wrap(copy).put(vec.asByteBuffer(0, len).asDoubleBuffer());
@@ -670,7 +670,7 @@ public class ScilabTypeCoder {
      * @param vec the vector to convert
      * @return a representative string
      */
-    private static String toString(VectorOfScicosID vec) {
+    public static String toString(VectorOfScicosID vec) {
         int len = vec.size();
         long[] copy = new long[len];
         LongBuffer.wrap(copy).put(vec.asByteBuffer(0, len).asLongBuffer());
@@ -683,7 +683,7 @@ public class ScilabTypeCoder {
      * @param vec the vector to convert
      * @return a representative string
      */
-    private static String toString(VectorOfInt vec) {
+    public static String toString(VectorOfInt vec) {
         int len = vec.size();
         int[] copy = new int[len];
         IntBuffer.wrap(copy).put(vec.asByteBuffer(0, len).asIntBuffer());
index d37c049..1379f43 100644 (file)
@@ -103,5 +103,4 @@ public class PortWriter extends ScilabWriter {
         shared.controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.STYLE, style);
         shared.stream.writeAttribute("style", style[0]);
     }
-
 }