This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit a029082e446bf3fd9f83709e567dbd58fbc826e2
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri Feb 22 19:52:20 2019 +0100

    Variable.hasRealValues() should take in account the transfer function that 
may be overridden in Convention.
    Add a Variable.getRole() convenience method.
---
 .../operation/transform/TransferFunction.java         | 15 +++++++++++++++
 .../operation/transform/TransferFunctionTest.java     |  5 +++++
 .../java/org/apache/sis/internal/netcdf/Variable.java | 19 ++++++++++++++++++-
 .../sis/internal/netcdf/impl/ChannelDecoder.java      |  2 +-
 .../org/apache/sis/storage/netcdf/GridResource.java   |  4 ++--
 .../org/apache/sis/storage/netcdf/MetadataReader.java |  2 +-
 .../org/apache/sis/internal/netcdf/VariableTest.java  |  5 ++---
 7 files changed, 44 insertions(+), 8 deletions(-)

diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
index 8852b00..1bd7676 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java
@@ -102,6 +102,8 @@ public class TransferFunction implements Cloneable, 
Serializable {
 
     /**
      * Creates a transfer function initialized to the identity transform.
+     *
+     * @see #isIdentity()
      */
     public TransferFunction() {
         type  = TransferFunctionType.LINEAR;
@@ -110,6 +112,19 @@ public class TransferFunction implements Cloneable, 
Serializable {
     }
 
     /**
+     * Returns {@code true} if this transfer function is identity. The 
function is identity if
+     * its {@linkplain #getType() type} is {@linkplain 
TransferFunctionType#LINEAR linear},
+     * its {@linkplain #getScale() scale} is 1 and its {@linkplain 
#getOffset() offset} is 0.
+     *
+     * @return whether this transfer function is identity.
+     *
+     * @since 1.0
+     */
+    public boolean isIdentity() {
+        return TransferFunctionType.LINEAR.equals(type) && scale == 1 && 
offset == 0;
+    }
+
+    /**
      * Returns the transfer function type (linear, logarithmic or exponential).
      *
      * @return the transfer function type.
diff --git 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java
 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java
index af7063f..2c960f4 100644
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java
@@ -52,6 +52,7 @@ public final strictfp class TransferFunctionTest extends 
TestCase {
         assertEquals("scale",  1, f.getScale(),  STRICT);
         assertEquals("offset", 0, f.getOffset(), STRICT);
         assertEquals("toString", "y = x", f.toString());
+        assertTrue  ("isIdentity", f.isIdentity());
 
         f.setScale(0.15);
         f.setOffset(-2);
@@ -69,6 +70,7 @@ public final strictfp class TransferFunctionTest extends 
TestCase {
         assertEquals("base",    1,    b.getBase(),   STRICT);
         assertEquals("scale",   0.15, b.getScale(),  STRICT);
         assertEquals("offset", -2,    b.getOffset(), STRICT);
+        assertFalse ("isIdentity",    b.isIdentity());
     }
 
     /**
@@ -93,6 +95,7 @@ public final strictfp class TransferFunctionTest extends 
TestCase {
         assertEquals("base",   10, b.getBase(),   STRICT);
         assertEquals("scale",   1, b.getScale(),  STRICT);
         assertEquals("offset", -2, b.getOffset(), STRICT);
+        assertFalse ("isIdentity", b.isIdentity());
     }
 
     /**
@@ -117,6 +120,7 @@ public final strictfp class TransferFunctionTest extends 
TestCase {
         assertEquals("base",   10,    b.getBase(),   STRICT);
         assertEquals("scale",   0.15, b.getScale(),  STRICT);
         assertEquals("offset",  0,    b.getOffset(), STRICT);
+        assertFalse ("isIdentity",    b.isIdentity());
     }
 
     /**
@@ -141,6 +145,7 @@ public final strictfp class TransferFunctionTest extends 
TestCase {
         assertEquals("base",   10,    b.getBase(),   STRICT);
         assertEquals("scale",   0.15, b.getScale(),  1E-16);
         assertEquals("offset", -2,    b.getOffset(), 1E-16);
+        assertFalse ("isIdentity",    b.isIdentity());
     }
 
     /**
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
index a6dfaaf..fe9084c 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
@@ -259,6 +259,11 @@ public abstract class Variable extends NamedElement {
     public final boolean hasRealValues() {
         final int n = getDataType().number;
         if (n == Numbers.FLOAT | n == Numbers.DOUBLE) {
+            final Convention convention = decoder.convention();
+            if (convention != Convention.DEFAULT) {
+                return convention.transferFunction(this).isIdentity();
+            }
+            // Shortcut for common case.
             double c = getAttributeAsNumber(CDM.SCALE_FACTOR);
             if (Double.isNaN(c) || c == 1) {
                 c = getAttributeAsNumber(CDM.ADD_OFFSET);
@@ -279,6 +284,18 @@ public abstract class Variable extends NamedElement {
     public abstract DataType getDataType();
 
     /**
+     * Returns whether this variable is used as a coordinate system axis, a 
coverage or something else.
+     * This is a shortcut for {@link Convention#roleOf(Variable)}, except that 
{@code this} can not be null.
+     *
+     * @return role of this variable.
+     *
+     * @see Convention#roleOf(Variable)
+     */
+    public final VariableRole getRole() {
+        return decoder.convention().roleOf(this);
+    }
+
+    /**
      * Returns whether this variable can grow. A variable is unlimited if at 
least one of its dimension is unlimited.
      * In netCDF 3 classic format, only the first dimension can be unlimited.
      *
@@ -347,7 +364,7 @@ public abstract class Variable extends NamedElement {
         final List<Variable> axes = new ArrayList<>();
         final Map<Object,Dimension> domain = new HashMap<>();
         for (final Variable candidate : decoder.getVariables()) {
-            if (convention.roleOf(candidate) == VariableRole.AXIS) {
+            if (candidate.getRole() == VariableRole.AXIS) {
                 axes.add(candidate);
                 for (final Dimension dim : candidate.getGridDimensions()) {
                     domain.put(dim, dim);
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
index 7ce2a53..e5b6abf 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
@@ -921,7 +921,7 @@ public final class ChannelDecoder extends Decoder {
              */
             final Map<DimensionInfo, List<VariableInfo>> dimToAxes = new 
IdentityHashMap<>();
             for (final VariableInfo variable : variables) {
-                switch (convention().roleOf(variable)) {
+                switch (variable.getRole()) {
                     case COVERAGE: {
                         // If Convention.roleOf(…) overwrote the value 
computed by VariableInfo,
                         // remember the new value for avoiding to ask again in 
next loops.
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
index 611b534..bc17a45 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java
@@ -162,7 +162,7 @@ final class GridResource extends AbstractGridResource 
implements ResourceOnFileS
         final List<Resource> resources = new ArrayList<>();
         for (int i=0; i<variables.length; i++) {
             final Variable variable = variables[i];
-            if (decoder.convention().roleOf(variable) != 
VariableRole.COVERAGE) {
+            if (decoder.convention().roleOf(variable) != 
VariableRole.COVERAGE) {                 // Variable may be null.
                 continue;                                                   // 
Skip variables that are not grid coverages.
             }
             final GridGeometry grid = variable.getGridGeometry();
@@ -190,7 +190,7 @@ final class GridResource extends AbstractGridResource 
implements ResourceOnFileS
                     int suffixLength = name.length() - suffixStart;
                     for (int j=i; ++j < variables.length;) {
                         final Variable candidate = variables[j];
-                        if (decoder.convention().roleOf(candidate) != 
VariableRole.COVERAGE) {
+                        if (decoder.convention().roleOf(candidate) != 
VariableRole.COVERAGE) {        // Variable may be null.
                             variables[j] = null;                               
 // For avoiding to revisit that variable again.
                             continue;
                         }
diff --git 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index ca8f55a..4b43741 100644
--- 
a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ 
b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@ -895,7 +895,7 @@ split:  while ((start = 
CharSequences.skipLeadingWhitespaces(value, start, lengt
     private void addContentInfo() {
         final Map<List<String>, List<Variable>> contents = new HashMap<>(4);
         for (final Variable variable : decoder.getVariables()) {
-            if (decoder.convention().roleOf(variable) == 
VariableRole.COVERAGE) {
+            if (variable.getRole() == VariableRole.COVERAGE) {
                 final List<org.apache.sis.internal.netcdf.Dimension> 
dimensions = variable.getGridDimensions();
                 final String[] names = new String[dimensions.size()];
                 for (int i=0; i<names.length; i++) {
diff --git 
a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java
 
b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java
index b7710b8..e200ff0 100644
--- 
a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java
+++ 
b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java
@@ -93,7 +93,7 @@ public strictfp class VariableTest extends TestCase {
      *   <li>{@link Variable#getDescription()}</li>
      *   <li>{@link Variable#getDataType()}</li>
      *   <li>{@link Variable#getGridDimensions()} length</li>
-     *   <li>{@link Convention#roleOf(Variable)}</li>
+     *   <li>{@link Variable#getRole()}</li>
      * </ul>
      *
      * @throws IOException if an I/O error occurred while opening the file.
@@ -120,7 +120,6 @@ public strictfp class VariableTest extends TestCase {
      * @param  variables  the variable for which to test properties.
      */
     private static void assertBasicPropertiesEqual(final Object[] expected, 
final Variable[] variables) {
-        final Convention convention = new Convention();
         int propertyIndex = 0;
         for (final Variable variable : variables) {
             final String name = variable.getName();
@@ -130,7 +129,7 @@ public strictfp class VariableTest extends TestCase {
             assertEquals(name, expected[propertyIndex++], 
variable.getDescription());
             assertEquals(name, expected[propertyIndex++], dataType);
             assertEquals(name, expected[propertyIndex++], 
variable.getGridDimensions().size());
-            assertEquals(name, expected[propertyIndex++], 
convention.roleOf(variable));
+            assertEquals(name, expected[propertyIndex++], variable.getRole());
             assertEquals(0, propertyIndex % NUM_BASIC_PROPERTY_COLUMNS);       
     // Sanity check for VariableTest itself.
         }
         assertEquals("Expected more variables.",

Reply via email to