]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/impl/ObjectArrayBinding.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / impl / ObjectArrayBinding.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.impl;
13
14 import java.lang.reflect.Array;\r
15 import java.util.Iterator;\r
16 \r
17 import org.simantics.databoard.Bindings;\r
18 import org.simantics.databoard.adapter.AdaptException;\r
19 import org.simantics.databoard.adapter.Adapter;\r
20 import org.simantics.databoard.adapter.AdapterConstructionException;\r
21 import org.simantics.databoard.binding.ArrayBinding;\r
22 import org.simantics.databoard.binding.Binding;\r
23 import org.simantics.databoard.binding.error.BindingException;\r
24 import org.simantics.databoard.type.ArrayType;\r
25 \r
26 /**\r
27  * Binds to Object[]\r
28  *\r
29  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>\r
30  */
31 public class ObjectArrayBinding extends ArrayBinding {
32
33         public ObjectArrayBinding(ArrayType type, Binding componentBinding) {\r
34                 super(type, componentBinding);\r
35                 if (type == null)\r
36                         throw new IllegalArgumentException("null arg");\r
37                 this.type = type;\r
38         }\r
39 \r
40         public ObjectArrayBinding(Binding componentBinding) {\r
41                 this(new ArrayType(componentBinding.type()), componentBinding);\r
42         }\r
43 \r
44         @Override
45         public Object create(int length, Iterator<Object> values) {
46                 Object[] array = new Object[length];
47                 for (int i = 0; i < length; ++i)
48                         array[i] = values.next();
49                 return array;
50         }
51
52         @Override
53         public Object create() {
54                 return new Object[0];
55         }
56         
57         public Object create(Object[] values) {
58                 return values.clone();
59         }
60 \r
61         @Override\r
62         public void readFrom(Binding srcBinding, Object src, Object dst)\r
63                         throws BindingException {\r
64                 // Src Binding\r
65                 ArrayBinding sb = (ArrayBinding) srcBinding;\r
66                 // Src Component Binding\r
67                 Binding scb = sb.getComponentBinding();\r
68                 // Dst component binding\r
69                 Binding dcb = getComponentBinding();\r
70                 // Dst array\r
71                 Object[] d = (Object[]) dst;\r
72                 if (d.length != sb.size(src)) throw new BindingException("Object[] is length immutable");\r
73                 \r
74                 for (int i=0; i<d.length; i++) {\r
75                         Object sc = sb.get(src, i);\r
76                         Object dc = d[i];\r
77                         d[i] = dcb.readFromTry(scb, sc, dc);\r
78                 }\r
79         }       \r
80         \r
81         @Override\r
82         public Object readFromTry(Binding srcBinding, Object src, Object dst) throws BindingException {\r
83                 // Src Binding\r
84                 ArrayBinding sb = (ArrayBinding) srcBinding;\r
85                 // Src Component Binding\r
86                 Binding scb = sb.getComponentBinding();\r
87                 // Dst component binding\r
88                 Binding dcb = getComponentBinding();\r
89                 // Dst array\r
90                 Object[] d = (Object[]) dst;\r
91                 int srcSize = sb.size(src);\r
92                 if (d.length != srcSize) {\r
93                         Object[] oldD = (Object[]) dst;\r
94                         d = new Object[ srcSize ];\r
95                         int X = Math.min(oldD.length, srcSize);\r
96                         for (int i=0; i<X; i++) {\r
97                                 Object sc = sb.get(src, i);\r
98                                 Object dc = d[i];\r
99                                 d[i] = dcb.readFromTry(scb, sc, dc);\r
100                         }\r
101                         if (X<srcSize) {\r
102                                 try {\r
103                                         Adapter cloner = Bindings.adapterFactory.getAdapter(scb, dcb, false, true);\r
104                                         for (int i=X; i<srcSize; i++) {\r
105                                                 Object sc = sb.get(src, i);\r
106                                                 Object dc = cloner.adapt( sc );\r
107                                                 d[i] = dc;\r
108                                         }\r
109                                 } catch (AdaptException e) {\r
110                                         throw new BindingException( e );\r
111                                 } catch (AdapterConstructionException e) {\r
112                                         throw new BindingException( e );\r
113                                 }\r
114                         }\r
115                 } else {\r
116                         for (int i=0; i<d.length; i++) {\r
117                                 Object sc = sb.get(src, i);\r
118                                 Object dc = d[i];\r
119                                 d[i] = dcb.readFromTry(scb, sc, dc);                    \r
120                         }\r
121                 }\r
122                 return d;\r
123         }       \r
124         \r
125         @Override
126         public void add(Object array, int index, Object element)
127         throws BindingException, IndexOutOfBoundsException {
128                 throw new UnsupportedOperationException();
129         }
130         
131         @Override
132         public void remove(Object array, int index, int count) throws BindingException {
133                 throw new UnsupportedOperationException();
134         }
135
136         @Override
137         public void getAll(Object array, Object[] result) throws BindingException {
138                 Object[] list = (Object[]) array;
139                 System.arraycopy(list, 0, result, 0, list.length);
140         }
141         
142         @Override
143         public Object get(Object array, int index) throws BindingException {
144                 if (!isInstance(array))
145                         throw new BindingException("Unexpected class "
146                                         + array.getClass().getSimpleName() + ", Object[] expected");
147                 return ((Object[]) array)[index];
148         }
149         
150         @Override
151         public void set(Object array, int index, Object value)
152                         throws BindingException {
153                 Object[] list = (Object[]) array;
154                 list[index] = value;
155         }
156
157         @Override
158         public int size(Object array) throws BindingException {
159                 if (!isInstance(array))
160                         throw new BindingException("Unexpected class "
161                                         + array.getClass().getSimpleName() + ", Object[] expected");
162                 return ((Object[]) array).length;
163         }
164
165         @Override
166         public boolean isInstance(Object obj) {
167                 return obj instanceof Object[];
168         }
169         
170         @Override
171         public boolean isImmutable() {
172                 return false;
173         }\r
174 \r
175         @Override\r
176         public void setSize(Object array, int newSize) throws BindingException {\r
177                 int oldSize = Array.getLength(array);\r
178                 if (oldSize==newSize) return;\r
179                 throw new BindingException("Object[] is length immutable");\r
180         }       \r
181         \r
182         @Override\r
183         public boolean isResizable() {\r
184                 return false;\r
185         }\r
186         
187 }