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