]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/impl/BeanBinding.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / impl / BeanBinding.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2011 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.impl;
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.RecordBinding;
20 import org.simantics.databoard.binding.VariantBinding;
21 import org.simantics.databoard.binding.classfactory.TypeClassFactory;
22 import org.simantics.databoard.binding.error.BindingConstructionException;
23 import org.simantics.databoard.binding.error.BindingException;
24 import org.simantics.databoard.binding.factory.BindingRepository;
25 import org.simantics.databoard.binding.reflection.BindingRequest;
26 import org.simantics.databoard.binding.reflection.ClassBindingFactory;
27 import org.simantics.databoard.type.Datatype;
28 import org.simantics.databoard.util.Bean;
29
30 /**
31  * Binds Bean-class (exact match) as Variant.
32  *
33  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
34  */
35 public class BeanBinding extends VariantBinding {
36         
37         ClassBindingFactory bindingFactory;
38         AdapterFactory adapterFactory;
39         TypeClassFactory typeClassFactory;
40
41         public BeanBinding(ClassBindingFactory bindingFactory, TypeClassFactory typeClassFactory, AdapterFactory adapterFactory) {
42                 this.bindingFactory = bindingFactory;
43                 this.adapterFactory = adapterFactory;
44                 this.typeClassFactory = typeClassFactory;
45         }
46
47         public ClassBindingFactory getBindingFactory() {
48                 return bindingFactory;
49         }
50         
51         public BindingRepository getRepository() {
52                 return bindingFactory.getRepository();
53         }
54                 
55         @Override
56         public Object create(Binding srcBinding, Object value) throws BindingException {
57 //              if (srcBinding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+srcBinding.getClass()+" to bean.");
58                 try {                   
59                         BindingRequest request = typeClassFactory.getClass( srcBinding.type() );                        
60                         Binding dstBinding = bindingFactory.getBinding( request );
61                         return adapterFactory.adapt(value, srcBinding, dstBinding); 
62                 } catch (BindingConstructionException e) {
63                         throw new BindingException(e);
64                 } catch (AdaptException e) {
65                         throw new BindingException(e);
66                 }               
67         }
68
69         @Override
70         public Binding getContentBinding(Object variant) throws BindingException {
71                 Bean bean = (Bean) variant;
72                 return bean.getBinding();
73         }
74
75         @Override
76         public Datatype getContentType(Object variant) throws BindingException {
77                 Bean bean = (Bean) variant;
78                 return bean.getBinding().type();
79         }
80
81         @Override
82         public Object getContent(Object variant, Binding binding)
83         throws BindingException {
84                 try {
85                         if (binding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+binding.getClass()+" to bean.");
86                         RecordBinding dstBinding = (RecordBinding) binding;
87                         Bean src = (Bean) variant;
88                         RecordBinding srcBinding = (RecordBinding) src.getBinding(); 
89                         return adapterFactory.adapt(src, srcBinding, dstBinding);
90                 } catch (AdaptException e) {
91                         throw new BindingException( e );
92                 }
93         }
94         
95         @Override
96         public Object getContent(Object variant)
97         throws BindingException {
98                 return variant;
99         }       
100
101         @Override
102         public void setContent(Object variant, Binding binding, Object src)
103         throws BindingException {
104                 if (variant==src) return;
105                 if (binding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+binding.getClass()+" to bean.");
106                 RecordBinding srcBinding = (RecordBinding) binding;
107                 Bean dst = (Bean) variant;
108                 RecordBinding dstBinding = (RecordBinding) dst.getBinding(); 
109                 dstBinding.readFrom(srcBinding, src, dst);
110         }
111
112         @Override
113         public void assertInstaceIsValid(Object obj, Set<Object> validInstances) throws BindingException {
114                 Bean bean = (Bean) obj;
115                 bean.getBinding().assertInstaceIsValid(bean, validInstances);
116         }
117
118         @Override
119         public boolean isInstance(Object obj) {
120                 return obj instanceof Bean;
121         }
122         
123         @Override
124         public boolean isImmutable() {
125                 return false;
126         }
127
128         @Override
129         protected boolean baseEquals(Object obj) {
130                 BeanBinding o = (BeanBinding)obj;
131                 return super.baseEquals(obj) && o.adapterFactory == this.adapterFactory && o.bindingFactory == this.bindingFactory && o.typeClassFactory == this.typeClassFactory;
132         }
133         
134         @Override
135         public int baseHashCode() {
136             return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode() + 17 * typeClassFactory.hashCode(); 
137         }
138 }