Xcos load: do not duplicate children
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / io / writer / PortWriter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12 package org.scilab.modules.xcos.io.writer;
13
14 import java.rmi.server.UID;
15 import javax.xml.stream.XMLStreamException;
16
17 import org.scilab.modules.xcos.Kind;
18 import org.scilab.modules.xcos.ObjectProperties;
19 import org.scilab.modules.xcos.VectorOfInt;
20 import org.scilab.modules.xcos.port.BasicPort;
21
22 public class PortWriter extends ScilabWriter {
23
24     private final ObjectProperties portKind;
25     private int ordering;
26
27     public PortWriter(XcosWriter writer, ObjectProperties portKind) {
28         super(writer);
29
30         this.portKind = portKind;
31         this.ordering = 0;
32     }
33
34     @Override
35     public void write(long uid, Kind kind) throws XMLStreamException {
36         assert kind == Kind.PORT;
37
38         String localName;
39         boolean[] isImplicit = new boolean[1];
40
41         // retrieve some properties before emiting the element
42         shared.controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.IMPLICIT, isImplicit);
43
44         switch (portKind) {
45             case INPUTS:
46                 if (isImplicit[0]) {
47                     localName = "ImplicitInputPort";
48                 } else {
49                     localName = "ExplicitInputPort";
50                 }
51                 break;
52             case OUTPUTS:
53                 if (isImplicit[0]) {
54                     localName = "ImplicitOutputPort";
55                 } else {
56                     localName = "ExplicitOutputPort";
57                 }
58                 break;
59             case EVENT_INPUTS:
60                 localName = "ControlPort";
61                 break;
62             case EVENT_OUTPUTS:
63                 localName = "CommandPort";
64                 break;
65
66             default:
67                 return;
68         }
69
70         /*
71          * Emit the XML
72          */
73         String[] str = new String[1];
74
75         // the Geometry does not need to be saved, serialize only attributes there
76         shared.stream.writeEmptyElement(localName);
77
78         shared.controller.getObjectProperty(uid, kind, ObjectProperties.UID, str);
79         while (str[0].isEmpty() || shared.uniqueUIDs.contains(str[0])) {
80             str[0] = new UID().toString();
81         }
82         shared.controller.setObjectProperty(uid, kind, ObjectProperties.UID, str[0]);
83         shared.stream.writeAttribute("id", str[0]);
84
85         shared.stream.writeAttribute("parent", shared.layers.peek());
86         shared.stream.writeAttribute("ordering", Integer.toString(++ordering));
87
88         VectorOfInt datatype = new VectorOfInt();
89         shared.controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.DATATYPE, datatype);
90
91         int dataDescriptor = datatype.get(0);
92         if (0 <= dataDescriptor && dataDescriptor < BasicPort.DataType.values().length) {
93             shared.stream.writeAttribute("dataType", BasicPort.DataType.values()[dataDescriptor].name());
94             shared.stream.writeAttribute("dataColumns", Integer.toString(datatype.get(1)));
95             shared.stream.writeAttribute("dataLines", Integer.toString(datatype.get(2)));
96         }
97
98         double[] firing = new double[1];
99         shared.controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.FIRING, firing);
100         shared.stream.writeAttribute("initialState", Double.toString(firing[0]));
101
102         String[] style = new String[1];
103         shared.controller.getObjectProperty(uid, Kind.PORT, ObjectProperties.STYLE, style);
104         shared.stream.writeAttribute("style", style[0]);
105     }
106 }