]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/method/MethodTypeBinding.java
Improved Bindings.getBinding(Class) caching for Datatype.class
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / method / MethodTypeBinding.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.method;
13
14 import org.simantics.databoard.Methods;
15 import org.simantics.databoard.binding.Binding;
16 import org.simantics.databoard.binding.RecordBinding;
17 import org.simantics.databoard.binding.UnionBinding;
18
19 /**
20  * MethodTypeBinding is a binding of MethodType (Request, Response and Error data types)
21  * to a Java Class.
22  * 
23  * @see Methods#getMethodTypeBinding(java.lang.reflect.Method)
24  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
25  */
26 public class MethodTypeBinding {
27         
28         MethodTypeDefinition methodDefinition;
29
30         RecordBinding requestBinding;
31         Binding responseBinding;
32         UnionBinding errorBinding;
33
34         public MethodTypeBinding(String methodName, RecordBinding requestBinding, Binding responseBinding, UnionBinding errorBinding)
35         {
36                 if (methodName==null||requestBinding==null||responseBinding==null||errorBinding==null)
37                         throw new IllegalArgumentException("null arg");
38                 this.methodDefinition = new MethodTypeDefinition(methodName, new MethodType(requestBinding.type(), responseBinding.type(), errorBinding.type()));
39                 this.requestBinding = requestBinding;
40                 this.responseBinding = responseBinding;
41                 this.errorBinding = errorBinding;
42         }
43         
44         public MethodTypeBinding(MethodTypeDefinition methodDescription, RecordBinding requestBinding, Binding responseBinding, UnionBinding errorBinding)
45         {
46                 if (methodDescription==null||requestBinding==null||responseBinding==null||errorBinding==null)
47                         throw new IllegalArgumentException("null arg");
48                 this.methodDefinition = methodDescription;
49                 this.requestBinding = requestBinding;
50                 this.responseBinding = responseBinding;
51                 this.errorBinding = errorBinding;
52         }
53
54         public MethodTypeDefinition getMethodDefinition() {
55                 return methodDefinition;
56         }
57         
58         public MethodType getMethodType() {
59                 return methodDefinition.getType();
60         }
61         
62         public String getName() {
63                 return methodDefinition.getName();
64         }
65
66         public RecordBinding getRequestBinding() {
67                 return requestBinding;
68         }
69
70         public Binding getResponseBinding() {
71                 return responseBinding;
72         }
73
74         public UnionBinding getErrorBinding() {
75                 return errorBinding;
76         }
77         /*
78         // Puts error classes into an union type 
79         public static Binding error(final Class<?>...errorClasses)
80         {
81                 UnionType ut = new UnionType();
82                 UnionBinding ub = new UnionBinding() {
83                         @Override
84                         public Object create(int tag, Object value)
85                         throws BindingException {
86                                 return value;
87                         }
88                         @Override
89                         public int getTag(Object obj) throws BindingException {
90                                 for (int i=0; i<errorClasses.length; i++)
91                                         if (errorClasses[i].isInstance(obj))
92                                                 return i;
93                                 throw new BindingException("pl");
94                         }
95                         @Override
96                         public Object getValue(Object obj) throws BindingException {
97                                 return obj;
98                         }
99                         @Override
100                         public boolean isInstance(Object obj) {
101                                 for (Class<?> clazz : errorClasses)
102                                         if (clazz.isInstance(obj)) 
103                                                 return true;
104                                 return false;
105                         }};
106                 ub.type = ut;
107                 ub.componentBindings = new Binding[errorClasses.length];
108                 ut.components = new Component[errorClasses.length];
109                 for (int i=0; i<errorClasses.length; i++)
110                 {
111                         Component c = new Component();
112                         c.name = errorClasses[i].getName();
113                         c.type = DataTypes.getDataType(errorClasses[i]);
114                         ut.components[i] = c;
115                         ub.componentBindings[i] = DataTypes.getBinding(errorClasses[i]);
116                 }
117                 
118                 return ub;
119         }
120
121         // Puts request arguments to record type   
122         public static Binding request(Class<?>...argumentClasses)
123         {
124                 return null;
125         }
126         
127         public static Binding response(Class<?> response)
128         {
129                 return DataTypes.getBinding(response);
130         }
131 */      
132 }
133