Program: 120467
Project: 120467
Buggy source:
public void selectInputXmlTree(InputXmlTree inputTree){
  if (inputTree != selectedInputTree) {
    selectedInputTree=inputTree;
    MetadataTableEditorView inputMetaEditorView=mapperUI.getTabFolderEditors().getInputMetaEditorView();
    List<IODataComponent> inputs=getMapperComponent().getIODataComponents().getInputs();
    IMetadataTable table=null;
    for (int i=0; i < inputs.size(); i++) {
      IODataComponent ioDataComponent=inputs.get(i);
      if (inputTree.getName() != null && inputTree.getName().equals(ioDataComponent.getConnection().getName())) {
        table=ioDataComponent.getTable();
        break;
      }
    }
    if (table != null) {
      MetadataTableEditor editor=new MetadataTableEditor(table,selectedInputTree.getName());
      editor.setModifiedBeanListenable(inputMetaEditorView.getTableViewerCreator());
      IModifiedBeanListener<IMetadataColumn> columnListener=new IModifiedBeanListener<IMetadataColumn>(){
        @Override public void handleEvent(        ModifiedBeanEvent<IMetadataColumn> event){
          fireCurrentDirectEditApply();
          if (AbstractMetadataTableEditorView.ID_COLUMN_NAME.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              if (treeNode != null) {
                treeNode.setName((String)event.newValue);
                processColumnNameChanged(treeNode);
              }
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_TYPE.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              if (treeNode != null) {
                if (treeNode.getType() != null && treeNode.getType().equals(XmlMapUtil.DOCUMENT)) {
                  List<TreeNode> oldLoops=new ArrayList<TreeNode>();
                  if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
                    oldLoops=XmlMapUtil.getMultiLoopsForXmlTree(selectedInputTree);
                  }
                  XmlMapUtil.detachNodeConnections(treeNode,getExternalData(),true);
                  treeNode.getChildren().clear();
                  if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
                    selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
                    List<TreeNode> newLoops=XmlMapUtil.getMultiLoopsForXmlTree(selectedInputTree);
                    oldLoops.removeAll(newLoops);
                    if (!oldLoops.isEmpty()) {
                      XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
                    }
                  }
                }
                treeNode.setType((String)event.newValue);
                if (XmlMapUtil.DOCUMENT.equals(event.newValue)) {
                  XmlMapUtil.detachNodeConnections(treeNode,getExternalData(),true);
                  TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                  createTreeNode.setName("String_Node_Str");
                  createTreeNode.setType(XmlMapUtil.DEFAULT_DATA_TYPE);
                  createTreeNode.setNodeType(NodeType.ELEMENT);
                  createTreeNode.setXpath(XmlMapUtil.getXPath(treeNode.getXpath(),createTreeNode.getName(),createTreeNode.getNodeType()));
                  createTreeNode.setLoop(true);
                  createTreeNode.setMain(true);
                  treeNode.getChildren().add(createTreeNode);
                }
                problemsAnalyser.checkProblems(selectedInputTree);
                mapperUI.updateStatusBar();
                inputTreeSchemaBeanListModified();
              }
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_KEY.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setKey((Boolean)event.newValue);
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_PATTERN.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setPattern((String)event.newValue);
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_NULLABLE.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setNullable((Boolean)event.newValue);
            }
          }
        }
      }
