]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultSerializerFactory.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / serialization / DefaultSerializerFactory.java
1 package org.simantics.databoard.serialization;\r
2 \r
3 import java.util.Map;\r
4 \r
5 import org.simantics.databoard.binding.ArrayBinding;\r
6 import org.simantics.databoard.binding.Binding;\r
7 import org.simantics.databoard.binding.BooleanBinding;\r
8 import org.simantics.databoard.binding.ByteBinding;\r
9 import org.simantics.databoard.binding.DoubleBinding;\r
10 import org.simantics.databoard.binding.FloatBinding;\r
11 import org.simantics.databoard.binding.IntegerBinding;\r
12 import org.simantics.databoard.binding.LongBinding;\r
13 import org.simantics.databoard.binding.MapBinding;\r
14 import org.simantics.databoard.binding.OptionalBinding;\r
15 import org.simantics.databoard.binding.RecordBinding;\r
16 import org.simantics.databoard.binding.StringBinding;\r
17 import org.simantics.databoard.binding.UnionBinding;\r
18 import org.simantics.databoard.binding.VariantBinding;\r
19 import org.simantics.databoard.binding.impl.BooleanArrayBinding;\r
20 import org.simantics.databoard.binding.impl.ByteArrayBinding;\r
21 import org.simantics.databoard.binding.impl.DoubleArrayBinding;\r
22 import org.simantics.databoard.binding.impl.FloatArrayBinding;\r
23 import org.simantics.databoard.binding.impl.IntArrayBinding;\r
24 import org.simantics.databoard.binding.impl.LongArrayBinding;\r
25 import org.simantics.databoard.serialization.impl.ArraySerializer;\r
26 import org.simantics.databoard.serialization.impl.BooleanArraySerializer;\r
27 import org.simantics.databoard.serialization.impl.BooleanSerializer;\r
28 import org.simantics.databoard.serialization.impl.ByteArraySerializer;\r
29 import org.simantics.databoard.serialization.impl.ByteSerializer;\r
30 import org.simantics.databoard.serialization.impl.DoubleArraySerializer;\r
31 import org.simantics.databoard.serialization.impl.DoubleSerializer;\r
32 import org.simantics.databoard.serialization.impl.FloatArraySerializer;\r
33 import org.simantics.databoard.serialization.impl.FloatSerializer;\r
34 import org.simantics.databoard.serialization.impl.GenericRecordSerializer;\r
35 import org.simantics.databoard.serialization.impl.IntArraySerializer;\r
36 import org.simantics.databoard.serialization.impl.IntSerializer;\r
37 import org.simantics.databoard.serialization.impl.LongArraySerializer;\r
38 import org.simantics.databoard.serialization.impl.LongSerializer;\r
39 import org.simantics.databoard.serialization.impl.MapSerializer;\r
40 import org.simantics.databoard.serialization.impl.ModifiedUTF8StringSerializer;\r
41 import org.simantics.databoard.serialization.impl.MutableVariantSerializer;\r
42 import org.simantics.databoard.serialization.impl.OptionalSerializer;\r
43 import org.simantics.databoard.serialization.impl.ReferableRecordSerializer;\r
44 import org.simantics.databoard.serialization.impl.UnionSerializer;\r
45 import org.simantics.databoard.serialization.impl.VariantSerializer;\r
46 import org.simantics.databoard.type.ArrayType;\r
47 import org.simantics.databoard.type.BooleanType;\r
48 import org.simantics.databoard.type.ByteType;\r
49 import org.simantics.databoard.type.DoubleType;\r
50 import org.simantics.databoard.type.FloatType;\r
51 import org.simantics.databoard.type.IntegerType;\r
52 import org.simantics.databoard.type.LongType;\r
53 \r
54 /**\r
55  * Default serializer factory creates serializers that follow databoard serialization\r
56  * specification.\r
57  * \r
58  * <a href="http://dev.simantics.org/index.php/Org.simantics.datatype_Manual#Binary_Serialization">Binary Serialization format</a>\r
59  *\r
60  * \r
61  * @author Toni Kalajainen\r
62  */\r
63 public class DefaultSerializerFactory extends SerializerFactory {\r
64 \r
65         /**\r
66          * Construct a new serializer.\r
67          */\r
68         public DefaultSerializerFactory() {\r
69                 super();\r
70         }\r
71         \r
72         /**\r
73          * Construct a new serializer factory that places constructed serializers\r
74          * into user given repository.\r
75          * \r
76          * @param repository\r
77          */\r
78         public DefaultSerializerFactory(Map<Binding, Serializer> repository) {\r
79                 super(repository);\r
80         }       \r
81 \r
82         @Override\r
83         protected Serializer doConstruct(Binding binding)\r
84                         throws SerializerConstructionException {\r
85             \r
86             // Specialized serializers\r
87             if(binding instanceof SpecializedSerializerProvider) {\r
88                 Serializer specializedSerializer = \r
89                     ((SpecializedSerializerProvider)binding).getSpecializedSerializer();\r
90                 if(specializedSerializer != null)\r
91                     return specializedSerializer;\r
92             }\r
93                 \r
94                 // Primitives\r
95                 if (binding instanceof BooleanBinding) return new BooleanSerializer( (BooleanBinding) binding );\r
96                 if (binding instanceof ByteBinding) return new ByteSerializer( (ByteBinding) binding );\r
97                 if (binding instanceof IntegerBinding) return new IntSerializer( (IntegerBinding) binding );\r
98                 if (binding instanceof LongBinding) return new LongSerializer( (LongBinding) binding );\r
99                 if (binding instanceof FloatBinding) return new FloatSerializer( (FloatBinding) binding );\r
100                 if (binding instanceof DoubleBinding) return new DoubleSerializer( (DoubleBinding) binding );\r
101                 if (binding instanceof StringBinding) return new ModifiedUTF8StringSerializer( (StringBinding) binding );\r
102 \r
103                 // Record\r
104                 if (binding instanceof RecordBinding) {\r
105                         RecordBinding b = (RecordBinding) binding;\r
106                         Binding[] componentBindings = b.getComponentBindings();\r
107                         int count = b.getComponentCount();\r
108                         \r
109                         if ( b.type().isReferable() ) {\r
110                                 ReferableRecordSerializer result = new ReferableRecordSerializer(b, null);\r
111                                 inprogress.put(binding, result);                                \r
112                                 result.componentSerializers = new Serializer[count];\r
113                                 for (int i=0; i<count; i++) {\r
114                                         result.componentSerializers[i] = construct( componentBindings[i] );\r
115                                 }                               \r
116                                 result.finalizeConstruction();\r
117                                 inprogress.remove(binding);\r
118                                 return result;\r
119                         } else {\r
120                                 GenericRecordSerializer result = new GenericRecordSerializer(b, null);\r
121                                 inprogress.put(binding, result);                                \r
122                                 result.componentSerializers = new Serializer[count];\r
123                                 for (int i=0; i<count; i++) {\r
124                                         result.componentSerializers[i] = construct( componentBindings[i] );\r
125                                 }                               \r
126                                 result.finalizeConstruction();\r
127                                 inprogress.remove(binding);\r
128                                 return result;                                  \r
129                         }\r
130                 }               \r
131                 \r
132                 // Union\r
133                 if (binding instanceof UnionBinding) {\r
134                         UnionBinding b = (UnionBinding) binding;\r
135                         Binding[] componentBindings = b.getComponentBindings();\r
136                         int count = b.getComponentCount();\r
137                         \r
138                         UnionSerializer result = new UnionSerializer(b, null);\r
139                         inprogress.put(binding, result);                                \r
140                         result.componentSerializers = new Serializer[count];\r
141                         for (int i=0; i<count; i++) {\r
142                                 result.componentSerializers[i] = construct( componentBindings[i] );\r
143                         }                               \r
144                         result.finalizeConstruction();\r
145                         inprogress.remove(binding);\r
146                         return result;\r
147                 }                       \r
148                 \r
149                 // Optional\r
150                 if (binding instanceof OptionalBinding) {\r
151                         OptionalBinding b = (OptionalBinding) binding;\r
152                         OptionalSerializer result = new OptionalSerializer(b, null);\r
153                         inprogress.put(binding, result);\r
154                         result.componentSerializer = construct( b.getComponentBinding() );\r
155                         inprogress.remove(binding);\r
156                         return result;                  \r
157                 }               \r
158                 \r
159                 // Array\r
160                 if (binding instanceof ArrayBinding) {\r
161                         ArrayBinding b = (ArrayBinding) binding;\r
162                         ArrayType type = (ArrayType) b.type();\r
163                         \r
164                         if( b instanceof FloatArrayBinding && type.componentType instanceof FloatType )\r
165                                 return new FloatArraySerializer(b);\r
166                         if(b instanceof DoubleArrayBinding && type.componentType instanceof DoubleType )\r
167                                 return new DoubleArraySerializer(b);\r
168                         if(b instanceof IntArrayBinding && type.componentType instanceof IntegerType )\r
169                                 return new IntArraySerializer(b);\r
170                         if(b instanceof ByteArrayBinding && type.componentType instanceof ByteType )\r
171                                 return new ByteArraySerializer(b);\r
172                         if(b instanceof BooleanArrayBinding && type.componentType instanceof BooleanType )\r
173                                 return new BooleanArraySerializer(b);\r
174                         if(b instanceof LongArrayBinding && type.componentType instanceof LongType )\r
175                                 return new LongArraySerializer(b);\r
176                         \r
177                         ArraySerializer result = new ArraySerializer(b, null);\r
178                         inprogress.put(binding, result);\r
179                         result.componentSerializer = construct( b.getComponentBinding() );\r
180                         result.finalizeConstruction();\r
181                         inprogress.remove(binding);\r
182                         return result;                  \r
183                 }\r
184                 \r
185                 // Map\r
186                 if (binding instanceof MapBinding) {\r
187                         MapBinding b = (MapBinding) binding;                    \r
188                         MapSerializer result = new MapSerializer(b, null, null);\r
189                         inprogress.put(binding, result);\r
190                         result.keySerializer = construct( b.getKeyBinding() );\r
191                         result.valueSerializer = construct( b.getValueBinding() );\r
192                         result.finalizeConstruction();\r
193                         inprogress.remove(binding);\r
194                         return result;                  \r
195                 }               \r
196                 \r
197                 // Variant\r
198                 if (binding instanceof VariantBinding) {\r
199                         VariantSerializer result = binding.isImmutable() ? new VariantSerializer((VariantBinding)binding, this)\r
200                                                                          : new MutableVariantSerializer((VariantBinding)binding, this );\r
201                         result.finalizeConstruction();\r
202                         return result;\r
203                 }\r
204                 \r
205                 throw new SerializerConstructionException("Cannot serialize "+binding.getClass().getName());\r
206         }\r
207 \r
208         @Override\r
209         public boolean supportsBinding(Binding binding) {\r
210                 return true;\r
211         }\r
212         \r
213 }\r