X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fserialization%2FDefaultConcurrentSerializerFactory.java;fp=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fserialization%2FDefaultConcurrentSerializerFactory.java;h=65147b3f9ceae65e214fe44ed7f664f560a15fd7;hb=48bb50bb6640506d1f150ca8e4fa5a6e878464be;hp=0000000000000000000000000000000000000000;hpb=91ea7a38f29bb1b02dbf55947d791d7876462e4e;p=simantics%2Fplatform.git 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 index 000000000..65147b3f9 --- /dev/null +++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultConcurrentSerializerFactory.java @@ -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; + } + +}