@Override
  public void undo() {
    propagateDatas(false);

    if (currentInputMetadata != null) {
      if (!currentInputMetadata.sameMetadataAs(oldInputMetadata, IMetadataColumn.OPTIONS_NONE)) {
        currentInputMetadata.setListColumns(oldInputMetadata.getListColumns());
        if (inputWasRepository) {
          inputNode.setPropertyValue(EParameterName.SCHEMA_TYPE.getName(), EmfComponent.REPOSITORY);
        }
      }
    }
    if (!currentOutputMetadata.sameMetadataAs(oldOutputMetadata, IMetadataColumn.OPTIONS_NONE)) {
      List<IMetadataColumn> currentColumns =
          new ArrayList<IMetadataColumn>(oldOutputMetadata.getListColumns());
      currentOutputMetadata.setListColumns(currentColumns);
      MetadataToolHelper.copyTable(oldOutputMetadata, currentOutputMetadata);
    }

    for (INodeConnector connector : node.getListConnector()) {
      if ((!connector.getName().equals(currentConnector))
          && connector.getBaseSchema().equals(currentConnector)) {
        MetadataToolHelper.copyTable(
            oldOutputMetadata, node.getMetadataFromConnector(connector.getName()));
      }
    }
    if (outputWasRepository) {
      node.setPropertyValue(EParameterName.SCHEMA_TYPE.getName(), EmfComponent.REPOSITORY);
    }
    for (ChangeMetadataCommand cmd : propagatedChange) {
      cmd.undo();
    }

    List<ColumnNameChanged> columnNameChanged =
        MetadataToolHelper.getColumnNameChanged(oldOutputMetadata, newOutputMetadata);
    ColumnListController.updateColumnList(node, columnNameChanged, true);
    // newOutputMetadata.setListColumns(new
    // ArrayList<IMetadataColumn>(oldOutputMetadata.getListColumns()));

    if (!internal) {
      updateColumnList(newOutputMetadata, oldOutputMetadata);
      ((Process) node.getProcess()).checkProcess();
    }
    refreshMetadataChanged();
  }