Xcos: do not create #identifier#identifier mxCell 03/16503/2
Clément DAVID [Wed, 20 May 2015 16:18:11 +0000 (18:18 +0200)]
When selecting multiple element on a diagram, it was possible to create
invalid identifier cells. This commit also include a cleanup at load
time to remove these invalid cells.

This commit fix the otrs#13058 bug.

Change-Id: I40b245f8df1138f84dd2e2273d3042581b417bbc

scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/codec/XcosDiagramCodec.java

index 58f8075..830eeea 100644 (file)
@@ -1717,6 +1717,10 @@ public class XcosDiagram extends ScilabGraph {
      * @return the identifier cell
      */
     public mxCell getOrCreateCellIdentifier(final mxCell cell) {
+        if (cell.getId().endsWith(HASH_IDENTIFIER)) {
+            return cell;
+        }
+
         final mxGraphModel graphModel = (mxGraphModel) getModel();
 
         final mxCell identifier;
index ecd0c14..c28ea71 100644 (file)
@@ -196,9 +196,15 @@ public class XcosDiagramCodec extends ScilabGraphCodec {
 
     /**
      * {@inheritDoc}
+     * <BR>
+     * <BR>
+     * <B>UPDATED TO COVER</B>
      *
-     * Strip out any node with an invalid parent id. (5.3.1 diagrams may
-     * contains invalid default parents, remove them.)
+     * <UL>
+     * <LI>Strip out any node with an invalid parent id. (5.3.1 diagrams may
+     * contains invalid default parents, remove them.)</LI>
+     * <LI>Remove cell where id end with "#identifier#identifier"</LI>
+     * </UL>
      */
     @Override
     public Node beforeDecode(mxCodec dec, Node node, Object obj) {
@@ -239,14 +245,20 @@ public class XcosDiagramCodec extends ScilabGraphCodec {
      */
     private void cleanUpNode(final Set<String> ids, final Collection<Node> trash, Node cell) {
         final Node id = cell.getAttributes().getNamedItem("id");
+        final String idValue = id.getNodeValue();
         final Node parent = cell.getAttributes().getNamedItem("parent");
 
         if (id instanceof Element) {
-            ids.add(id.getNodeValue());
+            ids.add(idValue);
         }
         if (parent instanceof Element && !ids.contains(parent.getNodeValue())) {
             trash.add(parent);
         }
+
+        // remove dual identifier cells
+        if (idValue.endsWith(XcosDiagram.HASH_IDENTIFIER + XcosDiagram.HASH_IDENTIFIER)) {
+            trash.add(cell);
+        }
     }
 
     /**