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 2022/12/09 15:30:14 UTC

[sis] 02/02: Fix NullPointerException when auxiliary PRJ, TFW or HDR file can not be found. Improve test stability.

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 e6382ae9538c2f0c1530261f6747f3b6b7675ff5
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Fri Dec 9 16:29:35 2022 +0100

    Fix NullPointerException when auxiliary PRJ, TFW or HDR file can not be found.
    Improve test stability.
---
 .../org/apache/sis/internal/storage/PRJDataStore.java  | 11 ++++++++---
 .../sis/internal/storage/esri/RawRasterStore.java      | 16 ++++++++++------
 .../sis/internal/storage/image/WorldFileStore.java     | 18 +++++++++++-------
 .../sis/internal/storage/csv/StoreProviderTest.java    |  5 ++++-
 4 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
index 52029b56ed..38b510889f 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/PRJDataStore.java
@@ -66,7 +66,7 @@ import org.apache.sis.util.Classes;
  * be null and the CRS defined by the {@code DataOptionKey} will be used.</p>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
  * @since   1.2
  * @module
  */
@@ -146,7 +146,12 @@ public abstract class PRJDataStore extends URIDataStore {
     protected final void readPRJ() throws DataStoreException {
         Exception cause = null;
         try {
-            final String wkt = readAuxiliaryFile(PRJ).toString();
+            final AuxiliaryContent content = readAuxiliaryFile(PRJ);
+            if (content == null) {
+                listeners.warning(Resources.format(Resources.Keys.CanNotReadAuxiliaryFile_1, PRJ));
+                return;
+            }
+            final String wkt = content.toString();
             final StoreFormat format = new StoreFormat(locale, timezone, null, listeners);
             format.setConvention(Convention.WKT1_COMMON_UNITS);         // Ignored if the format is WKT 2.
             final ParsePosition pos = new ParsePosition(0);
@@ -177,7 +182,7 @@ public abstract class PRJDataStore extends URIDataStore {
      * An arbitrary size limit is applied for safety.
      *
      * @param  extension    the filename extension of the auxiliary file to open.
-     * @return the file content together with the source. Should be short-lived.
+     * @return the file content together with the source, or {@code null} if none. Should be short-lived.
      * @throws NoSuchFileException if the auxiliary file has not been found (when opened from path).
      * @throws FileNotFoundException if the auxiliary file has not been found (when opened from URL).
      * @throws IOException if another error occurred while opening the stream.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/esri/RawRasterStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/esri/RawRasterStore.java
index 7af2e2f21b..22b186f4bf 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/esri/RawRasterStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/esri/RawRasterStore.java
@@ -358,6 +358,10 @@ final class RawRasterStore extends RasterStore {
         RawRasterLayout layout = RawRasterLayout.BIL;
         ByteOrder byteOrder    = ByteOrder.nativeOrder();
         final AuxiliaryContent header = readAuxiliaryFile(RawRasterStoreProvider.HDR);
+        if (header == null) {
+            throw new DataStoreException(Resources.forLocale(getLocale())
+                    .getString(Resources.Keys.CanNotReadAuxiliaryFile_1, RawRasterStoreProvider.HDR));
+        }
         for (CharSequence line : CharSequences.splitOnEOL(header)) {
             final int length   = line.length();
             final int keyStart = CharSequences.skipLeadingWhitespaces(line, 0, length);
@@ -381,12 +385,12 @@ final class RawRasterStore extends RasterStore {
                         case BANDROWBYTES:  bandRowBytes  = parseStrictlyPositive(keyword, value); break;
                         case TOTALROWBYTES: totalRowBytes = parseStrictlyPositive(keyword, value); break;
                         case BANDGAPBYTES:  bandGapBytes  = Integer.parseInt(value); break;
-                        case SKIPBYTES:     skipBytes     = Long.valueOf(value); break;
-                        case ULXMAP:        ulxmap        = Double.valueOf(value); geomask |= 1; break;
-                        case ULYMAP:        ulymap        = Double.valueOf(value); geomask |= 2; break;
-                        case XDIM:          xdim          = Double.valueOf(value); geomask |= 4; break;
-                        case YDIM:          ydim          = Double.valueOf(value); geomask |= 8; break;
-                        case NODATA:        nodataValue   = Double.valueOf(value); break;
+                        case SKIPBYTES:     skipBytes     = Long.parseLong(value); break;
+                        case ULXMAP:        ulxmap        = Double.parseDouble(value); geomask |= 1; break;
+                        case ULYMAP:        ulymap        = Double.parseDouble(value); geomask |= 2; break;
+                        case XDIM:          xdim          = Double.parseDouble(value); geomask |= 4; break;
+                        case YDIM:          ydim          = Double.parseDouble(value); geomask |= 8; break;
+                        case NODATA:        nodataValue   = Double.parseDouble(value); break;
                         case PIXELTYPE:     signed        = indexOf(keyword, value, "SIGNED", "SIGNEDINT") >= 0; break;
                         case LAYOUT:        layout        = RawRasterLayout.valueOf(value.toUpperCase(Locale.US)); break;
                         case BYTEORDER: {
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java
index cdfc09d1bd..251dfae3fe 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/image/WorldFileStore.java
@@ -370,17 +370,21 @@ loop:   for (int convention=0;; convention++) {
      * Reads the "World file" by parsing an auxiliary file with the given suffix.
      *
      * @param  wld  suffix of the auxiliary file.
-     * @return the "World file" content as an affine transform.
+     * @return the "World file" content as an affine transform, or {@code null} if none was found.
      * @throws IOException if an I/O error occurred.
      * @throws DataStoreException if the file content cannot be parsed.
      */
     private AffineTransform2D readWorldFile(final String wld) throws IOException, DataStoreException {
-        final AuxiliaryContent content  = readAuxiliaryFile(wld);
-        final String           filename = content.getFilename();
-        final CharSequence[]   lines    = CharSequences.splitOnEOL(readAuxiliaryFile(wld));
-        final int              expected = 6;        // Expected number of elements.
-        int                    count    = 0;        // Actual number of elements.
-        final double[]         elements = new double[expected];
+        final AuxiliaryContent content = readAuxiliaryFile(wld);
+        if (content == null) {
+            listeners.warning(Resources.format(Resources.Keys.CanNotReadAuxiliaryFile_1, wld));
+            return null;
+        }
+        final String         filename = content.getFilename();
+        final CharSequence[] lines    = CharSequences.splitOnEOL(content);
+        final int            expected = 6;        // Expected number of elements.
+        int                  count    = 0;        // Actual number of elements.
+        final double[]       elements = new double[expected];
         for (int i=0; i<expected; i++) {
             final String line = lines[i].toString().trim();
             if (!line.isEmpty() && line.charAt(0) != '#') {
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreProviderTest.java b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreProviderTest.java
index 9a3e17c9e6..41a69d1e48 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreProviderTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/csv/StoreProviderTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sis.internal.storage.csv;
 
+import org.apache.sis.setup.OptionKey;
+import org.apache.sis.setup.GeometryLibrary;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.ProbeResult;
@@ -29,7 +31,7 @@ import static org.junit.Assert.*;
  * Tests {@link StoreProvider}.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.3
  * @since   0.8
  * @module
  */
@@ -43,6 +45,7 @@ public final strictfp class StoreProviderTest extends TestCase {
     public void testProbeContent() throws DataStoreException {
         final StoreProvider p = new StoreProvider();
         final StorageConnector c = new StorageConnector(StoreTest.testData());
+        c.setOption(OptionKey.GEOMETRY_LIBRARY, GeometryLibrary.ESRI);
         assertEquals(ProbeResult.SUPPORTED, p.probeContent(c));
     }
 }