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 <martin.desruisse...@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); } /**