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 2018/02/24 15:44:10 UTC

svn commit: r1825252 [3/7] - in /sis/branches/JDK9: ./ application/ application/sis-console/src/main/artifact/ application/sis-console/src/main/java/org/apache/sis/console/ application/sis-openoffice/ application/sis-openoffice/src/main/java/org/apache...

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -3185,7 +3185,7 @@ next:               while (r.next()) {
                           ? " ORDER BY ABS(DEPRECATED), "
                           : " AND DEPRECATED=0 ORDER BY ");     // Do not put spaces around "=" - SQLTranslator searches for this exact match.
             if (isFloat) {
-                buffer.append("ABS(").append(select).append("-?), ");
+                buffer.append("ABS(").append(where).append("-?), ");
             }
             buffer.append(select);          // Only for making order determinist.
             /*

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGFactory.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -45,6 +45,7 @@ import org.apache.sis.internal.system.De
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.referencing.factory.ConcurrentAuthorityFactory;
 import org.apache.sis.referencing.factory.UnavailableFactoryException;
+import org.apache.sis.util.resources.Messages;
 import org.apache.sis.util.logging.Logging;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.Classes;
@@ -270,7 +271,7 @@ public class EPSGFactory extends Concurr
                 throw new UnavailableFactoryException(Initializer.unspecified(locale));
             }
         } catch (Exception e) {
-            throw new UnavailableFactoryException(message(e), e);
+            throw new UnavailableFactoryException(canNotUse(e), e);
         }
         dataSource   = ds;
         nameFactory  = factory(NameFactory.class,                "nameFactory",  properties);
@@ -293,12 +294,19 @@ public class EPSGFactory extends Concurr
     /**
      * Returns the message to put in an {@link UnavailableFactoryException} having the given exception as its cause.
      */
-    private String message(final Exception e) {
+    private String canNotUse(final Exception e) {
         String message = Exceptions.getLocalizedMessage(e, locale);
         if (message == null) {
             message = Classes.getShortClassName(e);
         }
-        return Resources.forLocale(locale).getString(Resources.Keys.CanNotUseGeodeticParameters_2, Constants.EPSG, message);
+        return canNotUse(message);
+    }
+
+    /**
+     * Returns the message to put in an {@link UnavailableFactoryException} having the given cause.
+     */
+    private String canNotUse(final String cause) {
+        return Resources.forLocale(locale).getString(Resources.Keys.CanNotUseGeodeticParameters_2, Constants.EPSG, cause);
     }
 
     /**
@@ -367,15 +375,18 @@ public class EPSGFactory extends Concurr
      * See <a href="https://issues.apache.org/jira/browse/LEGAL-183">LEGAL-183</a> for more information.</p>
      *
      * @param  connection  connection to the database where to create the EPSG schema.
-     * @throws FileNotFoundException if a SQL script has not been found,
-     *         typically because a required resource is not on the classpath.
-     * @throws IOException  if an I/O error occurred while reading a SQL script.
-     * @throws SQLException if an error occurred while writing to the database.
+     * @throws UnavailableFactoryException if installation failed. The exception will have a
+     *         {@link FileNotFoundException} cause if a SQL script has not been found
+     *         (typically because a required resource is not on the classpath), an
+     *         {@link IOException} if an I/O error occurred while reading a SQL script, or a
+     *         {@link SQLException} if an error occurred while writing to the database.
      *
      * @see InstallationScriptProvider
      */
-    public synchronized void install(final Connection connection) throws IOException, SQLException {
+    public synchronized void install(final Connection connection) throws UnavailableFactoryException {
         ArgumentChecks.ensureNonNull("connection", connection);
+        String    message = null;
+        Exception failure = null;
         try (EPSGInstaller installer = new EPSGInstaller(connection)) {
             final boolean ac = connection.getAutoCommit();
             if (ac) {
@@ -403,9 +414,21 @@ public class EPSGFactory extends Concurr
                     }
                 }
             } catch (IOException | SQLException e) {
-                installer.logFailure(locale, e);
-                throw e;
+                message = installer.failure(locale, e);
+                failure = e;
             }
+        } catch (SQLException e) {
+            message = Messages.getResources(locale).getString(Messages.Keys.CanNotCreateSchema_1, Constants.EPSG);
+            failure = e;
+        }
+        if (failure != null) {
+            /*
+             * Derby sometime wraps SQLException into another SQLException.  For making the stack strace a
+             * little bit simpler, keep only the root cause provided that the exception type is compatible.
+             */
+            UnavailableFactoryException exception = new UnavailableFactoryException(message, Exceptions.unwrap(failure));
+            exception.setUnavailableFactory(this);
+            throw exception;
         }
     }
 
@@ -455,7 +478,7 @@ public class EPSGFactory extends Concurr
                 return newDataAccess(connection, tr);
             } else {
                 connection.close();
-                exception = new UnavailableFactoryException(SQLTranslator.tableNotFound(locale));
+                exception = new UnavailableFactoryException(canNotUse(SQLTranslator.tableNotFound(locale)));
             }
         } catch (Exception e) {                     // Really want to catch all exceptions here.
             if (connection != null) try {
@@ -463,11 +486,14 @@ public class EPSGFactory extends Concurr
             } catch (SQLException e2) {
                 e.addSuppressed(e2);
             }
+            if (e instanceof FactoryException) {
+                throw (FactoryException) e;
+            }
             /*
              * Derby sometime wraps SQLException into another SQLException.  For making the stack strace a
              * little bit simpler, keep only the root cause provided that the exception type is compatible.
              */
-            exception = new UnavailableFactoryException(message(e), Exceptions.unwrap(e));
+            exception = new UnavailableFactoryException(canNotUse(e), Exceptions.unwrap(e));
         }
         exception.setUnavailableFactory(this);
         throw exception;

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGInstaller.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -25,7 +25,6 @@ import java.sql.SQLException;
 import java.util.StringTokenizer;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
-import java.util.logging.LogRecord;
 import java.io.BufferedReader;
 import org.apache.sis.util.StringBuilders;
 import org.apache.sis.internal.metadata.sql.ScriptRunner;
@@ -187,7 +186,7 @@ final class EPSGInstaller extends Script
 
     /**
      * Invoked for each text found in a SQL statement. This method replaces {@code ''} by {@code Null}.
-     * The intend is to consistently use the null value for meaning "no information", which is not the
+     * The intent is to consistently use the null value for meaning "no information", which is not the
      * same than "information is an empty string". This replacement is okay in this particular case
      * since there is no field in the EPSG database for which we really want an empty string.
      *
@@ -275,18 +274,16 @@ final class EPSGInstaller extends Script
     }
 
     /**
-     * Logs a message reporting the failure to create EPSG database. This method is invoked when {@link EPSGFactory}
-     * caught an exception. This log completes rather than replaces the exception message since {@code EPSGFactory}
-     * lets the exception propagate. Another code (for example {@link org.apache.sis.referencing.CRS#forCode(String)})
-     * may catch that exception and log another record with the exception message.
+     * Creates a message reporting the failure to create EPSG database. This method is invoked when {@link EPSGFactory}
+     * caught an exception. This method completes the exception message with the file name and line number where the
+     * error occurred, if such information is available.
      */
