1 /*******************************************************************************
2 * Copyright (c) 2010 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.databoard.binding.mutable;
16 import org.simantics.databoard.adapter.AdaptException;
17 import org.simantics.databoard.adapter.AdapterFactory;
18 import org.simantics.databoard.binding.Binding;
19 import org.simantics.databoard.binding.VariantBinding;
20 import org.simantics.databoard.binding.error.BindingException;
21 import org.simantics.databoard.binding.reflection.ClassBindingFactory;
22 import org.simantics.databoard.type.Datatype;
25 * ImmutableVariantBinding binds VariantType to {@link Variant} Class.
27 public class ImmutableVariantBinding extends VariantBinding {
29 ClassBindingFactory bindingFactory;
30 AdapterFactory adapterFactory;
32 public ImmutableVariantBinding(ClassBindingFactory bindingFactory, AdapterFactory adapterFactory) {
33 this.bindingFactory = bindingFactory;
34 this.adapterFactory = adapterFactory;
38 public boolean isImmutable() {
43 public Object create(Binding binding, Object value) throws BindingException {
44 return new Variant(binding, value);
48 public Binding getContentBinding(Object variant) throws BindingException {
49 Variant result = (Variant) variant;
50 return result.binding;
54 public Datatype getContentType(Object variant) throws BindingException {
55 Variant result = (Variant) variant;
56 return result.binding.type();
60 public Object getContent(Object variant, Binding binding) throws BindingException {
61 Variant var = (Variant) variant;
63 Binding binding1 = var.binding;
64 Object value1 = var.value;
65 Binding binding2 = binding;
66 Object value2 = adapterFactory.adapt(value1, binding1, binding2);
68 } catch (AdaptException e) {
69 throw new BindingException(e);
73 public Object getContent(Object variant) throws BindingException {
74 Variant var = (Variant) variant;
79 public void setContent(Object variant, Binding binding, Object value)
80 throws BindingException {
81 Variant var = (Variant) variant;
82 if (var.binding == binding && var.value==value) return;
83 throw new BindingException("Cannot write to immutable variant");
87 public void assertInstaceIsValid(Object obj, Set<Object> validInstances) throws BindingException {
88 if (obj==null) throw new BindingException("null value is not Variant");
89 if (obj instanceof Variant == false) throw new BindingException("wrong class, Variant expected");
90 Variant var = (Variant) obj;
91 if (var.binding==null) throw new BindingException("Binding is expected");
92 var.binding.assertInstaceIsValid(var.value, validInstances);
96 public boolean isInstance(Object obj) {
97 if (obj==null) return false;
98 if (obj instanceof Variant == false) return false;
102 boolean isValid(Binding binding, Object obj) throws BindingException {
103 binding.assertInstaceIsValid(obj);
108 public int baseHashCode() {
109 return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode();
113 protected boolean baseEquals(Object obj) {
114 ImmutableVariantBinding o = (ImmutableVariantBinding)obj;
115 return super.baseEquals(obj) && o.adapterFactory == adapterFactory && o.bindingFactory == bindingFactory;