]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/impl/LongArraySerializer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / serialization / impl / LongArraySerializer.java
1 package org.simantics.databoard.serialization.impl;\r
2 \r
3 import java.io.DataInput;\r
4 import java.io.DataOutput;\r
5 import java.io.IOException;\r
6 import java.util.List;\r
7 \r
8 import org.simantics.databoard.binding.ArrayBinding;\r
9 import org.simantics.databoard.binding.error.BindingException;\r
10 import org.simantics.databoard.serialization.SerializationException;\r
11 import org.simantics.databoard.serialization.Serializer.NonRecursiveSerializer;\r
12 import org.simantics.databoard.type.ArrayType;\r
13 import org.simantics.databoard.util.Range;\r
14 \r
15 public class LongArraySerializer extends NonRecursiveSerializer {\r
16 \r
17         Range length;\r
18         Integer fixedLength, fixedSize;\r
19         \r
20         public LongArraySerializer(ArrayBinding binding)\r
21         {\r
22                 ArrayType arrayType = (ArrayType) binding.type();\r
23                 this.length = arrayType.getLength();\r
24                 if (length!=null && length.getLower().equals(length.getUpper()) && length.getLower().getValue()!=null)\r
25                 {\r
26                         fixedLength = length.getLower().getValue().intValue();\r
27                         fixedSize = fixedLength * 8;\r
28                 }\r
29         }\r
30         \r
31         @Override\r
32         public Object deserialize(DataInput in)\r
33         throws IOException \r
34         {\r
35                 int length = fixedSize != null ? fixedLength : in.readInt();                    \r
36                 if (length<0) throw new SerializationException("Cannot use negative array length");\r
37                 assertRemainingBytes(in, length*8L);                                    \r
38 \r
39                 long[] array = new long[length];\r
40                 for(int i=0;i<array.length;++i)\r
41                         array[i] = in.readLong();\r
42                 return array;\r
43         }\r
44         \r
45         public Object deserializeToTry(DataInput in, List<Object> identities, Object obj) throws IOException\r
46         {\r
47                 int length = fixedLength != null ? fixedLength : in.readInt();\r
48                 long[] array = (long[]) obj;\r
49                 if (length!=array.length) array = new long[ length ];\r
50                 assertRemainingBytes(in, length*8L);                                    \r
51                 \r
52                 for (int i=0; i<array.length;i++)\r
53                         array[i] = in.readLong();\r
54                 \r
55                 return array;\r
56         }\r
57         \r
58 \r
59         @Override\r
60         public void deserializeTo(DataInput in, Object obj) throws IOException {\r
61                 try {\r
62                         int length = fixedLength != null ? fixedLength : in.readInt();\r
63                         long[] array = (long[]) obj;\r
64                         if (length!=array.length) throw new BindingException("primitive array is size immutable");\r
65                         assertRemainingBytes(in, length*8L);                                    \r
66                         for (int i=0; i<array.length;i++)\r
67                                 array[i] = in.readLong();\r
68                 } catch (BindingException e) {\r
69                         throw new IOException( e ); \r
70                 }\r
71         }\r
72 \r
73         @Override\r
74         public void skip(DataInput in)\r
75         throws IOException {\r
76                 int length = fixedSize != null ? fixedLength : in.readInt();                    \r
77                 in.skipBytes(8* length);                        \r
78         }\r
79         \r
80         @Override\r
81         public void serialize(DataOutput out, Object obj)\r
82         throws IOException \r
83         {\r
84                 long[] array = (long[])obj;\r
85                 if (fixedSize==null) \r
86                         out.writeInt(array.length);\r
87                 for(long f : array)\r
88                         out.writeLong(f);\r
89         }\r
90 \r
91         @Override\r
92         public Integer getConstantSize() {\r
93                 return fixedSize;\r
94         }\r
95 \r
96         @Override\r
97         public int getSize(Object obj) {\r
98                 if (fixedSize!=null) return fixedSize;\r
99                 long[] array = (long[])obj;                     \r
100                 return 4 + 8 * array.length;\r
101         }\r
102         \r
103         @Override\r
104         public int getMinSize() {\r
105                 return fixedSize != null ? fixedSize : 4;\r
106         }\r
107         \r
108 }\r