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>