1 /*******************************************************************************
\r
2 * Copyright (c) 2010 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.databoard.binding.util;
14 import java.util.Map;
\r
15 import java.util.WeakHashMap;
\r
17 import org.simantics.databoard.Bindings;
\r
18 import org.simantics.databoard.binding.ArrayBinding;
\r
19 import org.simantics.databoard.binding.Binding;
\r
20 import org.simantics.databoard.binding.Binding.Visitor;
\r
21 import org.simantics.databoard.binding.BooleanBinding;
\r
22 import org.simantics.databoard.binding.ByteBinding;
\r
23 import org.simantics.databoard.binding.DoubleBinding;
\r
24 import org.simantics.databoard.binding.FloatBinding;
\r
25 import org.simantics.databoard.binding.IntegerBinding;
\r
26 import org.simantics.databoard.binding.LongBinding;
\r
27 import org.simantics.databoard.binding.MapBinding;
\r
28 import org.simantics.databoard.binding.OptionalBinding;
\r
29 import org.simantics.databoard.binding.RecordBinding;
\r
30 import org.simantics.databoard.binding.StringBinding;
\r
31 import org.simantics.databoard.binding.UnionBinding;
\r
32 import org.simantics.databoard.binding.VariantBinding;
\r
33 import org.simantics.databoard.binding.error.BindingException;
\r
34 import org.simantics.databoard.binding.error.RuntimeBindingException;
\r
35 import org.simantics.databoard.type.ArrayType;
\r
36 import org.simantics.databoard.type.ByteType;
\r
37 import org.simantics.databoard.type.DoubleType;
\r
38 import org.simantics.databoard.type.FloatType;
\r
39 import org.simantics.databoard.type.IntegerType;
\r
40 import org.simantics.databoard.type.LongType;
\r
41 import org.simantics.databoard.type.StringType;
\r
42 import org.simantics.databoard.util.Range;
\r
45 * Visitor that creates a default instance of a DataType.
46 * This visitor may throw RuntimeBindingException.
49 * ------------------------------------------------------
51 * Byte, Integer, Long 0 or min limit
52 * Float, Double 0.0 or min limit
56 * Record each field with default value
57 * Array min range number of elements
62 * TODO Create String according to the pattern
63 * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
65 public class DefaultValueWithCache implements Visitor<Object> {
67 /** Map of default values already created. Used to link back to recursive records */
68 Map<Binding, Object> map = new WeakHashMap<Binding, Object>(1);
71 public Object visit(ArrayBinding b) {
72 Object result = map.get(b);
73 if (result!=null) return result;
75 ArrayType at = b.type();
76 Range r = at.getLength();
77 int min = (r!=null) ? r.getLower().getValue().intValue() : 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);
85 result = b.createUnchecked(array);
87 result = b.createUnchecked();
94 public Object visit(BooleanBinding b) {
95 Object result = map.get(b);
96 if (result!=null) return result;
97 result = b.createUnchecked(Boolean.FALSE);
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);
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);
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);
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);
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);
163 public Object visit(OptionalBinding b) {
164 Object result = map.get(b);
165 if (result!=null) return result;
166 result = b.createNoValueUnchecked();
172 public Object visit(RecordBinding b) {
174 Object result = map.get(b);
175 if (result!=null) return result;
176 Object[] values = new Object[ b.getComponentCount() ];
177 result = b.createPartial();
179 for (int i=0; i<values.length; i++) {
180 Binding cb = b.getComponentBinding(i);
181 values[i] = cb.accept(this);
183 b.setComponents(result, values);
185 } catch (BindingException e) {
186 throw new RuntimeBindingException(e);
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("");
199 result = b.createUnchecked("");
206 public Object visit(UnionBinding b) {
207 Object result = map.get(b);
208 if (result!=null) return result;
210 Binding componentBinding = b.getComponentBinding(tag);
211 Object tag0defaultValue = componentBinding.accept(this);
212 result = b.createUnchecked(tag, tag0defaultValue);
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);
230 public Object visit(MapBinding b) {
231 Object result = map.get(b);
232 if (result!=null) return result;
233 result = b.createUnchecked();