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 143f5ae  Improve the support of ESRI geometry library.
143f5ae is described below

commit 143f5ae7d343fb7b58f8fa1e4e61981af506b7d8
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Tue Sep 14 18:54:23 2021 +0200

    Improve the support of ESRI geometry library.
---
 .../apache/sis/internal/feature/GeometryType.java  | 11 +++
 .../apache/sis/internal/feature/esri/Factory.java  | 98 ++++++++++++++++++++--
 .../apache/sis/internal/feature/esri/Wrapper.java  | 76 ++++++++++++-----
 .../BinarySpatialFilterUsingESRI_Test.java}        | 39 +++++++--
 .../internal/filter/sqlmm/RegistryTestCase.java    | 25 ++++--
 ...ngJTS_Test.java => RegistryUsingESRI_Test.java} | 46 +++++++++-
 .../filter/sqlmm/RegistryUsingJTS_Test.java        |  2 +-
 .../apache/sis/test/suite/FeatureTestSuite.java    |  2 +
 .../apache/sis/util/collection/IntegerList.java    |  2 +-
 ide-project/NetBeans/nbproject/genfiles.properties |  2 +-
 10 files changed, 261 insertions(+), 42 deletions(-)

diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryType.java
 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryType.java
index f432a9d..a326c43 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryType.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryType.java
@@ -101,6 +101,17 @@ public enum GeometryType {
     }
 
     /**
+     * Returns {@code true} if this geometry type is some sort of collection.
+     * Those types are {@link #MULTI_POINT}, {@link #MULTI_LINESTRING},
+     * {@link #MULTI_POLYGON} or {@link #GEOMETRY_COLLECTION}.
+     *
+     * @return whether this geometry type is some kind of collections.
+     */
+    public final boolean isCollection() {
+        return ordinal() >= MULTI_POINT.ordinal();
+    }
+
+    /**
      * Returns the enumeration value for the given name.
      * This method is case-insensitive.
      *
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Factory.java
 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Factory.java
index 2b196a5..7fcc179 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Factory.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Factory.java
@@ -16,20 +16,28 @@
  */
 package org.apache.sis.internal.feature.esri;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
 import java.nio.ByteBuffer;
 import java.io.ObjectStreamException;
 import com.esri.core.geometry.Geometry;
-import com.esri.core.geometry.MultiPath;
-import com.esri.core.geometry.OperatorImportFromWkb;
-import com.esri.core.geometry.OperatorImportFromWkt;
+import com.esri.core.geometry.Line;
 import com.esri.core.geometry.Point;
 import com.esri.core.geometry.Polygon;
 import com.esri.core.geometry.Polyline;
+import com.esri.core.geometry.MultiPath;
+import com.esri.core.geometry.MultiPoint;
+import com.esri.core.geometry.OperatorCentroid2D;
+import com.esri.core.geometry.OperatorImportFromWkb;
+import com.esri.core.geometry.OperatorImportFromWkt;
 import com.esri.core.geometry.WkbImportFlags;
 import com.esri.core.geometry.WktImportFlags;
 import org.apache.sis.setup.GeometryLibrary;
 import org.apache.sis.internal.feature.Geometries;
+import org.apache.sis.internal.feature.GeometryType;
 import org.apache.sis.internal.feature.GeometryWrapper;
+import org.apache.sis.internal.util.CollectionsExt;
 import org.apache.sis.math.Vector;
 
 
