1 package org.simantics.databoard.serialization;
\r
3 import java.util.Map;
\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
55 * Default serializer factory creates serializers that follow databoard serialization
\r
58 * <a href="http://dev.simantics.org/index.php/Org.simantics.datatype_Manual#Binary_Serialization">Binary Serialization format</a>
\r
61 * @author Toni Kalajainen
\r
63 public class DefaultSerializerFactory extends SerializerFactory {
\r
66 * Construct a new serializer.
\r
68 public DefaultSerializerFactory() {
\r
73 * Construct a new serializer factory that places constructed serializers
\r
74 * into user given repository.
\r
78 public DefaultSerializerFactory(Map<Binding, Serializer> repository) {
\r
83 protected Serializer doConstruct(Binding binding)
\r
84 throws SerializerConstructionException {
\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
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
104 if (binding instanceof RecordBinding) {
\r
105 RecordBinding b = (RecordBinding) binding;
\r
106 Binding[] componentBindings = b.getComponentBindings();
\r
107 int count = b.getComponentCount();
\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
116 result.finalizeConstruction();
\r
117 inprogress.remove(binding);
\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
126 result.finalizeConstruction();
\r
127 inprogress.remove(binding);
\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
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
144 result.finalizeConstruction();
\r
145 inprogress.remove(binding);
\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
160 if (binding instanceof ArrayBinding) {
\r
161 ArrayBinding b = (ArrayBinding) binding;
\r
162 ArrayType type = (ArrayType) b.type();
\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
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
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
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
205 throw new SerializerConstructionException("Cannot serialize "+binding.getClass().getName());
\r
209 public boolean supportsBinding(Binding binding) {
\r