/******************************************************************************* * Copyright (c) 2010 Association for Decentralized Information Management in * Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.databoard.binding.util; import java.util.Map; import java.util.WeakHashMap; import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.ArrayBinding; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.Binding.Visitor; import org.simantics.databoard.binding.BooleanBinding; import org.simantics.databoard.binding.ByteBinding; import org.simantics.databoard.binding.DoubleBinding; import org.simantics.databoard.binding.FloatBinding; import org.simantics.databoard.binding.IntegerBinding; import org.simantics.databoard.binding.LongBinding; import org.simantics.databoard.binding.MapBinding; import org.simantics.databoard.binding.OptionalBinding; import org.simantics.databoard.binding.RecordBinding; import org.simantics.databoard.binding.StringBinding; import org.simantics.databoard.binding.UnionBinding; import org.simantics.databoard.binding.VariantBinding; import org.simantics.databoard.binding.error.BindingException; import org.simantics.databoard.binding.error.RuntimeBindingException; import org.simantics.databoard.type.ArrayType; import org.simantics.databoard.type.ByteType; import org.simantics.databoard.type.DoubleType; import org.simantics.databoard.type.FloatType; import org.simantics.databoard.type.IntegerType; import org.simantics.databoard.type.LongType; import org.simantics.databoard.type.StringType; import org.simantics.databoard.util.Range; /** * Visitor that creates a default instance of a DataType. * This visitor may throw RuntimeBindingException. * * Type Value * ------------------------------------------------------ * Boolean false * Byte, Integer, Long 0 or min limit * Float, Double 0.0 or min limit * String "" * Optional *novalue* * Union tag 0 * Record each field with default value * Array min range number of elements * Map no entries * Variant {} : void * * * TODO Create String according to the pattern * @author Toni Kalajainen */ public class DefaultValueWithCache implements Visitor { /** Map of default values already created. Used to link back to recursive records */ Map map = new WeakHashMap(1); @Override public Object visit(ArrayBinding b) { Object result = map.get(b); if (result!=null) return result; ArrayType at = b.type(); Range r = at.getLength(); int min = (r!=null) ? r.getLower().getValue().intValue() : 0; if (min>0) { Binding componentBinding = b.getComponentBinding(); Object[] array = new Object[min]; for (int i=0; i