1 /*******************************************************************************
\r
2 * Copyright (c) 2010 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.binding.mutable;
14 import java.util.Set;
\r
16 import org.simantics.databoard.adapter.AdaptException;
\r
17 import org.simantics.databoard.adapter.AdapterFactory;
\r
18 import org.simantics.databoard.binding.Binding;
\r
19 import org.simantics.databoard.binding.VariantBinding;
\r
20 import org.simantics.databoard.binding.error.BindingException;
\r
21 import org.simantics.databoard.binding.reflection.ClassBindingFactory;
\r
22 import org.simantics.databoard.type.Datatype;
\r
25 * ImmutableVariantBinding binds VariantType to {@link Variant} Class.
27 public class ImmutableVariantBinding extends VariantBinding {
29 ClassBindingFactory bindingFactory;
\r
30 AdapterFactory adapterFactory;
\r
32 public ImmutableVariantBinding(ClassBindingFactory bindingFactory, AdapterFactory adapterFactory) {
\r
33 this.bindingFactory = bindingFactory;
\r
34 this.adapterFactory = adapterFactory;
\r
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 {
\r
81 Variant var = (Variant) variant;
\r
82 if (var.binding == binding && var.value==value) return;
\r
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() {
\r
109 return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode();
\r
113 protected boolean baseEquals(Object obj) {
\r
114 ImmutableVariantBinding o = (ImmutableVariantBinding)obj;
\r
115 return super.baseEquals(obj) && o.adapterFactory == adapterFactory && o.bindingFactory == bindingFactory;
\r