]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/binding/util/DefaultValueWithCache.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / binding / util / DefaultValueWithCache.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.util;
13
14 import java.util.Map;
15 import java.util.WeakHashMap;
16
17 import org.simantics.databoard.Bindings;
18 import org.simantics.databoard.binding.ArrayBinding;
19 import org.simantics.databoard.binding.Binding;
20 import org.simantics.databoard.binding.Binding.Visitor;
21 import org.simantics.databoard.binding.BooleanBinding;
22 import org.simantics.databoard.binding.ByteBinding;
23 import org.simantics.databoard.binding.DoubleBinding;
24 import org.simantics.databoard.binding.FloatBinding;
25 import org.simantics.databoard.binding.IntegerBinding;
26 import org.simantics.databoard.binding.LongBinding;
27 import org.simantics.databoard.binding.MapBinding;
28 import org.simantics.databoard.binding.OptionalBinding;
29 import org.simantics.databoard.binding.RecordBinding;
30 import org.simantics.databoard.binding.StringBinding;
31 import org.simantics.databoard.binding.UnionBinding;
32 import org.simantics.databoard.binding.VariantBinding;
33 import org.simantics.databoard.binding.error.BindingException;
34 import org.simantics.databoard.binding.error.RuntimeBindingException;
35 import org.simantics.databoard.type.ArrayType;
36 import org.simantics.databoard.type.ByteType;
37 import org.simantics.databoard.type.DoubleType;
38 import org.simantics.databoard.type.FloatType;
39 import org.simantics.databoard.type.IntegerType;
40 import org.simantics.databoard.type.LongType;
41 import org.simantics.databoard.type.StringType;
42 import org.simantics.databoard.util.Range;
43
44 /**
45  * Visitor that creates a default instance of a DataType.
46  * This visitor may throw RuntimeBindingException. 
47  * 
48  * Type                     Value
49  * ------------------------------------------------------
50  * Boolean                  false
51  * Byte, Integer, Long      0 or min limit
52  * Float, Double            0.0 or min limit
53  * String                   ""
54  * Optional                 *novalue*
55  * Union                    tag 0
56  * Record                   each field with default value
57  * Array                    min range number of elements
58  * Map                      no entries
59  * Variant                  {} : void
60  * 
61  * 
62  * TODO Create String according to the pattern
63  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
64  */
65 public class DefaultValueWithCache implements Visitor<Object> {
66
67         /** Map of default values already created. Used to link back to recursive records */
68         Map<Binding, Object> map = new WeakHashMap<Binding, Object>(1); 
69                 
70         @Override
71         public Object visit(ArrayBinding b) {
72                 Object result = map.get(b);
73                 if (result!=null) return result;
74                 
75                 ArrayType at = b.type();
76                 Range r = at.getLength();
77                 int min = (r!=null) ? r.getLower().getValue().intValue() : 0;
78                         
79                 if (min>0) {
80                         Binding componentBinding = b.getComponentBinding();
81                         Object[] array = new Object[min];
82                         for (int i=0; i<min; i++) {
83                                 array[i] = componentBinding.accept(this);
84                         }
85                         result = b.createUnchecked(array);
86                 } else {
87                         result = b.createUnchecked();
88                 }               
89                 map.put(b, result);
90                 return result;
91         }
92
93         @Override
94         public Object visit(BooleanBinding b) {
95                 Object result = map.get(b);
96                 if (result!=null) return result;
97                 result = b.createUnchecked(Boolean.FALSE);
98                 map.put(b, result);
99                 return result;
100         }
101
102         @Override
103         public Object visit(DoubleBinding b) {
104                 Object result = map.get(b);
105                 if (result!=null) return result;
106                 DoubleType type = b.type();
107                 Range range = type.getRange();
108                 double value = (range==null) ? 0.0 : range.getLower().getValue().doubleValue();
109                 result = b.createUnchecked(value);
110                 map.put(b, result);
111                 return result;
112         }
113
114         @Override
115         public Object visit(FloatBinding b) {
116                 Object result = map.get(b);
117                 if (result!=null) return result;
118                 FloatType type = b.type();
119                 Range range = type.getRange();
120                 float value = (range==null) ? 0.f : range.getLower().getValue().floatValue();
121                 result = b.createUnchecked(value);
122                 map.put(b, result);
123                 return result;
124         }
125
126         @Override
127         public Object visit(IntegerBinding b) {
128                 Object result = map.get(b);
129                 if (result!=null) return result;
130                 IntegerType type = b.type();
131                 Range range = type.getRange();
132                 int value = (range==null) ? 0 : range.getLower().getValue().intValue();
133                 result = b.createUnchecked(value);
134                 map.put(b, result);
135                 return result;
136         }
137
138         @Override
139         public Object visit(ByteBinding b) {
140                 Object result = map.get(b);
141                 if (result!=null) return result;
142                 ByteType type = b.type();
143                 Range range = type.getRange();
144                 byte value = (range==null) ? 0 : range.getLower().getValue().byteValue();
145                 result = b.createUnchecked(value);
146                 map.put(b, result);
147                 return result;
148         }
149
150         @Override
151         public Object visit(LongBinding b) {
152                 Object result = map.get(b);
153                 if (result!=null) return result;
154                 LongType type = b.type();
155                 Range range = type.getRange();
156                 long value = (range==null) ? 0 : range.getLower().getValue().longValue();
157                 result = b.createUnchecked(value);
158                 map.put(b, result);
159                 return result;
160         }
161
162         @Override
163         public Object visit(OptionalBinding b) {
164                 Object result = map.get(b);
165                 if (result!=null) return result;
166                 result = b.createNoValueUnchecked();
167                 map.put(b, result);
168                 return result;
169         }
170
171         @Override
172         public Object visit(RecordBinding b) {
173                 try {
174                         Object result = map.get(b);
175                         if (result!=null) return result;
176                         Object[] values = new Object[ b.getComponentCount() ];
177                         result = b.createPartial();
178                         map.put(b, result);
179                         for (int i=0; i<values.length; i++) {
180                                 Binding cb = b.getComponentBinding(i);                  
181                                 values[i] = cb.accept(this);
182                         }
183                         b.setComponents(result, values);
184                         return result;
185                 } catch (BindingException e) {
186                         throw new RuntimeBindingException(e);
187                 }
188         }
189
190         @Override
191         public Object visit(StringBinding b) {
192                 Object result = map.get(b);
193                 if (result!=null) return result;
194                 StringType st = b.type();
195                 if (st.getPattern() != null) {
196                         // TODO Create a string that is valid to the pattern
197                         result = b.createUnchecked("");                 
198                 } else {
199                         result = b.createUnchecked("");
200                 }
201                 map.put(b, result);
202                 return result;
203         }
204
205         @Override
206         public Object visit(UnionBinding b) {
207                 Object result = map.get(b);
208                 if (result!=null) return result;
209                 int tag = 0;
210                 Binding componentBinding = b.getComponentBinding(tag);
211                 Object tag0defaultValue = componentBinding.accept(this);
212                 result = b.createUnchecked(tag, tag0defaultValue);
213                 map.put(b, result);
214                 return result;
215         }
216
217         
218         @Override
219         public Object visit(VariantBinding b) {
220                 Object result = map.get(b);
221                 if (result!=null) return result;
222                 Binding voidBinding = Bindings.getBindingUnchecked(void.class);
223                 Object voidValue = null;
224                 result = b.createUnchecked(voidBinding, voidValue);
225                 map.put(b, result);
226                 return result;
227         }
228
229         @Override
230         public Object visit(MapBinding b) {
231                 Object result = map.get(b);
232                 if (result!=null) return result;
233                 result = b.createUnchecked();
234                 map.put(b, result);
235                 return result;
236         }
237     
238 }
239