Program: 120727
Project: 120727
Buggy source:
private void propagateDatas(boolean isExecute){
  String baseConnectorForCurrentNode=node.getConnectorFromName(currentConnector).getBaseSchema();
  if (outputdataContainer != null && (!outputdataContainer.getInputs().isEmpty() || !outputdataContainer.getOuputs().isEmpty())) {
    for (    IODataComponent currentIO : outputdataContainer.getInputs()) {
      INode sourceNode=currentIO.getSource();
      if (currentIO.hasChanged() && (sourceNode.getConnectorFromName(currentIO.getConnection().getConnectorName()).getBaseSchema().equals(baseConnectorForCurrentNode))) {
        sourceNode.metadataOutputChanged(currentIO,currentIO.getName());
        if (isExecute) {
          currentIO.setTable(oldInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          currentIO.setTable(newInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
    for (    IODataComponent currentIO : outputdataContainer.getOuputs()) {
      INodeConnector nodeConnector=null;
      String baseConnector=null;
      Node sourceNode=(Node)currentIO.getSource();
      nodeConnector=sourceNode.getConnectorFromName(currentIO.getConnection().getConnectorName());
      baseConnector=nodeConnector.getBaseSchema();
      INode targetNode=currentIO.getTarget();
      boolean sourceIsBuiltIn=((Node)currentIO.getSource()).getConnectorFromType(currentIO.getConnection().getLineStyle()).isMultiSchema();
      boolean targetIsBuiltIn=((Node)targetNode).getConnectorFromType(currentIO.getConnection().getLineStyle()).isMultiSchema();
      boolean isJoblet=((Node)targetNode).isJoblet();
      if (!isJoblet && baseConnector.equals(baseConnectorForCurrentNode) && (targetIsBuiltIn || (targetNode.getMetadataFromConnector(baseConnector) != null && !targetNode.getMetadataFromConnector(baseConnector).sameMetadataAs(newOutputMetadata)))) {
        targetNode.metadataInputChanged(currentIO,currentIO.getUniqueName());
        if (isExecute) {
          if (targetNode instanceof Node) {
            if (((Node)targetNode).getComponent().isSchemaAutoPropagated() && getPropagate() && targetNode.getMetadataList().size() > 0) {
              IMetadataTable tmpClone;
              if (sourceIsBuiltIn) {
                IMetadataTable tab=node.getMetadataTable(currentIO.getConnection().getMetadataTable().getTableName());
                if (tab == null && node.getJobletNode() != null) {
                  tab=node.getJobletNode().getMetadataTable(currentIO.getConnection().getMetadataTable().getTableName());
                }
                tmpClone=tab.clone(true);
              }
 else {
                IMetadataTable tab=node.getMetadataFromConnector(currentIO.getConnection().getConnectorName());
                if (tab == null && node.getJobletNode() != null) {
                  tab=node.getJobletNode().getMetadataFromConnector(currentIO.getConnection().getConnectorName());
                }
                tmpClone=tab.clone(true);
              }
              IMetadataTable toCopy=newOutputMetadata.clone();
              String dbmsId=null;
              IMetadataTable copy;
              if (((Node)targetNode).getMetadataFromConnector(baseConnector) != null) {
                dbmsId=targetNode.getMetadataFromConnector(baseConnector).getDbms();
                MetadataToolHelper.copyTable(dbmsId,toCopy,tmpClone);
                toCopy=tmpClone;
                copy=((Node)targetNode).getMetadataFromConnector(baseConnector).clone(true);
              }
 else {
                final String mainConnector="String_Node_Str";
                dbmsId=targetNode.getMetadataFromConnector(mainConnector).getDbms();
                MetadataToolHelper.copyTable(dbmsId,toCopy,tmpClone);
                toCopy=tmpClone;
                copy=((Node)targetNode).getMetadataFromConnector(mainConnector).clone(true);
              }
              MetadataToolHelper.copyTable(dbmsId,toCopy,copy);
              ChangeMetadataCommand cmd=new ChangeMetadataCommand(targetNode,null,null,copy,inputSchemaParam);
              if (outputdataContainer.getOuputs().size() > 0) {
                List<ColumnNameChanged> columnNameChanged=outputdataContainer.getOuputs().get(0).getColumnNameChanged();
                for (                IODataComponent dataComp : cmd.outputdataContainer.getOuputs()) {
                  dataComp.setColumnNameChanged(columnNameChanged);
                }
              }
              cmd.execute(true);
              propagatedChange.add(cmd);
            }
          }
          currentIO.setTable(oldOutputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          if (targetNode instanceof Node) {
            if (!targetIsBuiltIn && getPropagate()) {
              if (((Node)targetNode).getComponent().isSchemaAutoPropagated()) {
                if (outputdataContainer.getOuputs().size() > 0) {
                  List<ColumnNameChanged> columnNameChanged=outputdataContainer.getOuputs().get(0).getColumnNameChanged();
                  for (                  ChangeMetadataCommand cmd : propagatedChange) {
                    for (                    IODataComponent dataComp : cmd.outputdataContainer.getOuputs()) {
                      dataComp.setColumnNameChanged(columnNameChanged);
                    }
                  }
                }
              }
            }
          }
          currentIO.setTable(newOutputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
  }
 else   if (dataComponent != null) {
    for (    IConnection outgoingConnection : node.getOutgoingConnections()) {
      if (outgoingConnection.getConnectorName().equals(currentConnector)) {
        outgoingConnection.getTarget().metadataInputChanged(dataComponent,outgoingConnection.getName());
      }
    }
  }
 else {
    if (!node.getOutgoingConnections().isEmpty()) {
      for (      IConnection outgoingConnection : node.getOutgoingConnections()) {
        final Node target=(Node)outgoingConnection.getTarget();
        if (target != null && target.getExternalNode() != null) {
          List<IMetadataColumn> oldListColumns=oldOutputMetadata.getListColumns();
          List<IMetadataColumn> newListColumns=newOutputMetadata.getListColumns();
          List<ColumnNameChanged> columnNameChanges=new ArrayList<ColumnNameChanged>();
          int size=oldListColumns.size();
          int newSize=newListColumns.size();
          if (newSize < size) {
            size=newSize;
          }
          for (int i=0; i < size; i++) {
            IMetadataColumn metadataColumn=oldListColumns.get(i);
            IMetadataColumn newMetadataColumn=newListColumns.get(i);
            if (metadataColumn != null && newMetadataColumn != null) {
              String oldLabel=metadataColumn.getLabel();
              String newLabel=newMetadataColumn.getLabel();
              if (oldLabel != null && !oldLabel.equals(newLabel)) {
                columnNameChanges.add(new ColumnNameChanged(oldLabel,newLabel));
              }
            }
          }
          if (GlobalServiceRegister.getDefault().isServiceRegistered(IXmlMapService.class)) {
            final IXmlMapService service=(IXmlMapService)GlobalServiceRegister.getDefault().getService(IXmlMapService.class);
            if (service.isXmlMapComponent(target.getExternalNode())) {
              IODataComponent output=new IODataComponent(outgoingConnection,newOutputMetadata);
              output.setColumnNameChanged(columnNameChanges);
              target.metadataInputChanged(output,outgoingConnection.getName());
            }
          }
          if (GlobalServiceRegister.getDefault().isServiceRegistered(IDbMapService.class)) {
            final IDbMapService service=(IDbMapService)GlobalServiceRegister.getDefault().getService(IDbMapService.class);
            if (service.isDbMapComponent(target.getExternalNode())) {
              IODataComponent output=new IODataComponent(outgoingConnection,newOutputMetadata);
              output.setColumnNameChanged(columnNameChanges);
              target.metadataInputChanged(output,outgoingConnection.getName());
            }
          }
        }
      }
    }
  }
  if (inputdataContainer != null) {
    for (    IODataComponent currentIO : inputdataContainer.getOuputs()) {
      if (currentIO.hasChanged() && (currentIO.getSource().getConnectorFromName(currentIO.getConnection().getConnectorName()).getBaseSchema().equals(currentConnector))) {
        INode targetNode=currentIO.getTarget();
        targetNode.metadataInputChanged(currentIO,currentIO.getUniqueName());
        if (isExecute) {
          currentIO.setTable(oldInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          currentIO.setTable(newInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
  }
}

Fixed version (ground truth):
private void propagateDatas(boolean isExecute){
  String baseConnectorForCurrentNode=node.getConnectorFromName(currentConnector).getBaseSchema();
  if (outputdataContainer != null && (!outputdataContainer.getInputs().isEmpty() || !outputdataContainer.getOuputs().isEmpty())) {
    for (    IODataComponent currentIO : outputdataContainer.getInputs()) {
      INode sourceNode=currentIO.getSource();
      if (currentIO.hasChanged() && (sourceNode.getConnectorFromName(currentIO.getConnection().getConnectorName()).getBaseSchema().equals(baseConnectorForCurrentNode))) {
        sourceNode.metadataOutputChanged(currentIO,currentIO.getName());
        if (isExecute) {
          currentIO.setTable(oldInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          currentIO.setTable(newInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
    for (    IODataComponent currentIO : outputdataContainer.getOuputs()) {
      INodeConnector nodeConnector=null;
      String baseConnector=null;
      Node sourceNode=(Node)currentIO.getSource();
      nodeConnector=sourceNode.getConnectorFromName(currentIO.getConnection().getConnectorName());
      baseConnector=nodeConnector.getBaseSchema();
      INode targetNode=currentIO.getTarget();
      boolean sourceIsBuiltIn=((Node)currentIO.getSource()).getConnectorFromType(currentIO.getConnection().getLineStyle()).isMultiSchema();
      boolean targetIsBuiltIn=((Node)targetNode).getConnectorFromType(currentIO.getConnection().getLineStyle()).isMultiSchema();
      boolean isJoblet=((Node)targetNode).isJoblet();
      if (!isJoblet && baseConnector.equals(baseConnectorForCurrentNode) && (targetIsBuiltIn || (targetNode.getMetadataFromConnector(baseConnector) != null && !targetNode.getMetadataFromConnector(baseConnector).sameMetadataAs(newOutputMetadata)))) {
        IMetadataTable targetMeatadat=targetNode.getMetadataFromConnector(baseConnector);
        if (targetMeatadat.isReadOnly()) {
          continue;
        }
        targetNode.metadataInputChanged(currentIO,currentIO.getUniqueName());
        if (isExecute) {
          if (targetNode instanceof Node) {
            if (((Node)targetNode).getComponent().isSchemaAutoPropagated() && getPropagate() && targetNode.getMetadataList().size() > 0) {
              IMetadataTable tmpClone;
              if (sourceIsBuiltIn) {
                IMetadataTable tab=node.getMetadataTable(currentIO.getConnection().getMetadataTable().getTableName());
                if (tab == null && node.getJobletNode() != null) {
                  tab=node.getJobletNode().getMetadataTable(currentIO.getConnection().getMetadataTable().getTableName());
                }
                tmpClone=tab.clone(true);
              }
 else {
                IMetadataTable tab=node.getMetadataFromConnector(currentIO.getConnection().getConnectorName());
                if (tab == null && node.getJobletNode() != null) {
                  tab=node.getJobletNode().getMetadataFromConnector(currentIO.getConnection().getConnectorName());
                }
                tmpClone=tab.clone(true);
              }
              IMetadataTable toCopy=newOutputMetadata.clone();
              String dbmsId=null;
              IMetadataTable copy;
              if (((Node)targetNode).getMetadataFromConnector(baseConnector) != null) {
                dbmsId=targetNode.getMetadataFromConnector(baseConnector).getDbms();
                MetadataToolHelper.copyTable(dbmsId,toCopy,tmpClone);
                toCopy=tmpClone;
                copy=((Node)targetNode).getMetadataFromConnector(baseConnector).clone(true);
              }
 else {
                final String mainConnector="String_Node_Str";
                dbmsId=targetNode.getMetadataFromConnector(mainConnector).getDbms();
                MetadataToolHelper.copyTable(dbmsId,toCopy,tmpClone);
                toCopy=tmpClone;
                copy=((Node)targetNode).getMetadataFromConnector(mainConnector).clone(true);
              }
              MetadataToolHelper.copyTable(dbmsId,toCopy,copy);
              ChangeMetadataCommand cmd=new ChangeMetadataCommand(targetNode,null,null,copy,inputSchemaParam);
              if (outputdataContainer.getOuputs().size() > 0) {
                List<ColumnNameChanged> columnNameChanged=outputdataContainer.getOuputs().get(0).getColumnNameChanged();
                for (                IODataComponent dataComp : cmd.outputdataContainer.getOuputs()) {
                  dataComp.setColumnNameChanged(columnNameChanged);
                }
              }
              cmd.execute(true);
              propagatedChange.add(cmd);
            }
          }
          currentIO.setTable(oldOutputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          if (targetNode instanceof Node) {
            if (!targetIsBuiltIn && getPropagate()) {
              if (((Node)targetNode).getComponent().isSchemaAutoPropagated()) {
                if (outputdataContainer.getOuputs().size() > 0) {
                  List<ColumnNameChanged> columnNameChanged=outputdataContainer.getOuputs().get(0).getColumnNameChanged();
                  for (                  ChangeMetadataCommand cmd : propagatedChange) {
                    for (                    IODataComponent dataComp : cmd.outputdataContainer.getOuputs()) {
                      dataComp.setColumnNameChanged(columnNameChanged);
                    }
                  }
                }
              }
            }
          }
          currentIO.setTable(newOutputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
  }
 else   if (dataComponent != null) {
    for (    IConnection outgoingConnection : node.getOutgoingConnections()) {
      if (outgoingConnection.getConnectorName().equals(currentConnector)) {
        outgoingConnection.getTarget().metadataInputChanged(dataComponent,outgoingConnection.getName());
      }
    }
  }
 else {
    if (!node.getOutgoingConnections().isEmpty()) {
      for (      IConnection outgoingConnection : node.getOutgoingConnections()) {
        final Node target=(Node)outgoingConnection.getTarget();
        if (target != null && target.getExternalNode() != null) {
          List<IMetadataColumn> oldListColumns=oldOutputMetadata.getListColumns();
          List<IMetadataColumn> newListColumns=newOutputMetadata.getListColumns();
          List<ColumnNameChanged> columnNameChanges=new ArrayList<ColumnNameChanged>();
          int size=oldListColumns.size();
          int newSize=newListColumns.size();
          if (newSize < size) {
            size=newSize;
          }
          for (int i=0; i < size; i++) {
            IMetadataColumn metadataColumn=oldListColumns.get(i);
            IMetadataColumn newMetadataColumn=newListColumns.get(i);
            if (metadataColumn != null && newMetadataColumn != null) {
              String oldLabel=metadataColumn.getLabel();
              String newLabel=newMetadataColumn.getLabel();
              if (oldLabel != null && !oldLabel.equals(newLabel)) {
                columnNameChanges.add(new ColumnNameChanged(oldLabel,newLabel));
              }
            }
          }
          if (GlobalServiceRegister.getDefault().isServiceRegistered(IXmlMapService.class)) {
            final IXmlMapService service=(IXmlMapService)GlobalServiceRegister.getDefault().getService(IXmlMapService.class);
            if (service.isXmlMapComponent(target.getExternalNode())) {
              IODataComponent output=new IODataComponent(outgoingConnection,newOutputMetadata);
              output.setColumnNameChanged(columnNameChanges);
              target.metadataInputChanged(output,outgoingConnection.getName());
            }
          }
          if (GlobalServiceRegister.getDefault().isServiceRegistered(IDbMapService.class)) {
            final IDbMapService service=(IDbMapService)GlobalServiceRegister.getDefault().getService(IDbMapService.class);
            if (service.isDbMapComponent(target.getExternalNode())) {
              IODataComponent output=new IODataComponent(outgoingConnection,newOutputMetadata);
              output.setColumnNameChanged(columnNameChanges);
              target.metadataInputChanged(output,outgoingConnection.getName());
            }
          }
        }
      }
    }
  }
  if (inputdataContainer != null) {
    for (    IODataComponent currentIO : inputdataContainer.getOuputs()) {
      if (currentIO.hasChanged() && (currentIO.getSource().getConnectorFromName(currentIO.getConnection().getConnectorName()).getBaseSchema().equals(currentConnector))) {
        INode targetNode=currentIO.getTarget();
        targetNode.metadataInputChanged(currentIO,currentIO.getUniqueName());
        if (isExecute) {
          currentIO.setTable(oldInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
 else {
          currentIO.setTable(newInputMetadata);
          currentIO.setColumnNameChanged(null);
        }
      }
    }
  }
}