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
The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
new 7e3132901f When parsing GCOM-C files, accept `Image_start_time`
attribute if `Scane_start_time` is not present.
7e3132901f is described below
commit 7e3132901f5201fa798e068feb1fda3ce58c89b9
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Tue Sep 20 18:17:14 2022 +0200
When parsing GCOM-C files, accept `Image_start_time` attribute if
`Scane_start_time` is not present.
---
.../apache/sis/internal/earth/netcdf/GCOM_C.java | 18 +++++++++---
.../apache/sis/internal/earth/netcdf/GCOM_W.java | 15 ++++++----
.../org/apache/sis/internal/netcdf/Convention.java | 19 +++++++------
.../sis/internal/netcdf/impl/ChannelDecoder.java | 32 +++++++++++-----------
.../sis/internal/netcdf/ucar/DecoderWrapper.java | 22 +++++++--------
5 files changed, 61 insertions(+), 45 deletions(-)
diff --git
a/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_C.java
b/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_C.java
index 8ec93cd0b7..8672c85d57 100644
---
a/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_C.java
+++
b/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_C.java
@@ -231,12 +231,22 @@ public final class GCOM_C extends Convention {
* The given parameter is a name from <cite>CF conventions</cite> or from
<cite>Attribute Convention for Dataset Discovery
* (ACDD)</cite>.
*
- * @param name an attribute name from CF or ACDD convention.
- * @return the attribute name expected to be found in a netCDF file for
GCOM-C, or {@code name} if unknown.
+ * @param name an attribute name from CF or ACDD convention.
+ * @param index index of the element to get from the list of names.
+ * @return the attribute name expected to be found in a netCDF file for
GCOM-C, or {@code null} if none.
*/
@Override
- public String mapAttributeName(final String name) {
- return ATTRIBUTES.getOrDefault(name, name);
+ public String mapAttributeName(final String name, final int index) {
+ switch (index) {
+ case 0: return name;
+ case 1: return ATTRIBUTES.get(name);
+ case 2: {
+ if (AttributeNames.TIME.MINIMUM.equalsIgnoreCase(name)) return
"Image_start_time";
+ if (AttributeNames.TIME.MAXIMUM.equalsIgnoreCase(name)) return
"Image_end_time";
+ break;
+ }
+ }
+ return null;
}
/**
diff --git
a/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_W.java
b/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_W.java
index 343984e16e..82b485e1a5 100644
---
a/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_W.java
+++
b/profiles/sis-japan-profile/src/main/java/org/apache/sis/internal/earth/netcdf/GCOM_W.java
@@ -70,7 +70,7 @@ import org.apache.sis.util.CharSequences;
* </ul>
*
* @author Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.3
*
* @see <a href="http://global.jaxa.jp/projects/sat/gcom_w/">SHIZUKU (GCOM-W)
on JAXA</a>
* @see <a
href="https://en.wikipedia.org/wiki/Global_Change_Observation_Mission">GCOM on
Wikipedia</a>
@@ -147,12 +147,17 @@ public final class GCOM_W extends Convention {
* The given parameter is a name from <cite>CF conventions</cite> or from
<cite>Attribute Convention for Dataset Discovery
* (ACDD)</cite>.
*
- * @param name an attribute name from CF or ACDD convention.
- * @return the attribute name expected to be found in a netCDF file for
GCOM-W, or {@code name} if unknown.
+ * @param name an attribute name from CF or ACDD convention.
+ * @param index index of the element to get from the list of names.
+ * @return the attribute name expected to be found in a netCDF file for
GCOM-W, or {@code null} if none.
*/
@Override
- public String mapAttributeName(final String name) {
- return ATTRIBUTES.getOrDefault(name, name);
+ public String mapAttributeName(final String name, final int index) {
+ switch (index) {
+ case 0: return name;
+ case 1: return ATTRIBUTES.get(name);
+ default: return null;
+ }
}
/**
diff --git
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
index 67ea796b7a..8570cbd890 100644
---
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
+++
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
@@ -67,7 +67,7 @@ import ucar.nc2.constants.CF;
* @author Johann Sorel (Geomatys)
* @author Martin Desruisseaux (Geomatys)
* @author Alexis Manin (Geomatys)
- * @version 1.2
+ * @version 1.3
*
* @see <a href="https://issues.apache.org/jira/browse/SIS-315">SIS-315</a>
*
@@ -192,17 +192,20 @@ public class Convention {
* The given parameter is a name from <cite>CF conventions</cite> or from
<cite>Attribute Convention for Dataset Discovery
* (ACDD)</cite>. Some of those attribute names are listed in the {@link
org.apache.sis.storage.netcdf.AttributeNames} class.
*
+ * <p>The returned names are conceptually a list. However instead of
returning a {@link java.util.List},
+ * this method is invoked repeatedly with increasing index values until
this method returns {@code null}.
+ * Implementation are encouraged to return the {@code name} argument
unchanged as the value at index 0.</p>
+ *
* <p>In current version of netCDF reader, this method is invoked only for
global attributes,
* not for the attributes on variables.</p>
*
- * <p>The default implementation returns {@code name} unchanged.</p>
- *
- * @param name an attribute name from CF or ACDD convention.
- * @return the attribute name expected to be found in a netCDF file
structured according this {@code Convention}.
- * If this convention does not know about attribute of the given
name, then {@code name} is returned unchanged.
+ * @param name an attribute name from CF or ACDD convention.
+ * @param index index of the element to get from the list of names.
+ * @return the attribute name expected to be found in a netCDF file
structured according this {@code Convention},
+ * or {@code null} if there is no name mapping at the given index.
*/
- public String mapAttributeName(final String name) {
- return name;
+ public String mapAttributeName(final String name, final int index) {
+ return (index == 0) ? name : null;
}
/**
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 0d3d376cd3..970e7c0016 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
@@ -47,6 +47,7 @@ import org.apache.sis.internal.netcdf.Node;
import org.apache.sis.internal.netcdf.Grid;
import org.apache.sis.internal.netcdf.Variable;
import org.apache.sis.internal.netcdf.Dimension;
+import org.apache.sis.internal.netcdf.Convention;
import org.apache.sis.internal.netcdf.NamedElement;
import org.apache.sis.internal.storage.io.ChannelDataInput;
import org.apache.sis.internal.util.Constants;
@@ -73,7 +74,7 @@ import org.apache.sis.math.Vector;
*
* @author Johann Sorel (Geomatys)
* @author Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
*
* @see <a
href="http://portal.opengeospatial.org/files/?artifact_id=43734">NetCDF Classic
and 64-bit Offset Format (1.0)</a>
*
@@ -790,8 +791,15 @@ public final class ChannelDecoder extends Decoder {
* @see #getAttributeNames()
*/
private Object findAttribute(final String name) {
- Object value = attributeMap.get(name);
- if (value == null && name != null) {
+ if (name == null) {
+ return null;
+ }
+ int index = 0;
+ String mappedName;
+ final Convention convention = convention();
+ while ((mappedName = convention.mapAttributeName(name, index++)) !=
null) {
+ Object value = attributeMap.get(mappedName);
+ if (value != null) return value;
/*
* If no value were found for the given name, tries the following
alternatives:
*
@@ -802,21 +810,13 @@ public final class ChannelDecoder extends Decoder {
* Identity comparisons performed between String instances below
are okay since they
* are only optimizations for skipping calls to Map.get(Object) in
common cases.
*/
- String lower = name.toLowerCase(NAME_LOCALE);
- if (lower == name || (value = attributeMap.get(lower)) == null) {
- final String mappedName = convention().mapAttributeName(name);
- if (mappedName != name) {
- value = attributeMap.get(mappedName);
- if (value == null) {
- lower = name.toLowerCase(NAME_LOCALE);
- if (lower != mappedName) {
- value = attributeMap.get(lower);
- }
- }
- }
+ final String lowerCase = mappedName.toLowerCase(NAME_LOCALE);
+ if (lowerCase != mappedName) {
+ value = attributeMap.get(lowerCase);
+ if (value != null) return value;
}
}
- return value;
+ return null;
}
/**
diff --git
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/ucar/DecoderWrapper.java
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/ucar/DecoderWrapper.java
index 634a3937df..99138aef3d 100644
---
a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/ucar/DecoderWrapper.java
+++
b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/ucar/DecoderWrapper.java
@@ -49,6 +49,7 @@ import org.apache.sis.internal.netcdf.Variable;
import org.apache.sis.internal.netcdf.Dimension;
import org.apache.sis.internal.netcdf.Node;
import org.apache.sis.internal.netcdf.Grid;
+import org.apache.sis.internal.netcdf.Convention;
import org.apache.sis.internal.netcdf.DiscreteSampling;
import org.apache.sis.setup.GeometryLibrary;
import org.apache.sis.storage.DataStore;
@@ -257,20 +258,17 @@ public final class DecoderWrapper extends Decoder
implements CancelTask {
* @return the attribute, or {@code null} if none.
*/
private Attribute findAttribute(final Group group, final String name) {
- Attribute value = (group != null) ?
group.attributes().findAttributeIgnoreCase(name)
- :
file.findGlobalAttributeIgnoreCase(name);
- if (value == null) {
- final String mappedName = convention().mapAttributeName(name);
- /*
- * Identity check between String instances below is okay
- * since this is only an optimization for a common case.
- */
- if (mappedName != name) {
- value = (group != null) ?
group.attributes().findAttributeIgnoreCase(mappedName)
- :
file.findGlobalAttributeIgnoreCase(mappedName);
+ int index = 0;
+ String mappedName;
+ final Convention convention = convention();
+ while ((mappedName = convention.mapAttributeName(name, index++)) !=
null) {
+ Attribute value = (group != null) ?
group.attributes().findAttributeIgnoreCase(mappedName)
+ :
file.findGlobalAttributeIgnoreCase(mappedName);
+ if (value != null) {
+ return value;
}
}
- return value;
+ return null;
}
/**