]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/mutable/ImmutableVariantBinding.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / mutable / ImmutableVariantBinding.java
1 /*******************************************************************************
2  *  Copyright (c) 2010 Association for Decentralized Information Management in
3  *  Industry THTH ry.
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
8  *
9  *  Contributors:
10  *      VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.databoard.binding.mutable;
13
14 import java.util.Set;
15
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;
23
24 /**
25  * ImmutableVariantBinding binds VariantType to {@link Variant} Class. 
26  */
27 public class ImmutableVariantBinding extends VariantBinding {
28                 
29         ClassBindingFactory bindingFactory;
30         AdapterFactory adapterFactory;
31         
32         public ImmutableVariantBinding(ClassBindingFactory bindingFactory, AdapterFactory adapterFactory) {
33                 this.bindingFactory = bindingFactory;
34                 this.adapterFactory = adapterFactory;
35         }
36         
37         @Override
38         public boolean isImmutable() {
39                 return true;
40         }
41         
42         @Override
43         public Object create(Binding binding, Object value) throws BindingException {
44                 return new Variant(binding, value);
45         }
46         
47         @Override
48         public Binding getContentBinding(Object variant) throws BindingException {
49                 Variant result = (Variant) variant;
50                 return result.binding;
51         }
52         
53         @Override
54         public Datatype getContentType(Object variant) throws BindingException {
55                 Variant result = (Variant) variant;
56                 return result.binding.type();
57         }
58         
59         @Override
60         public Object getContent(Object variant, Binding binding) throws BindingException {
61                 Variant var = (Variant) variant;
62                 try {
63                         Binding binding1 = var.binding;
64                         Object value1 = var.value;
65                         Binding binding2 = binding;
66                         Object value2 = adapterFactory.adapt(value1, binding1, binding2);
67                         return value2;
68                 } catch (AdaptException e) {
69                         throw new BindingException(e);
70                 }
71         }
72         
73         public Object getContent(Object variant) throws BindingException {
74                 Variant var = (Variant) variant;
75                 return var.value;
76         }
77
78         @Override
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");
84         }
85
86         @Override
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);
93         }
94
95         @Override
96         public boolean isInstance(Object obj) {
97                 if (obj==null) return false;
98                 if (obj instanceof Variant == false) return false;
99                 return true;
100         }
101         
102         boolean isValid(Binding binding, Object obj) throws BindingException {
103                 binding.assertInstaceIsValid(obj);
104                 return true;
105         }
106
107         @Override
108         public int baseHashCode() {
109             return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode(); 
110         }
111         
112         @Override
113         protected boolean baseEquals(Object obj) {
114                 ImmutableVariantBinding o = (ImmutableVariantBinding)obj;
115                 return super.baseEquals(obj) && o.adapterFactory == adapterFactory && o.bindingFactory == bindingFactory;
116         }
117 }