]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultConcurrentSerializerFactory.java
Initial support for concurrency in databoard, bindings and serializers
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / serialization / DefaultConcurrentSerializerFactory.java
1 package org.simantics.databoard.serialization;
2
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;
51
52 /**
53  * @author Jani Simomaa
54  */
55 public class DefaultConcurrentSerializerFactory extends ConcurrentSerializerFactory {
56
57     @Override
58     protected Serializer doConstruct(Binding binding) throws SerializerConstructionException {
59
60         // Specialized serializers
61         if (binding instanceof SpecializedSerializerProvider) {
62             Serializer specializedSerializer = ((SpecializedSerializerProvider) binding).getSpecializedSerializer();
63             if (specializedSerializer != null)
64                 return specializedSerializer;
65         }
66
67         // Primitives
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);
82
83         // Record
84         if (binding instanceof RecordBinding) {
85             RecordBinding b = (RecordBinding) binding;
86             Binding[] componentBindings = b.getComponentBindings();
87             int count = b.getComponentCount();
88
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]);
95                 }
96                 result.finalizeConstruction();
97                 finishInProgress(binding);
98                 return result;
99             } else {
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]);
105                 }
106                 result.finalizeConstruction();
107                 finishInProgress(binding);
108                 return result;
109             }
110         }
111
112         // Union
113         if (binding instanceof UnionBinding) {
114             UnionBinding b = (UnionBinding) binding;
115             Binding[] componentBindings = b.getComponentBindings();
116             int count = b.getComponentCount();
117
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]);
123             }
124             result.finalizeConstruction();
125             finishInProgress(binding);
126             return result;
127         }
128
129         // Optional
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);
136             return result;
137         }
138
139         // Array
140         if (binding instanceof ArrayBinding) {
141             ArrayBinding b = (ArrayBinding) binding;
142             ArrayType type = (ArrayType) b.type();
143
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);
156
157             ArraySerializer result = new ArraySerializer(b, null);
158             addInProgress(binding, result);
159             result.componentSerializer = construct(b.getComponentBinding());
160             result.finalizeConstruction();
161             finishInProgress(binding);
162             return result;
163         }
164
165         // Map
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);
174             return result;
175         }
176
177         // Variant
178         if (binding instanceof VariantBinding) {
179             VariantSerializer result = binding.isImmutable() ? new VariantSerializer((VariantBinding) binding, this)
180                                                              : new MutableVariantSerializer((VariantBinding) binding, this);
181             result.finalizeConstruction();
182             return result;
183         }
184
185         throw new SerializerConstructionException("Cannot serialize " + binding.getClass().getName());
186     }
187
188     @Override
189     public boolean supportsBinding(Binding binding) {
190         return true;
191     }
192
193 }