You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2016/10/29 15:39:09 UTC
svn commit: r1767109 - in /sis/branches/JDK7: ./ application/sis-console/
core/sis-utility/src/main/java/org/apache/sis/measure/
core/sis-utility/src/test/java/org/apache/sis/measure/ storage/sis-netcdf/
Author: desruisseaux
Date: Sat Oct 29 15:39:08 2016
New Revision: 1767109
URL: http://svn.apache.org/viewvc?rev=1767109&view=rev
Log:
Merge test tuning from JDK8 branch.
Modified:
sis/branches/JDK7/ (props changed)
sis/branches/JDK7/application/sis-console/pom.xml
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/ConventionalUnit.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/SystemUnit.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/ConventionalUnitTest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java
sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java
sis/branches/JDK7/storage/sis-netcdf/pom.xml
Propchange: sis/branches/JDK7/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Oct 29 15:39:08 2016
@@ -1,4 +1,4 @@
/sis/branches/Android:1430670-1480699
/sis/branches/JDK6:1394913-1508480
-/sis/branches/JDK8:1584960-1766907
+/sis/branches/JDK8:1584960-1767108
/sis/trunk:1394364-1508466,1519089-1519674
Modified: sis/branches/JDK7/application/sis-console/pom.xml
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/application/sis-console/pom.xml?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/application/sis-console/pom.xml (original)
+++ sis/branches/JDK7/application/sis-console/pom.xml Sat Oct 29 15:39:08 2016
@@ -125,6 +125,12 @@ Console application.
<version>${geoapi.version}</version>
<type>test-jar</type>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>tec.units</groupId>
+ <artifactId>unit-ri</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.apache.sis.core</groupId>
Modified: sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/ConventionalUnit.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/ConventionalUnit.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/ConventionalUnit.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/ConventionalUnit.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -94,13 +94,15 @@ final class ConventionalUnit<Q extends Q
}
/*
* Verifies if an instance already exists for the given converter.
+ * The 'related' array is populated only by the Units class static initializer.
+ * The SystemUnitTest.verifyRelatedUnits() method verified that the array does
+ * not contain null element and that all 'toTarget' are instances of LinearConverter.
*/
final ConventionalUnit<Q>[] related = target.related;
if (related != null && toTarget instanceof LinearConverter) {
final LinearConverter c = (LinearConverter) toTarget;
for (final ConventionalUnit<Q> existing : related) {
- // Units.add(\u2026) verified the UnitConverter class.
- if (c.equivalent((LinearConverter) existing.toTarget)) {
+ if (c.equivalent((LinearConverter) existing.toTarget)) { // Cast is safe - see above comment.
return existing;
}
}
Modified: sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/SystemUnit.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/SystemUnit.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/SystemUnit.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/SystemUnit.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -66,6 +66,8 @@ final class SystemUnit<Q extends Quantit
* Units for the same quantity but with scale factors that are not the SI one.
* This is initialized by {@link Units} only and shall not change anymore after.
* All units in this array shall use an instance of {@link LinearConverter}.
+ *
+ * @see #related(int)
*/
transient ConventionalUnit<Q>[] related;
@@ -459,6 +461,15 @@ final class SystemUnit<Q extends Quantit
}
/**
+ * Invoked by {@link Units} initializer before to fill the {@link #related} array.
+ * We define this method only for isolating the generic array creation.
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ final void related(final int n) {
+ related = new ConventionalUnit[n];
+ }
+
+ /**
* Compares this unit with the given object for equality.
*
* @param other the other object to compares with this unit, or {@code null}.
Modified: sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/UnitFormat.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -263,7 +263,7 @@ public class UnitFormat extends Format i
*
* @see #symbolToName()
*/
- private transient ResourceBundle symbolToName;
+ private transient volatile ResourceBundle symbolToName;
/**
* Mapping from long localized and unlocalized names to unit instances.
Modified: sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -16,7 +16,6 @@
*/
package org.apache.sis.measure;
-import java.util.Arrays;
import javax.measure.Dimension;
import javax.measure.Unit;
import javax.measure.UnitConverter;
@@ -707,16 +706,21 @@ public final class Units extends Static
final LinearConverter kilo = LinearConverter.forPrefix('k');
/*
* All Unit<Angle>
+ * 20 is the greatest common denominator between 180 and 200. The intend is to have arguments as small
+ * as possible in the call to the scale(double, double) method, while keeping the right side integer.
+ * Staying closer to zero during conversions helo to reduce rounding errors.
*/
+ rad.related(4);
RADIAN = rad;
GRAD = add(rad, LinearConverter.scale(Math.PI / 20, 200 / 20), "grad", UnitRegistry.OTHER, (short) 9105);
DEGREE = add(rad, LinearConverter.scale(Math.PI / 20, 180 / 20), "�", UnitRegistry.ACCEPTED, Constants.EPSG_PARAM_DEGREES);
ARC_MINUTE = add(rad, LinearConverter.scale(Math.PI / 20, 180*60 / 20), "\u2032", UnitRegistry.ACCEPTED, (short) 9103);
ARC_SECOND = add(rad, LinearConverter.scale(Math.PI / 20, 180*60*60 / 20), "\u2033", UnitRegistry.ACCEPTED, (short) 9104);
- MICRORADIAN = add(rad, micro, "�rad", UnitRegistry.SI, (short) 9109);
+ MICRORADIAN = add(rad, micro, "�rad", UnitRegistry.SI, (short) 9109);
/*
* All Unit<Length>
*/
+ m.related(6);
METRE = m;
NANOMETRE = add(m, nano, "nm", UnitRegistry.SI, (short) 0);
MILLIMETRE = add(m, milli, "mm", UnitRegistry.SI, (short) 1025);
@@ -731,6 +735,7 @@ public final class Units extends Static
/*
* All Unit<Time>
*/
+ s.related(5);
SECOND = s;
MILLISECOND = add(s, milli, "ms", UnitRegistry.SI, (short) 0);
MINUTE = add(s, LinearConverter.scale( 60, 1), "min", UnitRegistry.ACCEPTED, (short) 0);
@@ -794,18 +799,14 @@ public final class Units extends Static
* Invoked by {@code Units} static class initializer for registering SI conventional units.
* This method shall be invoked in a single thread by the {@code Units} class initializer only.
*/
- @SuppressWarnings({"unchecked", "rawtypes"})
private static <Q extends Quantity<Q>> ConventionalUnit<Q> add(SystemUnit<Q> target, UnitConverter toTarget, String symbol, byte scope, short epsg) {
final ConventionalUnit<Q> unit = UnitRegistry.init(new ConventionalUnit<>(target, toTarget, symbol, scope, epsg));
- if (unit.scope != UnitRegistry.SI && toTarget instanceof LinearConverter) {
- ConventionalUnit<Q>[] related = target.related;
- if (related == null) {
- related = new ConventionalUnit[1];
- } else {
- related = Arrays.copyOf(related, related.length + 1);
- }
- related[related.length - 1] = unit;
- target.related = related;
+ final ConventionalUnit<Q>[] related = target.related;
+ if (related != null && unit.scope != UnitRegistry.SI) {
+ // Search first empty slot. This algorithm is inefficient, but the length of those arrays is small (<= 6).
+ int i = 0;
+ while (related[i] != null) i++;
+ related[i] = unit;
}
return unit;
}
Modified: sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/ConventionalUnitTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/ConventionalUnitTest.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/ConventionalUnitTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/ConventionalUnitTest.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -181,7 +181,11 @@ public final strictfp class Conventional
verify (Units.CUBIC_METRE, Units.CUBIC_METRE .multiply(1E+9), "km�", 1E+9);
verify (Units.CUBIC_METRE, Units.CUBIC_METRE .divide (1E+9), "mm�", 1E-9);
- assertSame(Units.HOUR, Units.SECOND.multiply(3600));
+ assertSame(Units.HOUR, Units.SECOND.multiply(3600));
+ assertSame(Units.DEGREE, Units.RADIAN.multiply(Math.PI/180));
+ assertSame(Units.GRAD, Units.RADIAN.multiply(Math.PI/200));
+ assertSame(Units.ARC_SECOND, Units.RADIAN.multiply(Math.PI / (180*60*60)));
+ assertSame(Units.MICRORADIAN, Units.RADIAN.divide(1E6));
}
/**
@@ -203,6 +207,17 @@ public final strictfp class Conventional
}
/**
+ * Tests {@link ConventionalUnit#isCompatible(Unit)}.
+ */
+ @Test
+ public void testIsCompatible() {
+ assertTrue (Units.KILOMETRE.isCompatible(Units.METRE));
+ assertFalse(Units.KILOMETRE.isCompatible(Units.SECOND));
+ assertTrue (Units.DEGREE .isCompatible(Units.GRAD));
+ assertTrue (Units.DEGREE .isCompatible(Units.PPM)); // Because those units are dimensionless.
+ }
+
+ /**
* Tests conversion of an angular value between two conventional units.
* The use of angular units is of special interest because of rounding errors.
*/
Modified: sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/SystemUnitTest.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -20,7 +20,9 @@ import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
+import java.lang.reflect.Field;
import javax.measure.Unit;
+import javax.measure.UnitConverter;
import javax.measure.UnconvertibleException;
import javax.measure.IncommensurableException;
import javax.measure.quantity.Length;
@@ -45,6 +47,32 @@ import static org.apache.sis.test.Assert
@DependsOn(UnitDimensionTest.class)
public final strictfp class SystemUnitTest extends TestCase {
/**
+ * Verifies the {@link SystemUnit#related} array content of all system units declared in {@link Units}.
+ * This tests verify that the array has been fully populated and that the converter of all units are
+ * instance of {@link LinearConverter}.
+ *
+ * @throws ReflectiveOperationException if an error occurred while iterating over the field values.
+ *
+ * @see ConventionalUnit#create(SystemUnit, UnitConverter)
+ */
+ @Test
+ public void verifyRelatedUnits() throws ReflectiveOperationException {
+ for (final Field f : Units.class.getFields()) {
+ final Object value = f.get(null);
+ if (value instanceof SystemUnit<?>) {
+ final ConventionalUnit<?>[] related = ((SystemUnit<?>) value).related;
+ if (related != null) {
+ final String symbol = ((SystemUnit<?>) value).getSymbol();
+ for (final ConventionalUnit<?> r : related) {
+ assertNotNull(symbol, r);
+ assertInstanceOf(symbol, LinearConverter.class, r.toTarget);
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Tests {@link SystemUnit#multiply(Unit)}.
*/
@Test
Modified: sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitServicesTest.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -30,7 +30,7 @@ import static org.apache.sis.test.Assert
/**
- * Test {@link UnitServicesTest}.
+ * Test {@link UnitServices}.
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.8
Modified: sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java [UTF-8] Sat Oct 29 15:39:08 2016
@@ -17,6 +17,15 @@
package org.apache.sis.measure;
import javax.measure.Unit;
+import javax.measure.quantity.Angle;
+import javax.measure.quantity.Area;
+import javax.measure.quantity.Dimensionless;
+import javax.measure.quantity.Length;
+import javax.measure.quantity.Mass;
+import javax.measure.quantity.Speed;
+import javax.measure.quantity.Temperature;
+import javax.measure.quantity.Time;
+import javax.measure.quantity.Volume;
import org.apache.sis.test.DependsOn;
import org.apache.sis.test.TestCase;
import org.junit.Test;
@@ -184,6 +193,22 @@ public final strictfp class UnitsTest ex
}
/**
+ * Tests getting a unit for a given quantity type.
+ */
+ @Test
+ public void testGetForQuantity() {
+ assertSame("Length", Units.METRE, Units.get(Length.class));
+ assertSame("Mass", Units.KILOGRAM, Units.get(Mass.class));
+ assertSame("Time", Units.SECOND, Units.get(Time.class));
+ assertSame("Temperature", Units.KELVIN, Units.get(Temperature.class));
+ assertSame("Area", Units.SQUARE_METRE, Units.get(Area.class));
+ assertSame("Volume", Units.CUBIC_METRE, Units.get(Volume.class));
+ assertSame("Speed", Units.METRES_PER_SECOND, Units.get(Speed.class));
+ assertSame("Angle", Units.RADIAN, Units.get(Angle.class));
+ assertSame("Dimensionless", Units.UNITY, Units.get(Dimensionless.class));
+ }
+
+ /**
* Tests {@link Units#valueOf(String)} with units most commonly found in geospatial data.
*/
@Test
Modified: sis/branches/JDK7/storage/sis-netcdf/pom.xml
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/storage/sis-netcdf/pom.xml?rev=1767109&r1=1767108&r2=1767109&view=diff
==============================================================================
--- sis/branches/JDK7/storage/sis-netcdf/pom.xml (original)
+++ sis/branches/JDK7/storage/sis-netcdf/pom.xml Sat Oct 29 15:39:08 2016
@@ -126,6 +126,12 @@ Bridge between NetCDF Climate and Foreca
<artifactId>geoapi-netcdf</artifactId>
<version>${geoapi.version}</version>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>tec.units</groupId>
+ <artifactId>unit-ri</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.opengis.wrapper</groupId>
@@ -133,6 +139,12 @@ Bridge between NetCDF Climate and Foreca
<version>${geoapi.version}</version>
<type>test-jar</type>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>tec.units</groupId>
+ <artifactId>unit-ri</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>