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);
}
/**