diff --git a/src/main/java/gr/uom/java/xmi/diff/UMLJavadocDiff.java b/src/main/java/gr/uom/java/xmi/diff/UMLJavadocDiff.java index 8a9be69799..c4bca7ab58 100644 --- a/src/main/java/gr/uom/java/xmi/diff/UMLJavadocDiff.java +++ b/src/main/java/gr/uom/java/xmi/diff/UMLJavadocDiff.java @@ -337,7 +337,6 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf List deletedDocElements = new ArrayList(fragmentsBefore); List addedDocElements = new ArrayList(fragmentsAfter); if(fragmentsBefore.size() <= fragmentsAfter.size()) { - int updates = 0; for(UMLDocElement docElement : fragmentsBefore) { if(fragmentsAfter.contains(docElement)) { List matchingIndices = findAllMatchingIndices(fragmentsAfter, docElement); @@ -352,7 +351,8 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf UMLDocElement after1 = fragmentsBefore.get(beforeIndex+1); UMLDocElement before2 = fragmentsAfter.get(index-1); UMLDocElement after2 = fragmentsAfter.get(index+1); - if(before1.equals(before2) && after1.equals(after2) && !alreadyMatchedDocElement(docElement, fragmentsAfter.get(index))) { + if(before1.equals(before2) && after1.equals(after2) && !alreadyMatchedDocElement(docElement, fragmentsAfter.get(index)) && + !alreadyMatchedDocElement(fragmentsBefore.get(beforeIndex), docElement)) { matchFound = true; Pair pair = Pair.of(fragmentsBefore.get(beforeIndex), fragmentsAfter.get(index)); commonDocElements.add(pair); @@ -360,15 +360,14 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf List indices2 = findAllMatchingIndices(addedDocElements, docElement); int beforeIndexToRemove = beforeMatchingIndices.indexOf(beforeIndex); if(beforeIndexToRemove >= indices1.size()) { - beforeIndexToRemove = beforeIndexToRemove - updates; + beforeIndexToRemove = indices1.size()-1; } deletedDocElements.remove((int)indices1.get(beforeIndexToRemove)); int afterIndexToRemove = matchingIndices.indexOf(index); if(afterIndexToRemove >= indices2.size()) { - afterIndexToRemove = afterIndexToRemove - updates; + afterIndexToRemove = indices2.size()-1; } addedDocElements.remove((int)indices2.get(afterIndexToRemove)); - updates++; break; } } @@ -394,7 +393,6 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf } } else { - int updates = 0; for(UMLDocElement docElement : fragmentsAfter) { if(fragmentsBefore.contains(docElement)) { List matchingIndices = findAllMatchingIndices(fragmentsBefore, docElement); @@ -409,7 +407,8 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf UMLDocElement after1 = fragmentsBefore.get(index+1); UMLDocElement before2 = fragmentsAfter.get(afterIndex-1); UMLDocElement after2 = fragmentsAfter.get(afterIndex+1); - if(before1.equals(before2) && after1.equals(after2) && !alreadyMatchedDocElement(fragmentsBefore.get(index), docElement)) { + if(before1.equals(before2) && after1.equals(after2) && !alreadyMatchedDocElement(fragmentsBefore.get(index), docElement) && + !alreadyMatchedDocElement(docElement, fragmentsAfter.get(afterIndex))) { matchFound = true; Pair pair = Pair.of(fragmentsBefore.get(index), fragmentsAfter.get(afterIndex)); commonDocElements.add(pair); @@ -417,15 +416,46 @@ private boolean processModifiedTags(UMLTagElement tagBefore, UMLTagElement tagAf List indices2 = findAllMatchingIndices(addedDocElements, docElement); int beforeIndexToRemove = matchingIndices.indexOf(index); if(beforeIndexToRemove >= indices1.size()) { - beforeIndexToRemove = beforeIndexToRemove - updates; + beforeIndexToRemove = indices1.size()-1; } deletedDocElements.remove((int)indices1.get(beforeIndexToRemove)); int afterIndexToRemove = afterMatchingIndices.indexOf(afterIndex); if(afterIndexToRemove >= indices2.size()) { - afterIndexToRemove = afterIndexToRemove - updates; + afterIndexToRemove = indices2.size()-1; + } + addedDocElements.remove((int)indices2.get(afterIndexToRemove)); + break; + } + } + } + if(matchFound) { + break; + } + //match HTML tags if the doc elements after them are identical and unique + for(Integer afterIndex : afterMatchingIndices) { + if(afterIndex > 0 && afterIndex < fragmentsAfter.size()-1) { + UMLDocElement after1 = fragmentsBefore.get(index+1); + List after1MatchingIndices = findAllMatchingIndices(fragmentsBefore, after1); + UMLDocElement after2 = fragmentsAfter.get(afterIndex+1); + List after2MatchingIndices = findAllMatchingIndices(fragmentsAfter, after2); + if(after1.equals(after2) && !alreadyMatchedDocElement(fragmentsBefore.get(index), docElement) && + !alreadyMatchedDocElement(docElement, fragmentsAfter.get(afterIndex)) && + after1MatchingIndices.size() == 1 && after2MatchingIndices.size() == 1) { + matchFound = true; + Pair pair = Pair.of(fragmentsBefore.get(index), fragmentsAfter.get(afterIndex)); + commonDocElements.add(pair); + List indices1 = findAllMatchingIndices(deletedDocElements, docElement); + List indices2 = findAllMatchingIndices(addedDocElements, docElement); + int beforeIndexToRemove = matchingIndices.indexOf(index); + if(beforeIndexToRemove >= indices1.size()) { + beforeIndexToRemove = indices1.size()-1; + } + deletedDocElements.remove((int)indices1.get(beforeIndexToRemove)); + int afterIndexToRemove = afterMatchingIndices.indexOf(afterIndex); + if(afterIndexToRemove >= indices2.size()) { + afterIndexToRemove = indices2.size()-1; } addedDocElements.remove((int)indices2.get(afterIndexToRemove)); - updates++; break; } }