public ChartEditingResult performEdit(
      final Element element, final ReportDesignerContext reportDesignerContext)
      throws CloneNotSupportedException {
    if (element == null) {
      throw new NullPointerException();
    }
    if (reportDesignerContext == null) {
      throw new NullPointerException();
    }
    if (LegacyChartsUtil.isLegacyChartElement(element) == false) {
      return null;
    }
    try {
      chartTable.setReportDesignerContext(reportDesignerContext);
      primaryDataSourceTable.setReportDesignerContext(reportDesignerContext);
      secondaryDataSourceTable.setReportDesignerContext(reportDesignerContext);

      chartPropertiesTableModel.setActiveContext(reportDesignerContext.getActiveContext());
      primaryDataSourcePropertiesTableModel.setActiveContext(
          reportDesignerContext.getActiveContext());
      secondaryDataSourcePropertiesTableModel.setActiveContext(
          reportDesignerContext.getActiveContext());

      final Element editableElement = element.derive();
      final Expression chartExpression =
          editableElement.getAttributeExpression(
              AttributeNames.Core.NAMESPACE, AttributeNames.Core.VALUE);

      final Expression originalPrimaryDataSourceExpression;
      final Expression originalSecondaryDataSourceExpression;
      if (chartExpression != null) {
        originalPrimaryDataSourceExpression = extractPrimaryDatasource(element);
        originalSecondaryDataSourceExpression = extractSecondaryDatasource(element);

        editModel.setChartExpression(chartExpression.getInstance());
        if (originalPrimaryDataSourceExpression != null) {
          editModel.setPrimaryDataSource(originalPrimaryDataSourceExpression.getInstance());
        } else {
          editModel.setPrimaryDataSource(null);
        }

        if (originalSecondaryDataSourceExpression != null) {
          editModel.setSecondaryDataSource(originalSecondaryDataSourceExpression.getInstance());
        } else {
          editModel.setSecondaryDataSource(null);
        }

      } else {
        editModel.setChartExpression(null);
        editModel.setPrimaryDataSource(null);
        editModel.setSecondaryDataSource(null);
        originalPrimaryDataSourceExpression = null;
        originalSecondaryDataSourceExpression = null;
      }

      if (editModel.getCurrentChartType() != null) {
        final ChartType chartType = editModel.getCurrentChartType();
        if (editModel.getPrimaryDataSource() == null) {
          final Class dataSourceImplementation =
              chartType.getPreferredPrimaryDataSourceImplementation();
          final ExpressionMetaData data =
              ExpressionRegistry.getInstance()
                  .getExpressionMetaData(dataSourceImplementation.getName());
          editModel.getPrimaryDataSourcesModel().setSelectedItem(data);
        }
        if (editModel.getSecondaryDataSource() == null) {
          final Class dataSourceImplementation =
              chartType.getPreferredSecondaryDataSourceImplementation();
          if (dataSourceImplementation != null) {
            final ExpressionMetaData data =
                ExpressionRegistry.getInstance()
                    .getExpressionMetaData(dataSourceImplementation.getName());
            editModel.getSecondaryDataSourcesModel().setSelectedItem(data);
          }
        }
      }

      if (performEdit() == false) {
        return null;
      }

      secondaryDataSourceTable.stopEditing();
      primaryDataSourceTable.stopEditing();
      chartTable.stopEditing();

      return new ChartEditingResult(
          chartExpression,
          originalPrimaryDataSourceExpression,
          originalSecondaryDataSourceExpression,
          editModel.getChartExpression(),
          editModel.getPrimaryDataSource(),
          editModel.getSecondaryDataSource());
    } finally {
      chartTable.setReportDesignerContext(null);
      primaryDataSourceTable.setReportDesignerContext(null);
      secondaryDataSourceTable.setReportDesignerContext(null);

      chartPropertiesTableModel.setActiveContext(null);
      primaryDataSourcePropertiesTableModel.setActiveContext(null);
      secondaryDataSourcePropertiesTableModel.setActiveContext(null);
    }
  }