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; } }