Xcos: remove block default values
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / io / scicos / LabelElement.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - ClĂ©ment 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-en.txt
10  *
11  */
12
13 package org.scilab.modules.xcos.io.scicos;
14
15 import static java.util.Arrays.asList;
16
17 import java.util.List;
18
19 import org.scilab.modules.types.scilabTypes.ScilabMList;
20 import org.scilab.modules.types.scilabTypes.ScilabString;
21 import org.scilab.modules.types.scilabTypes.ScilabType;
22 import org.scilab.modules.xcos.block.TextBlock;
23 import org.scilab.modules.xcos.io.scicos.ScicosFormatException.WrongElementException;
24 import org.scilab.modules.xcos.io.scicos.ScicosFormatException.WrongStructureException;
25 import org.scilab.modules.xcos.io.scicos.ScicosFormatException.WrongTypeException;
26
27 /**
28  * Perform label transformation between Xcos and Scicos.
29  */
30 public class LabelElement extends AbstractElement<TextBlock> {
31         private static final List<String> DATA_FIELD_NAMES = asList("Text",
32                         "graphics", "model", "void", "gui");
33
34         /** Mutable field to easily get the data through methods */ 
35         private ScilabMList data;
36         
37         /** Element used to decode/encode Scicos model part into a BasicBlock*/
38         private final BlockModelElement modelElement = new BlockModelElement();
39         
40         /** Element used to decode/encode Scicos model part into a BasicBlock*/
41         private final BlockGraphicElement graphicElement = new BlockGraphicElement();
42         
43         /**
44          * Default constructor
45          */
46         public LabelElement() { }
47
48         /**
49          * Decode the element into the block.
50          * 
51          * @param element The current Scilab data
52          * @param into the target, if null a new instance is allocated and returned.
53          * @return the decoded block.
54          * @throws ScicosFormatException when e decoding error occurred.
55          * @see org.scilab.modules.xcos.io.scicos.Element#decode(org.scilab.modules.types.scilabTypes.ScilabType, java.lang.Object)
56          */
57         @Override
58         public TextBlock decode(ScilabType element, TextBlock into)
59                         throws ScicosFormatException {
60                 TextBlock block = into;
61                 data = (ScilabMList) element;
62                 
63                 validate();
64                 
65                 if (into == null) {
66                         block = new TextBlock();
67                 }
68                 
69                 /*
70                  * Fill block with the data structure
71                  */
72                 int field = 1;
73                 graphicElement.decode(data.get(field), block);
74                 
75                 field++;
76                 modelElement.decode(data.get(field), block);
77                 
78                 // interfunction, keep the default one
79                 field++;
80                 
81                 // doc, do nothing
82                 field++;
83                 
84                 /*
85                  * Fill Jgraphx properties
86                  */
87                 if (isEmptyField(block.getRealParameters())) {
88                         block.setValue("");
89                 } else {
90                         final String text = ((ScilabString) block.getRealParameters())
91                                         .getData()[0][0];
92                         block.setValue(text);
93                 }
94                 
95                 return block;
96         }
97
98         /**
99          * Validate the current data.
100          * 
101          * This method doesn't pass the metrics because it
102          * perform many test. Therefore all these tests are trivial and the
103          * conditioned action only throw an exception.
104          * 
105          * @throws ScicosFormatException
106          *             when there is a validation error.
107          */
108         // CSOFF: CyclomaticComplexity
109         // CSOFF: NPathComplexity
110         private void validate() throws ScicosFormatException {
111                 if (!canDecode(data)) {
112                         throw new WrongElementException();
113                 }
114                 
115                 int field = 0;
116                 
117                 // we test if the structure as enough field
118                 if (data.size() != DATA_FIELD_NAMES.size()) {
119                         throw new WrongStructureException(DATA_FIELD_NAMES);
120                 }
121                 
122                 /*
123                  * Checking the MList header
124                  */
125                 
126                 // Check the first field
127                 if (!(data.get(field) instanceof ScilabString)) {
128                         throw new WrongTypeException(DATA_FIELD_NAMES, field);
129                 }
130                 final String[] header = ((ScilabString) data.get(field)).getData()[0];
131                 
132                 // Checking for the field names
133                 if (header.length != DATA_FIELD_NAMES.size()) {
134                         throw new WrongStructureException(DATA_FIELD_NAMES);
135                 }
136                 for (int i = 0; i < header.length; i++) {
137                         if (!header[i].equals(DATA_FIELD_NAMES.get(i))) {
138                                 throw new WrongStructureException(DATA_FIELD_NAMES);
139                         }
140                 }
141                 
142                 /*
143                  * Checking the data
144                  */
145                 
146                 // the second field must contain list of all graphic property (how the
147                 // block will be displayed )
148                 field++;
149                 if (!(data.get(field) instanceof ScilabMList)) {
150                         throw new WrongTypeException(DATA_FIELD_NAMES, field);
151                 }
152                 
153                 // the third field must contains all the informations needed to compile
154                 // the block
155                 field++;
156                 if (!(data.get(field) instanceof ScilabMList)) {
157                         throw new WrongTypeException(DATA_FIELD_NAMES, field);
158                 }
159
160                 // the fourth field must contains an empty string
161                 field++;
162                 if (!(data.get(field) instanceof ScilabString)) {
163                         throw new WrongTypeException(DATA_FIELD_NAMES, field);
164                 }
165                 
166                 // the last field must contain a gui name
167                 field++;
168                 if (!(data.get(field) instanceof ScilabString)
169                                 && isEmptyField(data.get(field))) {
170                         throw new WrongTypeException(DATA_FIELD_NAMES, field);
171                 }
172         }
173         // CSON: CyclomaticComplexity
174         // CSON: NPathComplexity
175         
176         /**
177          * Test if the current implementation can be used to decode the element.
178          * 
179          * @param element the element to test
180          * @return true when the implementation is the right one, false otherwise.
181          * @see org.scilab.modules.xcos.io.scicos.Element#canDecode(org.scilab.modules.types.scilabTypes.ScilabType)
182          */
183         @Override
184         public boolean canDecode(ScilabType element) {
185                 data = (ScilabMList) element;
186                 
187                 final String type = ((ScilabString) data.get(0)).getData()[0][0];
188                 return type.equals(DATA_FIELD_NAMES.get(0));
189         }
190         
191         /**
192          * Not implemented yet
193          * 
194          * @param from not used
195          * @param element not used
196          * @return always null
197          * @see org.scilab.modules.xcos.io.scicos.Element#encode(java.lang.Object, org.scilab.modules.types.scilabTypes.ScilabType)
198          */
199         @Override
200         public ScilabType encode(TextBlock from, ScilabType element) {
201                 return null;
202         }
203
204 }