/* * Copyright (c) 2016, grossmann, bentele * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.tools.unit; import org.jowidgets.api.convert.IConverter; import org.jowidgets.unit.api.IUnit; import org.jowidgets.unit.api.IUnitProvider; import org.jowidgets.unit.api.IUnitSet; import org.jowidgets.unit.tools.converter.LongDoubleUnitConverter; import org.jowidgets.util.Assert; public class AutoUnitProviderLongDouble implements IUnitProvider<Long> { private final IUnitSet unitSet; private final IUnit defaultUnit; private final double minValueForUnit; private final IConverter<Double> doubleConverter; /** * Creates a new instance * * @param unitSet The unit set to use * @param defaultUnit The default unit * @param minValueForUnit The minimal value to accept for a unit * @param doubleConverter The converter that will be used for double converting. If set, the converted double value will be * checked with this converter for loss by rounding. If so, the next lower unit will be used. If set to null, no * rounding check will be made. */ public AutoUnitProviderLongDouble( final IUnitSet unitSet, final IUnit defaultUnit, final double minValueForUnit, final IConverter<Double> doubleConverter) { Assert.paramNotNull(unitSet, "unitSet"); Assert.paramNotNull(defaultUnit, "defaultUnit"); this.unitSet = unitSet; this.defaultUnit = defaultUnit; this.minValueForUnit = minValueForUnit; this.doubleConverter = doubleConverter; } @Override public final IUnit getUnit(final Long value) { if (value != null) { for (int i = unitSet.size() - 1; i >= 0; i--) { final IUnit unit = unitSet.get(i); if (isUnitAppropriateForValue(unit, value.longValue())) { return unit; } } } return defaultUnit; } private boolean isUnitAppropriateForValue(final IUnit unit, final long value) { final double convertedForUnit = convertToDoubleForUnit(value, unit); if (convertedForUnit < minValueForUnit) { return false; } else if (doubleConverter != null) { final String convertedString = doubleConverter.convertToString(Double.valueOf(convertedForUnit)); final Double convertedFromString = doubleConverter.convertToObject(convertedString); return Double.valueOf(convertedForUnit).equals(convertedFromString); } else { return true; } } private double convertToDoubleForUnit(final long value, final IUnit unit) { return new LongDoubleUnitConverter(unit).toUnitValue(Long.valueOf(value)).getValue().doubleValue(); } }