sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1805590 [3/3] - in /sis/branches/JDK9: ./ application/sis-console/src/main/artifact/ core/ core/sis-feature/src/main/java/org/apache/sis/feature/ core/sis-metadata/src/main/java/org/apache/sis/internal/jaxb/metadata/ core/sis-metadata/src/...
Date Mon, 21 Aug 2017 01:03:13 GMT
Modified: sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Proj4Factory.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.storage.gdal;
 
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
 import java.util.HashMap;
@@ -95,6 +96,20 @@ public class Proj4Factory extends Geodet
     static final String PROJ_PARAM = '+' + Proj4Parser.PROJ + '=';
 
     /**
+     * Options to be added in any {@literal Proj.4} definition strings.
+     * <ul>
+     *   <li>The {@code "+over"} option is for disabling the default wrapping of output longitudes in the -180 to 180 range.
+     *     We do that for having the same behavior between Proj.4 and Apache SIS. No wrapping reduce discontinuity problems
+     *     with geometries that cross the anti-meridian.</li>
+     *   <li>The {@code "+no_defs"} option is for ensuring that no defaults are read from {@code "/usr/share/proj/proj_def.dat"} file.
+     *     That file contains default values for various map projections, for example {@code "+lat_1=29.5"} and {@code "+lat_2=45.5"}
+     *     for the {@code "aea"} projection. Those defaults are assuming that users want Conterminous U.S. map.
+     *     This may cause surprising behavior for users outside USA.</li>
+     * </ul>
+     */
+    static String STANDARD_OPTIONS = " +over +no_defs";
+
+    /**
      * The {@literal Proj.4} parameter used for declaration of axis order.  Proj.4 expects the axis parameter
      * to be exactly 3 characters long, but Apache SIS accepts 2 characters as well. We relax the Proj.4 rule
      * because we use the number of characters for determining the number of dimensions.
@@ -271,7 +286,7 @@ public class Proj4Factory extends Geodet
     /**
      * Returns the set of authority codes for objects of the given type.
      * Current implementation can not return complete Proj.4 definition strings.
-     * Instead, this method currently returns only fragments (e.g. {@code "+init="}).
+     * Instead, this method currently returns only fragments (e.g. {@code "+proj=lcc"}).
      *
      * @param  type  the spatial reference objects type.
      * @return fragments of definition strings for spatial reference objects of the given type.
@@ -279,19 +294,21 @@ public class Proj4Factory extends Geodet
      */
     @Override
     public Set<String> getAuthorityCodes(Class<? extends IdentifiedObject> type) throws FactoryException {
-        final String method;
-        if (type.isAssignableFrom(ProjectedCRS.class)) {                // Must be tested first.
-            method = "";
-        } else if (type.isAssignableFrom(GeographicCRS.class)) {        // Should be tested before GeocentricCRS.
-            method = "latlon";
-        } else if (type.isAssignableFrom(GeocentricCRS.class)) {
-            method = "geocent";
-        } else {
-            return Collections.emptySet();
+        final Set<String> codes = new LinkedHashSet<>(10);
+        if (type.isAssignableFrom(GeographicCRS.class)) {
+            codes.add("latlon");
+        }
+        if (type.isAssignableFrom(GeocentricCRS.class)) {
+            codes.add("geocent");
+        }
+        if (type.isAssignableFrom(ProjectedCRS.class)) {
+            codes.addAll(Arrays.asList("lcc", "merc", "tmerc", "stere"));   // Only a subset of supported projections.
+        }
+        final String[] methods = codes.toArray(new String[codes.size()]);
+        codes.clear();
+        for (final String method : methods) {
+            codes.add(PROJ_PARAM.concat(method));
         }
-        final Set<String> codes = new LinkedHashSet<>(4);
-        codes.add("+init=");
-        codes.add(PROJ_PARAM.concat(method));
         return codes;
     }
 
@@ -421,7 +438,7 @@ public class Proj4Factory extends Geodet
      */
     public MathTransform createParameterizedTransform(final ParameterValueGroup parameters) throws FactoryException {
         final String proj = name(parameters.getDescriptor(), Errors.Keys.UnsupportedOperation_1);
-        final StringBuilder buffer = new StringBuilder(100).append(PROJ_PARAM).append(proj);
+        final StringBuilder buffer = new StringBuilder(100).append(PROJ_PARAM).append(proj).append(STANDARD_OPTIONS);
         for (final GeneralParameterValue p : parameters.values()) {
             /*
              * Unconditionally ask the parameter name in order to throw an exception
@@ -573,16 +590,22 @@ public class Proj4Factory extends Geodet
     private CoordinateReferenceSystem createCRS(final PJ pj, final boolean withHeight) throws FactoryException {
         final PJ.Type type = pj.getType();
         final boolean geographic = PJ.Type.GEOGRAPHIC.equals(type);
+        final boolean geocentric = PJ.Type.GEOCENTRIC.equals(type);
         final Proj4Parser parser = new Proj4Parser(pj.getCode());
         final String dir = parser.value("axis", "enu");
-        final CoordinateSystemAxis[] axes = new CoordinateSystemAxis[withHeight ? dir.length() : 2];
+        final CoordinateSystemAxis[] axes = new CoordinateSystemAxis[geocentric | withHeight ? dir.length() : 2];
         for (int i=0; i<axes.length; i++) {
             final char d = Character.toLowerCase(dir.charAt(i));
             char abbreviation = Character.toUpperCase(d);
             boolean vertical = false;
             final AxisDirection c;
             final String name;
-            switch (d) {
+            if (geocentric) switch (d) {
+                case 'e': c = AxisDirection.GEOCENTRIC_X;  name = "Geocentric X";  break;
+                case 'n': c = AxisDirection.GEOCENTRIC_Y;  name = "Geocentric Y";  break;
+                case 'u': c = AxisDirection.GEOCENTRIC_Z;  name = "Geocentric Z";  break;
+                default:  c = AxisDirection.OTHER;         name = "Unknown";       break;
+            } else switch (d) {
                 case 'e': c = AxisDirection.EAST;  name = geographic ? "Geodetic longitude" : "Easting";  break;
                 case 'w': c = AxisDirection.WEST;  name = geographic ? "Geodetic longitude" : "Westing";  break;
                 case 'n': c = AxisDirection.NORTH; name = geographic ? "Geodetic latitude"  : "Northing"; break;

Modified: sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Transform.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Transform.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Transform.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/Transform.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -38,6 +38,13 @@ import org.apache.sis.util.ComparisonMod
 
 /**
  * A math transform which delegate its work to the {@literal Proj.4} native library.
+ * The WKT for this math transform looks like the following fragment:
+ *
+ * {@preformat wkt
+ *   PARAM_MT["pj_transform",
+ *     PARAMETER["srcdefn", "+proj=…"],
+ *     PARAMETER["dstdefn", "+proj=…"]]
+ * }
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 0.8

Modified: sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/main/java/org/apache/sis/storage/gdal/package-info.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -40,10 +40,16 @@
  * }
  *
  * Calls to {@link org.apache.sis.referencing.CRS#findOperation CRS.findOperation(…)} will delegate the coordinate
- * transformation to Proj.4 if an only if {@code sourceCRS} and {@code targetCRS} were both obtained from a code
- * in {@code "Proj4"} namespace or by a method in this package. If at least one CRS were obtained by another way,
- * then Apache SIS will use its own referencing engine. The backing referencing engine can be seen by printing
- * the {@code CoordinateOperation}.
+ * transformation to Proj.4 if {@code sourceCRS} and {@code targetCRS} were both obtained from a code in {@code "Proj4"}
+ * namespace or by a method in this package. Otherwise, Apache SIS will use its own referencing engine.
+ * The backing referencing engine can be seen by printing the {@code MathTransform}:
+ * a transform backed by Proj.4 have a <cite>Well Known Text 1</cite> representation like below:
+ *
+ * {@preformat wkt
+ *   PARAM_MT["pj_transform",
+ *     PARAMETER["srcdefn", "+proj=…"],
+ *     PARAMETER["dstdefn", "+proj=…"]]
+ * }
  *
  * <div class="section">Note on Proj.4 definition strings</div>
  * Proj.4 unconditionally requires 3 letters for the {@code "+axis="} parameter — for example {@code "neu"} for

Modified: sis/branches/JDK9/storage/sis-gdal/src/main/resources/native/darwin/libproj-binding.so
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/main/resources/native/darwin/libproj-binding.so?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
Binary files - no diff available.

Modified: sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/PJTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/PJTest.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/PJTest.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/PJTest.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -60,7 +60,7 @@ public final strictfp class PJTest exten
      * Ensures that the given object is the WGS84 definition.
      */
     private static void assertIsWGS84(final PJ pj) {
-        assertEquals("+proj=latlong +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0", pj.getCode().trim());
+        assertEquals("+proj=latlong +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0", pj.getCode());
         assertEquals("Proj4",            pj.getCodeSpace());
         assertSame  (Citations.PROJ4,    pj.getAuthority());
         assertTrue  (Character.isDigit(  pj.getVersion().codePointAt(0)));

Modified: sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/Proj4FactoryTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/Proj4FactoryTest.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/Proj4FactoryTest.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/Proj4FactoryTest.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -64,8 +64,10 @@ public final strictfp class Proj4Factory
     @Test
     public void testGetAuthorityCodes() throws FactoryException {
         final Proj4Factory factory = Proj4Factory.INSTANCE;
-        assertTrue(factory.getAuthorityCodes(GeographicCRS.class).containsAll(Arrays.asList("+init=", "+proj=latlon")));
-        assertTrue(factory.getAuthorityCodes(CoordinateReferenceSystem.class).containsAll(Arrays.asList("+init=", "+proj=")));
+        assertTrue(factory.getAuthorityCodes(GeographicCRS.class).containsAll(Arrays.asList("+proj=latlon")));
+        assertTrue(factory.getAuthorityCodes(ProjectedCRS.class).containsAll(Arrays.asList("+proj=merc", "+proj=lcc")));
+        assertTrue(factory.getAuthorityCodes(CoordinateReferenceSystem.class).containsAll(
+                Arrays.asList("+proj=latlon", "+proj=merc", "+proj=lcc")));
     }
 
     /**

Modified: sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/TransformTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/TransformTest.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/TransformTest.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-gdal/src/test/java/org/apache/sis/storage/gdal/TransformTest.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -24,6 +24,7 @@ import org.opengis.util.NoSuchIdentifier
 import org.opengis.test.referencing.ParameterizedTransformTest;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.junit.BeforeClass;
 import org.junit.AfterClass;
 
 import static org.apache.sis.test.Assert.*;
@@ -56,7 +57,7 @@ public class TransformTest extends Param
                     return super.getDefaultParameters(method);
                 } catch (NoSuchIdentifierException e) {
                     FAILURES.add(method);
-                    throw e;
+                    throw e;                            // Instructs ParameterizedTransformTest to skip the test.
                 }
             }
         });
@@ -64,6 +65,14 @@ public class TransformTest extends Param
     }
 
     /**
+     * Verifies if the {@literal Proj.4} library is available.
+     */
+    @BeforeClass
+    public static void verifyNativeLibraryAvailability() {
+        PJTest.verifyNativeLibraryAvailability();
+    }
+
+    /**
      * Invoked after all the tests have been run for comparing the list of failures with the expected list.
      * This method checks for the exact same content, so this method detects both unexpected failures and
      * "unexpected" successes. Note that a failure is not necessarily because Proj.4 does not support the
@@ -72,22 +81,28 @@ public class TransformTest extends Param
      */
     @AfterClass
     public static void verifyFailureList() {
-        assertSetEquals(Arrays.asList(
-                "Abridged Molodensky",
-                "Cassini-Soldner",                          // No OperationMethod in SIS yet.
-                "Hotine Oblique Mercator (variant B)",
-                "Krovak",                                   // No OperationMethod in SIS yet.
-                "Lambert Azimuthal Equal Area",             // No OperationMethod in SIS yet.
-                "Lambert Conic Conformal (1SP)",
-                "Lambert Conic Conformal (2SP Belgium)",
-                "Lambert Conic Conformal (2SP Michigan)",
-                "Mercator (Spherical)",
-                "Mercator (variant C)",
-                "Polar Stereographic (variant B)",
-                "Polar Stereographic (variant C)",
-                "Popular Visualisation Pseudo Mercator",
-                "Polyconic",                                // No OperationMethod in SIS yet.
-                "Transverse Mercator (South Orientated)"), FAILURES);
-        FAILURES.clear();
+        /*
+         * The list of failures is empty if verifyNativeLibraryAvailability() failed,
+         * in which case no test have been run.
+         */
+        if (!FAILURES.isEmpty()) {
+            assertSetEquals(Arrays.asList(
+                    "Abridged Molodensky",
+                    "Cassini-Soldner",                          // No OperationMethod in SIS yet.
+                    "Hotine Oblique Mercator (variant B)",
+                    "Krovak",                                   // No OperationMethod in SIS yet.
+                    "Lambert Azimuthal Equal Area",             // No OperationMethod in SIS yet.
+                    "Lambert Conic Conformal (1SP)",
+                    "Lambert Conic Conformal (2SP Belgium)",
+                    "Lambert Conic Conformal (2SP Michigan)",
+                    "Mercator (Spherical)",
+                    "Mercator (variant C)",
+                    "Polar Stereographic (variant B)",
+                    "Polar Stereographic (variant C)",
+                    "Popular Visualisation Pseudo Mercator",
+                    "Polyconic",                                // No OperationMethod in SIS yet.
+                    "Transverse Mercator (South Orientated)"), FAILURES);
+            FAILURES.clear();
+        }
     }
 }

Modified: sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/CRSBuilder.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -131,7 +131,7 @@ import static org.apache.sis.util.Utilit
  * <p>Going further down the list, the key 2051 ({@code GeogLinearUnitSize}) is located in {@code GeoDoubleParams(34736)}
  * at offset 0 and has the value 1.5; the value of key 2049 ({@code GeogCitation}) is "My Geographic".</p>
  *
- * @author  Rémi Marechal (Geomatys)
+ * @author  Rémi Maréchal (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  * @version 0.8
  *

Modified: sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTIFF.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTIFF.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTIFF.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTIFF.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -30,7 +30,7 @@ import org.apache.sis.internal.geotiff.R
  * Those readers and writers are <strong>not</strong> thread safe.
  * The {@link GeoTiffStore} class is responsible for synchronization if needed.
  *
- * @author  Rémi Marechal (Geomatys)
+ * @author  Rémi Maréchal (Geomatys)
  * @author  Alexis Manin (Geomatys)
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)

Modified: sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -36,6 +36,7 @@ import org.apache.sis.internal.storage.M
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.metadata.sql.MetadataStoreException;
 import org.apache.sis.storage.DataStoreClosedException;
+import org.apache.sis.storage.Resource;
 import org.apache.sis.util.resources.Errors;
 
 
@@ -132,6 +133,18 @@ public class GeoTiffStore extends DataSt
     }
 
     /**
+     * Current implementation does not provide any resource yet.
+     * A future version will return the raster data in a coverage resource.
+     *
+     * @return the starting point of all resources in this data store.
+     * @throws DataStoreException if an error occurred while reading the data.
+     */
+    @Override
+    public Resource getRootResource() throws DataStoreException {
+        return null;
+    }
+
+    /**
      * Returns the reader if it is not closed, or thrown an exception otherwise.
      */
     private Reader reader() throws DataStoreException {

Modified: sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -47,7 +47,7 @@ import org.apache.sis.measure.Units;
 /**
  * An Image File Directory (FID) in a TIFF image.
  *
- * @author  Rémi Marechal (Geomatys)
+ * @author  Rémi Maréchal (Geomatys)
  * @author  Alexis Manin (Geomatys)
  * @author  Johann Sorel (Geomatys)
  * @author  Thi Phuong Hao Nguyen (VNSC)

Modified: sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Reader.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Reader.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Reader.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Reader.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -44,7 +44,7 @@ import org.apache.sis.util.resources.Err
  * <p>The TIFF format specification version 6.0 (June 3, 1992) is available
  * <a href="https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf">here</a>.</p>
  *
- * @author  Rémi Marechal (Geomatys)
+ * @author  Rémi Maréchal (Geomatys)
  * @author  Alexis Manin (Geomatys)
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)

Modified: sis/branches/JDK9/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -26,6 +26,7 @@ import org.apache.sis.storage.StorageCon
 import org.apache.sis.internal.netcdf.Decoder;
 import org.apache.sis.metadata.ModifiableMetadata;
 import org.apache.sis.setup.OptionKey;
+import org.apache.sis.storage.Resource;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.Version;
 import ucar.nc2.constants.CDM;
@@ -117,6 +118,17 @@ public class NetcdfStore extends DataSto
     }
 
     /**
+     * This implementation does not provide any resource yet.
+     *
+     * @return currently {@code null} (will be implemented in future Apache SIS version).
+     * @throws DataStoreException if an error occurred while reading the data.
+     */
+    @Override
+    public Resource getRootResource() throws DataStoreException {
+        return null;
+    }
+
+    /**
      * Returns the version number of the Climate and Forecast (CF) conventions used in the NetCDF file.
      * The use of CF convention is mandated by the OGC 11-165r2 standard
      * (<cite>CF-netCDF3 Data Model Extension standard</cite>).

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FeatureCatalogBuilder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FeatureCatalogBuilder.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FeatureCatalogBuilder.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FeatureCatalogBuilder.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -39,7 +39,7 @@ import org.opengis.feature.FeatureType;
  * @since 0.8
  * @module
  */
-public class FeatureCatalogBuilder extends MetadataBuilder {
+public final class FeatureCatalogBuilder extends MetadataBuilder {
     /**
      * The data store for which the metadata will be created, or {@code null} if unknown.
      * This is used for producing error message if an exception is thrown.

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -52,8 +52,8 @@ import org.opengis.metadata.identificati
 import org.opengis.metadata.distribution.Format;
 import org.opengis.metadata.quality.Element;
 import org.opengis.geometry.DirectPosition;
+import org.opengis.referencing.ReferenceSystem;
 import org.opengis.referencing.crs.VerticalCRS;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.TransformException;
 import org.apache.sis.geometry.AbstractEnvelope;
 import org.apache.sis.metadata.iso.DefaultMetadata;
@@ -122,7 +122,7 @@ import org.opengis.metadata.citation.Res
  * API of this class may change in any future SIS versions.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @author  Rémi Marechal (Geomatys)
+ * @author  Rémi Maréchal (Geomatys)
  * @version 0.8
  * @since   0.8
  * @module
@@ -1605,7 +1605,7 @@ parse:      for (int i = 0; i < length;)
      *
      * @param  crs  the coordinate reference system to add to the metadata, or {@code null} for no-operation.
      */
-    public final void addReferenceSystem(final CoordinateReferenceSystem crs) {
+    public final void addReferenceSystem(final ReferenceSystem crs) {
         if (crs != null) {
             addIfNotPresent(metadata().getReferenceSystemInfo(), crs);
         }

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -149,6 +149,16 @@ public final class Resources extends Ind
         public static final short ProcessingExecutedOn_1 = 12;
 
         /**
+         * More than one resource have the “{1}” identifier in the “{0}” data store.
+         */
+        public static final short ResourceIdentifierCollision_2 = 23;
+
+        /**
+         * No resource found for the “{1}” identifier in the “{0}” data store.
+         */
+        public static final short ResourceNotFound_2 = 24;
+
+        /**
          * The “{1}” element must be declared before “{0}”.
          */
         public static final short ShallBeDeclaredBefore_2 = 22;

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.properties?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.properties [ISO-8859-1] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources.properties [ISO-8859-1] Mon Aug 21 01:03:12 2017
@@ -36,6 +36,8 @@ IllegalOutputTypeForWriter_2      = The
 InconsistentNameComponents_2      = Components of the \u201c{1}\u201d name are inconsistent with those of the name previously binded in \u201c{0}\u201d data store.
 MissingSchemeInURI_1              = Missing scheme in \u201c{0}\u201d URI.
 ProcessingExecutedOn_1            = Processing executed on {0}.
+ResourceIdentifierCollision_2     = More than one resource have the \u201c{1}\u201d identifier in the \u201c{0}\u201d data store.
+ResourceNotFound_2                = No resource found for the \u201c{1}\u201d identifier in the \u201c{0}\u201d data store.
 ShallBeDeclaredBefore_2           = The \u201c{1}\u201d element must be declared before \u201c{0}\u201d.
 StreamIsForwardOnly_1             = Can not move backward in the \u201c{0}\u201d stream.
 StreamIsReadOnce_1                = The \u201c{0}\u201d data store can be read only once.

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources_fr.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources_fr.properties?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources_fr.properties [ISO-8859-1] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Resources_fr.properties [ISO-8859-1] Mon Aug 21 01:03:12 2017
@@ -41,6 +41,8 @@ IllegalOutputTypeForWriter_2      = Le l
 InconsistentNameComponents_2      = Les \u00e9l\u00e9ments qui composent le nom \u00ab\u202f{1}\u202f\u00bb ne sont pas coh\u00e9rents avec ceux du nom qui avait \u00e9t\u00e9 pr\u00e9c\u00e9demment li\u00e9 dans les donn\u00e9es de \u00ab\u202f{0}\u202f\u00bb.
 MissingSchemeInURI_1              = Il manque le sch\u00e9ma dans l\u2019URI \u00ab\u202f{0}\u202f\u00bb.
 ProcessingExecutedOn_1            = Traitement ex\u00e9cut\u00e9 sur {0}.
+ResourceIdentifierCollision_2     = Plusieurs ressources utilisent l\u2019identifiant \u00ab\u202f{1}\u202f\u00bb dans les donn\u00e9es de \u00ab\u202f{0}\u202f\u00bb.
+ResourceNotFound_2                = Aucune ressource n\u2019a \u00e9t\u00e9 trouv\u00e9e pour l\u2019identifiant \u00ab\u202f{1}\u202f\u00bb dans les donn\u00e9es de \u00ab\u202f{0}\u202f\u00bb.
 ShallBeDeclaredBefore_2           = L\u2019\u00e9l\u00e9ment \u00ab\u202f{1}\u202f\u00bb doit \u00eatre d\u00e9clar\u00e9 avant \u00ab\u202f{0}\u202f\u00bb.
 StreamIsForwardOnly_1             = Ne peut pas reculer dans le flux de donn\u00e9es \u00ab\u202f{0}\u202f\u00bb.
 StreamIsReadOnce_1                = Les donn\u00e9es de \u00ab\u202f{0}\u202f\u00bb ne peuvent \u00eatre lues qu\u2019une seule fois.

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/csv/Store.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -45,17 +45,17 @@ import org.apache.sis.internal.referenci
 import org.apache.sis.internal.util.UnmodifiableArrayList;
 import org.apache.sis.internal.storage.MetadataBuilder;
 import org.apache.sis.internal.storage.io.IOUtilities;
-import org.apache.sis.internal.storage.FeatureStore;
 import org.apache.sis.internal.feature.Geometries;
 import org.apache.sis.internal.feature.MovingFeature;
 import org.apache.sis.internal.storage.Resources;
 import org.apache.sis.geometry.GeneralEnvelope;
 import org.apache.sis.metadata.iso.DefaultMetadata;
 import org.apache.sis.metadata.sql.MetadataStoreException;
+import org.apache.sis.storage.Resource;
+import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.DataStoreContentException;
 import org.apache.sis.storage.DataStoreReferencingException;
-import org.apache.sis.storage.IllegalNameException;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.setup.OptionKey;
 import org.apache.sis.util.ArraysExt;
@@ -83,7 +83,7 @@ import org.opengis.feature.AttributeType
  * @since   0.7
  * @module
  */
-public final class Store extends FeatureStore {
+public final class Store extends DataStore {
     /**
      * The character at the beginning of lines to ignore in the header.
      * Note that this is not part of OGC Moving Feature Specification.
@@ -111,12 +111,24 @@ public final class Store extends Feature
     static final char ORDINATE_SEPARATOR = ' ';
 
     /**
-     * The prefix for elements in the {@code @columns} line that specify the data type.
+     * The prefix for elements in the {@code @columns} line that specify the data type,
+     * as required by the OGC CSV encoding specification.
      * Examples: {@code xsd:boolean}, {@code xsd:decimal}, {@code xsd:integer}, <i>etc</i>.
+     *
+     * <p>Note that this prefix is slightly different than the {@code "xs:"} prefix used
+     * in {@code https://www.w3.org/2009/XMLSchema/XMLSchema.xsd} file. This data store
+     * implementation accepts both.</p>
      */
     private static final String TYPE_PREFIX = "xsd:";
 
     /**
+     * The prefix used in {@code https://www.w3.org/2009/XMLSchema/XMLSchema.xsd} file.
+     * This is not the same prefix than the one specified by OGC CSV encoding, but this
+     * implementation accepts both.
+     */
+    private static final String XS_PREFIX = "xs:";
+
+    /**
      * The reader, set by the constructor and cleared when no longer needed.
      *
      * @see #readLine()
@@ -473,8 +485,11 @@ public final class Store extends Feature
             Class<?> type = null;
             if (++i < size) {
                 String tn = elements.get(i);
-                if (!tn.isEmpty() && tn.regionMatches(true, 0, TYPE_PREFIX, 0, TYPE_PREFIX.length())) {
-                    String st = tn.substring(TYPE_PREFIX.length()).toLowerCase(Locale.US);
+                int length;
+                if (tn.regionMatches(true, 0, TYPE_PREFIX, 0, length = TYPE_PREFIX.length()) ||
+                    tn.regionMatches(true, 0,   XS_PREFIX, 0, length =   XS_PREFIX.length()))
+                {
+                    String st = tn.substring(length).toLowerCase(Locale.US);
                     switch (st) {
                         case "boolean":  type = Boolean.class; break;
                         case "decimal":  type = Double .class; break;
@@ -604,28 +619,13 @@ public final class Store extends Feature
     }
 
     /**
-     * Returns the feature type for the given name. The {@code name} argument should be the
-     * value specified at the following path (only one such value exists for a CSV data store):
+     * Returns the {@code FeatureSet} from which all features in this data store can be accessed.
      *
-     * <blockquote>
-     * {@link #getMetadata()} /
-     * {@link org.apache.sis.metadata.iso.DefaultMetadata#getContentInfo() contentInfo} /
-     * {@link org.apache.sis.metadata.iso.content.DefaultFeatureCatalogueDescription#getFeatureTypeInfo() featureTypes} /
-     * {@link org.apache.sis.metadata.iso.content.DefaultFeatureTypeInfo#getFeatureTypeName() featureTypeName}
-     * </blockquote>
-     *
-     * @param  name  the name of the feature type to get.
-     * @return the feature type of the given name (never {@code null}).
-     * @throws IllegalNameException if the given name was not found.
-     *
-     * @since 0.8
+     * @return the starting point of all features in this data store.
      */
     @Override
-    public FeatureType getFeatureType(String name) throws IllegalNameException {
-        if (featureType.getName().toString().equals(name)) {
-            return featureType;
-        }
-        throw new IllegalNameException(getLocale(), getDisplayName(), name);
+    public Resource getRootResource() {
+        return new FeatureAccess(this, listeners);
     }
 
     /**
@@ -638,8 +638,7 @@ public final class Store extends Feature
      * @todo Needs to reset the position when doing another pass on the features.
      * @todo If sequential order, publish Feature as soon as identifier changed.
      */
-    @Override
-    public synchronized Stream<Feature> features(final boolean parallel) throws DataStoreException {
+    final synchronized Stream<Feature> features(final boolean parallel) throws DataStoreException {
         /*
          * If the user asks for one feature instance per line, then we can return a FeatureIter instance directly.
          * Since each feature is fully constructed from a single line and each line are read atomically, we can

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -17,8 +17,8 @@
 package org.apache.sis.internal.storage.wkt;
 
 import java.util.List;
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.io.Reader;
@@ -33,12 +33,13 @@ import org.apache.sis.internal.storage.R
 import org.apache.sis.internal.system.Loggers;
 import org.apache.sis.io.wkt.WKTFormat;
 import org.apache.sis.io.wkt.Warnings;
+import org.apache.sis.storage.Resource;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.DataStoreContentException;
 import org.apache.sis.internal.referencing.DefinitionVerifier;
-import org.apache.sis.metadata.iso.DefaultMetadata;
+import org.apache.sis.internal.storage.MetadataBuilder;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.util.CharSequences;
 
@@ -171,7 +172,7 @@ final class Store extends DataStore {
     /**
      * Returns the metadata associated to the parsed objects, or {@code null} if none.
      * The current implementation retains only instances of {@link ReferenceSystem}
-     * and ignore other cases.
+     * and ignore other objects.
      *
      * @return the metadata associated to the parsed object, or {@code null} if none.
      * @throws DataStoreException if an error occurred during the parsing process.
@@ -180,19 +181,28 @@ final class Store extends DataStore {
     public synchronized Metadata getMetadata() throws DataStoreException {
         if (metadata == null) {
             parse();
-            DefaultMetadata md = null;
+            final MetadataBuilder builder = new MetadataBuilder();
+            builder.addTitle(getDisplayName());
             for (final Object object : objects) {
                 if (object instanceof ReferenceSystem) {
-                    if (md == null) md = new DefaultMetadata();
-                    md.getReferenceSystemInfo().add((ReferenceSystem) object);
+                    builder.addReferenceSystem((ReferenceSystem) object);
                 }
             }
-            metadata = md;
+            metadata = builder.build(true);
         }
         return metadata;
     }
 
     /**
+     * There is currently no resource associated to Well Known Text format since we parse only CRS.
+     * Future versions may return resources if we parse also geometries.
+     */
+    @Override
+    public Resource getRootResource() throws DataStoreException {
+        return null;
+    }
+
+    /**
      * Closes this data store and releases any underlying resources.
      *
      * @throws DataStoreException if an error occurred while closing this data store.

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/xml/Store.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -30,6 +30,7 @@ import org.opengis.util.FactoryException
 import org.opengis.referencing.ReferenceSystem;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.xml.XML;
+import org.apache.sis.storage.Resource;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataStoreException;
@@ -37,10 +38,9 @@ import org.apache.sis.metadata.iso.Defau
 import org.apache.sis.util.logging.WarningListener;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.internal.system.Loggers;
+import org.apache.sis.internal.storage.MetadataBuilder;
 import org.apache.sis.internal.referencing.DefinitionVerifier;
 
-import static java.util.Collections.singleton;
-
 
 /**
  * A data store which creates data objects from a XML file.
@@ -199,15 +199,25 @@ final class Store extends DataStore {
             if (object instanceof Metadata) {
                 metadata = (Metadata) object;
             } else if (object instanceof ReferenceSystem) {
-                final DefaultMetadata md = new DefaultMetadata();
-                md.setReferenceSystemInfo(singleton((ReferenceSystem) object));
-                metadata = md;
+                final MetadataBuilder builder = new MetadataBuilder();
+                builder.addReferenceSystem((ReferenceSystem) object);
+                builder.addTitle(getDisplayName());
+                metadata = builder.build(true);
             }
         }
         return metadata;
     }
 
     /**
+     * Current implementation does not provide any resource since it is only about metadata.
+     * Futures versions may return resources if Apache SIS provides a wider GML support.
+     */
+    @Override
+    public Resource getRootResource() throws DataStoreException {
+        return null;
+    }
+
+    /**
      * Closes this data store and releases any underlying resources.
      *
      * @throws DataStoreException if an error occurred while closing this data store.

Modified: sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -17,12 +17,17 @@
 package org.apache.sis.storage;
 
 import java.util.Locale;
+import java.util.Map;
+import java.util.IdentityHashMap;
 import java.util.NoSuchElementException;
 import org.opengis.metadata.Metadata;
+import org.opengis.metadata.identification.Identification;
 import org.apache.sis.util.Localized;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.logging.WarningListener;
 import org.apache.sis.util.logging.WarningListeners;
+import org.apache.sis.internal.storage.Resources;
+import org.apache.sis.internal.util.Citations;
 
 
 /**
@@ -164,16 +169,107 @@ public abstract class DataStore implemen
     }
 
     /**
-     * Returns information about the dataset as a whole. The returned metadata object, if any, can contain
-     * information such as the spatiotemporal extent of the dataset, contact information about the creator
-     * or distributor, data quality, update frequency, usage constraints and more.
+     * Returns information about the data store as a whole. The returned metadata object can contain
+     * information such as the spatiotemporal extent of all contained {@linkplain Resource resources},
+     * contact information about the creator or distributor, data quality, update frequency, usage constraints,
+     * file format and more.
      *
-     * @return information about the dataset, or {@code null} if none.
+     * @return information about resources in the data store, or {@code null} if none.
      * @throws DataStoreException if an error occurred while reading the data.
+     *
+     * @see Resource#getMetadata()
      */
     public abstract Metadata getMetadata() throws DataStoreException;
 
     /**
+     * Returns the starting point from which all resources in this data store can be accessed.
+     * A resource can be for example a air temperature map or the set of all bridges in a city.
+     * If this data store contains only one resource, then that resource is returned directly.
+     * Otherwise if this data store contains more than one resource, then this method returns
+     * an {@link Aggregate} from which other resources can be accessed.
+     *
+     * @return the starting point of all resources in this data store,
+     *         or {@code null} if this data store does not contain any resources.
+     * @throws DataStoreException if an error occurred while reading the data.
+     */
+    public abstract Resource getRootResource() throws DataStoreException;
+
+    /**
+     * Searches for a resource identified by the given identifier.
+     * The given identifier should match the following metadata element of a resource:
+     *
+     * <blockquote>{@link Resource#getMetadata() metadata} /
+     * {@link org.apache.sis.metadata.iso.DefaultMetadata#getIdentificationInfo() identificationInfo} /
+     * {@link org.apache.sis.metadata.iso.identification.AbstractIdentification#getCitation() citation} /
+     * {@link org.apache.sis.metadata.iso.citation.DefaultCitation#getIdentifiers() identifier}</blockquote>
+     *
+     * Implementation may also accept aliases for convenience. For example if the full name of a resource
+     * is {@code "foo:bar"}, then this method may accept {@code "bar"} as a synonymous of {@code "foo:bar"}
+     * provided that it does not introduce ambiguity.
+     *
+     * <p>The default implementation verifies the {@linkplain #getRootResource() root resource}, then iterates over
+     * components of {@link Aggregate}s. If a match is found without ambiguity, the associated resource is returned.
+     * Otherwise an exception is thrown. Subclasses are encouraged to override this method with a more efficient
+     * implementation.</p>
+     *
+     * @param  identifier  identifier of the resource to fetch. Must be non-null.
+     * @return resource associated to the given identifier (never {@code null}).
+     * @throws IllegalNameException if no resource is found for the given identifier, or if more than one resource is found.
+     * @throws DataStoreException if another kind of error occurred while searching resources.
+     */
+    public Resource findResource(final String identifier) throws DataStoreException {
+        ArgumentChecks.ensureNonEmpty("identifier", identifier);
+        final Resource resource = findResource(identifier, getRootResource(), new IdentityHashMap<>());
+        if (resource != null) {
+            return resource;
+        }
+        throw new IllegalNameException(Resources.forLocale(getLocale())
+                .getString(Resources.Keys.ResourceNotFound_2, getDisplayName(), identifier));
+    }
+
+    /**
+     * Recursively searches for a resource identified by the given identifier.
+     * This is the implementation of {@link #findResource(String)}.
+     *
+     * @param  identifier  identifier of the resource to fetch.
+     * @param  candidate   a resource to compare against the identifier.
+     * @param  visited     resources visited so-far, for avoiding never-ending loops if cycles exist.
+     * @return resource associated to the given identifier, or {@code null} if not found.
+     */
+    private Resource findResource(final String identifier, final Resource candidate,
+            final Map<Resource,Boolean> visited) throws DataStoreException
+    {
+        if (candidate != null && visited.put(candidate, Boolean.TRUE) == null) {
+            final Metadata metadata = candidate.getMetadata();
+            if (metadata != null) {
+                for (final Identification identification : metadata.getIdentificationInfo()) {
+                    if (identification != null) {                                                   // Paranoiac check.
+                        if (Citations.identifierMatches(identification.getCitation(), null, identifier)) {
+                            return candidate;
+                        }
+                    }
+                }
+            }
+            if (candidate instanceof Aggregate) {
+                Resource result = null;
+                for (final Resource child : ((Aggregate) candidate).components()) {
+                    final Resource match = findResource(identifier, child, visited);
+                    if (match != null) {
+                        if (result == null) {
+                            result = match;
+                        } else {
+                            throw new IllegalNameException(Resources.forLocale(getLocale())
+                                    .getString(Resources.Keys.ResourceIdentifierCollision_2, getDisplayName(), identifier));
+                        }
+                    }
+                }
+                return result;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Adds a listener to be notified when a warning occurred while reading from or writing to the storage.
      * When a warning occurs, there is a choice:
      *

Modified: sis/branches/JDK9/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-storage/src/test/java/org/apache/sis/storage/DataStoreMock.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -54,6 +54,11 @@ final strictfp class DataStoreMock exten
     }
 
     @Override
+    public Resource getRootResource() throws DataStoreException {
+        return null;
+    }
+
+    @Override
     public void close() {
     }
 }

Modified: sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Store.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -21,6 +21,7 @@ import org.opengis.util.NameFactory;
 import org.opengis.util.FactoryException;
 import org.opengis.metadata.Metadata;
 import org.opengis.metadata.distribution.Format;
+import org.apache.sis.storage.Resource;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.DataStoreContentException;
@@ -167,14 +168,27 @@ public final class Store extends StaxDat
     }
 
     /**
+     * Returns the {@code FeatureSet} from which all features in this data store can be accessed.
+     *
+     * @return the starting point of all features in this data store.
+     */
+    @Override
+    public Resource getRootResource() {
+        return new FeatureAccess(this, listeners);
+    }
+
+    /**
      * Returns the feature type for the given name. The {@code name} argument should be the result of calling
      * {@link org.opengis.util.GenericName#toString()} on the name of one of the feature types in this data store.
      *
      * @param  name  the name or alias of the feature type to get.
      * @return the feature type of the given name or alias (never {@code null}).
      * @throws IllegalNameException if the given name was not found or is ambiguous.
+     *
+     * @deprecated We are not sure yet if we will keep this method. Decision is pending acquisition of
+     *             more experience with the API proposed by {@link org.apache.sis.storage.FeatureSet}.
      */
-    @Override
+    @Deprecated
     public FeatureType getFeatureType(final String name) throws IllegalNameException {
         return types.names.get(this, name);
     }
@@ -182,12 +196,10 @@ public final class Store extends StaxDat
     /**
      * Returns the stream of features.
      *
-     * @param  parallel  ignored in current implementation.
      * @return a stream over all features in the XML file.
      * @throws DataStoreException if an error occurred while creating the feature stream.
      */
-    @Override
-    public synchronized Stream<Feature> features(final boolean parallel) throws DataStoreException {
+    final synchronized Stream<Feature> features() throws DataStoreException {
         Reader r = reader;
         reader = null;
         if (r == null) try {

Modified: sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/Types.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -64,6 +64,11 @@ import org.opengis.feature.FeatureType;
  */
 final class Types {
     /**
+     * The parent of all other feature types.
+     */
+    final FeatureType parent;
+
+    /**
      * Way point GPX feature type.
      */
     final FeatureType wayPoint;
@@ -91,7 +96,11 @@ final class Types {
     /**
      * Binding from names to feature type instances.
      * Shall not be modified after construction.
+     *
+     * @deprecated We are not sure yet if we will keep this field. Decision is pending acquisition of
+     *             more experience with the API proposed by {@link org.apache.sis.storage.FeatureSet}.
      */
+    @Deprecated
     final FeatureNaming<FeatureType> names;
 
     /**
@@ -143,34 +152,34 @@ final class Types {
         final FeatureTypeBuilder builder = new FeatureTypeBuilder(factory, library, locale);
         builder.setNameSpace(Tags.PREFIX).setName("GPXEntity").setAbstract(true);
         builder.addAttribute(Integer.class).setName(AttributeConvention.IDENTIFIER_PROPERTY);
-        final FeatureType parent = builder.build();
+        parent = builder.build();
         /*
          * WayPoint ⇾ GPXEntity
-         * ┌──────────────────┬────────────────┬────────────────────────┬─────────────┐
-         * │ Name             │ Type           │ XML type               │ Cardinality │
-         * ├──────────────────┼────────────────┼────────────────────────┼─────────────┤
-         * │ sis:identifier   │ Integer        │                        │   [1 … 1]   │
-         * │ sis:envelope     │ Envelope       │                        │   [1 … 1]   │
-         * │ sis:geometry     │ Point          │ (lat,lon) attributes   │   [1 … 1]   │
-         * │ ele              │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ time             │ Temporal       │ xsd:dateTime           │   [0 … 1]   │
-         * │ magvar           │ Double         │ gpx:degreesType        │   [0 … 1]   │
-         * │ geoidheight      │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ name             │ String         │ xsd:string             │   [0 … 1]   │
-         * │ cmt              │ String         │ xsd:string             │   [0 … 1]   │
-         * │ desc             │ String         │ xsd:string             │   [0 … 1]   │
-         * │ src              │ String         │ xsd:string             │   [0 … 1]   │
-         * │ link             │ OnlineResource │ gpx:linkType           │   [0 … ∞]   │
-         * │ sym              │ String         │ xsd:string             │   [0 … 1]   │
-         * │ type             │ String         │ xsd:string             │   [0 … 1]   │
-         * │ fix              │ Fix            │ gpx:fixType            │   [0 … 1]   │
-         * │ sat              │ Integer        │ xsd:nonNegativeInteger │   [0 … 1]   │
-         * │ hdop             │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ vdop             │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ pdop             │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ ageofdgpsdata    │ Double         │ xsd:decimal            │   [0 … 1]   │
-         * │ dgpsid           │ Integer        │ gpx:dgpsStationType    │   [0 … 1]   │
-         * └──────────────────┴────────────────┴────────────────────────┴─────────────┘
+         * ┌──────────────────┬────────────────┬───────────────────────┬─────────────┐
+         * │ Name             │ Type           │ XML type              │ Cardinality │
+         * ├──────────────────┼────────────────┼───────────────────────┼─────────────┤
+         * │ sis:identifier   │ Integer        │                       │   [1 … 1]   │
+         * │ sis:envelope     │ Envelope       │                       │   [1 … 1]   │
+         * │ sis:geometry     │ Point          │ (lat,lon) attributes  │   [1 … 1]   │
+         * │ ele              │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ time             │ Temporal       │ xs:dateTime           │   [0 … 1]   │
+         * │ magvar           │ Double         │ gpx:degreesType       │   [0 … 1]   │
+         * │ geoidheight      │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ name             │ String         │ xs:string             │   [0 … 1]   │
+         * │ cmt              │ String         │ xs:string             │   [0 … 1]   │
+         * │ desc             │ String         │ xs:string             │   [0 … 1]   │
+         * │ src              │ String         │ xs:string             │   [0 … 1]   │
+         * │ link             │ OnlineResource │ gpx:linkType          │   [0 … ∞]   │
+         * │ sym              │ String         │ xs:string             │   [0 … 1]   │
+         * │ type             │ String         │ xs:string             │   [0 … 1]   │
+         * │ fix              │ Fix            │ gpx:fixType           │   [0 … 1]   │
+         * │ sat              │ Integer        │ xs:nonNegativeInteger │   [0 … 1]   │
+         * │ hdop             │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ vdop             │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ pdop             │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ ageofdgpsdata    │ Double         │ xs:decimal            │   [0 … 1]   │
+         * │ dgpsid           │ Integer        │ gpx:dgpsStationType   │   [0 … 1]   │
+         * └──────────────────┴────────────────┴───────────────────────┴─────────────┘
          */
         builder.clear().setSuperTypes(parent).setNameSpace(Tags.PREFIX).setName("WayPoint");
         builder.addAttribute(GeometryType.POINT).setName(geomName)
@@ -198,21 +207,21 @@ final class Types {
         wayPoint = create(builder, resources);
         /*
          * Route ⇾ GPXEntity
-         * ┌────────────────┬────────────────┬────────────────────────┬─────────────┐
-         * │ Name           │ Type           │ XML type               │ Cardinality │
-         * ├────────────────┼────────────────┼────────────────────────┼─────────────┤
-         * │ sis:identifier │ Integer        │                        │   [1 … 1]   │
-         * │ sis:envelope   │ Envelope       │                        │   [1 … 1]   │
-         * │ sis:geometry   │ Polyline       │                        │   [1 … 1]   │
-         * │ name           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ cmt            │ String         │ xsd:string             │   [0 … 1]   │
-         * │ desc           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ src            │ String         │ xsd:string             │   [0 … 1]   │
-         * │ link           │ OnlineResource │ gpx:linkType           │   [0 … ∞]   │
-         * │ number         │ Integer        │ xsd:nonNegativeInteger │   [0 … 1]   │
-         * │ type           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ rtept          │ WayPoint       │ gpx:wptType            │   [0 … ∞]   │
-         * └────────────────┴────────────────┴────────────────────────┴─────────────┘
+         * ┌────────────────┬────────────────┬───────────────────────┬─────────────┐
+         * │ Name           │ Type           │ XML type              │ Cardinality │
+         * ├────────────────┼────────────────┼───────────────────────┼─────────────┤
+         * │ sis:identifier │ Integer        │                       │   [1 … 1]   │
+         * │ sis:envelope   │ Envelope       │                       │   [1 … 1]   │
+         * │ sis:geometry   │ Polyline       │                       │   [1 … 1]   │
+         * │ name           │ String         │ xs:string             │   [0 … 1]   │
+         * │ cmt            │ String         │ xs:string             │   [0 … 1]   │
+         * │ desc           │ String         │ xs:string             │   [0 … 1]   │
+         * │ src            │ String         │ xs:string             │   [0 … 1]   │
+         * │ link           │ OnlineResource │ gpx:linkType          │   [0 … ∞]   │
+         * │ number         │ Integer        │ xs:nonNegativeInteger │   [0 … 1]   │
+         * │ type           │ String         │ xs:string             │   [0 … 1]   │
+         * │ rtept          │ WayPoint       │ gpx:wptType           │   [0 … ∞]   │
+         * └────────────────┴────────────────┴───────────────────────┴─────────────┘
          */
         final AttributeType<?> groupResult = GroupAsPolylineOperation.getResult(geometries);
         GroupAsPolylineOperation groupOp = new GroupAsPolylineOperation(geomInfo, Tags.ROUTE_POINTS, groupResult);
@@ -249,21 +258,21 @@ final class Types {
         trackSegment = create(builder, resources);
         /*
          * Track ⇾ GPXEntity
-         * ┌────────────────┬────────────────┬────────────────────────┬─────────────┐
-         * │ Name           │ Type           │ XML type               │ Cardinality │
-         * ├────────────────┼────────────────┼────────────────────────┼─────────────┤
-         * │ sis:identifier │ Integer        │                        │   [1 … 1]   │
-         * │ sis:envelope   │ Envelope       │                        │   [1 … 1]   │
-         * │ sis:geometry   │ Polyline       │                        │   [1 … 1]   │
-         * │ name           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ cmt            │ String         │ xsd:string             │   [0 … 1]   │
-         * │ desc           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ src            │ String         │ xsd:string             │   [0 … 1]   │
-         * │ link           │ OnlineResource │ gpx:linkType           │   [0 … ∞]   │
-         * │ number         │ Integer        │ xsd:nonNegativeInteger │   [0 … 1]   │
-         * │ type           │ String         │ xsd:string             │   [0 … 1]   │
-         * │ trkseg         │ TrackSegment   │ gpx:trksegType         │   [0 … ∞]   │
-         * └────────────────┴────────────────┴────────────────────────┴─────────────┘
+         * ┌────────────────┬────────────────┬───────────────────────┬─────────────┐
+         * │ Name           │ Type           │ XML type              │ Cardinality │
+         * ├────────────────┼────────────────┼───────────────────────┼─────────────┤
+         * │ sis:identifier │ Integer        │                       │   [1 … 1]   │
+         * │ sis:envelope   │ Envelope       │                       │   [1 … 1]   │
+         * │ sis:geometry   │ Polyline       │                       │   [1 … 1]   │
+         * │ name           │ String         │ xs:string             │   [0 … 1]   │
+         * │ cmt            │ String         │ xs:string             │   [0 … 1]   │
+         * │ desc           │ String         │ xs:string             │   [0 … 1]   │
+         * │ src            │ String         │ xs:string             │   [0 … 1]   │
+         * │ link           │ OnlineResource │ gpx:linkType          │   [0 … ∞]   │
+         * │ number         │ Integer        │ xs:nonNegativeInteger │   [0 … 1]   │
+         * │ type           │ String         │ xs:string             │   [0 … 1]   │
+         * │ trkseg         │ TrackSegment   │ gpx:trksegType        │   [0 … ∞]   │
+         * └────────────────┴────────────────┴───────────────────────┴─────────────┘
          */
         groupOp = new GroupAsPolylineOperation(geomInfo, Tags.TRACK_SEGMENTS, groupResult);
         builder.clear().setSuperTypes(parent).setNameSpace(Tags.PREFIX).setName("Track");

Modified: sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStore.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStore.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStore.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxDataStore.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -38,7 +38,6 @@ import org.apache.sis.setup.OptionKey;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.StorageConnector;
 import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.internal.storage.FeatureStore;
 import org.apache.sis.internal.storage.io.ChannelFactory;
 import org.apache.sis.internal.storage.io.IOUtilities;
 import org.apache.sis.internal.storage.io.Markable;
@@ -65,7 +64,7 @@ import org.apache.sis.util.Debug;
  * @since   0.8
  * @module
  */
-public abstract class StaxDataStore extends FeatureStore {
+public abstract class StaxDataStore extends DataStore {
     /**
      * The locale to use for locale-sensitive data (<strong>not</strong> for logging or warning messages),
      * or {@code null} if unspecified.

Modified: sis/branches/JDK9/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK9/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java?rev=1805590&r1=1805589&r2=1805590&view=diff
==============================================================================
--- sis/branches/JDK9/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java [UTF-8] (original)
+++ sis/branches/JDK9/storage/sis-xmlstore/src/test/java/org/apache/sis/internal/storage/gpx/ReaderTest.java [UTF-8] Mon Aug 21 01:03:12 2017
@@ -224,7 +224,7 @@ public final strictfp class ReaderTest e
         try (Store reader = create("1.0/waypoint.xml")) {
             verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
             assertEquals("version", StoreProvider.V1_0, reader.getVersion());
-            try (Stream<Feature> features = reader.features(false)) {
+            try (Stream<Feature> features = reader.features()) {
                 final Iterator<Feature> it = features.iterator();
                 verifyPoint(it.next(), 0, false);
                 verifyPoint(it.next(), 1, false);
@@ -245,7 +245,7 @@ public final strictfp class ReaderTest e
         try (Store reader = create("1.1/waypoint.xml")) {
             verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
             assertEquals("version", StoreProvider.V1_1, reader.getVersion());
-            try (Stream<Feature> features = reader.features(false)) {
+            try (Stream<Feature> features = reader.features()) {
                 final Iterator<Feature> it = features.iterator();
                 verifyPoint(it.next(), 0, true);
                 verifyPoint(it.next(), 1, true);
@@ -266,7 +266,7 @@ public final strictfp class ReaderTest e
         try (Store reader = create("1.0/route.xml")) {
             verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
             assertEquals("version", StoreProvider.V1_0, reader.getVersion());
-            try (Stream<Feature> features = reader.features(false)) {
+            try (Stream<Feature> features = reader.features()) {
                 final Iterator<Feature> it = features.iterator();
                 verifyRoute(it.next(), false, 1);
                 verifyEmpty(it.next(), "rtept");
@@ -295,7 +295,7 @@ public final strictfp class ReaderTest e
      * This verification is shared by {@link #testRoute110()} and {@link #testSequentialReads()}.
      */
     static void verifyRoute110(final Store reader) throws DataStoreException {
-        try (Stream<Feature> features = reader.features(false)) {
+        try (Stream<Feature> features = reader.features()) {
             final Iterator<Feature> it = features.iterator();
             verifyRoute(it.next(), true, 3);
             verifyEmpty(it.next(), "rtept");
@@ -373,7 +373,7 @@ public final strictfp class ReaderTest e
         try (Store reader = create("1.0/track.xml")) {
             verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
             assertEquals("version", StoreProvider.V1_0, reader.getVersion());
-            try (Stream<Feature> features = reader.features(false)) {
+            try (Stream<Feature> features = reader.features()) {
                 final Iterator<Feature> it = features.iterator();
                 verifyTrack(it.next(), false, 1);
                 verifyEmpty(it.next(), "trkseg");
@@ -393,7 +393,7 @@ public final strictfp class ReaderTest e
         try (Store reader = create("1.1/track.xml")) {
             verifyAlmostEmptyMetadata((Metadata) reader.getMetadata());
             assertEquals("version", StoreProvider.V1_1, reader.getVersion());
-            try (Stream<Feature> features = reader.features(false)) {
+            try (Stream<Feature> features = reader.features()) {
                 final Iterator<Feature> it = features.iterator();
                 verifyTrack(it.next(), true, 3);
                 verifyEmpty(it.next(), "trkseg");
@@ -610,13 +610,13 @@ public final strictfp class ReaderTest e
     @DependsOnMethod("testSequentialReads")
     public void testConcurrentReads() throws DataStoreException {
         try (Store reader = createFromURL()) {
-            final Stream<Feature>   f1 = reader.features(false);
+            final Stream<Feature>   f1 = reader.features();
             final Iterator<Feature> i1 = f1.iterator();
             verifyRoute(i1.next(), true, 3);
-            final Stream<Feature>   f2 = reader.features(false);
+            final Stream<Feature>   f2 = reader.features();
             final Iterator<Feature> i2 = f2.iterator();
             verifyEmpty(i1.next(), "rtept");
-            final Stream<Feature>   f3 = reader.features(false);
+            final Stream<Feature>   f3 = reader.features();
             final Iterator<Feature> i3 = f3.iterator();
             verifyRoute(i2.next(), true, 3);
             verifyRoute(i3.next(), true, 3);



Mime
View raw message