1 /*******************************************************************************
\r
2 * Copyright (c) 2012 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.databoard.serialization.impl;
\r
14 import java.io.DataInput;
\r
15 import java.io.IOException;
\r
16 import java.util.ArrayList;
\r
17 import java.util.List;
\r
19 import org.simantics.databoard.Bindings;
\r
20 import org.simantics.databoard.binding.Binding;
\r
21 import org.simantics.databoard.binding.VariantBinding;
\r
22 import org.simantics.databoard.binding.error.BindingException;
\r
23 import org.simantics.databoard.serialization.Serializer;
\r
24 import org.simantics.databoard.serialization.SerializerScheme;
\r
25 import org.simantics.databoard.type.Datatype;
\r
28 * A version of VariantSerializer that uses Bindings.getMutableBinding instead
\r
29 * of Bindings.getBinding for deserialization.
\r
31 * @author Tuukka Lehtonen
\r
33 public class MutableVariantSerializer extends VariantSerializer {
\r
35 public MutableVariantSerializer(VariantBinding binding, SerializerScheme scheme) {
\r
36 super(binding, scheme);
\r
40 public Object deserialize(DataInput in, List<Object> identities) throws IOException {
\r
42 List<Object> typeIdentities = new ArrayList<Object>(1);
\r
43 Datatype type = (Datatype) datatypeSerializer.deserialize(in, typeIdentities);
\r
44 Binding valueBinding = Bindings.getMutableBinding(type);
\r
45 Serializer valueSerializer = scheme.getSerializerUnchecked(valueBinding);
\r
46 assertRemainingBytes(in, valueSerializer.getMinSize());
\r
47 Object value = valueSerializer.deserialize(in, identities);
\r
48 return binding.create(valueBinding, value);
\r
49 } catch (BindingException e) {
\r
50 throw new IOException( e );
\r
55 public void deserializeTo(DataInput in, List<Object> identities, Object obj) throws IOException {
\r
57 List<Object> typeIdentities = new ArrayList<Object>(1);
\r
58 Datatype type = (Datatype) datatypeSerializer.deserialize(in, typeIdentities);
\r
59 Datatype oldType = binding.getContentType(obj);
\r
61 if (type.equals(oldType)) {
\r
62 Binding valueBinding = binding.getContentBinding(obj);
\r
63 Serializer valueSerializer = scheme.getSerializerUnchecked(valueBinding);
\r
64 Object component = binding.getContent(obj);
\r
65 // assertRemainingBytes(in, valueSerializer.getMinSize());
\r
66 component = valueSerializer.deserializeToTry(in, identities, component);
\r
67 binding.setContent(obj, valueBinding, component);
\r
69 Binding valueBinding = Bindings.getMutableBinding(type);
\r
70 Serializer valueSerializer = scheme.getSerializerUnchecked(valueBinding);
\r
71 // assertRemainingBytes(in, valueSerializer.getMinSize());
\r
72 Object component = valueSerializer.deserialize(in, identities);
\r
73 binding.setContent(obj, valueBinding, component);
\r
75 } catch (BindingException e) {
\r
76 throw new IOException( e );
\r
81 public void skip(DataInput in, List<Object> identities) throws IOException {
\r
82 List<Object> typeIdentities = new ArrayList<Object>(1);
\r
83 Datatype type = (Datatype) datatypeSerializer.deserialize(in, typeIdentities);
\r
84 Binding valueBinding = Bindings.getMutableBinding(type);
\r
85 Serializer valueSerializer = scheme.getSerializerUnchecked(valueBinding);
\r
86 valueSerializer.skip(in, identities);
\r