01f86729beb1bd4e2c4ee874976fe7ad5bed81e6
[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.block.AfficheBlock;
23 import org.scilab.modules.xcos.block.BasicBlock;
24 import org.scilab.modules.xcos.block.BasicBlock.SimulationFunctionType;
25 import org.scilab.modules.xcos.block.SplitBlock;
26 import org.scilab.modules.xcos.block.SuperBlock;
27 import org.scilab.modules.xcos.block.TextBlock;
28 import org.scilab.modules.xcos.block.io.EventInBlock;
29 import org.scilab.modules.xcos.block.io.EventOutBlock;
30 import org.scilab.modules.xcos.block.io.ExplicitInBlock;
31 import org.scilab.modules.xcos.block.io.ExplicitOutBlock;
32 import org.scilab.modules.xcos.block.io.ImplicitInBlock;
33 import org.scilab.modules.xcos.block.io.ImplicitOutBlock;
34 import org.scilab.modules.xcos.block.positionning.BigSom;
35 import org.scilab.modules.xcos.block.positionning.GroundBlock;
36 import org.scilab.modules.xcos.block.positionning.Product;
37 import org.scilab.modules.xcos.block.positionning.RoundBlock;
38 import org.scilab.modules.xcos.block.positionning.Summation;
39 import org.scilab.modules.xcos.block.positionning.VoltageSensorBlock;
40 import org.scilab.modules.xcos.graph.model.BlockInterFunction;
41 import org.scilab.modules.xcos.io.HandledElement;
42 import org.xml.sax.Attributes;
43
44 class BlockHandler implements ScilabHandler {
45
46     private final XcosSAXHandler saxHandler;
47
48     /**
49      * Default constructor
50      * @param saxHandler the shared sax handler
51      */
52     BlockHandler(XcosSAXHandler saxHandler) {
53         this.saxHandler = saxHandler;
54     }
55
56     @Override
57     public BasicBlock startElement(HandledElement found, Attributes atts) {
58         String v;
59         BasicBlock block;
60         Kind kind;
61         if (found == HandledElement.TextBlock) {
62             kind = Kind.ANNOTATION;
63         } else {
64             kind = Kind.BLOCK;
65         }
66         final long uid = saxHandler.controller.createObject(kind);
67
68         String value = atts.getValue("value");
69         if (value != null) {
70             if (kind == Kind.BLOCK) {
71                 saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.LABEL, value);
72             } else { // ANNOTATION
73                 saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.DESCRIPTION, value);
74             }
75         }
76
77         String style = atts.getValue("style");
78         if (style != null) {
79             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.STYLE, style);
80         }
81
82         String strUID = atts.getValue("id");
83         if (strUID != null) {
84             saxHandler.allChildren.peek().put(strUID, uid);
85         }
86
87         switch (found) {
88             case AfficheBlock:
89                 block = new AfficheBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
90                 break;
91             case BasicBlock:
92                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
93                 break;
94             case BigSom:
95                 block = new BigSom(saxHandler.controller, uid, kind, value, null, style, strUID);
96                 break;
97             case ConstBlock:
98                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
99                 break;
100             case EventInBlock:
101                 block = new EventInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
102                 break;
103             case EventOutBlock:
104                 block = new EventOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
105                 break;
106             case ExplicitInBlock:
107                 block = new ExplicitInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
108                 break;
109             case ExplicitOutBlock:
110                 block = new ExplicitOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
111                 break;
112             case GainBlock:
113                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
114                 break;
115             case GroundBlock:
116                 block = new GroundBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
117                 break;
118             case ImplicitInBlock:
119                 block = new ImplicitInBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
120                 break;
121             case ImplicitOutBlock:
122                 block = new ImplicitOutBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
123                 break;
124             case PrintBlock:
125                 block = new BasicBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
126                 break;
127             case Product:
128                 block = new Product(saxHandler.controller, uid, kind, value, null, style, strUID);
129                 break;
130             case RoundBlock:
131                 block = new RoundBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
132                 break;
133             case SplitBlock:
134                 block = new SplitBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
135                 break;
136             case Summation:
137                 block = new Summation(saxHandler.controller, uid, kind, value, null, style, strUID);
138                 break;
139             case SuperBlock:
140                 block = new SuperBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
141                 break;
142             case TextBlock:
143                 block = new TextBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
144                 break;
145             case VoltageSensorBlock:
146                 block = new VoltageSensorBlock(saxHandler.controller, uid, kind, value, null, style, strUID);
147                 break;
148             default:
149                 throw new IllegalArgumentException();
150         }
151
152         /*
153          * Set the attributes
154          */
155         v = atts.getValue("interfaceFunctionName");
156         if (v != null) {
157             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, v);
158         } else if (kind == Kind.BLOCK) {
159             // Setup the interface function accordingly to the mapping table
160             // by default it is empty and might not be serialized (depending on
161             // the class)
162             String defaultInterfaceFunction = Arrays.stream(BlockInterFunction.values()).filter(n -> n.getKlass().equals(block.getClass())).map(e -> e.name())
163                                               .findFirst().get();
164             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.INTERFACE_FUNCTION, defaultInterfaceFunction);
165         }
166         v = atts.getValue("simulationFunctionName");
167         if (v != null) {
168             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_FUNCTION_NAME, v);
169         }
170         v = atts.getValue("blockType");
171         if (v != null) {
172             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_BLOCKTYPE, v);
173         }
174         v = atts.getValue("simulationFunctionType");
175         if (v != null) {
176             SimulationFunctionType type = SimulationFunctionType.valueOf(v);
177             saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.SIM_FUNCTION_API, type.getValue());
178         }
179
180         saxHandler.insertChild(block);
181         return block;
182     }
183
184     @Override
185     public void endElement(HandledElement found) {
186     }
187 }