# Class AbstractGridCoverageResource

Object
AbstractResource
AbstractGridCoverageResource

All Implemented Interfaces:
  `DataSet, GridCoverageResource, Resource`

Direct Known Subclasses:
  `MemoryGridCoverageResource`

public abstract class AbstractGridCoverageResource extends AbstractResource implements GridCoverageResource
Default implementations of several methods for classes that want to implement the `GridCoverageResource` interface. Subclasses should override the following methods:

- `GridCoverageResource​.getGridGeometry()` (mandatory)
- `GridCoverageResource​.getSampleDimensions()` (mandatory)

This class also provides the following helper methods for implementation of the `read(…)` method in subclasses:

- `canNotRead(String, GridGeometry, Throwable)` for reporting a failure to read operation.
- `logReadOperation(Object, GridGeometry, long)` for logging a notice about a read operation.

Since:
  1.2

- ## Nested Class Summary

  ### Nested classes/interfaces inherited from interface Resource

  `Resource​.FileSet`

- ## Field Summary

  ### Fields inherited from class AbstractResource

  `listeners`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `AbstractGridCoverageResource(StoreListeners parentListeners, boolean hidden)`
  Creates a new resource which can send notifications to the given set of listeners.
  `protected`
  `AbstractGridCoverageResource(Resource parent)`
  Creates a new resource, potentially as a child of another resource.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected DataStoreException`
  `canNotRead(String filename, GridGeometry request, Throwable cause)`
  Creates an exception for a failure to load data.
  `protected Metadata`
  `createMetadata()`
  Invoked in a synchronized block the first time that `getMetadata()` is invoked.
  `Optional<Envelope>`
  `getEnvelope()`
  Returns the envelope of the grid geometry if known.
  `protected void`
  `logReadOperation(Object file, GridGeometry domain, long startTime)`
  Logs the execution of a `GridCoverageResource​.read(GridGeometry, int...)` operation.

  ### Methods inherited from class AbstractResource

  `addListener, clearCache, getMetadata, getSynchronizationLock, removeListener`

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

  ### Methods inherited from interface GridCoverageResource

  `getGridGeometry, getLoadingStrategy, getResolutions, getSampleDimensions, read, setLoadingStrategy, subset`

  ### Methods inherited from interface Resource

  `addListener, getFileSet, getIdentifier, getMetadata, removeListener`

- ## Constructor Details

  - ### AbstractGridCoverageResource

    protected AbstractGridCoverageResource(Resource parent)
    Creates a new resource, potentially as a child of another resource. The parent resource is typically, but not necessarily, an `Aggregate`.
    Parameters:
      `parent` - the parent resource, or `null` if none.
    Since:
      1.4

  - ### AbstractGridCoverageResource

    protected AbstractGridCoverageResource(StoreListeners parentListeners, boolean hidden)
    Creates a new resource which can send notifications to the given set of listeners. The `hidden` argument specifies whether the new resource should be invisible in the tree of resources. See the parent constructor for more information.
    Parameters:
      `parentListeners` - listeners of the parent resource, or `null` if none. This is usually the listeners of the `DataStore` that created this resource.
      `hidden` - `false` if this resource shall use its own `StoreListeners` with the specified parent, or `true` for using `parentListeners` directly.

- ## Method Details

  - ### getEnvelope

    public Optional<Envelope> getEnvelope() throws DataStoreException
    Returns the envelope of the grid geometry if known. The envelope is absent if the grid geometry does not provide this information.
    Specified by:
      `getEnvelope` in interface `DataSet`
    Specified by:
      `getEnvelope` in interface `GridCoverageResource`
    Overrides:
      `getEnvelope` in class `AbstractResource`
    Returns:
      the grid geometry envelope.
    Throws:
      `DataStoreException` - if an error occurred while computing the grid geometry.
    See Also:
      - `GridGeometry​.getEnvelope()`

  - ### createMetadata

    protected Metadata createMetadata() throws DataStoreException
    Invoked in a synchronized block the first time that `getMetadata()` is invoked. The default implementation populates metadata based on information provided by `getIdentifier()`, `getEnvelope()`, `getGridGeometry()` and `getSampleDimensions()`. Subclasses should override if they can provide more information. The default value can be completed by casting to `DefaultMetadata`.
    Overrides:
      `createMetadata` in class `AbstractResource`
    Returns:
      the newly created metadata, or `null` if unknown.
    Throws:
      `DataStoreException` - if an error occurred while reading metadata from this resource.

  - ### canNotRead

    protected DataStoreException canNotRead(String filename, GridGeometry request, Throwable cause)
    Creates an exception for a failure to load data. The exception sub-type is inferred from the arguments. If the failure is caused by an envelope outside the resource domain, then that envelope will be inferred from the `request` argument.
    Parameters:
      `filename` - some identification (typically a file name) of the data that cannot be read.
      `request` - the requested domain, or `null` if unspecified.
      `cause` - the cause of the failure, or `null` if none.
    Returns:
      the exception to throw.
    See Also:
      - `NoSuchDataException`
      - `DataStoreReferencingException`
      - `DataStoreContentException`

  - ### logReadOperation

    protected void logReadOperation(Object file, GridGeometry domain, long startTime)
    Logs the execution of a `GridCoverageResource​.read(GridGeometry, int...)` operation. The log level will be `Level​.FINE` if the operation was quick enough, or `PerformanceLevel​.SLOWNESS` or higher level otherwise.
    Parameters:
      `file` - the file that was opened, or `null` for `StoreListeners​.getSourceName()`.
      `domain` - domain of the created grid coverage.
      `startTime` - value of `System​.nanoTime()` when the loading process started.