/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.data.impl; import java.util.ArrayList; import javax.measure.Measurable; import javax.measure.quantity.Quantity; import javax.measure.unit.Dimension; import javax.measure.unit.Unit; import info.limpet.ICommand; import info.limpet.IQuantityCollection; import info.limpet.QuantityRange; import info.limpet.UIProperty; import info.limpet.data.impl.helpers.QuantityHelper; public class QuantityCollection<T extends Quantity> extends ObjectCollection<Measurable<T>> implements IQuantityCollection<T> { private Unit<T> units; private transient QuantityHelper<T> _qHelper; // TODO: we store range at this level, and in the Q Helper // this is required for persistence reasons, since the // Q Helper is transient private QuantityRange<T> _range; // public QuantityCollection(String name, Unit<T> units) // { // this(name, null, units); // } public QuantityCollection(String name, ICommand<?> precedent, Unit<T> units) { super(name, precedent); this.units = units; initQHelper(); } protected void initQHelper() { if (_qHelper == null) { _qHelper = new QuantityHelper<T>((ArrayList<Measurable<T>>) getValues(), units); } } @Override public void setRange(QuantityRange<T> range) { initQHelper(); _range = range; _qHelper.setRange(range); // tell anyone that wants to know super.fireMetadataChanged(); } @UIProperty(name = "Range", category = UIProperty.CATEGORY_METADATA, visibleWhen = "valuesCount == 1") @Override public QuantityRange<T> getRange() { initQHelper(); return _range; } @Override public void add(Number value) { initQHelper(); _qHelper.add(value); } @Override public Dimension getDimension() { initQHelper(); return _qHelper.getDimension(); } @UIProperty(name = "Units", category = UIProperty.CATEGORY_VALUE) @Override public Unit<T> getUnits() { initQHelper(); return _qHelper.getUnits(); } @Override public void add(Measurable<T> value) { initQHelper(); _qHelper.add(value); } @Override public Measurable<T> min() { initQHelper(); return _qHelper.min(); } @Override public Measurable<T> max() { initQHelper(); return _qHelper.max(); } @Override public Measurable<T> mean() { initQHelper(); return _qHelper.mean(); } @Override public Measurable<T> variance() { initQHelper(); return _qHelper.variance(); } @Override public Measurable<T> sd() { initQHelper(); return _qHelper.sd(); } @Override public boolean isQuantity() { return true; } @Override public boolean isTemporal() { return false; } @Override public void replaceSingleton(Number newValue) { _qHelper.replace(newValue); } @UIProperty(name = "Value", category = UIProperty.CATEGORY_VALUE, visibleWhen = "valuesCount == 1") public Number getSingletonValue() { initQHelper(); return _qHelper.getValue(); } public void setSingletonValue(Number newValue) { replaceSingleton(newValue); fireDataChanged(); } }