1 /*******************************************************************************
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
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
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.databoard.binding.impl;
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;
31 * Binds Bean-class (exact match) as Variant.
33 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
35 public class BeanBinding extends VariantBinding {
37 ClassBindingFactory bindingFactory;
38 AdapterFactory adapterFactory;
39 TypeClassFactory typeClassFactory;
41 public BeanBinding(ClassBindingFactory bindingFactory, TypeClassFactory typeClassFactory, AdapterFactory adapterFactory) {
42 this.bindingFactory = bindingFactory;
43 this.adapterFactory = adapterFactory;
44 this.typeClassFactory = typeClassFactory;
47 public ClassBindingFactory getBindingFactory() {
48 return bindingFactory;
51 public BindingRepository getRepository() {
52 return bindingFactory.getRepository();
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.");
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);
70 public Binding getContentBinding(Object variant) throws BindingException {
71 Bean bean = (Bean) variant;
72 return bean.getBinding();
76 public Datatype getContentType(Object variant) throws BindingException {
77 Bean bean = (Bean) variant;
78 return bean.getBinding().type();
82 public Object getContent(Object variant, Binding binding)
83 throws BindingException {
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 );
96 public Object getContent(Object variant)
97 throws BindingException {
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);
113 public void assertInstaceIsValid(Object obj, Set<Object> validInstances) throws BindingException {
114 Bean bean = (Bean) obj;
115 bean.getBinding().assertInstaceIsValid(bean, validInstances);
119 public boolean isInstance(Object obj) {
120 return obj instanceof Bean;
124 public boolean isImmutable() {
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;
135 public int baseHashCode() {
136 return super.baseHashCode() + 7 * adapterFactory.hashCode() + 13 * bindingFactory.hashCode() + 17 * typeClassFactory.hashCode();