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]