/** @throws CoreException */
  @Override
  public void run(IProgressMonitor monitor, ILogger logger, IRepository repository)
      throws CoreException {

    Grid3d property = _inputGrid.get();
    int size = _size.get();
    String propertyName = _outputGridName.get();
    String outputComments = _outputComments.get();
    float[][] kernel = _filterMethodProp.get().getFilter().getDefaultKernel(_size.get());

    // apply the filter on the horizon
    float[][] result = _filterMethodProp.get().getFilter().execute(property, size, kernel, monitor);

    // Create the new property
    Grid3d newProperty = Grid3dFactory.create(repository, property, result, propertyName);
    newProperty.setComment(outputComments);
    try {
      newProperty.update();
    } catch (IOException ex) {
      throw new RuntimeException(ex.getMessage());
    }
  }
  @Override
  public void validate(IValidation results) {
    // Validate the input grid is non-null and of the correct type.
    if (_inputGrid.isNull()) {
      results.error(_inputGrid, "No input grid specified.");
    }

    // Validate the output name is non-zero length.
    if (_outputGridName.isEmpty()) {
      results.error(_outputGridName, "No output grid name specified.");
    }

    // Validate the filter size
    if (!_filterMethodProp.get().getFilter().validateSize(_size.get())) {
      results.error(_size, _filterMethodProp.get().getFilter().getMessage());
    }

    // Check if an entry already exists in the datastore.
    if (!_inputGrid.isNull() && !_outputGridName.isEmpty()) {
      if (Grid3dFactory.existsInStore(_inputGrid.get(), _outputGridName.get())) {
        results.warning(_outputGridName, "Exists in datastore and will be overwritten.");
      }
    }
  }