]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/mutable/ImmutableVariantBinding.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / mutable / ImmutableVariantBinding.java
1 /*******************************************************************************\r
2  *  Copyright (c) 2010 Association for Decentralized Information Management in\r
3  *  Industry THTH ry.\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
8  *\r
9  *  Contributors:\r
10  *      VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.binding.mutable;
13
14 import java.util.Set;\r
15 \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
23
24 /**
25  * ImmutableVariantBinding binds VariantType to {@link Variant} Class. 
26  */
27 public class ImmutableVariantBinding extends VariantBinding {
28                 \r
29         ClassBindingFactory bindingFactory;\r
30         AdapterFactory adapterFactory;\r
31         
32         public ImmutableVariantBinding(ClassBindingFactory bindingFactory, AdapterFactory adapterFactory) {\r
33                 this.bindingFactory = bindingFactory;\r
34                 this.adapterFactory = adapterFactory;\r
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 {\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");
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 \r
107         @Override\r
108         public int baseHashCode() {\r
109             return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode(); \r
110         }\r
111         \r
112         @Override\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
116         }
117 }