GPL + CeCILL Header change
[scilab.git] / scilab / modules / types / src / java / org / scilab / modules / types / ScilabList.java
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2011-2011 - DIGITEO - Calixte DENIZET
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  * === LICENSE_END ===
15  *
16  */
17
18 package org.scilab.modules.types;
19
20 import java.io.IOException;
21 import java.io.ObjectInput;
22 import java.io.ObjectOutput;
23 import java.util.ArrayList;
24 import java.util.Collection;
25
26 /**
27  * This class provides a representation on the Scilab List datatype<br>
28  * <br>
29  * This class is {@link java.io.Serializable} and any modification could impact
30  * load and store of data (Xcos files, Javasci saved data, etc...).<br>
31  * <br>
32  * Example:<BR>
33  * <code>
34  * ScilabList data = new ScilabList();<BR>
35  * data.add(new ScilabString("hello"));<BR>
36  * data.add(new ScilabDouble(2));<BR>
37  * </code>
38  *
39  * @see org.scilab.modules.javasci.Scilab
40  */
41 public class ScilabList extends ArrayList<ScilabType> implements ScilabType {
42
43     private static final long serialVersionUID = 6884293176289980909L;
44     private static final ScilabTypeEnum type = ScilabTypeEnum.sci_list;
45
46     private static final int VERSION = 0;
47
48     private String varName;
49
50     /**
51      * Construct an empty Scilab list.
52      */
53     public ScilabList() {
54         super();
55     }
56
57     /**
58      * Construct a list containing the elements of the specified collection, in
59      * the order that they are returned by the specified collection's iterator.
60      *
61      * @param c
62      *            the collection whose elements are to be placed into this list.
63      */
64     public ScilabList(Collection <? extends ScilabType > c) {
65         super(c);
66     }
67
68     /**
69      * Construct an empty mlist.
70      *
71      * Note that the first element of this collection is the header used by
72      * Scilab to find each field name.
73      */
74     public ScilabList(String varName) {
75         super();
76         this.varName = varName;
77     }
78
79     /**
80      * @param varName the variable name
81      * @param size the initial list size
82      */
83     public ScilabList(String varName, int size) {
84         super(size);
85         this.varName = varName;
86     }
87
88     /**
89      * {@inheritDoc}
90      */
91     public boolean isReference() {
92         return false;
93     }
94
95     /**
96      * {@inheritDoc}
97      */
98     public String getVarName() {
99         return varName;
100     }
101
102     /**
103      * {@inheritDoc}
104      */
105     public boolean isSwaped() {
106         return false;
107     }
108
109     /**
110      * @return 1 when there is data on the list, 0 otherwise.
111      * @see org.scilab.modules.types.ScilabType#getHeight()
112      */
113     @Override
114     public int getHeight() {
115         if (isEmpty()) {
116             return 0;
117         }
118         return 1;
119     }
120
121     /**
122      * Return the type of Scilab
123      *
124      * @return the type of Scilab
125      * @since 5.4.0
126      */
127     @Override
128     public ScilabTypeEnum getType() {
129         return type;
130     }
131
132     /**
133      * @return 1 when there is data on the list, 0 otherwise.
134      * @see org.scilab.modules.types.ScilabType#getWidth()
135      */
136     @Override
137     public int getWidth() {
138         if (isEmpty()) {
139             return 0;
140         }
141         return size();
142     }
143
144     /**
145      * Get a serialized list; The format is the following: i) returned[0] is an
146      * array of integers containing the Scilab type (ScilabTypeEunm) of the
147      * different elements of the list. ii) returned[i] for i&gt;=1 contains the
148      * serialized form of each items.
149      *
150      * @return a serialized SiclabList/
151      */
152     public Object[] getSerializedObject() {
153         int[] types = new int[size()];
154         Object[] items = new Object[types.length + 1];
155
156         for (int i = 0; i < types.length; i++) {
157             ScilabType var = get(i);
158             types[i] = var.getType().swigValue();
159             items[i + 1] = var.getSerializedObject();
160         }
161         items[0] = types;
162
163         return items;
164     }
165
166     @Override
167     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
168         int version = in.readInt();
169         switch (version) {
170             case 0:
171                 int size = in.readInt();
172                 ensureCapacity(size + 1);
173                 ArrayList list = (ArrayList) this;
174                 for (int i = 0; i < size; i++) {
175                     list.add(in.readObject());
176                 }
177                 varName = (String) in.readObject();
178                 break;
179             default:
180                 throw new ClassNotFoundException("A class ScilabList with a version " + version + " does not exists");
181         }
182     }
183
184     @Override
185     public void writeExternal(ObjectOutput out) throws IOException {
186         out.writeInt(VERSION);
187         out.writeInt(size());
188         for (Object var : (ArrayList) this) {
189             out.writeObject(var);
190         }
191         out.writeObject(varName);
192     }
193
194     /**
195      * Display the representation in the Scilab language of the type<BR>
196      * Note that the representation can be copied/pasted straight into Scilab
197      *
198      * @return the pretty-printed data
199      * @see java.util.AbstractCollection#toString()
200      */
201     @Override
202     public String toString() {
203         StringBuffer result = new StringBuffer();
204         if (isEmpty()) {
205             return "list()";
206         }
207
208         result.append("list(");
209         for (int i = 0; i < size(); i++) {
210             result.append(get(i));
211             if (i != size() - 1) {
212                 result.append(", ");
213             }
214         }
215         result.append(")");
216
217         return result.toString();
218     }
219 }