;
      editor.addModifiedBeanListener(columnListener);
      editor.addAfterOperationListListener(new IListenableListListener(){
        @Override public void handleEvent(        ListenableListEvent event){
          if (event.type == TYPE.ADDED) {
            EList<TreeNode> nodes=selectedInputTree.getNodes();
            List<IMetadataColumn> metadataColumns=(List<IMetadataColumn>)event.addedObjects;
            if (event.index != null) {
              int index=event.index;
              for (              IMetadataColumn column : metadataColumns) {
                TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                createTreeNode.setName(column.getLabel());
                createTreeNode.setType(column.getTalendType());
                createTreeNode.setNullable(column.isNullable());
                createTreeNode.setPattern(column.getPattern());
                createTreeNode.setXpath(XmlMapUtil.getXPath(selectedInputTree.getName(),createTreeNode.getName(),createTreeNode.getNodeType()));
                selectedInputTree.getNodes().add(index,createTreeNode);
                index=index + 1;
              }
            }
          }
 else           if (event.type == TYPE.REMOVED) {
            List<IMetadataColumn> metadataColumns=(List<IMetadataColumn>)event.removedObjects;
            List treeNodeToRemove=new ArrayList();
            for (            IMetadataColumn column : metadataColumns) {
              for (              TreeNode node : selectedInputTree.getNodes()) {
                if (node.getName() != null && node.getName().equals(column.getLabel())) {
                  XmlMapUtil.detachNodeConnections(node,getExternalData(),true);
                  treeNodeToRemove.add(node);
                }
              }
            }
            selectedInputTree.getNodes().removeAll(treeNodeToRemove);
            if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
              selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
              List<TreeNode> oldLoops=new ArrayList<TreeNode>();
              XmlMapUtil.getChildLoops(oldLoops,treeNodeToRemove);
              if (!oldLoops.isEmpty()) {
                XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
              }
            }
          }
 else           if (event.type == TYPE.SWAPED) {
            List<Integer> listIndexTarget=event.indicesTarget;
            List<Integer> listIndexOrignal=event.indicesOrigin;
            for (int i=0; i < listIndexOrignal.size(); i++) {
              int orignal=listIndexOrignal.get(i);
              int target=listIndexTarget.get(i);
              if (orignal < selectedInputTree.getNodes().size()) {
                TreeNode tempTreeNode=selectedInputTree.getNodes().get(orignal);
                selectedInputTree.getNodes().remove(orignal);
                selectedInputTree.getNodes().add(target,tempTreeNode);
              }
            }
          }
 else           if (event.type == TYPE.REPLACED) {
            List added=(List)event.addedObjects;
            List removed=(List)event.removedObjects;
            boolean needCheckOutput=false;
            List<TreeNode> oldLoops=new ArrayList<TreeNode>();
            if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
              needCheckOutput=true;
            }
            List<IMetadataColumn> removedColumn=new ArrayList<IMetadataColumn>();
            List<IMetadataColumn> addedColumn=new ArrayList<IMetadataColumn>();
            if (!added.isEmpty()) {
              addedColumn.addAll((List<IMetadataColumn>)added.get(0));
            }
            if (!removed.isEmpty()) {
              removedColumn.addAll((List<IMetadataColumn>)removed.get(0));
            }
            Map<IMetadataColumn,TreeNode> nodeMap=new HashMap<IMetadataColumn,TreeNode>();
            for (int i=0; i < removedColumn.size(); i++) {
              IMetadataColumn column=removedColumn.get(i);
              TreeNode node=selectedInputTree.getNodes().get(i);
              boolean found=false;
              for (              IMetadataColumn columnAdded : addedColumn) {
                if (column.sameMetacolumnAs(columnAdded)) {
                  nodeMap.put(columnAdded,node);
                  found=true;
                  break;
                }
              }
              if (!found) {
                XmlMapUtil.detachNodeConnections(node,getExternalData(),true);
                if (needCheckOutput) {
                  XmlMapUtil.getChildLoops(oldLoops,node.getChildren());
                }
              }
            }
            selectedInputTree.getNodes().clear();
            for (            IMetadataColumn column : addedColumn) {
              TreeNode treeNode=nodeMap.get(column);
              if (treeNode == null) {
                treeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                treeNode.setName(column.getLabel());
                treeNode.setType(column.getTalendType());
                treeNode.setNullable(column.isNullable());
                treeNode.setPattern(column.getPattern());
                treeNode.setXpath(XmlMapUtil.getXPath(selectedInputTree.getName(),treeNode.getName(),treeNode.getNodeType()));
                if (XmlMapUtil.DOCUMENT.equals(column.getTalendType())) {
                  TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                  createTreeNode.setName("String_Node_Str");
                  createTreeNode.setType(XmlMapUtil.DEFAULT_DATA_TYPE);
                  createTreeNode.setNodeType(NodeType.ELEMENT);
                  createTreeNode.setXpath(XmlMapUtil.getXPath(treeNode.getXpath(),createTreeNode.getName(),createTreeNode.getNodeType()));
                  createTreeNode.setLoop(true);
                  createTreeNode.setMain(true);
                  treeNode.getChildren().add(createTreeNode);
                }
              }
              selectedInputTree.getNodes().add(treeNode);
            }
            selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
            if (!oldLoops.isEmpty()) {
              XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
            }
            mapperUI.updateStatusBar();
          }
        }
      }
);
      inputMetaEditorView.setMetadataTableEditor(editor);
    }
    refreshTreeSchemaEditor(inputTree);
  }
}

