public List<PlotConfigurationError> getErrors() {
    List<PlotConfigurationError> errors = new LinkedList<PlotConfigurationError>();

    for (ValueSourceData valueSourceData : getValueSourcesData()) {
      errors.addAll(valueSourceData.getErrors());
    }

    for (DimensionConfigData data : dimensionConfigDataMap.values()) {
      if (data.getDimensionConfig().getDimension() == PlotDimension.DOMAIN) {
        continue;
      } else {
        List<PlotConfigurationError> error = data.getErrors();
        errors.addAll(error);
      }
    }

    // check domain dimension for errors depending on grouping state
    DomainConfigManager domainConfigManager =
        plotInstance.getCurrentPlotConfigurationClone().getDomainConfigManager();
    GroupingState groupingState = domainConfigManager.getGroupingState();
    switch (groupingState) {
      case GROUPED:
        errors.addAll(
            getDimensionConfigData(domainConfigManager.getDomainConfig(true)).getErrors());
        break;
      case PARTIALLY_GROUPED:
        errors.addAll(
            getDimensionConfigData(domainConfigManager.getDomainConfig(true)).getErrors());
        errors.addAll(
            getDimensionConfigData(domainConfigManager.getDomainConfig(false)).getErrors());
        break;
      case UNGROUPED:
        errors.addAll(
            getDimensionConfigData(domainConfigManager.getDomainConfig(false)).getErrors());
        break;
    }

    for (RangeAxisData data : rangeAxisDataMap.values()) {
      errors.addAll(data.getErrors());
    }

    errors.addAll(domainConfigManagerData.getErrors());

    return errors;
  }
  public List<PlotConfigurationError> getWarnings() {
    List<PlotConfigurationError> warnings = new LinkedList<PlotConfigurationError>();
    for (ValueSourceData valueSourceData : getValueSourcesData()) {
      warnings.addAll(valueSourceData.getErrors());
    }
    boolean xAddedWarning = false;
    for (DimensionConfigData data : dimensionConfigDataMap.values()) {
      List<PlotConfigurationError> warning = data.getWarnings();
      if (data.getDimensionConfig().getDimension() == PlotDimension.DOMAIN) {
        if (!xAddedWarning) {
          xAddedWarning = warning.size() > 0;
          warnings.addAll(warning);
        }
      } else {
        warnings.addAll(warning);
      }
    }
    for (RangeAxisData data : rangeAxisDataMap.values()) {
      warnings.addAll(data.getWarnings());
    }

    warnings.addAll(domainConfigManagerData.getWarnings());
    return warnings;
  }
  private void rangeAxisConfigChanged(RangeAxisConfigChangeEvent rangeAxisConfigChange) {

    PlotConfiguration currentPlotConfig =
        plotInstance.getCurrentPlotConfigurationClone(); // get current plot config
    int id = rangeAxisConfigChange.getSource().getId(); // fetch id
    RangeAxisConfig currentRangeAxisConfig =
        currentPlotConfig.getRangeAxisConfigById(id); // look up range axis config

    if (currentRangeAxisConfig == null) {
      // if current range axis config is null it has been deleted afterwards in a meta change event
      debug(
          "#### CAUTION #### RANGE AXIS CONFIG CHANGE: current range axis config "
              + rangeAxisConfigChange.getSource().getLabel()
              + " with id "
              + rangeAxisConfigChange.getSource().getId()
              + " is null! Meta change event?");
      return;
    }

    // inform range axis data
    RangeAxisData rangeAxisData = getRangeAxisData(currentRangeAxisConfig);
    rangeAxisData.rangeAxisConfigChanged(rangeAxisConfigChange);

    // and also process event here
    ValueSource changeValueSource = rangeAxisConfigChange.getValueSource();
    ValueSource currentValueSource = null;
    if (changeValueSource != null) {
      id = changeValueSource.getId(); // fetch id from value source add/remove event
      currentValueSource =
          currentRangeAxisConfig.getValueSourceById(id); // look up current value source
    }
    //		else {
    //			return; // nothing to be done
    //		}

    switch (rangeAxisConfigChange.getType()) {
      case VALUE_SOURCE_ADDED:
        if (currentValueSource != null) {
          debug(
              "value source ADDED - "
                  + currentValueSource.getLabel()
                  + " ## ID: "
                  + currentValueSource.getId());
          valueSourceDataMap.put(
              currentValueSource.getId(), new ValueSourceData(currentValueSource, plotInstance));
          clearCache();
        } else {
          // if current value source is null it has been deleted afterwards in a meta change event
          debug(
              "#### CAUTION #### VALUE SOURCE ADDED: current value source"
                  + changeValueSource.getLabel()
                  + " with id "
                  + changeValueSource.getId()
                  + " is null! Meta change event?");
          return; // nothing to be done
        }
        break;
      case VALUE_SOURCE_CHANGED:
        ValueSourceChangeEvent valueSourceChange = rangeAxisConfigChange.getValueSourceChange();
        changeValueSource = valueSourceChange.getSource(); // get source
        id = changeValueSource.getId(); // fetch id from changed value source
        currentValueSource =
            currentRangeAxisConfig.getValueSourceById(id); // look up current value source

        if (currentValueSource != null) {
          debug("value source CHANGED - " + currentValueSource.getLabel() + " ## ID: " + id);
          getValueSourceData(currentValueSource)
              .valueSourceChanged(valueSourceChange, currentValueSource);
        } else {
          // if current value source is null it has been deleted afterwards in a meta change event
          debug(
              "#### CAUTION #### VALUE SOURCE CHANGED: current value source"
                  + changeValueSource.getLabel()
                  + " with id "
                  + changeValueSource.getId()
                  + " is null! Meta change event?");
          return; // nothing to be done
        }
        break;
      case VALUE_SOURCE_REMOVED:
        debug(
            "value source REMOVED - "
                + changeValueSource.getLabel()
                + " ## ID: "
                + changeValueSource.getId());
        valueSourceDataMap.remove(changeValueSource.getId());
        clearCache();
        break;
    }
  }