]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultConcurrentSerializerFactory.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultConcurrentSerializerFactory.java
new file mode 100644 (file)
index 0000000..65147b3
--- /dev/null
@@ -0,0 +1,193 @@
+package org.simantics.databoard.serialization;
+
+import org.simantics.databoard.binding.ArrayBinding;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.BooleanBinding;
+import org.simantics.databoard.binding.ByteBinding;
+import org.simantics.databoard.binding.DoubleBinding;
+import org.simantics.databoard.binding.FloatBinding;
+import org.simantics.databoard.binding.IntegerBinding;
+import org.simantics.databoard.binding.LongBinding;
+import org.simantics.databoard.binding.MapBinding;
+import org.simantics.databoard.binding.OptionalBinding;
+import org.simantics.databoard.binding.RecordBinding;
+import org.simantics.databoard.binding.StringBinding;
+import org.simantics.databoard.binding.UnionBinding;
+import org.simantics.databoard.binding.VariantBinding;
+import org.simantics.databoard.binding.impl.BooleanArrayBinding;
+import org.simantics.databoard.binding.impl.ByteArrayBinding;
+import org.simantics.databoard.binding.impl.DoubleArrayBinding;
+import org.simantics.databoard.binding.impl.FloatArrayBinding;
+import org.simantics.databoard.binding.impl.IntArrayBinding;
+import org.simantics.databoard.binding.impl.LongArrayBinding;
+import org.simantics.databoard.serialization.impl.ArraySerializer;
+import org.simantics.databoard.serialization.impl.BooleanArraySerializer;
+import org.simantics.databoard.serialization.impl.BooleanSerializer;
+import org.simantics.databoard.serialization.impl.ByteArraySerializer;
+import org.simantics.databoard.serialization.impl.ByteSerializer;
+import org.simantics.databoard.serialization.impl.DoubleArraySerializer;
+import org.simantics.databoard.serialization.impl.DoubleSerializer;
+import org.simantics.databoard.serialization.impl.FloatArraySerializer;
+import org.simantics.databoard.serialization.impl.FloatSerializer;
+import org.simantics.databoard.serialization.impl.GenericRecordSerializer;
+import org.simantics.databoard.serialization.impl.IntArraySerializer;
+import org.simantics.databoard.serialization.impl.IntSerializer;
+import org.simantics.databoard.serialization.impl.LongArraySerializer;
+import org.simantics.databoard.serialization.impl.LongSerializer;
+import org.simantics.databoard.serialization.impl.MapSerializer;
+import org.simantics.databoard.serialization.impl.ModifiedUTF8StringSerializer;
+import org.simantics.databoard.serialization.impl.MutableVariantSerializer;
+import org.simantics.databoard.serialization.impl.OptionalSerializer;
+import org.simantics.databoard.serialization.impl.ReferableRecordSerializer;
+import org.simantics.databoard.serialization.impl.UnionSerializer;
+import org.simantics.databoard.serialization.impl.VariantSerializer;
+import org.simantics.databoard.type.ArrayType;
+import org.simantics.databoard.type.BooleanType;
+import org.simantics.databoard.type.ByteType;
+import org.simantics.databoard.type.DoubleType;
+import org.simantics.databoard.type.FloatType;
+import org.simantics.databoard.type.IntegerType;
+import org.simantics.databoard.type.LongType;
+
+/**
+ * @author Jani Simomaa
+ */
+public class DefaultConcurrentSerializerFactory extends ConcurrentSerializerFactory {
+
+    @Override
+    protected Serializer doConstruct(Binding binding) throws SerializerConstructionException {
+
+        // Specialized serializers
+        if (binding instanceof SpecializedSerializerProvider) {
+            Serializer specializedSerializer = ((SpecializedSerializerProvider) binding).getSpecializedSerializer();
+            if (specializedSerializer != null)
+                return specializedSerializer;
+        }
+
+        // Primitives
+        if (binding instanceof BooleanBinding)
+            return new BooleanSerializer((BooleanBinding) binding);
+        if (binding instanceof ByteBinding)
+            return new ByteSerializer((ByteBinding) binding);
+        if (binding instanceof IntegerBinding)
+            return new IntSerializer((IntegerBinding) binding);
+        if (binding instanceof LongBinding)
+            return new LongSerializer((LongBinding) binding);
+        if (binding instanceof FloatBinding)
+            return new FloatSerializer((FloatBinding) binding);
+        if (binding instanceof DoubleBinding)
+            return new DoubleSerializer((DoubleBinding) binding);
+        if (binding instanceof StringBinding)
+            return new ModifiedUTF8StringSerializer((StringBinding) binding);
+
+        // Record
+        if (binding instanceof RecordBinding) {
+            RecordBinding b = (RecordBinding) binding;
+            Binding[] componentBindings = b.getComponentBindings();
+            int count = b.getComponentCount();
+
+            if (b.type().isReferable()) {
+                ReferableRecordSerializer result = new ReferableRecordSerializer(b, null);
+                addInProgress(binding, result);
+                result.componentSerializers = new Serializer[count];
+                for (int i = 0; i < count; i++) {
+                    result.componentSerializers[i] = construct(componentBindings[i]);
+                }
+                result.finalizeConstruction();
+                finishInProgress(binding);
+                return result;
+            } else {
+                GenericRecordSerializer result = new GenericRecordSerializer(b, null);
+                addInProgress(binding, result);
+                result.componentSerializers = new Serializer[count];
+                for (int i = 0; i < count; i++) {
+                    result.componentSerializers[i] = construct(componentBindings[i]);
+                }
+                result.finalizeConstruction();
+                finishInProgress(binding);
+                return result;
+            }
+        }
+
+        // Union
+        if (binding instanceof UnionBinding) {
+            UnionBinding b = (UnionBinding) binding;
+            Binding[] componentBindings = b.getComponentBindings();
+            int count = b.getComponentCount();
+
+            UnionSerializer result = new UnionSerializer(b, null);
+            addInProgress(binding, result);
+            result.componentSerializers = new Serializer[count];
+            for (int i = 0; i < count; i++) {
+                result.componentSerializers[i] = construct(componentBindings[i]);
+            }
+            result.finalizeConstruction();
+            finishInProgress(binding);
+            return result;
+        }
+
+        // Optional
+        if (binding instanceof OptionalBinding) {
+            OptionalBinding b = (OptionalBinding) binding;
+            OptionalSerializer result = new OptionalSerializer(b, null);
+            addInProgress(binding, result);
+            result.componentSerializer = construct(b.getComponentBinding());
+            finishInProgress(binding);
+            return result;
+        }
+
+        // Array
+        if (binding instanceof ArrayBinding) {
+            ArrayBinding b = (ArrayBinding) binding;
+            ArrayType type = (ArrayType) b.type();
+
+            if (b instanceof FloatArrayBinding && type.componentType instanceof FloatType)
+                return new FloatArraySerializer(b);
+            if (b instanceof DoubleArrayBinding && type.componentType instanceof DoubleType)
+                return new DoubleArraySerializer(b);
+            if (b instanceof IntArrayBinding && type.componentType instanceof IntegerType)
+                return new IntArraySerializer(b);
+            if (b instanceof ByteArrayBinding && type.componentType instanceof ByteType)
+                return new ByteArraySerializer(b);
+            if (b instanceof BooleanArrayBinding && type.componentType instanceof BooleanType)
+                return new BooleanArraySerializer(b);
+            if (b instanceof LongArrayBinding && type.componentType instanceof LongType)
+                return new LongArraySerializer(b);
+
+            ArraySerializer result = new ArraySerializer(b, null);
+            addInProgress(binding, result);
+            result.componentSerializer = construct(b.getComponentBinding());
+            result.finalizeConstruction();
+            finishInProgress(binding);
+            return result;
+        }
+
+        // Map
+        if (binding instanceof MapBinding) {
+            MapBinding b = (MapBinding) binding;
+            MapSerializer result = new MapSerializer(b, null, null);
+            addInProgress(binding, result);
+            result.keySerializer = construct(b.getKeyBinding());
+            result.valueSerializer = construct(b.getValueBinding());
+            result.finalizeConstruction();
+            finishInProgress(binding);
+            return result;
+        }
+
+        // Variant
+        if (binding instanceof VariantBinding) {
+            VariantSerializer result = binding.isImmutable() ? new VariantSerializer((VariantBinding) binding, this)
+                                                             : new MutableVariantSerializer((VariantBinding) binding, this);
+            result.finalizeConstruction();
+            return result;
+        }
+
+        throw new SerializerConstructionException("Cannot serialize " + binding.getClass().getName());
+    }
+
+    @Override
+    public boolean supportsBinding(Binding binding) {
+        return true;
+    }
+
+}