Skip to content

Commit

Permalink
Upgrade Units of Measurement dependencies (#10583)
Browse files Browse the repository at this point in the history
* Fix code/tests for upgrade
* Resolve runbundles
* Update Checkstyle ruleset for changed packages

Signed-off-by: Wouter Born <[email protected]>
  • Loading branch information
wborn authored May 11, 2021
1 parent 0fd9c4c commit c3a6aa5
Show file tree
Hide file tree
Showing 24 changed files with 178 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.ThingTypeUID;

import tec.uom.se.format.SimpleUnitFormat;
import tec.uom.se.function.RationalConverter;
import tec.uom.se.unit.ProductUnit;
import tec.uom.se.unit.TransformedUnit;
import tech.units.indriya.format.SimpleUnitFormat;
import tech.units.indriya.function.MultiplyConverter;
import tech.units.indriya.unit.ProductUnit;
import tech.units.indriya.unit.TransformedUnit;

/**
* The {@link AirthingsBindingConstants} class defines common constants, which are
Expand Down Expand Up @@ -59,7 +59,7 @@ public class AirthingsBindingConstants {
public static final String CHANNEL_ID_RADON_LT_AVG = "radon_lt_avg";

public static final Unit<Dimensionless> PARTS_PER_BILLION = new TransformedUnit<>(Units.ONE,
new RationalConverter(BigInteger.ONE, BigInteger.valueOf(1000000000)));
MultiplyConverter.ofRational(BigInteger.ONE, BigInteger.valueOf(1000000000)));
public static final Unit<Density> BECQUEREL_PER_CUBIC_METRE = new ProductUnit<>(
Units.BECQUEREL.divide(SIUnits.CUBIC_METRE));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,10 @@
import org.openhab.core.library.unit.SIUnits;
import org.openhab.core.library.unit.Units;

import tec.uom.se.format.SimpleUnitFormat;
import tec.uom.se.function.MultiplyConverter;
import tec.uom.se.function.PiMultiplierConverter;
import tec.uom.se.function.RationalConverter;
import tec.uom.se.unit.ProductUnit;
import tec.uom.se.unit.TransformedUnit;
import tech.units.indriya.format.SimpleUnitFormat;
import tech.units.indriya.function.MultiplyConverter;
import tech.units.indriya.unit.ProductUnit;
import tech.units.indriya.unit.TransformedUnit;

/**
* The {@link BluetoothUnit} maps bluetooth units to openHAB units.
Expand Down Expand Up @@ -239,13 +237,13 @@ public static class BUnits {
new ProductUnit<RadiationDoseAbsorptionRate>(Units.GRAY.divide(Units.SECOND)));

public static final Unit<Mass> POUND = addUnit(
new TransformedUnit<Mass>(SIUnits.KILOGRAM, new MultiplyConverter(0.45359237)));
new TransformedUnit<Mass>(SIUnits.KILOGRAM, MultiplyConverter.of(0.45359237)));

public static final Unit<Angle> MINUTE_ANGLE = addUnit(new TransformedUnit<Angle>(Units.RADIAN,
new PiMultiplierConverter().concatenate(new RationalConverter(1, 180 * 60))));
MultiplyConverter.ofPiExponent(1).concatenate(MultiplyConverter.ofRational(1, 180 * 60))));

public static final Unit<Angle> SECOND_ANGLE = addUnit(new TransformedUnit<Angle>(Units.RADIAN,
new PiMultiplierConverter().concatenate(new RationalConverter(1, 180 * 60 * 60))));
MultiplyConverter.ofPiExponent(1).concatenate(MultiplyConverter.ofRational(1, 180 * 60 * 60))));

public static final Unit<Area> HECTARE = addUnit(SIUnits.SQUARE_METRE.multiply(10000.0));
public static final Unit<Area> BARN = addUnit(SIUnits.SQUARE_METRE.multiply(10E-28));
Expand All @@ -259,10 +257,10 @@ public static class BUnits {
new ProductUnit<Radiance>(WATT_PER_STERADIAN.divide(SIUnits.SQUARE_METRE)));

public static final Unit<Frequency> CYCLES_PER_MINUTE = addUnit(new TransformedUnit<Frequency>(Units.HERTZ,
new RationalConverter(BigInteger.valueOf(60), BigInteger.ONE)));
MultiplyConverter.ofRational(BigInteger.valueOf(60), BigInteger.ONE)));

public static final Unit<Angle> REVOLUTION = addUnit(new TransformedUnit<Angle>(Units.RADIAN,
new PiMultiplierConverter().concatenate(new RationalConverter(2, 1))));
MultiplyConverter.ofPiExponent(1).concatenate(MultiplyConverter.ofRational(2, 1))));
public static final Unit<AngularVelocity> REVOLUTION_PER_MINUTE = addUnit(
new ProductUnit<AngularVelocity>(REVOLUTION.divide(Units.MINUTE)));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,15 @@ protected QuantityType<Q> getStateValue(String cosemValue) throws ParseException
*/
private String prepare(String cosemValue) {
Matcher matcher = COSEM_VALUE_WITH_UNIT_PATTERN.matcher(cosemValue.replace("m3", "m³"));
if (!matcher.find()) {
return cosemValue;
}

return matcher.find() ? matcher.group(1) + ' ' + matcher.group(2) : cosemValue;
try {
Integer.parseInt(matcher.group(2));
return cosemValue;
} catch (NumberFormatException e) {
return matcher.group(1) + ' ' + matcher.group(2);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.openhab.core.library.unit.Units;
import org.openhab.core.types.State;

import tec.uom.se.quantity.QuantityDimension;
import tech.units.indriya.unit.UnitDimension;

/**
* Tests for {@link AbstractTypeConverter#convertFromBinding(HmDatapoint)}.
Expand Down Expand Up @@ -75,28 +75,28 @@ public void testQuantityTypeConverter() throws ConverterException {
floatQuantityDp.setUnit("°C");
convertedState = temperatureConverter.convertFromBinding(floatQuantityDp);
assertThat(convertedState, instanceOf(QuantityType.class));
assertThat(((QuantityType<?>) convertedState).getDimension(), is(QuantityDimension.TEMPERATURE));
assertThat(((QuantityType<?>) convertedState).getDimension(), is(UnitDimension.TEMPERATURE));
assertThat(((QuantityType<?>) convertedState).doubleValue(), is(10.5));
assertThat(((QuantityType<?>) convertedState).toUnit(ImperialUnits.FAHRENHEIT).doubleValue(), is(50.9));

floatQuantityDp.setUnit("°C");
assertThat(((QuantityType<?>) convertedState).getDimension(), is(QuantityDimension.TEMPERATURE));
assertThat(((QuantityType<?>) convertedState).getDimension(), is(UnitDimension.TEMPERATURE));
assertThat(((QuantityType<?>) convertedState).doubleValue(), is(10.5));

integerQuantityDp.setValue(50000);
integerQuantityDp.setUnit("mHz");
convertedState = frequencyConverter.convertFromBinding(integerQuantityDp);
assertThat(convertedState, instanceOf(QuantityType.class));
assertThat(((QuantityType<?>) convertedState).getDimension(),
is(QuantityDimension.NONE.divide(QuantityDimension.TIME)));
is(UnitDimension.NONE.divide(UnitDimension.TIME)));
assertThat(((QuantityType<?>) convertedState).intValue(), is(50000));
assertThat(((QuantityType<?>) convertedState).toUnit(Units.HERTZ).intValue(), is(50));

floatQuantityDp.setValue(0.7);
floatQuantityDp.setUnit("100%");
convertedState = timeConverter.convertFromBinding(floatQuantityDp);
assertThat(convertedState, instanceOf(QuantityType.class));
assertThat(((QuantityType<?>) convertedState).getDimension(), is(QuantityDimension.NONE));
assertThat(((QuantityType<?>) convertedState).getDimension(), is(UnitDimension.NONE));
assertThat(((QuantityType<?>) convertedState).doubleValue(), is(70.0));
assertThat(((QuantityType<?>) convertedState).getUnit(), is(Units.PERCENT));
assertThat(((QuantityType<?>) convertedState).toUnit(Units.ONE).doubleValue(), is(0.7));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

import java.util.function.Consumer;

import javax.measure.format.MeasurementParseException;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.http.internal.config.HttpChannelConfig;
Expand Down Expand Up @@ -60,7 +62,7 @@ protected State toState(String value) {
return new QuantityType<>(trimmedValue);
}
}
} catch (IllegalArgumentException e) {
} catch (IllegalArgumentException | MeasurementParseException e) {
// finally failed
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public void numberItemConverterWithUnit() {
Assertions.assertEquals(new QuantityType<>(500, Units.WATT), converter.toState("500"));

// no valid value
Assertions.assertEquals(UnDefType.UNDEF, converter.toState("100°C"));
Assertions.assertEquals(UnDefType.UNDEF, converter.toState("100foo"));
Assertions.assertEquals(UnDefType.UNDEF, converter.toState("foo"));
Assertions.assertEquals(UnDefType.UNDEF, converter.toState(""));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import java.util.concurrent.TimeUnit;

import javax.measure.Unit;
import javax.measure.format.ParserException;
import javax.measure.format.MeasurementParseException;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
Expand Down Expand Up @@ -161,7 +161,7 @@ public void handleCommand(ChannelUID channelUID, Command receivedCommand) {
qtc = ((QuantityType<?>) command).toUnit(unit);
}
}
} catch (ParserException e) {
} catch (MeasurementParseException e) {
// swallow
}
if (qtc != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,21 +62,21 @@ public void testValidPowerBlock() {
Optional<Data> dataOpt = mc.parse(DataType.POWER);
assertTrue(dataOpt.isPresent());
PowerBlock b = (PowerBlock) dataOpt.get();
assertEquals("242.0 W", b.pvPowerSupply.toString(), "PV Supply");
assertEquals("14.0 W", b.gridPowerSupply.toString(), "Grid Supply");
assertEquals("0.0 W", b.gridPowerConsumpition.toString(), "Grid Consumption");
assertEquals("303.0 W", b.batteryPowerSupply.toString(), "Battery Supply");
assertEquals("242 W", b.pvPowerSupply.toString(), "PV Supply");
assertEquals("14 W", b.gridPowerSupply.toString(), "Grid Supply");
assertEquals("0 W", b.gridPowerConsumpition.toString(), "Grid Consumption");
assertEquals("303 W", b.batteryPowerSupply.toString(), "Battery Supply");
}

@Test
public void testValidPowerBlockNegativePVSupply() {
Optional<Data> dataOpt = mcNegativePVSupply.parse(DataType.POWER);
assertTrue(dataOpt.isPresent());
PowerBlock b = (PowerBlock) dataOpt.get();
assertEquals("-330.0 W", b.pvPowerSupply.toString(), "PV Supply");
assertEquals("14.0 W", b.gridPowerSupply.toString(), "Grid Supply");
assertEquals("0.0 W", b.gridPowerConsumpition.toString(), "Grid Consumption");
assertEquals("303.0 W", b.batteryPowerSupply.toString(), "Battery Supply");
assertEquals("-330 W", b.pvPowerSupply.toString(), "PV Supply");
assertEquals("14 W", b.gridPowerSupply.toString(), "Grid Supply");
assertEquals("0 W", b.gridPowerConsumpition.toString(), "Grid Consumption");
assertEquals("303 W", b.batteryPowerSupply.toString(), "Battery Supply");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,10 +231,9 @@ private <QU extends Quantity<QU>> Optional<QuantityType<QU>> parameterAsQuantity
* When the conversion is towards the handler (towardsItem=false), unit will be ONE
*
*/
@SuppressWarnings("unchecked") // Safe cast since QU = Dimensionless * QU
private <QU extends Quantity<QU>> QuantityType<QU> applyGainTowardsItem(QuantityType<Dimensionless> qtState,
QuantityType<QU> gainDelta) {
return (QuantityType<QU>) qtState.multiply(gainDelta);
return new QuantityType<>(qtState.toBigDecimal().multiply(gainDelta.toBigDecimal()), gainDelta.getUnit());
}

private QuantityType<Dimensionless> applyGainTowardsHandler(QuantityType<?> qtState, QuantityType<?> gainDelta) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,7 @@ private void testOnUpdateFromHandlerGeneric(String preGainOffset, String gain, O
// Workaround for errors like "java.lang.UnsupportedOperationException: °C is non-linear, cannot convert"
if (expectedStateUpdateTowardsItem instanceof QuantityType<?>) {
assertTrue(actualStateUpdateTowardsItem instanceof QuantityType<?>);
assertEquals(((QuantityType<?>) expectedStateUpdateTowardsItem).getUnit(),
((QuantityType<?>) actualStateUpdateTowardsItem).getUnit());
assertEquals(((QuantityType<?>) expectedStateUpdateTowardsItem).toBigDecimal(),
((QuantityType<?>) actualStateUpdateTowardsItem).toBigDecimal());
assertEquals(expectedStateUpdateTowardsItem, actualStateUpdateTowardsItem);
} else {
assertEquals(expectedStateUpdateTowardsItem, actualStateUpdateTowardsItem);
}
Expand Down
4 changes: 4 additions & 0 deletions itests/itest-common.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ Test-Cases: ${classes;CONCRETE;PUBLIC;NAMED;*Test}
# A temporary inclusion until an R7 framework is available
Import-Package: org.osgi.framework.*;version="[1.8,2)",*

# We would like to use the slf4j-api and implementation provided by pax-logging
-runblacklist.itest-common: \
bnd.identity;id='slf4j.api'

# Used by Objenesis/Mockito and not actually optional
-runsystempackages: sun.reflect

Expand Down
15 changes: 11 additions & 4 deletions itests/org.openhab.binding.astro.tests/itest.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@ Fragment-Host: org.openhab.binding.astro
# done
#
-runbundles: \
javax.measure.unit-api;version='[1.0.0,1.0.1)',\
org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\
org.osgi.service.event;version='[1.4.0,1.4.1)',\
tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\
tec.uom.se;version='[1.0.10,1.0.11)',\
org.opentest4j;version='[1.2.0,1.2.1)',\
com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\
jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\
Expand Down Expand Up @@ -44,4 +41,14 @@ Fragment-Host: org.openhab.binding.astro
org.apache.felix.scr;version='[2.1.26,2.1.27)',\
org.ops4j.pax.logging.pax-logging-api;version='[2.0.8,2.0.9)',\
org.osgi.util.function;version='[1.1.0,1.1.1)',\
org.osgi.util.promise;version='[1.1.1,1.1.2)'
org.osgi.util.promise;version='[1.1.1,1.1.2)',\
jakarta.annotation-api;version='[2.0.0,2.0.1)',\
jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\
javax.measure.unit-api;version='[2.1.2,2.1.3)',\
org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
org.osgi.service.cm;version='[1.6.0,1.6.1)',\
si-units;version='[2.0.1,2.0.2)',\
si.uom.si-quantity;version='[2.0.1,2.0.2)',\
tech.units.indriya;version='[2.1.2,2.1.3)',\
uom-lib-common;version='[2.1.0,2.1.1)'
15 changes: 11 additions & 4 deletions itests/org.openhab.binding.avmfritz.tests/itest.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,10 @@ Fragment-Host: org.openhab.binding.avmfritz
# done
#
-runbundles: \
javax.measure.unit-api;version='[1.0.0,1.0.1)',\
org.osgi.service.event;version='[1.4.0,1.4.1)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.jupnp;version='[2.5.2,2.5.3)',\
org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\
tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\
tec.uom.se;version='[1.0.10,1.0.11)',\
org.hamcrest;version='[2.2.0,2.2.1)',\
org.opentest4j;version='[1.2.0,1.2.1)',\
jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\
Expand Down Expand Up @@ -68,4 +65,14 @@ Fragment-Host: org.openhab.binding.avmfritz
org.apache.xbean.finder;version='[4.18.0,4.18.1)',\
org.objectweb.asm;version='[9.1.0,9.1.1)',\
org.objectweb.asm.commons;version='[9.0.0,9.0.1)',\
org.objectweb.asm.tree;version='[9.0.0,9.0.1)'
org.objectweb.asm.tree;version='[9.0.0,9.0.1)',\
jakarta.annotation-api;version='[2.0.0,2.0.1)',\
jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\
javax.measure.unit-api;version='[2.1.2,2.1.3)',\
org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
org.osgi.service.cm;version='[1.6.0,1.6.1)',\
si-units;version='[2.0.1,2.0.2)',\
si.uom.si-quantity;version='[2.0.1,2.0.2)',\
tech.units.indriya;version='[2.1.2,2.1.3)',\
uom-lib-common;version='[2.1.0,2.1.1)'
14 changes: 10 additions & 4 deletions itests/org.openhab.binding.feed.tests/itest.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,9 @@ Fragment-Host: org.openhab.binding.feed
# done
#
-runbundles: \
javax.measure.unit-api;version='[1.0.0,1.0.1)',\
org.osgi.service.event;version='[1.4.0,1.4.1)',\
org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\
tec.uom.se;version='[1.0.10,1.0.11)',\
org.hamcrest;version='[2.2.0,2.2.1)',\
org.opentest4j;version='[1.2.0,1.2.1)',\
com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\
Expand Down Expand Up @@ -71,4 +68,13 @@ Fragment-Host: org.openhab.binding.feed
org.apache.xbean.finder;version='[4.18.0,4.18.1)',\
org.objectweb.asm;version='[9.1.0,9.1.1)',\
org.objectweb.asm.commons;version='[9.0.0,9.0.1)',\
org.objectweb.asm.tree;version='[9.0.0,9.0.1)'
org.objectweb.asm.tree;version='[9.0.0,9.0.1)',\
jakarta.annotation-api;version='[2.0.0,2.0.1)',\
jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\
javax.measure.unit-api;version='[2.1.2,2.1.3)',\
org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
si-units;version='[2.0.1,2.0.2)',\
si.uom.si-quantity;version='[2.0.1,2.0.2)',\
tech.units.indriya;version='[2.1.2,2.1.3)',\
uom-lib-common;version='[2.1.0,2.1.1)'
15 changes: 11 additions & 4 deletions itests/org.openhab.binding.hue.tests/itest.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,10 @@ Fragment-Host: org.openhab.binding.hue
# done
#
-runbundles: \
javax.measure.unit-api;version='[1.0.0,1.0.1)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\
org.jupnp;version='[2.5.2,2.5.3)',\
org.osgi.service.event;version='[1.4.0,1.4.1)',\
tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\
tec.uom.se;version='[1.0.10,1.0.11)',\
org.hamcrest;version='[2.2.0,2.2.1)',\
org.opentest4j;version='[1.2.0,1.2.1)',\
org.eclipse.jdt.annotation;version='[2.2.100,2.2.101)',\
Expand Down Expand Up @@ -72,4 +69,14 @@ Fragment-Host: org.openhab.binding.hue
org.apache.xbean.finder;version='[4.18.0,4.18.1)',\
org.objectweb.asm;version='[9.1.0,9.1.1)',\
org.objectweb.asm.commons;version='[9.0.0,9.0.1)',\
org.objectweb.asm.tree;version='[9.0.0,9.0.1)'
org.objectweb.asm.tree;version='[9.0.0,9.0.1)',\
jakarta.annotation-api;version='[2.0.0,2.0.1)',\
jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\
javax.measure.unit-api;version='[2.1.2,2.1.3)',\
org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
org.osgi.service.cm;version='[1.6.0,1.6.1)',\
si-units;version='[2.0.1,2.0.2)',\
si.uom.si-quantity;version='[2.0.1,2.0.2)',\
tech.units.indriya;version='[2.1.2,2.1.3)',\
uom-lib-common;version='[2.1.0,2.1.1)'
15 changes: 11 additions & 4 deletions itests/org.openhab.binding.max.tests/itest.bndrun
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,9 @@ Fragment-Host: org.openhab.binding.max
# done
#
-runbundles: \
javax.measure.unit-api;version='[1.0.0,1.0.1)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\
org.osgi.service.event;version='[1.4.0,1.4.1)',\
tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\
tec.uom.se;version='[1.0.10,1.0.11)',\
org.hamcrest;version='[2.2.0,2.2.1)',\
org.opentest4j;version='[1.2.0,1.2.1)',\
com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\
Expand Down Expand Up @@ -59,4 +56,14 @@ Fragment-Host: org.openhab.binding.max
org.eclipse.jetty.util.ajax;version='[9.4.38,9.4.39)',\
org.ops4j.pax.logging.pax-logging-api;version='[2.0.8,2.0.9)',\
org.osgi.util.function;version='[1.1.0,1.1.1)',\
org.osgi.util.promise;version='[1.1.1,1.1.2)'
org.osgi.util.promise;version='[1.1.1,1.1.2)',\
jakarta.annotation-api;version='[2.0.0,2.0.1)',\
jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\
javax.measure.unit-api;version='[2.1.2,2.1.3)',\
org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
org.osgi.service.cm;version='[1.6.0,1.6.1)',\
si-units;version='[2.0.1,2.0.2)',\
si.uom.si-quantity;version='[2.0.1,2.0.2)',\
tech.units.indriya;version='[2.1.2,2.1.3)',\
uom-lib-common;version='[2.1.0,2.1.1)'
Loading

0 comments on commit c3a6aa5

Please sign in to comment.