* Bug #15284 fixed: Port names are not set to the corresponding I/O block labels.
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / io / sax / BlockHandler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015-2015 - Scilab Enterprises - Clement DAVID
4  * Copyright (C) 2017-2018 - ESI Group - Clement DAVID
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 package org.scilab.modules.xcos.io.sax;
18
19 import java.util.Arrays;
20 import java.util.regex.Pattern;
21
22 import org.scilab.modules.xcos.Kind;
23 import org.scilab.modules.xcos.ObjectProperties;
24 import org.scilab.modules.xcos.VectorOfInt;
25 import org.scilab.modules.xcos.block.AfficheBlock;
26 import org.scilab.modules.xcos.block.BasicBlock;
27 import org.scilab.modules.xcos.block.BasicBlock.SimulationFunctionType;
28 import org.scilab.modules.xcos.block.SplitBlock;
29 import org.scilab.modules.xcos.block.SuperBlock;
30 import org.scilab.modules.xcos.block.TextBlock;
31 import org.scilab.modules.xcos.block.io.EventInBlock;
32 import org.scilab.modules.xcos.block.io.EventOutBlock;
33 import org.scilab.modules.xcos.block.io.ExplicitInBlock;
34 import org.scilab.modules.xcos.block.io.ExplicitOutBlock;
35 import org.scilab.modules.xcos.block.io.ImplicitInBlock;
36 import org.scilab.modules.xcos.block.io.ImplicitOutBlock;
37 import org.scilab.modules.xcos.block.custom.BigSom;
38 import org.scilab.modules.xcos.block.custom.GroundBlock;
39 import org.scilab.modules.xcos.block.custom.Product;
40 import org.scilab.modules.xcos.block.custom.RoundBlock;
41 import org.scilab.modules.xcos.block.custom.Summation;
42 import org.scilab.modules.xcos.block.custom.VoltageSensorBlock;
43 import org.scilab.modules.xcos.graph.model.BlockInterFunction;
44 import org.scilab.modules.xcos.io.HandledElement;
45 import org.xml.sax.Attributes;
46
47 import com.mxgraph.util.mxUtils;
48
49 class BlockHandler implements ScilabHandler {
50     private static Pattern validCIdentifier = null;
51
52     private final XcosSAXHandler saxHandler;
53
54     /**
55      * Default constructor
56      * @param saxHandler the shared sax handler
57      */
58     BlockHandler(XcosSAXHandler saxHandler) {
59         this.saxHandler = saxHandler;
60     }
61
62     @Override
63     public BasicBlock startElement(HandledElement found, Attributes atts) {
64         String v;
65         BasicBlock block;
66         Kind kind;
67         if (found == HandledElement.TextBlock) {
68             kind = Kind.ANNOTATION;
69         } else {
70             kind = Kind.BLOCK;
71         }
72         final long uid = saxHandler.controller.createObject(kind);
73
74         String value = atts.getValue("value");
75         if (validCIdentifier == null) {
76             validCIdentifier = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_]*");
77         }
78         if (value != null && validCIdentifier.matcher(value).matches()) {
79             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, value);
80         }
81         if (value != null) {
82             // escape any html style / head
83             value = mxUtils.getBodyMarkup(value, false);
84         }
85
86         String style = atts.getValue("style");
87         if (style != null) {
88             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.STYLE, style);
89         }
90
91         String strUID = atts.getValue("id");
92         if (strUID != null) {
93             saxHandler.allChildren.peek().put(strUID, uid);
94         }
95
96         switch (found) {
97             case AfficheBlock:
98                 block = new AfficheBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
99                 break;
100             case BasicBlock:
101                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
102                 break;
103             case BigSom:
104                 block = new BigSom(saxHandler.controller, uid, kind, value, null, style, strUID);
105                 break;
106             case ConstBlock:
107                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
108                 break;
109             case EventInBlock:
110                 block = new EventInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
111                 break;
112             case EventOutBlock:
113                 block = new EventOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
114                 break;
115             case ExplicitInBlock:
116                 block = new ExplicitInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
117                 break;
118             case ExplicitOutBlock:
119                 block = new ExplicitOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
120                 break;
121             case GainBlock:
122                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
123                 break;
124             case GroundBlock:
125                 block = new GroundBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
126                 break;
127             case ImplicitInBlock:
128                 block = new ImplicitInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
129                 break;
130             case ImplicitOutBlock:
131                 block = new ImplicitOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
132                 break;
133             case PrintBlock:
134                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
135                 break;
136             case Product:
137                 block = new Product(saxHandler.controller, uid, kind, value, null, style, strUID);
138                 break;
139             case RoundBlock:
140                 block = new RoundBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
141                 break;
142             case SplitBlock:
143                 block = new SplitBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
144                 break;
145             case Summation:
146                 block = new Summation(saxHandler.controller, uid, kind, value, null, style, strUID);
147                 break;
148             case SuperBlock:
149                 block = new SuperBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
150                 break;
151             case TextBlock:
152                 block = new TextBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
153                 break;
154             case VoltageSensorBlock:
155                 block = new VoltageSensorBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
156                 break;
157             default:
158                 throw new IllegalArgumentException();
159         }
160
161         /*
162          * Set the attributes
163          */
164         v = atts.getValue("interfaceFunctionName");
165         if (v != null) {
166             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, v);
167         } else if (kind == Kind.BLOCK) {
168             // Setup the interface function accordingly to the mapping table
169             // by default it is empty and might not be serialized (depending on
170             // the class)
171             String defaultInterfaceFunction = Arrays.stream(BlockInterFunction.values()).filter(n -> n.getKlass().equals(block.getClass())).map(e -> e.name())
172                                               .findFirst().get();
173             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, defaultInterfaceFunction);
174         }
175         v = atts.getValue("simulationFunctionName");
176         if (v != null) {
177             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_FUNCTION_NAME, v);
178         }
179         v = atts.getValue("blockType");
180         if (v != null) {
181             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_BLOCKTYPE, v);
182         }
183         VectorOfInt vecOfInt = new VectorOfInt(2);
184         v = atts.getValue("dependsOnU");
185         if ("1".equals(v)) {
186             vecOfInt.set(0, 1);
187         }
188         v = atts.getValue("dependsOnT");
189         if ("1".equals(v)) {
190             vecOfInt.set(1, 1);
191         }
192         saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_DEP_UT, vecOfInt);
193         v = atts.getValue("simulationFunctionType");
194         if (v != null) {
195             SimulationFunctionType type = SimulationFunctionType.valueOf(v);
196             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_FUNCTION_API, type.getValue());
197         }
198
199         saxHandler.insertChild(block);
200         return block;
201     }
202
203     @Override
204     public void endElement(HandledElement found) {
205     }
206 }