Fixed version (ground truth):
public void selectInputXmlTree(InputXmlTree inputTree){
  if (inputTree != selectedInputTree) {
    selectedInputTree=inputTree;
    MetadataTableEditorView inputMetaEditorView=mapperUI.getTabFolderEditors().getInputMetaEditorView();
    List<IODataComponent> inputs=getMapperComponent().getIODataComponents().getInputs();
    IMetadataTable table=null;
    for (int i=0; i < inputs.size(); i++) {
      IODataComponent ioDataComponent=inputs.get(i);
      if (inputTree.getName() != null && inputTree.getName().equals(ioDataComponent.getConnection().getName())) {
        table=ioDataComponent.getTable();
        break;
      }
    }
    if (table != null) {
      MetadataTableEditor editor=new MetadataTableEditor(table,selectedInputTree.getName());
      editor.setModifiedBeanListenable(inputMetaEditorView.getTableViewerCreator());
      IModifiedBeanListener<IMetadataColumn> columnListener=new IModifiedBeanListener<IMetadataColumn>(){
        @Override public void handleEvent(        ModifiedBeanEvent<IMetadataColumn> event){
          fireCurrentDirectEditApply();
          if (AbstractMetadataTableEditorView.ID_COLUMN_NAME.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              if (treeNode != null) {
                treeNode.setName((String)event.newValue);
                processColumnNameChanged(treeNode);
              }
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_TYPE.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              if (treeNode != null) {
                if (treeNode.getType() != null && treeNode.getType().equals(XmlMapUtil.DOCUMENT)) {
                  List<TreeNode> oldLoops=new ArrayList<TreeNode>();
                  if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
                    oldLoops=XmlMapUtil.getMultiLoopsForXmlTree(selectedInputTree);
                  }
                  XmlMapUtil.detachNodeConnections(treeNode,getExternalData(),true);
                  treeNode.getChildren().clear();
                  if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
                    selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
                    List<TreeNode> newLoops=XmlMapUtil.getMultiLoopsForXmlTree(selectedInputTree);
                    oldLoops.removeAll(newLoops);
                    if (!oldLoops.isEmpty()) {
                      XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
                    }
                  }
                }
                treeNode.setType((String)event.newValue);
                if (XmlMapUtil.DOCUMENT.equals(event.newValue)) {
                  XmlMapUtil.detachNodeConnections(treeNode,getExternalData(),true);
                  TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                  createTreeNode.setName("String_Node_Str");
                  createTreeNode.setType(XmlMapUtil.DEFAULT_DATA_TYPE);
                  createTreeNode.setNodeType(NodeType.ELEMENT);
                  createTreeNode.setXpath(XmlMapUtil.getXPath(treeNode.getXpath(),createTreeNode.getName(),createTreeNode.getNodeType()));
                  createTreeNode.setLoop(true);
                  createTreeNode.setMain(true);
                  treeNode.getChildren().add(createTreeNode);
                }
                problemsAnalyser.checkProblems(selectedInputTree);
                mapperUI.updateStatusBar();
                inputTreeSchemaBeanListModified();
              }
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_KEY.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setKey((Boolean)event.newValue);
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_PATTERN.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setPattern((String)event.newValue);
            }
          }
 else           if (AbstractMetadataTableEditorView.ID_COLUMN_NULLABLE.equals(event.column.getId())) {
            if (event.index < selectedInputTree.getNodes().size()) {
              TreeNode treeNode=selectedInputTree.getNodes().get(event.index);
              treeNode.setNullable((Boolean)event.newValue);
            }
          }
        }
      }
