-package org.simantics.databoard.serialization;\r
-\r
-import java.util.Map;\r
-\r
-import org.simantics.databoard.binding.ArrayBinding;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.binding.BooleanBinding;\r
-import org.simantics.databoard.binding.ByteBinding;\r
-import org.simantics.databoard.binding.DoubleBinding;\r
-import org.simantics.databoard.binding.FloatBinding;\r
-import org.simantics.databoard.binding.IntegerBinding;\r
-import org.simantics.databoard.binding.LongBinding;\r
-import org.simantics.databoard.binding.MapBinding;\r
-import org.simantics.databoard.binding.OptionalBinding;\r
-import org.simantics.databoard.binding.RecordBinding;\r
-import org.simantics.databoard.binding.StringBinding;\r
-import org.simantics.databoard.binding.UnionBinding;\r
-import org.simantics.databoard.binding.VariantBinding;\r
-import org.simantics.databoard.binding.impl.BooleanArrayBinding;\r
-import org.simantics.databoard.binding.impl.ByteArrayBinding;\r
-import org.simantics.databoard.binding.impl.DoubleArrayBinding;\r
-import org.simantics.databoard.binding.impl.FloatArrayBinding;\r
-import org.simantics.databoard.binding.impl.IntArrayBinding;\r
-import org.simantics.databoard.binding.impl.LongArrayBinding;\r
-import org.simantics.databoard.serialization.impl.ArraySerializer;\r
-import org.simantics.databoard.serialization.impl.BooleanArraySerializer;\r
-import org.simantics.databoard.serialization.impl.BooleanSerializer;\r
-import org.simantics.databoard.serialization.impl.ByteArraySerializer;\r
-import org.simantics.databoard.serialization.impl.ByteSerializer;\r
-import org.simantics.databoard.serialization.impl.DoubleArraySerializer;\r
-import org.simantics.databoard.serialization.impl.DoubleSerializer;\r
-import org.simantics.databoard.serialization.impl.FloatArraySerializer;\r
-import org.simantics.databoard.serialization.impl.FloatSerializer;\r
-import org.simantics.databoard.serialization.impl.GenericRecordSerializer;\r
-import org.simantics.databoard.serialization.impl.IntArraySerializer;\r
-import org.simantics.databoard.serialization.impl.IntSerializer;\r
-import org.simantics.databoard.serialization.impl.LongArraySerializer;\r
-import org.simantics.databoard.serialization.impl.LongSerializer;\r
-import org.simantics.databoard.serialization.impl.MapSerializer;\r
-import org.simantics.databoard.serialization.impl.ModifiedUTF8StringSerializer;\r
-import org.simantics.databoard.serialization.impl.MutableVariantSerializer;\r
-import org.simantics.databoard.serialization.impl.OptionalSerializer;\r
-import org.simantics.databoard.serialization.impl.ReferableRecordSerializer;\r
-import org.simantics.databoard.serialization.impl.UnionSerializer;\r
-import org.simantics.databoard.serialization.impl.VariantSerializer;\r
-import org.simantics.databoard.type.ArrayType;\r
-import org.simantics.databoard.type.BooleanType;\r
-import org.simantics.databoard.type.ByteType;\r
-import org.simantics.databoard.type.DoubleType;\r
-import org.simantics.databoard.type.FloatType;\r
-import org.simantics.databoard.type.IntegerType;\r
-import org.simantics.databoard.type.LongType;\r
-\r
-/**\r
- * Default serializer factory creates serializers that follow databoard serialization\r
- * specification.\r
- * \r
- * <a href="http://dev.simantics.org/index.php/Org.simantics.datatype_Manual#Binary_Serialization">Binary Serialization format</a>\r
- *\r
- * \r
- * @author Toni Kalajainen\r
- */\r
-public class DefaultSerializerFactory extends SerializerFactory {\r
-\r
- /**\r
- * Construct a new serializer.\r
- */\r
- public DefaultSerializerFactory() {\r
- super();\r
- }\r
- \r
- /**\r
- * Construct a new serializer factory that places constructed serializers\r
- * into user given repository.\r
- * \r
- * @param repository\r
- */\r
- public DefaultSerializerFactory(Map<Binding, Serializer> repository) {\r
- super(repository);\r
- } \r
-\r
- @Override\r
- protected Serializer doConstruct(Binding binding)\r
- throws SerializerConstructionException {\r
- \r
- // Specialized serializers\r
- if(binding instanceof SpecializedSerializerProvider) {\r
- Serializer specializedSerializer = \r
- ((SpecializedSerializerProvider)binding).getSpecializedSerializer();\r
- if(specializedSerializer != null)\r
- return specializedSerializer;\r
- }\r
- \r
- // Primitives\r
- if (binding instanceof BooleanBinding) return new BooleanSerializer( (BooleanBinding) binding );\r
- if (binding instanceof ByteBinding) return new ByteSerializer( (ByteBinding) binding );\r
- if (binding instanceof IntegerBinding) return new IntSerializer( (IntegerBinding) binding );\r
- if (binding instanceof LongBinding) return new LongSerializer( (LongBinding) binding );\r
- if (binding instanceof FloatBinding) return new FloatSerializer( (FloatBinding) binding );\r
- if (binding instanceof DoubleBinding) return new DoubleSerializer( (DoubleBinding) binding );\r
- if (binding instanceof StringBinding) return new ModifiedUTF8StringSerializer( (StringBinding) binding );\r
-\r
- // Record\r
- if (binding instanceof RecordBinding) {\r
- RecordBinding b = (RecordBinding) binding;\r
- Binding[] componentBindings = b.getComponentBindings();\r
- int count = b.getComponentCount();\r
- \r
- if ( b.type().isReferable() ) {\r
- ReferableRecordSerializer result = new ReferableRecordSerializer(b, null);\r
- inprogress.put(binding, result); \r
- result.componentSerializers = new Serializer[count];\r
- for (int i=0; i<count; i++) {\r
- result.componentSerializers[i] = construct( componentBindings[i] );\r
- } \r
- result.finalizeConstruction();\r
- inprogress.remove(binding);\r
- return result;\r
- } else {\r
- GenericRecordSerializer result = new GenericRecordSerializer(b, null);\r
- inprogress.put(binding, result); \r
- result.componentSerializers = new Serializer[count];\r
- for (int i=0; i<count; i++) {\r
- result.componentSerializers[i] = construct( componentBindings[i] );\r
- } \r
- result.finalizeConstruction();\r
- inprogress.remove(binding);\r
- return result; \r
- }\r
- } \r
- \r
- // Union\r
- if (binding instanceof UnionBinding) {\r
- UnionBinding b = (UnionBinding) binding;\r
- Binding[] componentBindings = b.getComponentBindings();\r
- int count = b.getComponentCount();\r
- \r
- UnionSerializer result = new UnionSerializer(b, null);\r
- inprogress.put(binding, result); \r
- result.componentSerializers = new Serializer[count];\r
- for (int i=0; i<count; i++) {\r
- result.componentSerializers[i] = construct( componentBindings[i] );\r
- } \r
- result.finalizeConstruction();\r
- inprogress.remove(binding);\r
- return result;\r
- } \r
- \r
- // Optional\r
- if (binding instanceof OptionalBinding) {\r
- OptionalBinding b = (OptionalBinding) binding;\r
- OptionalSerializer result = new OptionalSerializer(b, null);\r
- inprogress.put(binding, result);\r
- result.componentSerializer = construct( b.getComponentBinding() );\r
- inprogress.remove(binding);\r
- return result; \r
- } \r
- \r
- // Array\r
- if (binding instanceof ArrayBinding) {\r
- ArrayBinding b = (ArrayBinding) binding;\r
- ArrayType type = (ArrayType) b.type();\r
- \r
- if( b instanceof FloatArrayBinding && type.componentType instanceof FloatType )\r
- return new FloatArraySerializer(b);\r
- if(b instanceof DoubleArrayBinding && type.componentType instanceof DoubleType )\r
- return new DoubleArraySerializer(b);\r
- if(b instanceof IntArrayBinding && type.componentType instanceof IntegerType )\r
- return new IntArraySerializer(b);\r
- if(b instanceof ByteArrayBinding && type.componentType instanceof ByteType )\r
- return new ByteArraySerializer(b);\r
- if(b instanceof BooleanArrayBinding && type.componentType instanceof BooleanType )\r
- return new BooleanArraySerializer(b);\r
- if(b instanceof LongArrayBinding && type.componentType instanceof LongType )\r
- return new LongArraySerializer(b);\r
- \r
- ArraySerializer result = new ArraySerializer(b, null);\r
- inprogress.put(binding, result);\r
- result.componentSerializer = construct( b.getComponentBinding() );\r
- result.finalizeConstruction();\r
- inprogress.remove(binding);\r
- return result; \r
- }\r
- \r
- // Map\r
- if (binding instanceof MapBinding) {\r
- MapBinding b = (MapBinding) binding; \r
- MapSerializer result = new MapSerializer(b, null, null);\r
- inprogress.put(binding, result);\r
- result.keySerializer = construct( b.getKeyBinding() );\r
- result.valueSerializer = construct( b.getValueBinding() );\r
- result.finalizeConstruction();\r
- inprogress.remove(binding);\r
- return result; \r
- } \r
- \r
- // Variant\r
- if (binding instanceof VariantBinding) {\r
- VariantSerializer result = binding.isImmutable() ? new VariantSerializer((VariantBinding)binding, this)\r
- : new MutableVariantSerializer((VariantBinding)binding, this );\r
- result.finalizeConstruction();\r
- return result;\r
- }\r
- \r
- throw new SerializerConstructionException("Cannot serialize "+binding.getClass().getName());\r
- }\r
-\r
- @Override\r
- public boolean supportsBinding(Binding binding) {\r
- return true;\r
- }\r
- \r
-}\r
+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.
+ *
+ * <a href="http://dev.simantics.org/index.php/Org.simantics.datatype_Manual#Binary_Serialization">Binary Serialization format</a>
+ *
+ *
+ * @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<Binding, Serializer> 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<count; i++) {
+ result.componentSerializers[i] = construct( componentBindings[i] );
+ }
+ result.finalizeConstruction();
+ inprogress.remove(binding);
+ return result;
+ } else {
+ GenericRecordSerializer result = new GenericRecordSerializer(b, null);
+ inprogress.put(binding, result);
+ result.componentSerializers = new Serializer[count];
+ for (int i=0; i<count; i++) {
+ result.componentSerializers[i] = construct( componentBindings[i] );
+ }
+ result.finalizeConstruction();
+ inprogress.remove(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);
+ inprogress.put(binding, result);
+ result.componentSerializers = new Serializer[count];
+ for (int i=0; i<count; i++) {
+ result.componentSerializers[i] = construct( componentBindings[i] );
+ }
+ result.finalizeConstruction();
+ inprogress.remove(binding);
+ return result;
+ }
+
+ // Optional
+ if (binding instanceof OptionalBinding) {
+ OptionalBinding b = (OptionalBinding) binding;
+ OptionalSerializer result = new OptionalSerializer(b, null);
+ inprogress.put(binding, result);
+ result.componentSerializer = construct( b.getComponentBinding() );
+ inprogress.remove(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);
+ inprogress.put(binding, result);
+ result.componentSerializer = construct( b.getComponentBinding() );
+ result.finalizeConstruction();
+ inprogress.remove(binding);
+ return result;
+ }
+
+ // Map
+ if (binding instanceof MapBinding) {
+ MapBinding b = (MapBinding) binding;
+ MapSerializer result = new MapSerializer(b, null, null);
+ inprogress.put(binding, result);
+ result.keySerializer = construct( b.getKeyBinding() );
+ result.valueSerializer = construct( b.getValueBinding() );
+ result.finalizeConstruction();
+ inprogress.remove(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;
+ }
+
+}