Author: desruisseaux
Date: Fri Sep 16 09:46:10 2016
New Revision: 1761015

URL: http://svn.apache.org/viewvc?rev=1761015&view=rev
Log:
Store attribute values as primitive wrappers instead than arrays where there is 
only one value.

Removed:
    
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/Attribute.java
    
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/AttributeTest.java
Modified:
    
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
    
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/VariableInfo.java
    
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/VariableInfoTest.java
    
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/test/suite/NetcdfTestSuite.java

Modified: 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java?rev=1761015&r1=1761014&r2=1761015&view=diff
==============================================================================
--- 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java
 [UTF-8] Fri Sep 16 09:46:10 2016
@@ -354,6 +354,19 @@ public final class ChannelDecoder extend
         if (length < 0 || type == null) {
             throw malformedHeader();
         }
+        if (length == 1) {
+            switch (type) {
+                case BYTE:   {final byte  v =         input.readByte();        
  align(1); return v;}
+                case UBYTE:  {final short v = (short) 
input.readUnsignedByte();  align(1); return v;}
+                case SHORT:  {final short v =         input.readShort();       
  align(2); return v;}
+                case USHORT: {final int   v =         
input.readUnsignedShort(); align(2); return v;}
+                case INT:    return input.readInt();
+                case INT64:  return input.readLong();
+                case UINT:   return input.readUnsignedInt();
+                case FLOAT:  return input.readFloat();
+                case DOUBLE: return input.readDouble();
+            }
+        }
         switch (type) {
             case CHAR: {
                 final String text = input.readString(length, encoding);
@@ -371,9 +384,7 @@ public final class ChannelDecoder extend
             case USHORT: {
                 final short[] array = new short[length];
                 input.readFully(array, 0, length);
-                if ((length & 1) != 0) {
-                    input.readShort();      // For byte alignment.
-                }
+                align(length << 1);
                 return array;
             }
             case INT:
@@ -599,7 +610,7 @@ public final class ChannelDecoder extend
         if (value instanceof String) {
             return parseNumber((String) value);
         }
-        final Number[] v = Attribute.numberValues(value);
+        final Number[] v = VariableInfo.numberValues(value);
         return (v.length != 0) ? v[0] : null;
     }
 

Modified: 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/VariableInfo.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/VariableInfo.java?rev=1761015&r1=1761014&r2=1761015&view=diff
==============================================================================
--- 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/VariableInfo.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/VariableInfo.java
 [UTF-8] Fri Sep 16 09:46:10 2016
@@ -18,6 +18,7 @@ package org.apache.sis.internal.netcdf.i
 
 import java.util.Map;
 import java.io.IOException;
+import java.lang.reflect.Array;
 import ucar.nc2.constants.CF;
 import ucar.nc2.constants.CDM;
 import ucar.nc2.constants._Coordinate;
@@ -29,6 +30,7 @@ import org.apache.sis.internal.storage.R
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.DataStoreContentException;
 import org.apache.sis.util.resources.Errors;
+import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.Numbers;
 
 
@@ -43,6 +45,11 @@ import org.apache.sis.util.Numbers;
  */
 final class VariableInfo extends Variable {
     /**
+     * The array to be returned by {@link #numberValues(Object)} when the 
given value is null.
+     */
+    private static final Number[] EMPTY = new Number[0];
+
+    /**
      * The names of attributes where to look for the description to be 
returned by {@link #getDescription()}.
      * We use the same attributes than the one documented in the {@link 
ucar.nc2.Variable#getDescription()} javadoc.
      */
@@ -76,6 +83,20 @@ final class VariableInfo extends Variabl
 
     /**
      * The attributes associates to the variable, or an empty map if none.
+     * Values can be:
+     *
+     * <ul>
+     *   <li>a {@link String}</li>
+     *   <li>A {@link Number}</li>
+     *   <li>an array of primitive type</li>
+     * </ul>
+     *
+     * If the value is a {@code String}, then leading and trailing spaces and 
control characters
+     * should be trimmed by {@link String#trim()}.
+     *
+     * @see #stringValues(Object)
+     * @see #numberValues(Object)
+     * @see #booleanValue(Object)
      */
     private final Map<String,Object> attributes;
 
@@ -108,7 +129,7 @@ final class VariableInfo extends Variabl
     {
         final Object isUnsigned = attributes.get(CDM.UNSIGNED);
         if (isUnsigned != null) {
-            dataType = dataType.unsigned(Attribute.booleanValue(isUnsigned));
+            dataType = dataType.unsigned(booleanValue(isUnsigned));
         }
         this.name          = name;
         this.dimensions    = dimensions;
@@ -230,7 +251,58 @@ final class VariableInfo extends Variabl
     @Override
     public Object[] getAttributeValues(final String attributeName, final 
boolean numeric) {
         final Object value = attributes.get(attributeName);
-        return numeric ? Attribute.numberValues(value) : 
Attribute.stringValues(value);
+        return numeric ? numberValues(value) : stringValues(value);
+    }
+
+    /**
+     * Returns the attribute values as an array of {@link String}s, or an 
empty array if none.
+     * The given argument is typically a value of the {@link #attributes} map.
+     *
+     * @see #getAttributeValues(String, boolean)
+     */
+    static String[] stringValues(final Object value) {
+        if (value == null) {
+            return CharSequences.EMPTY_ARRAY;
+        }
+        if (value.getClass().isArray()) {
+            final String[] values = new String[Array.getLength(value)];
+            for (int i=0; i<values.length; i++) {
+                values[i] = Array.get(value, i).toString();
+            }
+            return values;
+        }
+        return new String[] {value.toString()};
+    }
+
+    /**
+     * Returns the attribute values as an array of {@link Number}, or an empty 
array if none.
+     * The given argument is typically a value of the {@link #attributes} map.
+     *
+     * @see #getAttributeValues(String, boolean)
+     */
+    @SuppressWarnings("ReturnOfCollectionOrArrayField")
+    static Number[] numberValues(final Object value) {
+        if (value != null) {
+            if (value.getClass().isArray()) {
+                final Number[] values = new Number[Array.getLength(value)];
+                for (int i=0; i<values.length; i++) {
+                    values[i] = (Number) Array.get(value, i);
+                }
+                return values;
+            }
+            if (value instanceof Number) {
+                return new Number[] {(Number) value};
+            }
+        }
+        return EMPTY;
+    }
+
+    /**
+     * Returns the attribute value as a boolean, or {@code false} if the 
attribute is not a boolean.
+     * The given argument is typically a value of the {@link #attributes} map.
+     */
+    private static boolean booleanValue(final Object value) {
+        return (value instanceof String) && Boolean.valueOf((String) value);
     }
 
     /**

Modified: 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/VariableInfoTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/VariableInfoTest.java?rev=1761015&r1=1761014&r2=1761015&view=diff
==============================================================================
--- 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/VariableInfoTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/impl/VariableInfoTest.java
 [UTF-8] Fri Sep 16 09:46:10 2016
@@ -21,6 +21,9 @@ import org.apache.sis.internal.netcdf.De
 import org.apache.sis.internal.netcdf.VariableTest;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.test.DependsOn;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
 
 
 /**
@@ -30,7 +33,7 @@ import org.apache.sis.test.DependsOn;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3
- * @version 0.3
+ * @version 0.8
  * @module
  */
 @DependsOn({ChannelDecoderTest.class, VariableTest.class})
@@ -57,4 +60,14 @@ public final strictfp class VariableInfo
     protected boolean isSupplementalFormatSupported(final String format) {
         return false;
     }
+
+    /**
+     * Tests the {@link VariableInfo#numberValues(Object)} and {@link 
VariableInfo#stringValues(Object)} methods.
+     */
+    @Test
+    public void testNumberValues() {
+        final float[] a = new float[] {10, 20, 1};
+        assertArrayEquals("numberValues", new Number[] { 10f,    20f,    1f  
}, VariableInfo.numberValues(a));
+        assertArrayEquals("stringValues", new String[] {"10.0", "20.0", 
"1.0"}, VariableInfo.stringValues(a));
+    }
 }

Modified: 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/test/suite/NetcdfTestSuite.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/test/suite/NetcdfTestSuite.java?rev=1761015&r1=1761014&r2=1761015&view=diff
==============================================================================
--- 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/test/suite/NetcdfTestSuite.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/storage/sis-netcdf/src/test/java/org/apache/sis/test/suite/NetcdfTestSuite.java
 [UTF-8] Fri Sep 16 09:46:10 2016
@@ -36,7 +36,6 @@ import org.junit.BeforeClass;
     org.apache.sis.internal.netcdf.DecoderTest.class,
     org.apache.sis.internal.netcdf.VariableTest.class,
     org.apache.sis.internal.netcdf.GridGeometryTest.class,
-    org.apache.sis.internal.netcdf.impl.AttributeTest.class,
     org.apache.sis.internal.netcdf.impl.ChannelDecoderTest.class,
     org.apache.sis.internal.netcdf.impl.VariableInfoTest.class,
     org.apache.sis.internal.netcdf.impl.GridGeometryInfoTest.class,


Reply via email to