You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/09/13 17:10:09 UTC

[sis] 01/02: Add a protected `createConvertedView(boolean)` method that subclasses can override for taking advantage of the caching provide by public `forConvertedView(boolean)`.

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

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

commit 897456555372f65f25eb22bf6ffa760c4ef265ed
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Sep 13 18:43:44 2022 +0200

    Add a protected `createConvertedView(boolean)` method that subclasses can override
    for taking advantage of the caching provide by public `forConvertedView(boolean)`.
---
 .../sis/coverage/grid/ConvertedGridCoverage.java   |  8 +++
 .../org/apache/sis/coverage/grid/GridCoverage.java | 67 ++++++++++++++--------
 .../apache/sis/coverage/grid/GridCoverage2D.java   | 16 ++----
 .../sis/coverage/grid/TranslatedGridCoverage.java  | 15 +----
 4 files changed, 57 insertions(+), 49 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ConvertedGridCoverage.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ConvertedGridCoverage.java
index ccca65d2a0..4897d8d3b1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ConvertedGridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ConvertedGridCoverage.java
@@ -314,4 +314,12 @@ final class ConvertedGridCoverage extends DerivedGridCoverage {
     public GridCoverage forConvertedValues(final boolean converted) {
         return (converted == isConverted) ? this : source;
     }
+
+    /**
+     * Overridden as a matter of principle, but should not been invoked.
+     */
+    @Override
+    protected final GridCoverage createConvertedValues(final boolean converted) {
+        return forConvertedValues(converted);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
index 1feabdbf5c..8df0d1608a 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage.java
@@ -218,26 +218,6 @@ public abstract class GridCoverage extends BandedCoverage {
         return DataType.DOUBLE;     // Must conservative value, should be overridden by subclasses.
     }
 
-    /**
-     * Returns the converted or package view, or {@code null} if not yet computed.
-     * It is caller responsibility to ensure that this method is invoked in a synchronized block.
-     */
-    final GridCoverage getView(final boolean converted) {
-        return converted ? convertedView : packedView;
-    }
-
-    /**
-     * Sets the converted or package view. The given view should not be null.
-     * It is caller responsibility to ensure that this method is invoked in a synchronized block.
-     */
-    final void setView(final boolean converted, final GridCoverage view) {
-        if (converted) {
-            convertedView = view;
-        } else {
-            packedView = view;
-        }
-    }
-
     /**
      * Returns a grid coverage that contains real values or sample values, depending if {@code converted} is {@code true}
      * or {@code false} respectively. If there is no {@linkplain SampleDimension#getTransferFunction() transfer function}
@@ -254,22 +234,59 @@ public abstract class GridCoverage extends BandedCoverage {
      *       if {@code converted} is {@code false}.</li>
      * </ul>
      *
+     * The default implementation delegates to {@link #createConvertedValues(boolean)} when first needed,
+     * then caches the result for future invocations.
+     *
      * @param  converted  {@code true} for a coverage containing converted values,
      *                    or {@code false} for a coverage containing packed values.
      * @return a coverage containing converted or packed values, depending on {@code converted} argument value.
      *         May be {@code this} but never {@code null}.
+     * @throws CannotEvaluateException if an error occurred while conversion the values.
      *
      * @see SampleDimension#forConvertedValues(boolean)
      */
     public synchronized GridCoverage forConvertedValues(final boolean converted) {
-        GridCoverage view = getView(converted);
-        if (view == null) try {
-            view = ConvertedGridCoverage.create(this, converted);
-            setView(converted, view);
+        GridCoverage view = converted ? convertedView : packedView;
+        if (view == null) {
+            view = createConvertedValues(converted);
+            if (converted) {
+                convertedView = view;
+                if (view != this) {
+                    view.packedView = this;
+                }
+            } else {
+                packedView = view;
+                if (view != this) {
+                    view.convertedView = this;
+                }
+            }
+        }
+        return view;
+    }
+
+    /**
+     * Creates the grid coverage instance for the converted or packed values.
+     * This method is invoked by {@link #forConvertedValues(boolean)} when first needed.
+     * Then the result returned by this method is cached for future invocations
+     * of {@code forConvertedValues(converted)}.
+     *
+     * <p>Subclasses can override this method for customizing the converted coverages
+     * while leverage the caching done by {@link #forConvertedValues(boolean)}.</p>
+     *
+     * @param  converted  {@code true} for a coverage containing converted values,
+     *                    or {@code false} for a coverage containing packed values.
+     * @return a new coverage containing converted or packed values, depending on {@code converted} argument value.
+     *         May be {@code this} but never {@code null}.
+     * @throws CannotEvaluateException if an error occurred while conversion the values.
+     *
+     * @since 1.3
+     */
+    protected GridCoverage createConvertedValues(final boolean converted) {
+        try {
+            return ConvertedGridCoverage.create(this, converted);
         } catch (NoninvertibleTransformException e) {
             throw new CannotEvaluateException(e.getMessage(), e);
         }
-        return view;
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
index c5d9337fa3..28a9b41b91 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
@@ -471,7 +471,7 @@ public class GridCoverage2D extends GridCoverage {
     }
 
     /**
-     * Returns a grid coverage that contains real values or sample values,
+     * Creates a grid coverage that contains real values or sample values,
      * depending if {@code converted} is {@code true} or {@code false} respectively.
      *
      * @param  converted  {@code true} for a coverage containing converted values,
@@ -479,23 +479,15 @@ public class GridCoverage2D extends GridCoverage {
      * @return a coverage containing converted or packed values, depending on {@code converted} argument value.
      */
     @Override
-    public synchronized GridCoverage forConvertedValues(final boolean converted) {
-        GridCoverage2D view = (GridCoverage2D) getView(converted);
-        if (view == null) try {
+    protected GridCoverage createConvertedValues(final boolean converted) {
+        try {
             final List<SampleDimension> sources = getSampleDimensions();
             final List<SampleDimension> targets = new ArrayList<>(sources.size());
             final MathTransform1D[]  converters = ConvertedGridCoverage.converters(sources, targets, converted);
-            if (converters != null) {
-                view = new GridCoverage2D(this, targets, converters, converted);
-                view.setView(!converted, this);
-            } else {
-                view = this;
-            }
-            setView(converted, view);
+            return (converters == null) ? this : new GridCoverage2D(this, targets, converters, converted);
         } catch (NoninvertibleTransformException e) {
             throw new CannotEvaluateException(e.getMessage(), e);
         }
-        return view;
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/TranslatedGridCoverage.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/TranslatedGridCoverage.java
index c6e2dae659..51cd5969bf 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/TranslatedGridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/TranslatedGridCoverage.java
@@ -101,18 +101,9 @@ final class TranslatedGridCoverage extends DerivedGridCoverage {
      * result in a {@link TranslatedGridCoverage} with the same {@linkplain #translation}.
      */
     @Override
-    public final synchronized GridCoverage forConvertedValues(final boolean converted) {
-        GridCoverage view = getView(converted);
-        if (view == null) {
-            final GridCoverage cs = source.forConvertedValues(converted);
-            if (cs == source) {
-                view = this;
-            } else {
-                view = new TranslatedGridCoverage(cs, gridGeometry, translation);
-            }
-            setView(converted, view);
-        }
-        return view;
+    protected final GridCoverage createConvertedValues(final boolean converted) {
+        final GridCoverage cs = source.forConvertedValues(converted);
+        return (cs == source) ? this : new TranslatedGridCoverage(cs, gridGeometry, translation);
     }
 
     /**