@Override
  protected boolean verifyUserInput() {
    final SpectralUnmixingFormModel formModel = form.getFormModel();
    if (formModel.getSourceProduct() == null) {
      showErrorDialog("No source product selected.");
      return false;
    }
    final Map<String, Object> parameterMap = parameterSupport.getParameterMap();
    updateParameterMap(parameterMap);

    final Endmember[] endmembers = (Endmember[]) parameterMap.get("endmembers");
    final String[] sourceBandNames = (String[]) parameterMap.get("sourceBandNames");
    final double minBandwidth = (Double) parameterMap.get("minBandwidth");

    double[] sourceWavelengths = new double[sourceBandNames.length];
    double[] sourceBandwidths = new double[sourceBandNames.length];
    for (int i = 0; i < sourceBandNames.length; i++) {
      final Band sourceBand = formModel.getSourceProduct().getBand(sourceBandNames[i]);
      sourceWavelengths[i] = sourceBand.getSpectralWavelength();
      sourceBandwidths[i] = sourceBand.getSpectralBandwidth();
    }
    if (!matchingWavelength(endmembers, sourceWavelengths, sourceBandwidths, minBandwidth)) {
      showErrorDialog(
          "One or more source wavelengths do not fit\n"
              + "to one or more endmember spectra.\n\n"
              + "Consider increasing the maximum wavelength deviation.");
      return false;
    }

    return true;
  }
 @Override
 protected Product createTargetProduct() throws Exception {
   final SpectralUnmixingFormModel formModel = form.getFormModel();
   Map<String, Object> parameterMap = parameterSupport.getParameterMap();
   updateParameterMap(parameterMap);
   return GPF.createProduct(
       OperatorSpi.getOperatorAlias(SpectralUnmixingOp.class),
       parameterMap,
       formModel.getSourceProduct());
 }
  public SpectralUnmixingDialog(AppContext appContext) {
    super(appContext, TITLE, ID_APPLY_CLOSE, HELP_ID);

    ParameterUpdater parameterUpdater =
        new ParameterUpdater() {

          @Override
          public void handleParameterSaveRequest(Map<String, Object> parameterMap) {
            updateParameterMap(parameterMap);
          }

          @Override
          public void handleParameterLoadRequest(Map<String, Object> parameterMap) {
            updateEndmemberFormModel(parameterMap);
          }
        };

    final OperatorSpi operatorSpi =
        GPF.getDefaultInstance()
            .getOperatorSpiRegistry()
            .getOperatorSpi(SpectralUnmixingOp.Spi.class.getName());

    parameterSupport =
        new OperatorParameterSupport(
            operatorSpi.getOperatorDescriptor(), null, null, parameterUpdater);
    form =
        new SpectralUnmixingForm(
            appContext, parameterSupport.getPropertySet(), getTargetProductSelector());
    OperatorMenu operatorMenu =
        new OperatorMenu(
            this.getJDialog(),
            operatorSpi.getOperatorDescriptor(),
            parameterSupport,
            appContext,
            HELP_ID);

    getJDialog().setJMenuBar(operatorMenu.createDefaultMenu());
  }