]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.graph/src/org/simantics/graph/representation/TransferableGraph1Serializer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph / src / org / simantics / graph / representation / TransferableGraph1Serializer.java
1 package org.simantics.graph.representation;\r
2 \r
3 \r
4 import gnu.trove.map.hash.TObjectIntHashMap;\r
5 \r
6 import java.io.DataInput;\r
7 import java.io.DataOutput;\r
8 import java.io.File;\r
9 import java.io.IOException;\r
10 import java.io.InputStream;\r
11 import java.io.UTFDataFormatException;\r
12 import java.util.List;\r
13 \r
14 import org.simantics.databoard.Bindings;\r
15 import org.simantics.databoard.serialization.Serializer;\r
16 \r
17 public class TransferableGraph1Serializer extends Serializer {\r
18 \r
19     public static final TransferableGraph1Serializer INSTANCE = \r
20             new TransferableGraph1Serializer();\r
21     \r
22     private TransferableGraph1Serializer() {}\r
23     \r
24         static int writeUTF(String str, byte[] bytearr, int byteIndex) throws IOException {\r
25                 \r
26                 int strlen = str.length();\r
27                 int utflen = 0;\r
28                 int c;\r
29                 int count = byteIndex;\r
30 \r
31                 /* use charAt instead of copying String to char array */\r
32                 for (int i = 0; i < strlen; i++) {\r
33                         c = str.charAt(i);\r
34                         if ((c >= 0x0001) && (c <= 0x007F)) {\r
35                                 utflen++;\r
36                         } else if (c > 0x07FF) {\r
37                                 utflen += 3;\r
38                         } else {\r
39                                 utflen += 2;\r
40                         }\r
41                 }\r
42 \r
43                 if (utflen > 65535)\r
44                         throw new UTFDataFormatException(\r
45                                         "encoded string too long: " + utflen + " bytes");\r
46 \r
47                 if(utflen < 0x80) {\r
48                         bytearr[count++] = ((byte)utflen);\r
49                 }\r
50                 else {\r
51                         utflen -= 0x80;\r
52                         if(utflen < 0x4000) {\r
53                                 bytearr[count++] = (byte)( ((utflen&0x3f) | 0x80) );\r
54                                 bytearr[count++] = (byte)( (utflen>>>6) );\r
55                         }\r
56                         else {\r
57                                 utflen -= 0x4000;\r
58                                 if(utflen < 0x200000) {\r
59                                         bytearr[count++] = (byte)( ((utflen&0x1f) | 0xc0) );\r
60                                         bytearr[count++] = (byte)( ((utflen>>>5)&0xff) );\r
61                                         bytearr[count++] = (byte)( ((utflen>>>13)&0xff) );      \r
62                                 }\r
63                                 else {\r
64                                         utflen -= 0x200000;\r
65                                         if(utflen < 0x10000000) {\r
66                                                 bytearr[count++] = (byte)( ((utflen&0x0f) | 0xe0) );\r
67                                                 bytearr[count++] = (byte)( ((utflen>>>4)&0xff) );\r
68                                                 bytearr[count++] = (byte)( ((utflen>>>12)&0xff) );      \r
69                                                 bytearr[count++] = (byte)( ((utflen>>>20)&0xff) );\r
70                                         }\r
71                                         else {\r
72                                                 utflen -= 0x10000000;\r
73                                                 bytearr[count++] = (byte)( ((utflen&0x07) | 0xf0) );\r
74                                                 bytearr[count++] = (byte)( ((utflen>>>3)&0xff) );\r
75                                                 bytearr[count++] = (byte)( ((utflen>>>11)&0xff) );      \r
76                                                 bytearr[count++] = (byte)( ((utflen>>>19)&0xff) );\r
77                                                 bytearr[count++] = (byte)( ((utflen>>>27)&0xff) );\r
78                                         }\r
79                                 }                               \r
80                         }\r
81                 }       \r
82 \r
83                 int i=0;\r
84                 for (i=0; i<strlen; i++) {\r
85                         c = str.charAt(i);\r
86                         if (!((c >= 0x0001) && (c <= 0x007F))) break;\r
87                         bytearr[count++] = (byte) c;\r
88                 }\r
89 \r
90                 for (;i < strlen; i++){\r
91                         c = str.charAt(i);\r
92                         if ((c >= 0x0001) && (c <= 0x007F)) {\r
93                                 bytearr[count++] = (byte) c;\r
94 \r
95                         } else if (c > 0x07FF) {\r
96                                 bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));\r
97                                 bytearr[count++] = (byte) (0x80 | ((c >>  6) & 0x3F));\r
98                                 bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));\r
99                         } else {\r
100                                 bytearr[count++] = (byte) (0xC0 | ((c >>  6) & 0x1F));\r
101                                 bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));\r
102                         }\r
103                 }\r
104                 \r
105                 return count - byteIndex;\r
106                 \r
107         }\r
108         \r
109         @Override\r
110         public Object deserialize(File file) throws IOException {\r
111                 TransferableGraphFileReader reader = new TransferableGraphFileReader(file);\r
112                 try {\r
113                         return reader.readTG();\r
114                 } finally {\r
115                         reader.close();\r
116                 }\r
117         }\r
118         \r
119         public Object deserialize(InputStream in) throws IOException {\r
120                 TransferableGraphFileReader reader = new TransferableGraphFileReader(in);\r
121                 try {\r
122                         return reader.readTG();\r
123                 } finally {\r
124                         reader.close();\r
125                 }\r
126         }\r
127         \r
128         @Override\r
129         public byte[] serialize(Object obj) throws IOException {\r
130                 \r
131                 TransferableGraph1 tg = (TransferableGraph1)obj;\r
132 \r
133                 Extensions ex = new Extensions(tg.extensions);\r
134                 byte[] extensions = Bindings.getSerializerUnchecked(Bindings.getBindingUnchecked(Extensions.class)).serialize(ex);\r
135 \r
136                 Serializer variantSerializer = Bindings.getSerializerUnchecked(Bindings.VARIANT);\r
137                 \r
138                 int actualSize = 16 + 4*tg.values.length + 4*tg.statements.length + 5*tg.identities.length + extensions.length;\r
139                 for(Value v : tg.values) actualSize += variantSerializer.getSize(v.value);\r
140                 for(Identity id : tg.identities) { \r
141                         if(id.definition instanceof Internal) actualSize += (4 + ((Internal)id.definition).name.length() + 5);\r
142                         else if(id.definition instanceof External) actualSize += (4 + ((External)id.definition).name.length() + 5);\r
143                         else if(id.definition instanceof Root) actualSize += (((Root)id.definition).name.length() + ((Root)id.definition).type.length() + 10);\r
144                         else if(id.definition instanceof Optional) actualSize += (4 + ((Optional)id.definition).name.length() + 5);\r
145                 }\r
146                 \r
147                 byte[] bytes = new byte[actualSize];\r
148                 int byteIndex = 0;\r
149 \r
150                 int i = tg.resourceCount;\r
151                 \r
152                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
153                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
154                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
155                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
156                 byteIndex+=4;\r
157                 \r
158                 i = tg.identities.length;\r
159 \r
160                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
161                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
162                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
163                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
164                 byteIndex+=4;\r
165                 \r
166                 for(Identity id : tg.identities) {\r
167 \r
168                         i = id.resource;\r
169                         bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
170                         bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
171                         bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
172                         bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
173                         byteIndex+=4;\r
174                         \r
175                         if(id.definition instanceof Internal) {\r
176 \r
177                                 Internal r = (Internal)id.definition;\r
178 \r
179                                 bytes[byteIndex++] = 3;\r
180 \r
181                                 i = r.parent;\r
182                                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
183                                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
184                                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
185                                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
186                                 byteIndex+=4;\r
187                                 \r
188                                 byteIndex += writeUTF(r.name, bytes, byteIndex);\r
189 \r
190                         } else if(id.definition instanceof External) {\r
191 \r
192                                 External r = (External)id.definition;\r
193 \r
194                                 bytes[byteIndex++] = 1;\r
195 \r
196                                 i = r.parent;\r
197                                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
198                                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
199                                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
200                                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
201                                 byteIndex+=4;\r
202                                 \r
203                                 byteIndex += writeUTF(r.name, bytes, byteIndex);\r
204                                 \r
205                         } else if(id.definition instanceof Root) {\r
206                                 \r
207                                 bytes[byteIndex++] = 0;\r
208                                 \r
209                                 Root r = (Root)id.definition;\r
210                                 byteIndex += writeUTF(r.name, bytes, byteIndex);\r
211                                 byteIndex += writeUTF(r.type, bytes, byteIndex);\r
212                                 \r
213                         } else if(id.definition instanceof Optional) {\r
214 \r
215                                 Optional r = (Optional)id.definition;\r
216 \r
217                                 bytes[byteIndex++] = 2;\r
218 \r
219                                 i = r.parent;\r
220                                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
221                                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
222                                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
223                                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
224                                 byteIndex+=4;\r
225                                 \r
226                                 byteIndex += writeUTF(r.name, bytes, byteIndex);\r
227                                 \r
228                         }\r
229                         \r
230                 }\r
231                 \r
232                 i = tg.statements.length;\r
233                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
234                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
235                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
236                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
237                 byteIndex+=4;\r
238                 \r
239                 for(int s : tg.statements) {\r
240                         i = s;\r
241                         bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
242                         bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
243                         bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
244                         bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
245                         byteIndex+=4;\r
246                 }\r
247 \r
248                 i = tg.values.length;\r
249                 bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
250                 bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
251                 bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
252                 bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
253                 byteIndex+=4;\r
254                 \r
255                 for(Value v : tg.values) {\r
256                         \r
257                         i = v.resource;\r
258                         bytes[byteIndex+3] = (byte)(i & 0xFF);i >>>= 8;\r
259                         bytes[byteIndex+2] = (byte)(i & 0xFF);i >>>= 8;\r
260                         bytes[byteIndex+1] = (byte)(i & 0xFF);i >>>= 8;\r
261                         bytes[byteIndex] = (byte)(i & 0xFF);i >>>= 8;\r
262                         byteIndex+=4;\r
263 \r
264                         byte[] temp = variantSerializer.serialize(v.value);\r
265                         System.arraycopy(temp, 0, bytes, byteIndex, temp.length);\r
266                         byteIndex += temp.length;                       \r
267                 }\r
268 \r
269                 System.arraycopy(extensions, 0, bytes, byteIndex, extensions.length);\r
270                 \r
271                 return bytes; \r
272                 \r
273         }\r
274         \r
275         @Override\r
276         public void serialize(DataOutput out, TObjectIntHashMap<Object> identities,\r
277                         Object obj) throws IOException {\r
278                 TransferableGraph1.SERIALIZER.serialize(out, identities, obj);\r
279         }\r
280 \r
281         @Override\r
282         public void serialize(DataOutput out, Object obj) throws IOException {\r
283                 TransferableGraph1.SERIALIZER.serialize(out, obj);\r
284         }\r
285 \r
286         @Override\r
287         public Object deserialize(DataInput in, List<Object> identities)\r
288                         throws IOException {\r
289                 return TransferableGraph1.SERIALIZER.deserialize(in, identities);\r
290         }\r
291 \r
292         @Override\r
293         public Object deserialize(DataInput in) throws IOException {\r
294                 return TransferableGraph1.SERIALIZER.deserialize(in);\r
295         }\r
296 \r
297         @Override\r
298         public void deserializeTo(DataInput in, List<Object> identities, Object obj)\r
299                         throws IOException {\r
300                 TransferableGraph1.SERIALIZER.deserializeTo(in, identities, obj);\r
301         }\r
302 \r
303         @Override\r
304         public void deserializeTo(DataInput in, Object obj) throws IOException {\r
305                 TransferableGraph1.SERIALIZER.deserializeTo(in, obj);\r
306         }\r
307 \r
308         @Override\r
309         public void skip(DataInput in, List<Object> identities) throws IOException {\r
310                 TransferableGraph1.SERIALIZER.skip(in, identities);\r
311         }\r
312 \r
313         @Override\r
314         public void skip(DataInput in) throws IOException {\r
315                 TransferableGraph1.SERIALIZER.skip(in);\r
316         }\r
317 \r
318         @Override\r
319         public Integer getConstantSize() {\r
320                 return TransferableGraph1.SERIALIZER.getConstantSize();\r
321         }\r
322 \r
323         @Override\r
324         public int getSize(Object obj, TObjectIntHashMap<Object> identities)\r
325                         throws IOException {\r
326                 return TransferableGraph1.SERIALIZER.getSize(obj, identities);\r
327         }\r
328 \r
329         @Override\r
330         public int getSize(Object obj) throws IOException {\r
331                 return TransferableGraph1.SERIALIZER.getSize(obj);\r
332         }\r
333 \r
334         @Override\r
335         public int getMinSize() {\r
336                 return TransferableGraph1.SERIALIZER.getMinSize();\r
337         }\r
338 \r
339 }\r