-    final void logFailure(final Locale locale, final Exception cause) {
+    final String failure(final Locale locale, final Exception cause) {
         String message = Messages.getResources(locale).getString(Messages.Keys.CanNotCreateSchema_1, EPSG);
         String status = status(locale);
         if (status != null) {
             message = message + ' ' + status;
         }
-        message = Exceptions.formatChainedMessages(locale, message, cause);
-        InstallationScriptProvider.log(new LogRecord(Level.WARNING, message));
+        return Exceptions.formatChainedMessages(locale, message, cause);
     }
 }

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/SQLTranslator.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -19,6 +19,7 @@ package org.apache.sis.referencing.facto
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Locale;
+import java.util.function.Function;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -28,9 +29,6 @@ import org.apache.sis.util.ArgumentCheck
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.internal.util.Constants;
 
-// Branch-dependent imports
-import java.util.function.Function;
-
 
 /**
  * Converts the SQL statements from MS-Access dialect to standard SQL. The {@link #apply(String)} method

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -53,6 +53,7 @@ import org.apache.sis.util.collection.Co
 import org.apache.sis.util.UnsupportedImplementationException;
 import org.apache.sis.util.logging.Logging;
 import org.apache.sis.parameter.Parameterized;
+import org.apache.sis.metadata.iso.citation.Citations;
 import org.apache.sis.referencing.cs.CoordinateSystems;
 import org.apache.sis.referencing.AbstractIdentifiedObject;
 import org.apache.sis.referencing.operation.transform.MathTransforms;
@@ -64,6 +65,7 @@ import org.apache.sis.internal.referenci
 import org.apache.sis.internal.referencing.WKTUtilities;
 import org.apache.sis.internal.metadata.WKTKeywords;
 import org.apache.sis.internal.metadata.MetadataUtilities;
+import org.apache.sis.internal.util.Constants;
 import org.apache.sis.internal.util.CollectionsExt;
 import org.apache.sis.internal.util.UnmodifiableArrayList;
 import org.apache.sis.internal.system.Semaphores;
@@ -963,10 +965,27 @@ check:      for (int isTarget=0; ; isTar
                 parameters = null;
             }
             if (parameters != null) {
+                /*
+                 * Format the parameter values. Apache SIS uses the EPSG geodetic dataset as the main source of
+                 * parameter definitions. When a parameter is defined by both OGC and EPSG with different names,
+                 * the Formatter class is responsible for choosing an appropriate name. But when the difference
+                 * is more fundamental, we may have duplication. For example in the "Molodensky" operation, OGC
+                 * uses source and target axis lengths while EPSG uses only difference between those lengths.
+                 * In this case, OGC and EPSG parameters are defined separately and are redundant. To simplify
+                 * the CoordinateOperation WKT, we omit non-EPSG parameters when we have determined that we are
+                 * about to describe an EPSG operation. We could generalize this filtering to any authority, but
+                 * we don't because few authorities are as complete as EPSG, so other authorities are more likely
+                 * to mix EPSG or someone else components with their own. Note also that we don't apply filtering
+                 * on MathTransform WKT neither for more reliable debugging.
+                 */
+                final boolean filter = WKTUtilities.isEPSG(parameters.getDescriptor(), false) &&   // NOT method.getName()
+                        Constants.EPSG.equalsIgnoreCase(Citations.getCodeSpace(formatter.getNameAuthority()));
                 formatter.newLine();
                 formatter.indent(+1);
                 for (final GeneralParameterValue param : parameters.values()) {
-                    WKTUtilities.append(param, formatter);
+                    if (!filter || WKTUtilities.isEPSG(param.getDescriptor(), true)) {
+                        WKTUtilities.append(param, formatter);
+                    }
                 }
                 formatter.indent(-1);
             }

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/AbstractSingleOperation.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -173,7 +173,7 @@ class AbstractSingleOperation extends Ab
      * In the particular case of a {@linkplain PassThroughTransform pass through transform} with more dimensions
      * than what we would expect from the given method, the check will rather be performed against the
      * {@linkplain PassThroughTransform#getSubTransform() sub transform}.
-     * The intend is to allow creation of a three-dimensional {@code ProjectedCRS} with a two-dimensional
+     * The intent is to allow creation of a three-dimensional {@code ProjectedCRS} with a two-dimensional
      * {@code OperationMethod}, where the third-dimension just pass through.
      *
      * <p>This method tries to locates what seems to be the "core" of the given math transform. The definition

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -17,6 +17,7 @@
 package org.apache.sis.referencing.operation;
 
 import java.io.Serializable;
+import java.util.function.Predicate;
 import org.opengis.metadata.extent.Extent;
 import org.opengis.metadata.extent.GeographicBoundingBox;
 import org.opengis.referencing.operation.CoordinateOperation;
@@ -25,9 +26,6 @@ import org.apache.sis.metadata.iso.exten
 import org.apache.sis.internal.util.CollectionsExt;
 import org.apache.sis.util.ArgumentChecks;
 
-// Branch-dependent imports
-import java.util.function.Predicate;
-
 
 /**
  * Optional information about the context in which a requested coordinate operation will be used.

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -542,7 +542,7 @@ public class CoordinateOperationFinder e
                 /*
                  * TODO: instead than creating parameters for an identity operation, we should create the
                  *       CoordinateOperation directly from the MathTransform created by mtFactory below.
-                 *       The intend if to get the correct OperationMethod, which should not be "Affine"
+                 *       The intent if to get the correct OperationMethod, which should not be "Affine"
                  *       if there is a CS type change.
                  */
                 parameters = Affine.identity(targetDim);
@@ -957,7 +957,7 @@ public class CoordinateOperationFinder e
         /*
          * If one of the transform performs nothing more than a change of axis order or units, do
          * not expose that conversion in a ConcatenatedTransform.  Instead, merge that conversion
-         * with the "main" operation. The intend is to simplify the operation chain by hidding
+         * with the "main" operation. The intent is to simplify the operation chain by hidding
          * trivial operations.
          */
         CoordinateOperation main = null;

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.Objects;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
+import java.util.function.Predicate;
 import javax.measure.IncommensurableException;
 
 import org.opengis.util.FactoryException;
@@ -78,9 +79,6 @@ import org.apache.sis.util.collection.Co
 import org.apache.sis.util.collection.BackingStoreException;
 import org.apache.sis.util.resources.Vocabulary;
 
-// Branch-dependent imports
-import java.util.function.Predicate;
-
 
 /**
  * Base class of code that search for coordinate operation, either by looking in a registry maintained by an authority

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -548,7 +548,7 @@ next:   for (int i=components.size(); --
             transform = getMathTransformFactory().createBaseToDerived(sourceCRS, parameters, targetCRS.getCoordinateSystem());
         }
         /*
-         * The "operationType" property is currently undocumented. The intend is to help this factory method in
+         * The "operationType" property is currently undocumented. The intent is to help this factory method in
          * situations where the given operation method is not an Apache SIS implementation or does not override
          * getOperationType(), or the method is ambiguous (e.g. "Affine" can be used for both a transformation
          * or a conversion).

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilder.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -110,7 +110,7 @@ public class LinearTransformBuilder exte
     private int numPoints;
 
     /**
-     * The transform created by the last call to {@link #create()}.
+     * The transform created by the last call to {@link #create(MathTransformFactory)}.
      * This is reset to {@code null} when coordinates are modified.
      */
     private transient LinearTransform transform;
@@ -373,8 +373,6 @@ search: for (int j=0; j<numPoints; j++)
             throws MismatchedDimensionException
     {
         ArgumentChecks.ensureNonNull("sourceToTarget", sourceToTarget);
-        pendingSources = null;
-        pendingTargets = null;
         transform   = null;
         correlation = null;
         sources     = null;
@@ -513,7 +511,6 @@ search: for (int j=0; j<numPoints; j++)
      * @since 0.8
      */
     public double[] getControlPoint(final int[] source) {
-        processPendings();
         ArgumentChecks.ensureNonNull("source", source);
         verifySourceDimension(source.length);
         if (targets == null) {
@@ -551,97 +548,6 @@ search: for (int j=0; j<numPoints; j++)
     }
 
     /**
-     * Sets the source points, overwriting any previous setting. The number of source points will need to be the same
-     * than the number of {@linkplain #setTargetPoints target points} when the {@link #create()} method will be invoked.
-     * In current Apache SIS implementation, the source points must be one or two-dimensional.
-     *
-     * <p>If this builder has been created with the {@link #LinearTransformBuilder(int...)} constructor,
-     * then all given points must be two-dimensional and all ordinate values must be integers in the
-     * [0 … <var>width</var>-1] or [0 … <var>height</var>-1] range for the first and second dimension
-     * respectively. This constraint does not apply if this builder has been created with the
-     * {@link #LinearTransformBuilder()} constructor.</p>
-     *
-     * <p>It is caller's responsibility to ensure that no source point is duplicated.
-     * If the same source point is repeated twice, then {@code LinearTransformBuilder} behavior is undefined.</p>
-     *
-     * @param  points  the source points, assumed precise.
-     * @throws MismatchedDimensionException if at least one point does not have the expected number of dimensions.
-     *
-     * @deprecated Replaced by {@link #setControlPoints(Map)}.
-     */
-    @Deprecated
-    public void setSourcePoints(final DirectPosition... points) throws MismatchedDimensionException {
-        ArgumentChecks.ensureNonNull("points", points);
-        transform   = null;
-        correlation = null;
-        sources     = null;
-        targets     = null;
-        numPoints   = 0;
-        pendingSources = points.clone();
-    }
-
-    /**
-     * Sets the target points, overwriting any previous setting. The number of target points will need to be the same
-     * than the number of {@linkplain #setSourcePoints source points} when the {@link #create()} method will be invoked.
-     * Target points can have any number of dimensions (not necessarily 2), but all points shall have
-     * the same number of dimensions.
-     *
-     * @param  points  the target points, assumed uncertain.
-     * @throws MismatchedDimensionException if not all points have the same number of dimensions.
-     *
-     * @deprecated Replaced by {@link #setControlPoints(Map)}.
-     */
-    @Deprecated
-    public void setTargetPoints(final DirectPosition... points) throws MismatchedDimensionException {
-        ArgumentChecks.ensureNonNull("points", points);
-        transform   = null;
-        correlation = null;
-        sources     = null;
-        targets     = null;
-        numPoints   = 0;
-        pendingTargets = points.clone();
-    }
-
-    @Deprecated
-    private transient DirectPosition[] pendingSources, pendingTargets;
-
-    @Deprecated
-    private void processPendings() {
-        if (pendingSources != null || pendingTargets != null) {
-            if (pendingSources == null || pendingTargets == null) {
-                throw new IllegalStateException(Errors.format(
-                        Errors.Keys.MissingValueForProperty_1, (pendingSources == null) ? "sources" : "targets"));
-            }
-            final int length = pendingSources.length;
-            if (pendingTargets.length != length) {
-                throw new IllegalStateException(Errors.format(Errors.Keys.MismatchedArrayLengths));
-            }
-            final Map<DirectPosition,DirectPosition> sourceToTarget = new java.util.HashMap<>(length);
-            for (int i=0; i<length; i++) {
-                sourceToTarget.put(pendingSources[i], pendingTargets[i]);
-            }
-            setControlPoints(sourceToTarget);
-        }
-    }
-
-    /**
-     * Creates a linear transform approximation from the source positions to the target positions.
-     * This method assumes that source positions are precise and that all uncertainty is in the target positions.
-     *
-     * @return the fitted linear transform.
-     *
-     * @deprecated Replaced by {@link #create(MathTransformFactory)}.
-     */
-    @Deprecated
-    public LinearTransform create() {
-        try {
-            return create(null);
-        } catch (FactoryException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
      * Creates a linear transform approximation from the source positions to the target positions.
      * This method assumes that source positions are precise and that all uncertainty is in the target positions.
      *
@@ -658,7 +564,6 @@ search: for (int j=0; j<numPoints; j++)
     @SuppressWarnings("serial")
     public LinearTransform create(final MathTransformFactory factory) throws FactoryException {
         if (transform == null) {
-            processPendings();
             final double[][] sources = this.sources;                    // Protect from changes.
             final double[][] targets = this.targets;
             if (targets == null) {
@@ -731,7 +636,7 @@ search: for (int j=0; j<numPoints; j++)
     }
 
     /**
-     * Returns the correlation coefficients of the last transform created by {@link #create()},
+     * Returns the correlation coefficients of the last transform created by {@link #create create(…)},
      * or {@code null} if none. If non-null, the array length is equals to the number of target
      * dimensions.
      *

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/matrix/GeneralMatrix.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -175,7 +175,7 @@ class GeneralMatrix extends MatrixSIS im
     /**
      * Infers all {@link DoubleDouble#error} with a default values inferred from {@link DoubleDouble#value}.
      * For example if a matrix element is exactly 3.141592653589793, there is good chances that the user's
-     * intend was to specify the {@link Math#PI} value, in which case this method will infer that we would
+     * intent was to specify the {@link Math#PI} value, in which case this method will infer that we would
      * need to add 1.2246467991473532E-16 in order to get a value closer to π.
      */
     static void inferErrors(final double[] elements) {

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AlbersEqualArea.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AlbersEqualArea.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AlbersEqualArea.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AlbersEqualArea.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -138,7 +138,7 @@ public class AlbersEqualArea extends Equ
         /*
          * Compute rn = (1-ℯ²)/nm, which is the reciprocal of the "real" n used in Snyder and EPSG guidance note.
          * We opportunistically use double-double arithmetic since the MatrixSIS operations use them anyway, but
-         * we do not really have that accuracy because of the limited precision of 'nm'. The intend is rather to
+         * we do not really have that accuracy because of the limited precision of 'nm'. The intent is rather to
          * increase the chances term cancellations happen during concatenation of coordinate operations.
          */
         final DoubleDouble rn = DoubleDouble.verbatim(1);

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Initializer.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Initializer.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Initializer.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Initializer.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -37,7 +37,7 @@ import static org.apache.sis.internal.ut
 /**
  * Helper class for map projection constructions, providing formulas normally needed only at construction time.
  * Since map projection constructions should not happen very often, we afford using some double-double arithmetic.
- * The main intend is not to provide more accurate coordinate conversions (while it may be a nice side-effect),
+ * The main intent is not to provide more accurate coordinate conversions (while it may be a nice side-effect),
  * but to improve the result of matrix multiplications when the map projection is part of a more complex chain
  * of transformations. More specifically we want to be able:
  *

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/Mercator.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -251,7 +251,7 @@ public class Mercator extends ConformalP
         if (λ0 != 0) {
             /*
              * Use double-double arithmetic here for consistency with the work done in the normalization matrix.
-             * The intend is to have exact value at 'double' precision when computing Matrix.invert(). Note that
+             * The intent is to have exact value at 'double' precision when computing Matrix.invert(). Note that
              * there is no such goal for other parameters computed from sine or consine functions.
              */
             final DoubleDouble offset = DoubleDouble.createDegreesToRadians();

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -106,7 +106,7 @@ import static java.lang.Math.*;
  * higher level}.</div>
  *
  * {@code NormalizedProjection} does not store the above cited parameters (central meridian, scale factor, <i>etc.</i>)
- * on intend (except indirectly), in order to make clear that those parameters are not used by subclasses.
+ * on intent (except indirectly), in order to make clear that those parameters are not used by subclasses.
  * The ability to recognize two {@code NormalizedProjection}s as {@linkplain #equals(Object, ComparisonMode) equivalent}
  * without consideration for the scale factor (among other) allow more efficient concatenation in some cases
  * (typically some combinations of inverse projection followed by a direct projection).

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -294,7 +294,7 @@ abstract class AbstractLinearTransform e
             /*
              * If the 'inverse' matrix was not computed in any of the transforms being compared
              * (i.e. if 'this.inverse' and 'object.inverse' are both null), then assume that the
-             * two transforms will compute their inverse in the same way. The intend is to avoid
+             * two transforms will compute their inverse in the same way. The intent is to avoid
              * to trig the inverse transform computation.
              *
              * Note that this code requires the 'inverse' fields to be volatile

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameter.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameter.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameter.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ContextualParameter.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -26,7 +26,7 @@ import org.apache.sis.parameter.DefaultP
  * This temporary {@code ParameterValue} bypasses the validity check normally performed by {@link DefaultParameterValue}.
  *
  * <div class="note"><b>Rational:</b>
- * The intend is to skip the parameter value verification done by {@link DefaultParameterValue#setValue(Object, Unit)}
+ * The intent is to skip the parameter value verification done by {@link DefaultParameterValue#setValue(Object, Unit)}
  * on the assumption that the value has already been verified when the user created his {@code ParameterValueGroup}.
  * Even if the user's {@code ParameterValue} implementation did not performed any verification, there is chances that
  * {@link DefaultMathTransformFactory} {@linkplain org.apache.sis.parameter.Parameters#copy copied} the parameters in

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransform.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -157,9 +157,9 @@ abstract class CoordinateSystemTransform
     }
 
     /**
-     * Implementation of {@link DefaultMathTransformFactory#createCoordinateSystemChange(CoordinateSystem, CoordinateSystem)},
-     * defined here for reducing the {@code DefaultMathTransformFactory} weight in the common case where the conversions
-     * handled by this class are not needed.
+     * Implementation of {@link DefaultMathTransformFactory#createCoordinateSystemChange(CoordinateSystem,
+     * CoordinateSystem, Ellipsoid)}, defined here for reducing the {@code DefaultMathTransformFactory}
+     * weight in the common case where the conversions handled by this class are not needed.
      */
     static MathTransform create(final MathTransformFactory factory, final CoordinateSystem source,
             final CoordinateSystem target) throws FactoryException

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactory.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -686,7 +686,7 @@ public class DefaultMathTransformFactory
         /**
          * If the parameters given by the user were not created by {@code getDefaultParameters(String)}
          * or something equivalent, copies those parameters into the structure expected by the provider.
-         * The intend is to make sure that we have room for the parameters that {@code setEllipsoids(…)}
+         * The intent is to make sure that we have room for the parameters that {@code setEllipsoids(…)}
          * may write.
          *
          * <p>A side effect of this method is that the copy operation may perform a check of
@@ -1203,25 +1203,6 @@ public class DefaultMathTransformFactory
     }
 
     /**
-     * Creates a math transform that represent a change of coordinate system.
-     *
-     * @param  source  the source coordinate system.
-     * @param  target  the target coordinate system.
-     * @return a conversion from the given source to the given target coordinate system.
-     * @throws FactoryException if the conversion can not be created.
-     *
-     * @deprecated Replaced by {@link #createCoordinateSystemChange(CoordinateSystem, CoordinateSystem, Ellipsoid)}
-     *
-     * @since 0.7
-     */
-    @Deprecated
-    public MathTransform createCoordinateSystemChange(final CoordinateSystem source, final CoordinateSystem target)
-            throws FactoryException
-    {
-        return createCoordinateSystemChange(source, target, null);
-    }
-
-    /**
      * Creates a math transform that represent a change of coordinate system. If exactly one argument is
      * an {@linkplain org.apache.sis.referencing.cs.DefaultEllipsoidalCS ellipsoidal coordinate systems},
      * then the {@code ellipsoid} argument is mandatory. In all other cases (including the case where both

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/EllipsoidToCentricTransform.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -898,7 +898,7 @@ next:   while (--numPts >= 0) {
         /**
          * If this transform returns three-dimensional outputs, and if the transform just after this one
          * just drops the height values, then replaces this transform by a two-dimensional one.
-         * The intend is to handle the following sequence of operations defined in the EPSG database:
+         * The intent is to handle the following sequence of operations defined in the EPSG database:
          *
          * <ol>
          *   <li>Inverse of <cite>Geographic/geocentric conversions</cite> (EPSG:9602)</li>
@@ -978,7 +978,7 @@ next:   while (--numPts >= 0) {
     /**
      * If this transform expects three-dimensional inputs, and if the transform just before this one
      * unconditionally sets the height to zero, then replaces this transform by a two-dimensional one.
-     * The intend is to handle the following sequence of operations defined in the EPSG database:
+     * The intent is to handle the following sequence of operations defined in the EPSG database:
      *
      * <ol>
      *   <li>Inverse of <cite>Geographic 3D to 2D conversion</cite> (EPSG:9659)</li>

Modified: sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -39,11 +39,26 @@ import org.apache.sis.util.resources.Err
  * <p>If desired values in decreasing order can be supported by inverting the sign of all values,
  * then concatenating this transform with a transform that multiply all output values by -1.</p>
  *
+ * <div class="section">Extrapolation</div>
+ * If an input value is outside the expected range of values, this class extrapolates using the
+ * slope defined by the two first points if the requested value is before, or the slope defined
+ * by the two last points if the requested value is after.   In other words, extrapolations are
+ * computed using only values at the extremum where extrapolation happen. This rule causes less
+ * surprising behavior when computing a data cube envelope, which may need extrapolation by 0.5
+ * pixel before the first value or after the last value.
+ *
+ * <div class="note"><b>Example:</b>
+ * if a vertical dimension is made of slices at y₀=5, y₁=10, y₂=100 and y₃=250 meters, then linear
+ * interpolation at 0.5 is 7.5 meters and extrapolation at -0.5 is expected to give 2.5 meters.</div>
+ *
  * @author  Johann Sorel (Geomatys)
  * @author  Rémi Maréchal (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.7
- * @since   0.7
+ * @version 1.0
+ *
+ * @see MathTransforms#interpolate(double[], double[])
+ *
+ * @since 0.7
  * @module
  */
 final class LinearInterpolator1D extends AbstractMathTransform1D implements Serializable {
@@ -54,15 +69,11 @@ final class LinearInterpolator1D extends
 
     /**
      * The sequence values specified at construction time.
+     * Must contain at least 2 values.
      */
     private final double[] values;
 
     /**
-     * The average function slope. Used only for extrapolations.
-     */
-    private final double slope;
-
-    /**
      * If the transform is invertible, the inverse. Otherwise {@code null}.
      * The transform is invertible only if values are in increasing order.
      */
@@ -72,15 +83,13 @@ final class LinearInterpolator1D extends
      * Creates a new transform which will interpolate in the given table of values.
      * The inputs are {0, 1, … , <var>N</var>} where <var>N</var> is length of output values.
      *
-     * <p>This constructor assumes that the {@code values} array have already be clones,
-     * so it will not clone it again.</p>
+     * <p>This constructor assumes that the {@code values} array has already been cloned,
+     * so it will not clone it again. That array shall contain at least two values.</p>
      *
      * @param values  the <var>y</var> values in <var>y=f(x)</var> where <var>x</var> = {0, 1, … , {@code values.length-1}}.
-     * @param slope   the value to use for extrapolation.
      */
-    private LinearInterpolator1D(final double[] values, final double slope) {
+    private LinearInterpolator1D(final double[] values) {
         this.values = values;                           // Cloning this array is caller's responsibility.
-        this.slope  = slope;
         double last = values[0];
         for (int i=1; i<values.length; i++) {
             if (!(last <= (last = values[i]))) {        // Use '!' for catching NaN values.
@@ -93,14 +102,15 @@ final class LinearInterpolator1D extends
 
     /**
      * Creates a transform for the given values. This method returns an affine transform instead than an
-     * interpolator if the given values form a series with a constant increment.
+     * interpolator if the given values form a series with a constant increment. The given array shall
+     * contain at least two values.
      *
      * @param  values  a <strong>copy</strong> of the user-provided values. This array may be modified.
      */
     private static MathTransform1D create(final double[] values) {
         final int n = values.length - 1;
         final double offset = values[0];
-        double slope = (values[n] - offset) / n;
+        final double slope = (values[n] - offset) / n;
         final double as = Math.abs(slope);
         /*
          * If the increment between values is constant (with a small tolerance factor),
@@ -122,12 +132,11 @@ final class LinearInterpolator1D extends
          */
         final boolean isReverted = (slope < 0);
         if (isReverted) {
-            slope = -slope;
             for (i=0; i <= n; i++) {
                 values[i] = -values[i];
             }
         }
-        MathTransform1D tr = new LinearInterpolator1D(values, slope);
+        MathTransform1D tr = new LinearInterpolator1D(values);
         if (isReverted) {
             tr = new ConcatenatedTransformDirect1D(tr, LinearTransform1D.NEGATE);
         }
@@ -223,17 +232,21 @@ final class LinearInterpolator1D extends
             final int n = values.length - 1;
             if (i < n) {
                 x -= i;
-                y = values[i] * (1-x) + values[i+1] * x;
-                d = values[i+1] - values[i];
+                final double y0 = values[i  ];
+                final double y1 = values[i+1];
+                y = y0 * (1-x) + y1 * x;
+                d = y1 - y0;
             } else {
                 // x is after the last available value.
-                y = (x - n) * slope + values[n];
-                d = slope;
+                final double y1 = values[n];
+                d = y1 - values[n-1];
+                y = (x - n) * d + y1;
             }
         } else {
             // x is before the first available value.
-            y = x * slope + values[0];
-            d = slope;
+            final double y0 = values[0];
+            d = values[1] - y0;
+            y = x * d + y0;
         }
         if (dstPts != null) {
             dstPts[dstOff] = y;
@@ -256,11 +269,13 @@ final class LinearInterpolator1D extends
                 return values[i] * (1-x) + values[i+1] * x;
             } else {
                 // x is after the last available value.
-                return (x - n) * slope + values[n];
+                final double y1 = values[n];
+                return (x - n) * (y1 - values[n-1]) + y1;
             }
         } else {
             // x is before the first available value.
-            return x * slope + values[0];
+            final double y0 = values[0];
+            return x * (values[1] - y0) + y0;
         }
     }
 
@@ -271,13 +286,8 @@ final class LinearInterpolator1D extends
      */
     @Override
     public double derivative(final double x) {
-        if (x >= 0) {
-            final int i = (int) x;
-            if (i < values.length - 1) {
-                return values[i+1] - values[i];
-            }
-        }
-        return slope;
+        final int i = Math.max(0, Math.min(values.length - 2, (int) x));
+        return values[i+1] - values[i];
     }
 
     /**
@@ -307,7 +317,7 @@ final class LinearInterpolator1D extends
 
         /**
          * Combines {@link #transform(double)}, {@link #derivative(double)} in a single method call.
-         * The intend is to avoid to call {@link Arrays#binarySearch(double[], double)} twice for the
+         * The intent is to avoid to call {@link Arrays#binarySearch(double[], double)} twice for the
          * same value.
          */
         @Override
@@ -320,7 +330,8 @@ final class LinearInterpolator1D extends
             int i = Arrays.binarySearch(values, y);
             if (i >= 0) {
                 x = i;
-                d = (i >= 1 && i < values.length) ? (values[i] - values[i-1]) : slope;
+                i = Math.max(1, Math.min(values.length - 1, i));
+                d = values[i] - values[i-1];
             } else {
                 i = ~i;
                 if (i >= 1) {
@@ -330,11 +341,13 @@ final class LinearInterpolator1D extends
                     } else {
                         // y is after the last available value.
                         final int n = values.length - 1;
-                        x = (y - values[n]) / (d = slope) + n;
+                        final double y1 = values[n];
+                        x = (y - y1) / (d = y1 - values[n-1]) + n;
                     }
                 } else {
                     // y is before the first available value.
-                    x = (y - values[0]) / (d = slope);
+                    final double y0 = values[0];
+                    x = (y - y0) / (d = values[1] - y0);
                 }
             }
             if (dstPts != null) {
@@ -361,11 +374,13 @@ final class LinearInterpolator1D extends
                     } else {
                         // y is after the last available value.
                         final int n = values.length - 1;
-                        return (y - values[n]) / slope + n;
+                        final double y1 = values[n];
+                        return (y - y1) / (y1 - values[n-1]) + n;
                     }
                 } else {
                     // y is before the first available value.
-                    return (y - values[0]) / slope;
+                    final double y0 = values[0];
+                    return (y - y0) / (values[1] - y0);
                 }
             }
         }
@@ -380,13 +395,8 @@ final class LinearInterpolator1D extends
             if (i < 0) {
                 i = ~i;
             }
-            final double d;
-            if (i >= 1 && i < values.length) {
-                d = (values[i] - values[i-1]);
-            } else {
-                d = slope;
-            }
-            return 1 / d;
+            i = Math.max(1, Math.min(values.length - 1, i));
+            return 1 / (values[i] - values[i-1]);
         }
     }
 

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/geometry/EnvelopesTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -67,7 +67,7 @@ public final strictfp class EnvelopesTes
      * This transformation can not handle poles.
      *
      * <p>This method wraps the math transform into an opaque object for hiding the fact that the given
-     * transform implement the {@link MathTransform2D} interface. The intend is to disable optimization
+     * transform implement the {@link MathTransform2D} interface. The intent is to disable optimization
      * paths (if any), in order to test the generic path.</p>
      */
     @Override

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeographicOffsetsTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeographicOffsetsTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeographicOffsetsTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/GeographicOffsetsTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -113,7 +113,7 @@ public final strictfp class GeographicOf
 
     /**
      * Tests {@code VerticalOffset.createMathTransform(…)} indirectly, through a call to the math transform factory
-     * with the source and target coordinate systems specified. The intend of this test is to verify that the change
+     * with the source and target coordinate systems specified. The intent of this test is to verify that the change
      * of axis direction is properly handled, given source CRS axis direction up and target CRS axis direction down.
      *
      * @throws FactoryException if an error occurred while creating the transform.

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/parameter/ParameterMarshallingTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -384,7 +384,7 @@ public final strictfp class ParameterMar
 
     /**
      * Tests unmarshalling of a parameter value group. The XML file does not use {@code xlink:href} attributes;
-     * descriptor definitions are repeated. The intend of this test is to test Apache SIS capability to replace
+     * descriptor definitions are repeated. The intent of this test is to test Apache SIS capability to replace
      * duplicates instances by unique instances.
      *
      * @throws JAXBException if an error occurred during unmarshalling.

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeocentricCRSTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -107,7 +107,7 @@ public final strictfp class DefaultGeoce
     }
 
     /**
-     * Tests WKT 1 formatting using axes in kilometres. The intend of this test is to verify that
+     * Tests WKT 1 formatting using axes in kilometres. The intent of this test is to verify that
      * the coordinate system replacement documented in {@link #testWKT1()} preserves the axis units.
      *
      * @since 0.6

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -87,7 +87,7 @@ public final strictfp class DefaultGeogr
 
     /**
      * Verifies the {@link CommonCRS#WGS84} identifiers in both normalized and unnormalized CRS.
-     * The intend is actually to test the replacement of {@code "EPSG:4326"} by {@code "CRS:84"}.
+     * The intent is actually to test the replacement of {@code "EPSG:4326"} by {@code "CRS:84"}.
      */
     @Test
     public void testIdentifiers() {

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/GeodeticObjectFactoryTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -111,7 +111,7 @@ public final strictfp class GeodeticObje
 
     /**
      * Tests {@link GeodeticObjectFactory#createFromWKT(String)} with an erroneous projection parameter name.
-     * The intend is to verify that the expected exception is thrown.
+     * The intent is to verify that the expected exception is thrown.
      *
      * @throws FactoryException if the parsing failed for another reason than the expected one.
      */

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/IdentifiedObjectFinderTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -77,7 +77,7 @@ public final strictfp class IdentifiedOb
                    CRS84, finder.findSingleton(CRS84));
         /*
          * Same test than above, using a CRS without identifier.
-         * The intend is to force a full scan.
+         * The intent is to force a full scan.
          */
         final CoordinateReferenceSystem search = new DefaultGeographicCRS(
                 Collections.singletonMap(DefaultGeographicCRS.NAME_KEY, CRS84.getName()),

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGInstallerTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGInstallerTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGInstallerTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/factory/sql/EPSGInstallerTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -221,7 +221,7 @@ public final strictfp class EPSGInstalle
             /*
              * Following forces the authority factory to iterate over all codes.
              * Since the iterator returns only non-deprecated codes, EPSG:4329
-             * should not be included. The intend is to verify that the fields
+             * should not be included. The intent is to verify that the fields
              * of type BOOLEAN have been properly handled.
              */
             codes = new HashSet<>(codes);

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -281,7 +281,7 @@ public final strictfp class CoordinateOp
         λDimension = new int[] {1};
         zDimension = new int[] {2};
         double[] source = {
-            39.00,  -85.00,  -10000.00,   // The intend of those large height values is to cause a shift in (φ,λ)
+            39.00,  -85.00,  -10000.00,   // The intent of those large height values is to cause a shift in (φ,λ)
             38.26,  -80.58,  +10000.00    // large enough for being detected if we fail to use h in calculations.
         };
         double[] target;

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperationTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -43,7 +43,7 @@ import static org.apache.sis.test.TestUt
  * Tests the {@link DefaultConcatenatedOperation} class.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.7
+ * @version 0.8
  * @since   0.7
  * @module
  */
@@ -114,9 +114,7 @@ public final strictfp class DefaultConca
                 "      Axis[“Latitude (B)”, north, Unit[“degree”, 0.017453292519943295]],\n" +
                 "      Axis[“Ellipsoidal height (h)”, up, Unit[“metre”, 1]]]],\n" +
                 "  CoordinateOperationStep[“Geographic to geocentric”,\n" +
-                "    Method[“Geographic/geocentric conversions”],\n" +
-                "      Parameter[“semi_major”, 6377397.155, Unit[“metre”, 1]],\n" +
-                "      Parameter[“semi_minor”, 6356078.962818189, Unit[“metre”, 1]]],\n" +
+                "    Method[“Geographic/geocentric conversions”]],\n" +         // Omit non-EPSG parameters for EPSG method.
                 "  CoordinateOperationStep[“Tokyo to JGD2000 (GSI)”,\n" +
                 "    Method[“Geocentric translations”],\n" +
                 "      Parameter[“X-axis translation”, -146.414],\n" +

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactoryTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactoryTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactoryTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactoryTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -169,16 +169,18 @@ public final strictfp class DefaultCoord
         assertSame      ("targetCRS", targetCRS, operation.getTargetCRS());
         assertInstanceOf("operation", ConcatenatedOperation.class, operation);
         /*
-         * The accuracy of the coordinate operation depends on whether a path as been found with the help
+         * The accuracy of the coordinate operation depends on whether a path has been found with the help
          * of the EPSG database (in which case the reported accuracy is 2 metres) or if we had to find an
-         * operation by ourselves (in which case we conservatively report an accuracy of 3000 metres, bu
-         * in practice observe an error of about 80 metres for this test).
+         * operation by ourselves (in which case we conservatively report an accuracy of 3000 metres, but
+         * in practice observe an error between 80 and 515 metres for this test depending on the operation
+         * method used). By comparison, the translation declared in EPSG database is about 370 metres in
+         * geocentric coordinates.
          */
         final boolean isUsingEpsgFactory = verifyParametersNTF(((ConcatenatedOperation) operation).getOperations(), 1);
         assertEquals("linearAccuracy", isUsingEpsgFactory ? 2 : PositionalAccuracyConstant.UNKNOWN_ACCURACY,
                                        CRS.getLinearAccuracy(operation), STRICT);
 
-        tolerance = isUsingEpsgFactory ? Formulas.LINEAR_TOLERANCE : 100;
+        tolerance = isUsingEpsgFactory ? Formulas.LINEAR_TOLERANCE : 600;
         transform = operation.getMathTransform();
         /*
          * Test using the location of Paris (48.856578°N, 2.351828°E) first,
@@ -236,7 +238,7 @@ public final strictfp class DefaultCoord
         assertEquals("linearAccuracy", isUsingEpsgFactory ? 2 : PositionalAccuracyConstant.UNKNOWN_ACCURACY,
                                        CRS.getLinearAccuracy(operation), STRICT);
 
-        tolerance = isUsingEpsgFactory ? Formulas.LINEAR_TOLERANCE : 100;
+        tolerance = isUsingEpsgFactory ? Formulas.LINEAR_TOLERANCE : 600;
         transform = operation.getMathTransform();
         isInverseTransformSupported = false;
         /*

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LinearTransformBuilderTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -74,15 +74,12 @@ public final strictfp class LinearTransf
      */
     @Test
     public void testMinimalist2D() throws FactoryException {
+        final Map<DirectPosition2D,DirectPosition2D> pos = new HashMap<>(8);
+        assertNull(pos.put(new DirectPosition2D(1, 1), new DirectPosition2D(3, 2)));
+        assertNull(pos.put(new DirectPosition2D(1, 2), new DirectPosition2D(3, 5)));
+        assertNull(pos.put(new DirectPosition2D(2, 2), new DirectPosition2D(5, 5)));
         final LinearTransformBuilder builder = new LinearTransformBuilder();
-        builder.setSourcePoints(
-                new DirectPosition2D(1, 1),
-                new DirectPosition2D(1, 2),
-                new DirectPosition2D(2, 2));
-        builder.setTargetPoints(
-                new DirectPosition2D(3, 2),
-                new DirectPosition2D(3, 5),
-                new DirectPosition2D(5, 5));
+        builder.setControlPoints(pos);
 
         assertArrayEquals(new double[] {3, 2}, builder.getControlPoint(new int[] {1, 1}), STRICT);
         assertArrayEquals(new double[] {3, 5}, builder.getControlPoint(new int[] {1, 2}), STRICT);

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorMethodComparison.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorMethodComparison.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorMethodComparison.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/MercatorMethodComparison.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -260,7 +260,7 @@ public final class MercatorMethodCompari
 
     /**
      * Prints the error of the two methods for various eccentricity values.
-     * The intend of this method is to find an eccentricity threshold value where we consider the errors too high.
+     * The intent of this method is to find an eccentricity threshold value where we consider the errors too high.
      *
      * <p>This method is used for determining empirically a value for {@link ConformalProjection#ECCENTRICITY_THRESHOLD}.
      * The current threshold value is shown by inserting a horizontal line separator in the table when that threshold

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/AbridgedMolodenskyTransformTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -127,7 +127,7 @@ public final strictfp class AbridgedMolo
     }
 
     /**
-     * Tests a deserialized instance. The intend is to verify that the transient fields
+     * Tests a deserialized instance. The intent is to verify that the transient fields
      * are correctly recomputed.
      *
      * @throws FactoryException if an error occurred while creating a transform step.

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateDomainTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateDomainTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateDomainTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateDomainTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -27,7 +27,7 @@ import static org.junit.Assert.*;
 
 /**
  * Tests {@link CoordinateDomain}.
- * The main intend of this class is to allow visual inspection (by looking in source code) of sampled data.
+ * The main intent of this class is to allow visual inspection (by looking in source code) of sampled data.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 0.6

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransformTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransformTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransformTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/CoordinateSystemTransformTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -37,7 +37,6 @@ import org.junit.AfterClass;
 import org.junit.Test;
 
 
-
 /**
  * Tests the {@link CoordinateSystemTransform} static factory method.
  *

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/DefaultMathTransformFactoryTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -229,7 +229,7 @@ public final strictfp class DefaultMathT
             assertEquals(classification, 6356256.909237285, param.parameter("semi_minor").doubleValue(), 1E-4);
             /*
              * Creates a ProjectedCRS from the map projection. This part is more an integration test than
-             * a DefaultMathTransformFactory test. Again, the intend is to verify that the properties are
+             * a DefaultMathTransformFactory test. Again, the intent is to verify that the properties are
              * the one that we specified.
              */
             final DefaultProjectedCRS crs = new DefaultProjectedCRS(dummyName,

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1DTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1DTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1DTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/LinearInterpolator1DTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -21,6 +21,7 @@ import org.opengis.referencing.operation
 import org.opengis.referencing.operation.NoninvertibleTransformException;
 import org.opengis.referencing.operation.TransformException;
 import org.opengis.test.referencing.TransformTestCase;
+import org.apache.sis.test.DependsOnMethod;
 import org.junit.Test;
 
 import static org.opengis.test.Assert.*;
@@ -31,7 +32,7 @@ import static org.opengis.test.Assert.*;
  *
  * @author  Rémi Maréchal (Geomatys)
  * @author  Martin Desruisseaux (Geomatys).
- * @version 0.7
+ * @version 1.0
  * @since   0.7
  * @module
  */
@@ -238,4 +239,25 @@ public final strictfp class LinearInterp
          */
         verifyInDomain(new double[] {min}, new double[] {max}, new int[] {100}, new Random(randomSeed));
     }
+
+    /**
+     * Tests input values outside the expected range.
+     * A few values inside ranges are also tested as a safety.
+     *
+     * @throws TransformException if an error occurred while testing a value.
+     */
+    @Test
+    @DependsOnMethod("testIndicesToIncreasingValues")
+    public void testExtrapolations() throws TransformException {
+        values = new double[] {5, 10, 100, 250};
+        transform = LinearInterpolator1D.create(preimage, values);
+        derivativeDeltas = new double[] {0.1};
+        verifyTransform(new double[] {0,  1, 0.5, -0.5, -1, -2,   3, 3.5,   4,   5},        // Values to transform.
+                        new double[] {5, 10, 7.5,  2.5,  0, -5, 250, 325, 400, 550});       // Expected results.
+
+        verifyConsistency(0f, 1f, 0.5f, -0.5f, -1f, -2f, 3f, 3.5f, 4f, 5f);
+        verifyDerivative(0.25);     // Interpolation (verified by safety)
+        verifyDerivative(-8);       // Extrapolation
+        verifyDerivative( 8);
+    }
 }

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -415,7 +415,7 @@ public final strictfp class CoordinateRe
 
     /**
      * The keywords before which to cut the CRS names when sorting by alphabetical order.
-     * The main intend here is to preserve the "far west", "west", "central west", "central",
+     * The main intent here is to preserve the "far west", "west", "central west", "central",
      * "central east", "east", "far east" order.
      */
     private static final String[] CUT_BEFORE = {

Modified: sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-referencing/src/test/java/org/apache/sis/test/integration/ConsistencyTest.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -25,6 +25,7 @@ import org.opengis.util.FactoryException
 import org.opengis.util.NoSuchIdentifierException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.referencing.factory.FactoryDataException;
+import org.apache.sis.referencing.factory.UnavailableFactoryException;
 import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.CRS;
 import org.apache.sis.io.wkt.Convention;
@@ -67,11 +68,22 @@ public final strictfp class ConsistencyT
      * Codes to exclude for now.
      */
     private static final Set<String> EXCLUDES = new HashSet<>(Arrays.asList(
-        "CRS:1",            // Computer display
-        "EPSG:5819"         // EPSG topocentric example A
+        "CRS:1",            // Computer display: WKT parser alters the (i,j) axis names.
+        "EPSG:5819",        // EPSG topocentric example A: error while parsing WKT.
+        "AUTO2:42001",      // This projection requires parameters, but we provide none.
+        "AUTO2:42002",      // This projection requires parameters, but we provide none.
+        "AUTO2:42003",      // This projection requires parameters, but we provide none.
+        "AUTO2:42004",      // This projection requires parameters, but we provide none.
+        "AUTO2:42005"       // This projection requires parameters, but we provide none.
     ));
 
     /**
+     * Width of the code columns in the warnings formatted by {@link #print(String, String, Object)}.
+     * We begin with an arbitrary width and will expand if necessary.
+     */
+    private int codeWidth = 15;
+
+    /**
      * Verifies the WKT consistency of all CRS instances.
      *
      * @throws FactoryException if an error other than "unsupported operation method" occurred.
@@ -92,7 +104,7 @@ public final strictfp class ConsistencyT
                 final CoordinateReferenceSystem crs;
                 try {
                     crs = CRS.forCode(code);
-                } catch (NoSuchIdentifierException | FactoryDataException e) {
+                } catch (UnavailableFactoryException | NoSuchIdentifierException | FactoryDataException e) {
                     print(code, "WARNING", e.getLocalizedMessage());
                     continue;
                 }
@@ -118,9 +130,13 @@ public final strictfp class ConsistencyT
      * Prints the given code followed by spaces and the given {@code "ERROR"} or {@code "WARNING"} word,
      * then the given message.
      */
-    private static void print(final String code, final String word, final Object message) {
+    private void print(final String code, final String word, final Object message) {
+        final int currentWidth = code.length();
+        if (currentWidth >= codeWidth) {
+            codeWidth = currentWidth + 1;
+        }
         out.print(code);
-        out.print(CharSequences.spaces(15 - code.length()));
+        out.print(CharSequences.spaces(codeWidth - currentWidth));
         out.print(word);
         out.print(": ");
         out.println(message);
@@ -135,7 +151,7 @@ public final strictfp class ConsistencyT
      * @param  crs   the CRS to test.
      * @return the parsed CRS.
      */
-    private static CoordinateReferenceSystem parseAndFormat(final WKTFormat f,
+    private CoordinateReferenceSystem parseAndFormat(final WKTFormat f,
             final String code, final CoordinateReferenceSystem crs)
     {
         String wkt = f.format(crs);

Modified: sis/branches/JDK9/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java?rev=1825252&r1=1825251&r2=1825252&view=diff
==============================================================================
--- sis/branches/JDK9/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java [UTF-8] (original)
+++ sis/branches/JDK9/core/sis-utility/src/main/java/org/apache/sis/internal/converter/SystemRegistry.java [UTF-8] Sat Feb 24 15:44:08 2018
@@ -33,7 +33,7 @@ import org.apache.sis.internal.system.Mo
  * <ul>
  *   <li>Fetch the list of converters from the content of all
  *       {@code META-INF/services/org.apache.sis.util.ObjectConverter} files found on the classpath.
- *       The intend is to allow other modules to register their own converters.</li>
+ *       The intent is to allow other modules to register their own converters.</li>
  *
  *   <li>Apply heuristic rules in addition to the explicitly registered converters.
  *       Those heuristic rules are provided in a separated class in order to keep the