;
      editor.addModifiedBeanListener(columnListener);
      editor.addAfterOperationListListener(new IListenableListListener(){
        @Override public void handleEvent(        ListenableListEvent event){
          if (event.type == TYPE.ADDED) {
            EList<TreeNode> nodes=selectedInputTree.getNodes();
            List<IMetadataColumn> metadataColumns=(List<IMetadataColumn>)event.addedObjects;
            if (event.index != null) {
              int index=event.index;
              for (              IMetadataColumn column : metadataColumns) {
                TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                createTreeNode.setName(column.getLabel());
                createTreeNode.setType(column.getTalendType());
                createTreeNode.setNullable(column.isNullable());
                createTreeNode.setPattern(column.getPattern());
                createTreeNode.setXpath(XmlMapUtil.getXPath(selectedInputTree.getName(),createTreeNode.getName(),createTreeNode.getNodeType()));
                selectedInputTree.getNodes().add(index,createTreeNode);
                index=index + 1;
              }
            }
          }
 else           if (event.type == TYPE.REMOVED) {
            List<IMetadataColumn> metadataColumns=(List<IMetadataColumn>)event.removedObjects;
            List treeNodeToRemove=new ArrayList();
            for (            IMetadataColumn column : metadataColumns) {
              for (              TreeNode node : selectedInputTree.getNodes()) {
                if (node.getName() != null && node.getName().equals(column.getLabel())) {
                  XmlMapUtil.detachNodeConnections(node,getExternalData(),true);
                  treeNodeToRemove.add(node);
                }
              }
            }
            selectedInputTree.getNodes().removeAll(treeNodeToRemove);
            if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
              selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
              List<TreeNode> oldLoops=new ArrayList<TreeNode>();
              XmlMapUtil.getChildLoops(oldLoops,treeNodeToRemove);
              if (!oldLoops.isEmpty()) {
                XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
              }
            }
            problemsAnalyser.checkProblems(selectedInputTree);
            mapperUI.updateStatusBar();
            inputTreeSchemaBeanListModified();
          }
 else           if (event.type == TYPE.SWAPED) {
            List<Integer> listIndexTarget=event.indicesTarget;
            List<Integer> listIndexOrignal=event.indicesOrigin;
            for (int i=0; i < listIndexOrignal.size(); i++) {
              int orignal=listIndexOrignal.get(i);
              int target=listIndexTarget.get(i);
              if (orignal < selectedInputTree.getNodes().size()) {
                TreeNode tempTreeNode=selectedInputTree.getNodes().get(orignal);
                selectedInputTree.getNodes().remove(orignal);
                selectedInputTree.getNodes().add(target,tempTreeNode);
              }
            }
          }
 else           if (event.type == TYPE.REPLACED) {
            List added=(List)event.addedObjects;
            List removed=(List)event.removedObjects;
            boolean needCheckOutput=false;
            List<TreeNode> oldLoops=new ArrayList<TreeNode>();
            if (selectedInputTree == mainInputTree && mainInputTree.isMultiLoops()) {
              needCheckOutput=true;
            }
            List<IMetadataColumn> removedColumn=new ArrayList<IMetadataColumn>();
            List<IMetadataColumn> addedColumn=new ArrayList<IMetadataColumn>();
            if (!added.isEmpty()) {
              addedColumn.addAll((List<IMetadataColumn>)added.get(0));
            }
            if (!removed.isEmpty()) {
              removedColumn.addAll((List<IMetadataColumn>)removed.get(0));
            }
            Map<IMetadataColumn,TreeNode> nodeMap=new HashMap<IMetadataColumn,TreeNode>();
            for (int i=0; i < removedColumn.size(); i++) {
              IMetadataColumn column=removedColumn.get(i);
              TreeNode node=selectedInputTree.getNodes().get(i);
              boolean found=false;
              for (              IMetadataColumn columnAdded : addedColumn) {
                if (column.sameMetacolumnAs(columnAdded)) {
                  nodeMap.put(columnAdded,node);
                  found=true;
                  break;
                }
              }
              if (!found) {
                XmlMapUtil.detachNodeConnections(node,getExternalData(),true);
                if (needCheckOutput) {
                  XmlMapUtil.getChildLoops(oldLoops,node.getChildren());
                }
              }
            }
            selectedInputTree.getNodes().clear();
            for (            IMetadataColumn column : addedColumn) {
              TreeNode treeNode=nodeMap.get(column);
              if (treeNode == null) {
                treeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                treeNode.setName(column.getLabel());
                treeNode.setType(column.getTalendType());
                treeNode.setNullable(column.isNullable());
                treeNode.setPattern(column.getPattern());
                treeNode.setXpath(XmlMapUtil.getXPath(selectedInputTree.getName(),treeNode.getName(),treeNode.getNodeType()));
                if (XmlMapUtil.DOCUMENT.equals(column.getTalendType())) {
                  TreeNode createTreeNode=XmlmapFactory.eINSTANCE.createTreeNode();
                  createTreeNode.setName("String_Node_Str");
                  createTreeNode.setType(XmlMapUtil.DEFAULT_DATA_TYPE);
                  createTreeNode.setNodeType(NodeType.ELEMENT);
                  createTreeNode.setXpath(XmlMapUtil.getXPath(treeNode.getXpath(),createTreeNode.getName(),createTreeNode.getNodeType()));
                  createTreeNode.setLoop(true);
                  createTreeNode.setMain(true);
                  treeNode.getChildren().add(createTreeNode);
                }
              }
              selectedInputTree.getNodes().add(treeNode);
            }
            selectedInputTree.setMultiLoops(XmlMapUtil.checkMultiLoopsStatus(selectedInputTree));
            if (!oldLoops.isEmpty()) {
              XmlMapUtil.removeloopInOutputTree(MapperManager.this,oldLoops);
            }
            mapperUI.updateStatusBar();
          }
        }
      }
);
      inputMetaEditorView.setMetadataTableEditor(editor);
    }
    refreshTreeSchemaEditor(inputTree);
  }
}