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