1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 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.impl;
\r
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.RecordBinding;
\r
20 import org.simantics.databoard.binding.VariantBinding;
\r
21 import org.simantics.databoard.binding.classfactory.TypeClassFactory;
\r
22 import org.simantics.databoard.binding.error.BindingConstructionException;
\r
23 import org.simantics.databoard.binding.error.BindingException;
\r
24 import org.simantics.databoard.binding.factory.BindingRepository;
\r
25 import org.simantics.databoard.binding.reflection.BindingRequest;
\r
26 import org.simantics.databoard.binding.reflection.ClassBindingFactory;
\r
27 import org.simantics.databoard.type.Datatype;
\r
28 import org.simantics.databoard.util.Bean;
\r
31 * Binds Bean-class (exact match) as Variant.
\r
33 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
\r
35 public class BeanBinding extends VariantBinding {
\r
37 ClassBindingFactory bindingFactory;
\r
38 AdapterFactory adapterFactory;
\r
39 TypeClassFactory typeClassFactory;
\r
41 public BeanBinding(ClassBindingFactory bindingFactory, TypeClassFactory typeClassFactory, AdapterFactory adapterFactory) {
\r
42 this.bindingFactory = bindingFactory;
\r
43 this.adapterFactory = adapterFactory;
\r
44 this.typeClassFactory = typeClassFactory;
\r
47 public ClassBindingFactory getBindingFactory() {
\r
48 return bindingFactory;
\r
51 public BindingRepository getRepository() {
\r
52 return bindingFactory.getRepository();
\r
56 public Object create(Binding srcBinding, Object value) throws BindingException {
\r
57 // if (srcBinding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+srcBinding.getClass()+" to bean.");
\r
59 BindingRequest request = typeClassFactory.getClass( srcBinding.type() );
\r
60 Binding dstBinding = bindingFactory.getBinding( request );
\r
61 return adapterFactory.adapt(value, srcBinding, dstBinding);
\r
62 } catch (BindingConstructionException e) {
\r
63 throw new BindingException(e);
\r
64 } catch (AdaptException e) {
\r
65 throw new BindingException(e);
\r
70 public Binding getContentBinding(Object variant) throws BindingException {
\r
71 Bean bean = (Bean) variant;
\r
72 return bean.getBinding();
\r
76 public Datatype getContentType(Object variant) throws BindingException {
\r
77 Bean bean = (Bean) variant;
\r
78 return bean.getBinding().type();
\r
82 public Object getContent(Object variant, Binding binding)
\r
83 throws BindingException {
\r
85 if (binding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+binding.getClass()+" to bean.");
\r
86 RecordBinding dstBinding = (RecordBinding) binding;
\r
87 Bean src = (Bean) variant;
\r
88 RecordBinding srcBinding = (RecordBinding) src.getBinding();
\r
89 return adapterFactory.adapt(src, srcBinding, dstBinding);
\r
90 } catch (AdaptException e) {
\r
91 throw new BindingException( e );
\r
96 public Object getContent(Object variant)
\r
97 throws BindingException {
\r
102 public void setContent(Object variant, Binding binding, Object src)
\r
103 throws BindingException {
\r
104 if (variant==src) return;
\r
105 if (binding instanceof RecordBinding == false) throw new BindingException("Cannot assign "+binding.getClass()+" to bean.");
\r
106 RecordBinding srcBinding = (RecordBinding) binding;
\r
107 Bean dst = (Bean) variant;
\r
108 RecordBinding dstBinding = (RecordBinding) dst.getBinding();
\r
109 dstBinding.readFrom(srcBinding, src, dst);
\r
113 public void assertInstaceIsValid(Object obj, Set<Object> validInstances) throws BindingException {
\r
114 Bean bean = (Bean) obj;
\r
115 bean.getBinding().assertInstaceIsValid(bean, validInstances);
\r
119 public boolean isInstance(Object obj) {
\r
120 return obj instanceof Bean;
\r
124 public boolean isImmutable() {
\r
129 protected boolean baseEquals(Object obj) {
\r
130 BeanBinding o = (BeanBinding)obj;
\r
131 return super.baseEquals(obj) && o.adapterFactory == this.adapterFactory && o.bindingFactory == this.bindingFactory && o.typeClassFactory == this.typeClassFactory;
\r
135 public int baseHashCode() {
\r
136 return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode() + 17 * typeClassFactory.hashCode();
\r