1 package org.simantics.databoard.serialization;
3 import org.simantics.databoard.binding.ArrayBinding;
4 import org.simantics.databoard.binding.Binding;
5 import org.simantics.databoard.binding.BooleanBinding;
6 import org.simantics.databoard.binding.ByteBinding;
7 import org.simantics.databoard.binding.DoubleBinding;
8 import org.simantics.databoard.binding.FloatBinding;
9 import org.simantics.databoard.binding.IntegerBinding;
10 import org.simantics.databoard.binding.LongBinding;
11 import org.simantics.databoard.binding.MapBinding;
12 import org.simantics.databoard.binding.OptionalBinding;
13 import org.simantics.databoard.binding.RecordBinding;
14 import org.simantics.databoard.binding.StringBinding;
15 import org.simantics.databoard.binding.UnionBinding;
16 import org.simantics.databoard.binding.VariantBinding;
17 import org.simantics.databoard.binding.impl.BooleanArrayBinding;
18 import org.simantics.databoard.binding.impl.ByteArrayBinding;
19 import org.simantics.databoard.binding.impl.DoubleArrayBinding;
20 import org.simantics.databoard.binding.impl.FloatArrayBinding;
21 import org.simantics.databoard.binding.impl.IntArrayBinding;
22 import org.simantics.databoard.binding.impl.LongArrayBinding;
23 import org.simantics.databoard.serialization.impl.ArraySerializer;
24 import org.simantics.databoard.serialization.impl.BooleanArraySerializer;
25 import org.simantics.databoard.serialization.impl.BooleanSerializer;
26 import org.simantics.databoard.serialization.impl.ByteArraySerializer;
27 import org.simantics.databoard.serialization.impl.ByteSerializer;
28 import org.simantics.databoard.serialization.impl.DoubleArraySerializer;
29 import org.simantics.databoard.serialization.impl.DoubleSerializer;
30 import org.simantics.databoard.serialization.impl.FloatArraySerializer;
31 import org.simantics.databoard.serialization.impl.FloatSerializer;
32 import org.simantics.databoard.serialization.impl.GenericRecordSerializer;
33 import org.simantics.databoard.serialization.impl.IntArraySerializer;
34 import org.simantics.databoard.serialization.impl.IntSerializer;
35 import org.simantics.databoard.serialization.impl.LongArraySerializer;
36 import org.simantics.databoard.serialization.impl.LongSerializer;
37 import org.simantics.databoard.serialization.impl.MapSerializer;
38 import org.simantics.databoard.serialization.impl.ModifiedUTF8StringSerializer;
39 import org.simantics.databoard.serialization.impl.MutableVariantSerializer;
40 import org.simantics.databoard.serialization.impl.OptionalSerializer;
41 import org.simantics.databoard.serialization.impl.ReferableRecordSerializer;
42 import org.simantics.databoard.serialization.impl.UnionSerializer;
43 import org.simantics.databoard.serialization.impl.VariantSerializer;
44 import org.simantics.databoard.type.ArrayType;
45 import org.simantics.databoard.type.BooleanType;
46 import org.simantics.databoard.type.ByteType;
47 import org.simantics.databoard.type.DoubleType;
48 import org.simantics.databoard.type.FloatType;
49 import org.simantics.databoard.type.IntegerType;
50 import org.simantics.databoard.type.LongType;
53 * @author Jani Simomaa
55 public class DefaultConcurrentSerializerFactory extends ConcurrentSerializerFactory {
58 protected Serializer doConstruct(Binding binding) throws SerializerConstructionException {
60 // Specialized serializers
61 if (binding instanceof SpecializedSerializerProvider) {
62 Serializer specializedSerializer = ((SpecializedSerializerProvider) binding).getSpecializedSerializer();
63 if (specializedSerializer != null)
64 return specializedSerializer;
68 if (binding instanceof BooleanBinding)
69 return new BooleanSerializer((BooleanBinding) binding);
70 if (binding instanceof ByteBinding)
71 return new ByteSerializer((ByteBinding) binding);
72 if (binding instanceof IntegerBinding)
73 return new IntSerializer((IntegerBinding) binding);
74 if (binding instanceof LongBinding)
75 return new LongSerializer((LongBinding) binding);
76 if (binding instanceof FloatBinding)
77 return new FloatSerializer((FloatBinding) binding);
78 if (binding instanceof DoubleBinding)
79 return new DoubleSerializer((DoubleBinding) binding);
80 if (binding instanceof StringBinding)
81 return new ModifiedUTF8StringSerializer((StringBinding) binding);
84 if (binding instanceof RecordBinding) {
85 RecordBinding b = (RecordBinding) binding;
86 Binding[] componentBindings = b.getComponentBindings();
87 int count = b.getComponentCount();
89 if (b.type().isReferable()) {
90 ReferableRecordSerializer result = new ReferableRecordSerializer(b, null);
91 addInProgress(binding, result);
92 result.componentSerializers = new Serializer[count];
93 for (int i = 0; i < count; i++) {
94 result.componentSerializers[i] = construct(componentBindings[i]);
96 result.finalizeConstruction();
97 finishInProgress(binding);
100 GenericRecordSerializer result = new GenericRecordSerializer(b, null);
101 addInProgress(binding, result);
102 result.componentSerializers = new Serializer[count];
103 for (int i = 0; i < count; i++) {
104 result.componentSerializers[i] = construct(componentBindings[i]);
106 result.finalizeConstruction();
107 finishInProgress(binding);
113 if (binding instanceof UnionBinding) {
114 UnionBinding b = (UnionBinding) binding;
115 Binding[] componentBindings = b.getComponentBindings();
116 int count = b.getComponentCount();
118 UnionSerializer result = new UnionSerializer(b, null);
119 addInProgress(binding, result);
120 result.componentSerializers = new Serializer[count];
121 for (int i = 0; i < count; i++) {
122 result.componentSerializers[i] = construct(componentBindings[i]);
124 result.finalizeConstruction();
125 finishInProgress(binding);
130 if (binding instanceof OptionalBinding) {
131 OptionalBinding b = (OptionalBinding) binding;
132 OptionalSerializer result = new OptionalSerializer(b, null);
133 addInProgress(binding, result);
134 result.componentSerializer = construct(b.getComponentBinding());
135 finishInProgress(binding);
140 if (binding instanceof ArrayBinding) {
141 ArrayBinding b = (ArrayBinding) binding;
142 ArrayType type = (ArrayType) b.type();
144 if (b instanceof FloatArrayBinding && type.componentType instanceof FloatType)
145 return new FloatArraySerializer(b);
146 if (b instanceof DoubleArrayBinding && type.componentType instanceof DoubleType)
147 return new DoubleArraySerializer(b);
148 if (b instanceof IntArrayBinding && type.componentType instanceof IntegerType)
149 return new IntArraySerializer(b);
150 if (b instanceof ByteArrayBinding && type.componentType instanceof ByteType)
151 return new ByteArraySerializer(b);
152 if (b instanceof BooleanArrayBinding && type.componentType instanceof BooleanType)
153 return new BooleanArraySerializer(b);
154 if (b instanceof LongArrayBinding && type.componentType instanceof LongType)
155 return new LongArraySerializer(b);
157 ArraySerializer result = new ArraySerializer(b, null);
158 addInProgress(binding, result);
159 result.componentSerializer = construct(b.getComponentBinding());
160 result.finalizeConstruction();
161 finishInProgress(binding);
166 if (binding instanceof MapBinding) {
167 MapBinding b = (MapBinding) binding;
168 MapSerializer result = new MapSerializer(b, null, null);
169 addInProgress(binding, result);
170 result.keySerializer = construct(b.getKeyBinding());
171 result.valueSerializer = construct(b.getValueBinding());
172 result.finalizeConstruction();
173 finishInProgress(binding);
178 if (binding instanceof VariantBinding) {
179 VariantSerializer result = binding.isImmutable() ? new VariantSerializer((VariantBinding) binding, this)
180 : new MutableVariantSerializer((VariantBinding) binding, this);
181 result.finalizeConstruction();
185 throw new SerializerConstructionException("Cannot serialize " + binding.getClass().getName());
189 public boolean supportsBinding(Binding binding) {