X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=inline;f=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fserialization%2FDefaultSerializerFactory.java;fp=bundles%2Forg.simantics.databoard%2Fsrc%2Forg%2Fsimantics%2Fdataboard%2Fserialization%2FDefaultSerializerFactory.java;h=07b3ca85e63638552a28da83787041b8be187066;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultSerializerFactory.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultSerializerFactory.java
new file mode 100644
index 000000000..07b3ca85e
--- /dev/null
+++ b/bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/DefaultSerializerFactory.java
@@ -0,0 +1,213 @@
+package org.simantics.databoard.serialization;
+
+import java.util.Map;
+
+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;
+
+/**
+ * Default serializer factory creates serializers that follow databoard serialization
+ * specification.
+ *
+ * Binary Serialization format
+ *
+ *
+ * @author Toni Kalajainen
+ */
+public class DefaultSerializerFactory extends SerializerFactory {
+
+ /**
+ * Construct a new serializer.
+ */
+ public DefaultSerializerFactory() {
+ super();
+ }
+
+ /**
+ * Construct a new serializer factory that places constructed serializers
+ * into user given repository.
+ *
+ * @param repository
+ */
+ public DefaultSerializerFactory(Map repository) {
+ super(repository);
+ }
+
+ @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);
+ inprogress.put(binding, result);
+ result.componentSerializers = new Serializer[count];
+ for (int i=0; i