]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/impl/ObjectArrayBinding.java
Merge "Remove unnecessary getComparableKey from HashMapBinding"
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / impl / ObjectArrayBinding.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.binding.impl;
13
14 import java.lang.reflect.Array;
15 import java.util.Iterator;
16
17 import org.simantics.databoard.Bindings;
18 import org.simantics.databoard.adapter.AdaptException;
19 import org.simantics.databoard.adapter.Adapter;
20 import org.simantics.databoard.adapter.AdapterConstructionException;
21 import org.simantics.databoard.binding.ArrayBinding;
22 import org.simantics.databoard.binding.Binding;
23 import org.simantics.databoard.binding.error.BindingException;
24 import org.simantics.databoard.type.ArrayType;
25
26 /**
27  * Binds to Object[]
28  *
29  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
30  */
31 public class ObjectArrayBinding extends ArrayBinding {
32
33         public ObjectArrayBinding(ArrayType type, Binding componentBinding) {
34                 super(type, componentBinding);
35                 if (type == null)
36                         throw new IllegalArgumentException("null arg");
37                 this.type = type;
38         }
39
40         public ObjectArrayBinding(Binding componentBinding) {
41                 this(new ArrayType(componentBinding.type()), componentBinding);
42         }
43
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
61         @Override
62         public void readFrom(Binding srcBinding, Object src, Object dst)
63                         throws BindingException {
64                 // Src Binding
65                 ArrayBinding sb = (ArrayBinding) srcBinding;
66                 // Src Component Binding
67                 Binding scb = sb.getComponentBinding();
68                 // Dst component binding
69                 Binding dcb = getComponentBinding();
70                 // Dst array
71                 Object[] d = (Object[]) dst;
72                 if (d.length != sb.size(src)) throw new BindingException("Object[] is length immutable");
73                 
74                 for (int i=0; i<d.length; i++) {
75                         Object sc = sb.get(src, i);
76                         Object dc = d[i];
77                         d[i] = dcb.readFromTry(scb, sc, dc);
78                 }
79         }       
80         
81         @Override
82         public Object readFromTry(Binding srcBinding, Object src, Object dst) throws BindingException {
83                 // Src Binding
84                 ArrayBinding sb = (ArrayBinding) srcBinding;
85                 // Src Component Binding
86                 Binding scb = sb.getComponentBinding();
87                 // Dst component binding
88                 Binding dcb = getComponentBinding();
89                 // Dst array
90                 Object[] d = (Object[]) dst;
91                 int srcSize = sb.size(src);
92                 if (d.length != srcSize) {
93                         Object[] oldD = (Object[]) dst;
94                         d = new Object[ srcSize ];
95                         int X = Math.min(oldD.length, srcSize);
96                         for (int i=0; i<X; i++) {
97                                 Object sc = sb.get(src, i);
98                                 Object dc = d[i];
99                                 d[i] = dcb.readFromTry(scb, sc, dc);
100                         }
101                         if (X<srcSize) {
102                                 try {
103                                         Adapter cloner = Bindings.adapterFactory.getAdapter(scb, dcb, false, true);
104                                         for (int i=X; i<srcSize; i++) {
105                                                 Object sc = sb.get(src, i);
106                                                 Object dc = cloner.adapt( sc );
107                                                 d[i] = dc;
108                                         }
109                                 } catch (AdaptException e) {
110                                         throw new BindingException( e );
111                                 } catch (AdapterConstructionException e) {
112                                         throw new BindingException( e );
113                                 }
114                         }
115                 } else {
116                         for (int i=0; i<d.length; i++) {
117                                 Object sc = sb.get(src, i);
118                                 Object dc = d[i];
119                                 d[i] = dcb.readFromTry(scb, sc, dc);                    
120                         }
121                 }
122                 return d;
123         }       
124         
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         }
174
175         @Override
176         public void setSize(Object array, int newSize) throws BindingException {
177                 int oldSize = Array.getLength(array);
178                 if (oldSize==newSize) return;
179                 throw new BindingException("Object[] is length immutable");
180         }       
181         
182         @Override
183         public boolean isResizable() {
184                 return false;
185         }
186         
187 }