This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 1fdc5e17639421f677d67491fdb511999f0c4402
Author: jsorel <[email protected]>
AuthorDate: Mon Nov 2 12:10:57 2026 +0100

    feat(Mesh): make MultiMeshPrimitive extend DefaultGeometryCollection
---
 .../apache/sis/geometries/GeometryCollection.java  |   1 -
 .../internal/shared/DefaultGeometryCollection.java |  51 ++++++-
 .../sis/geometries/mesh/MultiMeshPrimitive.java    | 147 ++-------------------
 .../sis/geometries/operation/TransformTest.java    |   2 +-
 4 files changed, 55 insertions(+), 146 deletions(-)

diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
index 8e3ddf3a56..5ba33a22d1 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
@@ -82,7 +82,6 @@ public sealed interface GeometryCollection<T extends 
Geometry> extends Geometry
         permits ProductCurve,
                 DefaultMultiPoint,
                 DefaultGeometryCollection,
-                MultiMeshPrimitive,
                 MeshPrimitive.Abs.Points,
                 MeshPrimitive.Abs.Lines
 {
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
index 79f35bb6bf..77448dff30 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
@@ -16,6 +16,10 @@
  */
 package org.apache.sis.geometries.internal.shared;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.geometries.Geometry;
 import org.apache.sis.geometries.GeometryCollection;
@@ -23,6 +27,7 @@ import org.apache.sis.geometries.GeometryFactory;
 import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.Point;
 import org.apache.sis.geometries.Geometries;
+import org.apache.sis.referencing.CRS;
 import org.apache.sis.util.ArgumentChecks;
 
 
@@ -33,7 +38,7 @@ import org.apache.sis.util.ArgumentChecks;
 public non-sealed class DefaultGeometryCollection<T extends Geometry> extends 
AbstractGeometry implements GeometryCollection<T> {
 
     private final GeometryType elementType;
-    private final T[] geometries;
+    protected final List<T> geometries = new ArrayList<>();
 
     /**
      * The coordinate reference system to report when this collection is empty.
@@ -52,7 +57,7 @@ public non-sealed class DefaultGeometryCollection<T extends 
Geometry> extends Ab
      */
     public DefaultGeometryCollection(GeometryType elementType, 
CoordinateReferenceSystem fallbackCRS, T[] geometries) {
         this.elementType = elementType;
-        this.geometries  = geometries;
+        if (geometries != null) this.geometries.addAll(List.of(geometries));
         this.fallbackCRS = (fallbackCRS != null) ? fallbackCRS : 
Geometries.getUndefinedCRS(2);
     }
 
@@ -63,7 +68,7 @@ public non-sealed class DefaultGeometryCollection<T extends 
Geometry> extends Ab
 
     @Override
     public CoordinateReferenceSystem getCoordinateReferenceSystem() {
-        return (geometries.length != 0) ? 
geometries[0].getCoordinateReferenceSystem() : fallbackCRS;
+        return (!geometries.isEmpty()) ? 
geometries.get(0).getCoordinateReferenceSystem() : fallbackCRS;
     }
 
     @Override
@@ -77,12 +82,12 @@ public non-sealed class DefaultGeometryCollection<T extends 
Geometry> extends Ab
 
     @Override
     public int getNumGeometries() {
-        return geometries.length;
+        return geometries.size();
     }
 
     @Override
     public T getGeometryN(int n) {
-        return geometries[n];
+        return geometries.get(n);
     }
 
     @Override
@@ -127,4 +132,40 @@ public non-sealed class DefaultGeometryCollection<T 
extends Geometry> extends Ab
         return asJTS().isValid();
     }
 
+    /**
+     * Add primitives.
+     *
+     * @param other Primitives to merge in.
+     */
+    public void append(Collection<? extends Geometry> other) {
+        for (Geometry p : other) {
+            if (!CRS.equivalent(fallbackCRS, 
p.getCoordinateReferenceSystem())) {
+                throw new IllegalArgumentException("Primitives must have the 
same CRS as the MultiPrimitive.");
+            }
+        }
+        geometries.addAll((Collection) other);
+    }
+
+    @Override
+    public int hashCode() {
+        return 23 * Objects.hashCode(this.geometries);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final DefaultGeometryCollection other = (DefaultGeometryCollection) 
obj;
+        if (!Objects.equals(this.geometries, other.geometries)) {
+            return false;
+        }
+        return Objects.equals(this.getCoordinateReferenceSystem(), 
other.getCoordinateReferenceSystem());
+    }
 }
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
index 176ae005d5..ac99004fa9 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
@@ -16,26 +16,13 @@
  */
 package org.apache.sis.geometries.mesh;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.TransformException;
-import org.apache.sis.geometries.DataPoints;
 import org.apache.sis.geometries.Geometries;
-import org.apache.sis.geometries.Geometry;
-import org.apache.sis.geometries.GeometryCollection;
 import org.apache.sis.geometries.GeometryType;
-import org.apache.sis.geometries.internal.shared.AbstractGeometry;
-import org.apache.sis.geometries.internal.shared.ConcatenatedDataPoints;
-import org.apache.sis.geometries.internal.shared.EmptyDataPoints;
-import org.apache.sis.referencing.CRS;
-import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.geometries.internal.shared.DefaultGeometryCollection;
 
 
 /**
@@ -44,12 +31,7 @@ import org.apache.sis.util.ArgumentChecks;
  *
  * @author Johann Sorel (Geomatys)
  */
-public final class MultiMeshPrimitive<T extends MeshPrimitive> extends 
AbstractGeometry implements GeometryCollection<T> {
-
-    protected final List<T> primitives = new ArrayList<>();
-
-    private CoordinateReferenceSystem crs;
-    private Map<String, Object> userProperties;
+public final class MultiMeshPrimitive<T extends MeshPrimitive> extends 
DefaultGeometryCollection<T> {
 
     /**
      * Create a geometry with right hand 3D CRS.
@@ -59,8 +41,7 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
     }
 
     public MultiMeshPrimitive(CoordinateReferenceSystem crs) {
-        ArgumentChecks.ensureNonNull("crs", crs);
-        this.crs = crs;
+        super(GeometryType.GEOMETRY, crs, null);
     }
 
     public MultiMeshPrimitive(MeshPrimitive ... primitives) {
@@ -68,35 +49,8 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
         append(Arrays.asList(primitives));
     }
 
-    @Override
-    public GeometryType getElementType() {
-        return GeometryType.GEOMETRY;
-    }
-
-    @Override
-    public CoordinateReferenceSystem getCoordinateReferenceSystem() {
-        for (MeshPrimitive p : primitives) {
-            return p.getCoordinateReferenceSystem();
-        }
-        return crs;
-    }
-
-    @Override
-    public Geometry getBoundary() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setCoordinateReferenceSystem(CoordinateReferenceSystem crs) {
-        ArgumentChecks.ensureNonNull("crs", crs);
-        for (MeshPrimitive p : primitives) {
-            p.setCoordinateReferenceSystem(crs);
-        }
-        this.crs = crs;
-    }
-
     public boolean isEmpty() {
-        for (MeshPrimitive p : primitives) {
+        for (MeshPrimitive p : geometries) {
             if (!p.isEmpty()) {
                 return false;
             }
@@ -105,57 +59,18 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
     }
 
     public List<T> getComponents() {
-        return Collections.unmodifiableList(primitives);
-    }
-
-    @Override
-    public int getNumGeometries() {
-        return primitives.size();
-    }
-
-    @Override
-    public T getGeometryN(int n) {
-        return primitives.get(n);
+        return Collections.unmodifiableList(geometries);
     }
 
     /**
      * Check geometry definition.
      */
     public void validate() {
-        for (MeshPrimitive p : primitives) {
+        for (MeshPrimitive p : geometries) {
             p.validate();
         }
     }
 
-    /**
-     * Add primitives.
-     *
-     * @param other Primitives to merge in.
-     */
-    public void append(Collection<? extends MeshPrimitive> other) {
-        for (MeshPrimitive p : other) {
-            if (!CRS.equivalent(crs, p.getCoordinateReferenceSystem())) {
-                throw new IllegalArgumentException("Primitives must have the 
same CRS as the MultiPrimitive.");
-            }
-        }
-        primitives.addAll((Collection<? extends T>) other);
-    }
-
-    /**
-     * Make a deep copy of this multi-primitive.
-     *
-     * Note : this method will clone all attributes.
-     *
-     * @return copied MultiPrimitive
-     */
-    public MultiMeshPrimitive deepCopy() throws TransformException {
-        final MultiMeshPrimitive copy = new 
MultiMeshPrimitive(getCoordinateReferenceSystem());
-        for (MeshPrimitive p : primitives) {
-            copy.primitives.add(p.deepCopy());
-        }
-        return copy;
-    }
-
     /**
      * Set each vertex normal by computing the normal of the triangle
      * where it is used.
@@ -163,7 +78,7 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
      * triangles or it will cause visual glitches.
      */
     public void computeFaceNormals() {
-        for (MeshPrimitive p : primitives) {
+        for (MeshPrimitive p : geometries) {
             p.computeFaceNormals();
         }
     }
@@ -173,55 +88,9 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
      * where it is used.
      */
     public void computeSmoothNormals() {
-        for (MeshPrimitive p : primitives) {
+        for (MeshPrimitive p : geometries) {
             p.computeSmoothNormals();
         }
     }
 
-    @Override
-    public synchronized Map<String, Object> userProperties() {
-        if (userProperties == null) {
-            userProperties = new HashMap<>();
-        }
-        return userProperties;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 7;
-        hash = 23 * hash + Objects.hashCode(this.primitives);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final MultiMeshPrimitive other = (MultiMeshPrimitive) obj;
-        if (!Objects.equals(this.primitives, other.primitives)) {
-            return false;
-        }
-        return Objects.equals(this.getCoordinateReferenceSystem(), 
other.getCoordinateReferenceSystem());
-    }
-
-
-    /**
-     * Returns the positions of the primitives of this set, in the order this 
set holds them.
-     */
-    @Override
-    public DataPoints getDataPoints() {
-        final List<T> components = getComponents();
-        if (components.isEmpty()) {
-            return new EmptyDataPoints(getCoordinateReferenceSystem());
-        }
-        return ConcatenatedDataPoints.of(components.toArray(Geometry[]::new));
-    }
-
 }
diff --git 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java
 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java
index a0dda07ca2..b1655ccc17 100644
--- 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java
+++ 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java
@@ -125,7 +125,7 @@ public class TransformTest extends AbstractD9IMTest {
         final MultiMeshPrimitive mp = new 
MultiMeshPrimitive(createPrimitive());
         final MultiMeshPrimitive result = (MultiMeshPrimitive) new 
GeometryProcessor().transform(mp, CRS_TARGET, TRANSFORM);
         assertEquals(1, result.getNumGeometries());
-        testPrimitive(result.getGeometryN(0));
+        testPrimitive((MeshPrimitive) result.getGeometryN(0));
     }
 
     /**

Reply via email to