@@ -100,8 +108,7 @@ public final class Factory extends Geometries<Geometry> {
      */
     @Override
     public Object createPoint(final double x, final double y) {
-        // Need to explicitly set z to NaN because default value is 0.
-        return new Point(x, y, Double.NaN);
+        return new Point(x, y);
     }
 
     /**
@@ -170,6 +177,87 @@ public final class Factory extends Geometries<Geometry> {
     }
 
     /**
+     * Creates a geometry from components.
+     * The expected {@code components} type depend on the target geometry type:
+     * <ul>
+     *   <li>If {@code type} is a multi-geometry, then the components shall be 
an array of {@link Point},
+     *       {@link Geometry}, {@link Polyline} or {@link Polygon} elements, 
depending on the desired target type.</li>
+     *   <li>Otherwise the components shall be an array or collection of 
{@link Point} instances.</li>
+     * </ul>
+     *
+     * @param  type        type of geometry to create.
+     * @param  components  the components. Valid classes depend on the type of 
geometry to create.
+     * @return geometry built from the given components.
+     * @throws ClassCastException if the given object is not an array or a 
collection of supported geometry components.
+     */
+    @Override
+    @SuppressWarnings("fallthrough")
+    public GeometryWrapper<Geometry> createFromComponents(final GeometryType 
type, final Object components) {
+        /*
+         * No exhaustive `if (x instanceof y)` checks in this method.
+         * `ClassCastException` shall be handled by the caller.
+         */
+        final Collection<?> data = (components instanceof Collection<?>)
+                ? (Collection<?>) components : Arrays.asList((Object[]) 
components);
+        /*
+         * ESRI API does not distinguish between single geometry and geometry 
collection, except MultiPoint.
+         * So if the number of components is 1, there is no reason to create a 
new geometry object.
+         */
+        Geometry geometry = (Geometry) CollectionsExt.singletonOrNull(data);
+        if (geometry == null) {
+            boolean isPolygon = false;
+            switch (type) {
+                case MULTI_LINESTRING:
+                case LINESTRING: break;
+                case MULTI_POLYGON:
+                case POLYGON: isPolygon=true; break;
+                case GEOMETRY_COLLECTION: {
+                    for (final Object component : data) {
+                        isPolygon = (((Geometry) component).getType() == 
Geometry.Type.Polygon);
+                        if (!isPolygon) break;
+                    }
+                    break;
+                }
+                case GEOMETRY:      // Default to multi-points for now.
+                case POINT:
+                case MULTI_POINT: {
+                    final MultiPoint points = new MultiPoint();
+                    for (final Object p : data) {
+                        points.add((Point) p);
+                    }
+                    geometry = points;
+                    if (type == GeometryType.POINT) {
+                        geometry = new 
Point(OperatorCentroid2D.local().execute(geometry, null));
+                    }
+                    break;
+                }
+                default: throw new AssertionError(type);
+            }
+            if (geometry == null) {
+                final MultiPath path = isPolygon ? new Polygon() : new 
Polyline();
+                if (type.isCollection()) {
+                    for (final Object component : data) {
+                        path.add((MultiPath) component, false);
+                    }
+                } else {
+                    final Iterator<?> it = data.iterator();
+                    if (it.hasNext()) {
+                        final Line segment = new Line();
+                        segment.setEnd((Point) it.next());
+                        while (it.hasNext()) {
+                            segment.setStartXY(segment.getEndX(), 
segment.getEndY());
+                            segment.setEnd((Point) it.next());
+                            path.addSegment(segment, false);
+                        }
+                    }
+                }
+                geometry = path;
+            }
+        }
+        return new Wrapper(geometry);
+    }
+
+    /**
      * Parses the given Well Known Text (WKT).
      *
      * @param  wkt  the Well Known Text to parse.
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Wrapper.java
 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Wrapper.java
index 425e83b..1981004 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Wrapper.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/esri/Wrapper.java
@@ -19,6 +19,7 @@ package org.apache.sis.internal.feature.esri;
 import java.util.Iterator;
 import java.util.function.Supplier;
 import com.esri.core.geometry.Geometry;
+import com.esri.core.geometry.GeometryEngine;
 import com.esri.core.geometry.Envelope2D;
 import com.esri.core.geometry.MultiPath;
 import com.esri.core.geometry.MultiVertexGeometry;
@@ -26,9 +27,11 @@ import com.esri.core.geometry.Operator;
 import com.esri.core.geometry.Polyline;
 import com.esri.core.geometry.Point;
 import com.esri.core.geometry.Point2D;
+import com.esri.core.geometry.WktImportFlags;
 import com.esri.core.geometry.WktExportFlags;
 import com.esri.core.geometry.OperatorExportToWkt;
 import com.esri.core.geometry.OperatorCentroid2D;
+import com.esri.core.geometry.OperatorIntersects;
 import com.esri.core.geometry.OperatorSimpleRelation;
 import com.esri.core.geometry.ProgressTracker;
 import com.esri.core.geometry.SpatialReference;
@@ -69,14 +72,6 @@ final class Wrapper extends GeometryWithCRS<Geometry> {
     }
 
     /**
-     * Returns the given geometry in new wrapper,
-     * or {@code this} if {@code g} is same as current geometry.
-     */
-    private Wrapper rewrap(final Geometry g) {
-        return (g != geometry) ? new Wrapper(g) : this;
-    }
-
-    /**
      * Returns the implementation-dependent factory of geometric object.
      */
     @Override
@@ -126,13 +121,12 @@ final class Wrapper extends GeometryWithCRS<Geometry> {
             return null;
         }
         final Point pt = (Point) geometry;
-        final double z = pt.getZ();
         final double[] coord;
-        if (Double.isNaN(z)) {
-            coord = new double[Factory.BIDIMENSIONAL];
-        } else {
+        if (pt.hasZ()) {
             coord = new double[Factory.TRIDIMENSIONAL];
-            coord[2] = z;
+            coord[2] = pt.getZ();
+        } else {
+            coord = new double[Factory.BIDIMENSIONAL];
         }
         coord[1] = pt.getY();
         coord[0] = pt.getX();
@@ -211,7 +205,7 @@ add:    for (Geometry next = geometry;;) {
         if (ordinal >= 0 && ordinal < PREDICATES.length) {
             final Supplier<OperatorSimpleRelation> op = PREDICATES[ordinal];
             if (op != null) {
-                return op.get().execute(geometry, ((Wrapper) other).geometry, 
null, null);
+                return op.get().execute(geometry, ((Wrapper) other).geometry, 
srs(), null);
             }
         }
         return super.predicateSameCRS(type, other);
@@ -240,8 +234,8 @@ add:    for (Geometry next = geometry;;) {
     private static final class BBOX extends OperatorSimpleRelation implements 
Supplier<OperatorSimpleRelation> {
         @Override public OperatorSimpleRelation get() {return this;}
         @Override public Operator.Type getType() {return 
Operator.Type.Intersects;}
-        @Override public boolean execute(Geometry g1, Geometry g2, 
SpatialReference sr, ProgressTracker pt) {
-            return 
!com.esri.core.geometry.OperatorDisjoint.local().execute(g1, g2, sr, pt);
+        @Override public boolean execute(Geometry g1, Geometry g2, 
SpatialReference srs, ProgressTracker pt) {
+            return 
!com.esri.core.geometry.OperatorDisjoint.local().execute(g1, g2, srs, pt);
         }
     }
 
@@ -255,12 +249,54 @@ add:    for (Geometry next = geometry;;) {
      */
     @Override
     protected Object operationSameCRS(final SQLMM operation, final 
GeometryWrapper<Geometry> other, final Object argument) {
+        final Geometry result;
         switch (operation) {
-            case ST_Centroid: {
-                return OperatorCentroid2D.local().execute(geometry, null);
-            }
-            default: return super.operationSameCRS(operation, other, argument);
+            case ST_Dimension:        return geometry.getDimension();
+            case ST_CoordDim:         return geometry.hasZ() ? 3 : 2;
+            case ST_GeometryType:     return geometry.getType().name();
+            case ST_IsEmpty:          return geometry.isEmpty();
+            case ST_Is3D:             return geometry.hasZ();
+            case ST_IsMeasured:       return geometry.hasM();
+            case ST_X:                return ((Point) geometry).getX();
+            case ST_Y:                return ((Point) geometry).getY();
+            case ST_Z:                return ((Point) geometry).getZ();
+            case ST_Envelope:         return getEnvelope();
+            case ST_Boundary:         result = geometry.getBoundary(); break;
+            case ST_Simplify:         result = GeometryEngine.simplify         
    (geometry, srs()); break;
+            case ST_ConvexHull:       result = GeometryEngine.convexHull       
    (geometry); break;
+            case ST_Buffer:           result = GeometryEngine.buffer           
    (geometry, srs(), ((Number) argument).doubleValue()); break;
+            case ST_Intersection:     result = GeometryEngine.intersect        
    (geometry, ((Wrapper) other).geometry,  srs()); break;
+            case ST_Union:            result = GeometryEngine.union(new 
Geometry[] {geometry, ((Wrapper) other).geometry}, srs()); break;
+            case ST_Difference:       result = GeometryEngine.difference       
    (geometry, ((Wrapper) other).geometry,  srs()); break;
+            case ST_SymDifference:    result = 
GeometryEngine.symmetricDifference  (geometry, ((Wrapper) other).geometry,  
srs()); break;
+            case ST_Distance:         return   GeometryEngine.distance         
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Equals:           return   GeometryEngine.equals           
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Disjoint:         return   GeometryEngine.disjoint         
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Touches:          return   GeometryEngine.touches          
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Crosses:          return   GeometryEngine.crosses          
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Within:           return   GeometryEngine.within           
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Contains:         return   GeometryEngine.contains         
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_Overlaps:         return   GeometryEngine.overlaps         
    (geometry, ((Wrapper) other).geometry,  srs());
+            case ST_AsText:           return   GeometryEngine.geometryToWkt    
    (geometry, WktExportFlags.wktExportDefaults);
+            case ST_GeomFromText:     return   
GeometryEngine.geometryFromWkt((String) argument, 
WktImportFlags.wktImportDefaults, Geometry.Type.Unknown);
+            case ST_PointFromText:    return   
GeometryEngine.geometryFromWkt((String) argument, 
WktImportFlags.wktImportDefaults, Geometry.Type.Point);
+            case ST_MPointFromText:   return   
GeometryEngine.geometryFromWkt((String) argument, 
WktImportFlags.wktImportDefaults, Geometry.Type.MultiPoint);
+            case ST_LineFromText:     return   
GeometryEngine.geometryFromWkt((String) argument, 
WktImportFlags.wktImportDefaults, Geometry.Type.Line);
+            case ST_PolyFromText:     return   
GeometryEngine.geometryFromWkt((String) argument, 
WktImportFlags.wktImportDefaults, Geometry.Type.Polygon);
+            case ST_Intersects:       return 
OperatorIntersects.local().execute(geometry, ((Wrapper) other).geometry, srs(), 
null);
+            case ST_Centroid:         result = new 
Point(OperatorCentroid2D.local().execute(geometry, null)); break;
+            default:                  return super.operationSameCRS(operation, 
other, argument);
         }
+        // Current version does not have metadata to copy, but it may be added 
in the future.
+        return result;
+    }
+
+    /**
+     * Returns the spatial reference system of this geometrY.
+     * This is currently only a placeholder for future development.
+     */
+    private static SpatialReference srs() {
+        return null;
     }
 
     /**
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
 
b/core/sis-feature/src/test/java/org/apache/sis/filter/BinarySpatialFilterUsingESRI_Test.java
similarity index 51%
copy from 
core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
copy to 
core/sis-feature/src/test/java/org/apache/sis/filter/BinarySpatialFilterUsingESRI_Test.java
index 56a226b..ed3ae6a 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/filter/BinarySpatialFilterUsingESRI_Test.java
@@ -14,13 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.internal.filter.sqlmm;
+package org.apache.sis.filter;
 
-import org.locationtech.jts.geom.Geometry;
+import com.esri.core.geometry.Geometry;
+import org.junit.Ignore;
+import org.junit.Test;
 
 
 /**
- * Tests {@link SpatialFunction} implementations using JTS library.
+ * Tests {@link BinarySpatialFilter} implementations using ESRI library.
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
@@ -28,11 +30,38 @@ import org.locationtech.jts.geom.Geometry;
  * @since   1.1
  * @module
  */
-public final strictfp class RegistryUsingJTS_Test extends 
RegistryTestCase<Geometry> {
+public final strictfp class BinarySpatialFilterUsingESRI_Test extends 
BinarySpatialFilterTestCase<Geometry> {
     /**
      * Creates a new test.
      */
-    public RegistryUsingJTS_Test() {
+    public BinarySpatialFilterUsingESRI_Test() {
         super(Geometry.class);
     }
+
+    /**
+     * Test ignored for now (not yet mapped to an ESRI operation).
+     */
+    @Test
+    @Override
+    @Ignore("Not yet mapped to an ESRI operation.")
+    public void testDWithin() {
+    }
+
+    /**
+     * Test ignored for now (not yet mapped to an ESRI operation).
+     */
+    @Test
+    @Override
+    @Ignore("Not yet mapped to an ESRI operation.")
+    public void testBeyond() {
+    }
+
+    /**
+     * Test ignored for now (not yet mapped to an ESRI operation).
+     */
+    @Test
+    @Override
+    @Ignore("Not yet mapped to an ESRI operation.")
+    public void testWithReprojection() {
+    }
 }
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
index e6eddba..4c158ed 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryTestCase.java
@@ -82,6 +82,11 @@ public abstract strictfp class RegistryTestCase<G> extends 
TestCase {
     private final Geometries<G> library;
 
     /**
+     * Whether the geometry object can stores CRS information.
+     */
+    private final boolean supportCRS;
+
+    /**
      * The geometry object used as an input for the function to test.
      * Usually an instance of {@code <G>} unless the geometry is a point.
      *
@@ -113,12 +118,14 @@ public abstract strictfp class RegistryTestCase<G> 
extends TestCase {
      * Creates a new test case.
      *
      * @param  rootGeometry  the root geometry class as on of JTS, ESRI or 
Java2D root class.
+     * @param  supportCRS    whether the geometry object can stores CRS 
information.
      */
     @SuppressWarnings("unchecked")
-    protected RegistryTestCase(final Class<G> rootGeometry) {
+    protected RegistryTestCase(final Class<G> rootGeometry, final boolean 
supportCRS) {
         factory = new DefaultFilterFactory.Features<>(rootGeometry, 
Object.class, WraparoundMethod.SPLIT);
         library = (Geometries<G>) Geometries.implementation(rootGeometry);
         assertEquals(rootGeometry, library.rootClass);
+        this.supportCRS = supportCRS;
     }
 
     /**
@@ -197,7 +204,9 @@ public abstract strictfp class RegistryTestCase<G> extends 
TestCase {
     private void assertPointEquals(final Object result, final 
CoordinateReferenceSystem crs, double x, double y) {
         assertInstanceOf("Expected a point.", library.pointClass, result);
         final GeometryWrapper<G> wrapped = library.castOrWrap(result);
-        assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+        if (supportCRS) {
+            assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+        }
         assertArrayEquals(new double[] {x, y}, wrapped.getPointCoordinates(), 
tolerance);
     }
 
@@ -215,13 +224,17 @@ public abstract strictfp class RegistryTestCase<G> 
extends TestCase {
         if (isPolygon) {
             assertInstanceOf("Expected a polygon.", library.polygonClass, 
result);
             final GeometryWrapper<G> wrapped = library.castOrWrap(result);
-            assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+            if (supportCRS) {
+                assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+            }
             env = wrapped.getEnvelope();
         } else {
             env = (GeneralEnvelope) result;
         }
+        if (supportCRS) {
+            assertEquals(crs, env.getCoordinateReferenceSystem());
+        }
         assertEquals(   2, env.getDimension());
-        assertEquals(crs,  env.getCoordinateReferenceSystem());
         assertEquals(xmin, env.getLower(0), tolerance);
         assertEquals(xmax, env.getUpper(0), tolerance);
         assertEquals(ymin, env.getLower(1), tolerance);
@@ -238,7 +251,9 @@ public abstract strictfp class RegistryTestCase<G> extends 
TestCase {
     private void assertPolylineEquals(final Object result, final 
CoordinateReferenceSystem crs, final double... coordinates) {
         assertInstanceOf("Expected a line string.", library.polylineClass, 
result);
         final GeometryWrapper<G> wrapped = library.castOrWrap(result);
-        assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+        if (supportCRS) {
+            assertEquals(crs, wrapped.getCoordinateReferenceSystem());
+        }
         assertArrayEquals(coordinates, wrapped.getAllCoordinates(), tolerance);
     }
 
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingESRI_Test.java
similarity index 52%
copy from 
core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
copy to 
core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingESRI_Test.java
index 56a226b..149d100 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingESRI_Test.java
@@ -16,7 +16,9 @@
  */
 package org.apache.sis.internal.filter.sqlmm;
 
-import org.locationtech.jts.geom.Geometry;
+import com.esri.core.geometry.Geometry;
+import org.junit.Ignore;
+import org.junit.Test;
 
 
 /**
@@ -28,11 +30,47 @@ import org.locationtech.jts.geom.Geometry;
  * @since   1.1
  * @module
  */
-public final strictfp class RegistryUsingJTS_Test extends 
RegistryTestCase<Geometry> {
+public final strictfp class RegistryUsingESRI_Test extends 
RegistryTestCase<Geometry> {
     /**
      * Creates a new test.
      */
-    public RegistryUsingJTS_Test() {
-        super(Geometry.class);
+    public RegistryUsingESRI_Test() {
+        super(Geometry.class, false);
+    }
+
+    @Test
+    @Override
+    @Ignore("Current implementation ignores the distance parameter.")
+    public void testSimplify() {
+    }
+
+    @Test
+    @Override
+    @Ignore("Reprojection not yet implemented.")
+    public void testTransform() {
+    }
+
+    @Test
+    @Override
+    @Ignore("Reprojection not yet implemented.")
+    public void testOptimization() {
+    }
+
+    @Test
+    @Override
+    @Ignore("Reprojection not yet implemented.")
+    public void testFeatureOptimization() {
+    }
+
+    @Test
+    @Override
+    @Ignore("Reprojection not yet implemented.")
+    public void testIntersectsWithReprojection() {
+    }
+
+    @Test
+    @Override
+    @Ignore("Operation not yet implemented.")
+    public void testSimplifyPreserveTopology() {
     }
 }
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
index 56a226b..117a40e 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/internal/filter/sqlmm/RegistryUsingJTS_Test.java
@@ -33,6 +33,6 @@ public final strictfp class RegistryUsingJTS_Test extends 
RegistryTestCase<Geome
      * Creates a new test.
      */
     public RegistryUsingJTS_Test() {
-        super(Geometry.class);
+        super(Geometry.class, true);
     }
 }
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/test/suite/FeatureTestSuite.java
 
b/core/sis-feature/src/test/java/org/apache/sis/test/suite/FeatureTestSuite.java
index e67aa39..55be51d 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/test/suite/FeatureTestSuite.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/test/suite/FeatureTestSuite.java
@@ -59,11 +59,13 @@ import org.junit.runners.Suite;
     org.apache.sis.filter.LikeFilterTest.class,
     org.apache.sis.filter.TemporalFilterTest.class,
     org.apache.sis.filter.BinarySpatialFilterUsingJTS_Test.class,
+    org.apache.sis.filter.BinarySpatialFilterUsingESRI_Test.class,
     org.apache.sis.internal.feature.AttributeConventionTest.class,
     org.apache.sis.internal.feature.GeometryTypeTest.class,
     org.apache.sis.internal.filter.FunctionNamesTest.class,
     org.apache.sis.internal.filter.sqlmm.SQLMMTest.class,
     org.apache.sis.internal.filter.sqlmm.RegistryUsingJTS_Test.class,
+    org.apache.sis.internal.filter.sqlmm.RegistryUsingESRI_Test.class,
     org.apache.sis.internal.feature.j2d.ShapePropertiesTest.class,
     org.apache.sis.internal.feature.j2d.FlatShapeTest.class,
     org.apache.sis.internal.feature.j2d.FactoryTest.class,
diff --git 
a/core/sis-utility/src/main/java/org/apache/sis/util/collection/IntegerList.java
 
b/core/sis-utility/src/main/java/org/apache/sis/util/collection/IntegerList.java
index c4340f7..9c9ab31 100644
--- 
a/core/sis-utility/src/main/java/org/apache/sis/util/collection/IntegerList.java
+++ 
b/core/sis-utility/src/main/java/org/apache/sis/util/collection/IntegerList.java
@@ -63,7 +63,7 @@ public class IntegerList extends AbstractList<Integer> 
implements RandomAccess,
 
     /**
      * The shift to apply on {@code index} in order to produce a result 
equivalent to {@code index} / {@value #VALUE_SIZE}.
-     * The following relation must hold: {@code (1 <<< BASE_SHIFT) == 
VALUE_SIZE}.
+     * The following relation must hold: {@code (1 << BASE_SHIFT) == 
VALUE_SIZE}.
      */
     private static final int BASE_SHIFT = 6;
 
diff --git a/ide-project/NetBeans/nbproject/genfiles.properties 
b/ide-project/NetBeans/nbproject/genfiles.properties
index ebf1415..59fe61f 100644
--- a/ide-project/NetBeans/nbproject/genfiles.properties
+++ b/ide-project/NetBeans/nbproject/genfiles.properties
@@ -3,6 +3,6 @@
 build.xml.data.CRC32=58e6b21c
 build.xml.script.CRC32=462eaba0
 [email protected]
-nbproject/build-impl.xml.data.CRC32=05bf4473
+nbproject/build-impl.xml.data.CRC32=a9ed19c4
 nbproject/build-impl.xml.script.CRC32=532e10e3
 nbproject/[email protected]

Reply via email to