Skip to content
19 changes: 15 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,22 @@
<artifactId>refactoring-miner</artifactId>
<version>${rm.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>junit</groupId>-->
<!-- <artifactId>junit</artifactId>-->
<!-- <version>4.13.2</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
Expand Down Expand Up @@ -130,7 +142,6 @@
<artifactId>jackson-databind</artifactId>
<version>2.17.1</version>
</dependency>

</dependencies>
<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public boolean checkForExtractionOrInline(Version currentVersion, Version parent
}
break;
}
case EXTRACT_FIXTURE:
// case EXTRACT_FIXTURE:TODO: upgrade RM version then uncomment
case MOVE_CODE: {
MoveCodeRefactoring moveCodeRefactoring = (MoveCodeRefactoring) refactoring;
Method extractedMethod = Method.of(moveCodeRefactoring.getTargetContainer(), currentVersion);
Expand Down
87 changes: 53 additions & 34 deletions src/main/java/org/codetracker/BlockTrackerChangeHistory.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,10 @@

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Predicate;

import gr.uom.java.xmi.*;
import gr.uom.java.xmi.diff.*;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.codetracker.api.History;
Expand All @@ -37,6 +30,7 @@
import org.codetracker.change.method.BodyChange;
import org.codetracker.element.Block;
import org.codetracker.element.Method;
import org.codetracker.util.Util;
import org.refactoringminer.api.Refactoring;

import com.github.difflib.DiffUtils;
Expand All @@ -46,11 +40,7 @@
import com.github.difflib.patch.InsertDelta;
import com.github.difflib.patch.Patch;

import gr.uom.java.xmi.UMLOperation;
import gr.uom.java.xmi.UMLType;
import gr.uom.java.xmi.VariableDeclarationContainer;
import gr.uom.java.xmi.LocationInfo.CodeElementType;
import gr.uom.java.xmi.UMLAnonymousClass;
import gr.uom.java.xmi.decomposition.AbstractCodeFragment;
import gr.uom.java.xmi.decomposition.AbstractCodeMapping;
import gr.uom.java.xmi.decomposition.AbstractExpression;
Expand All @@ -63,23 +53,9 @@
import gr.uom.java.xmi.decomposition.TryStatementObject;
import gr.uom.java.xmi.decomposition.UMLOperationBodyMapper;
import gr.uom.java.xmi.decomposition.VariableDeclaration;
import gr.uom.java.xmi.diff.ExtractOperationRefactoring;
import gr.uom.java.xmi.diff.InlineOperationRefactoring;
import gr.uom.java.xmi.diff.MergeOperationRefactoring;
import gr.uom.java.xmi.diff.MoveCodeRefactoring;
import gr.uom.java.xmi.diff.MoveOperationRefactoring;
import gr.uom.java.xmi.diff.PullUpOperationRefactoring;
import gr.uom.java.xmi.diff.PushDownOperationRefactoring;
import gr.uom.java.xmi.diff.RenameOperationRefactoring;
import gr.uom.java.xmi.diff.ReplaceAnonymousWithClassRefactoring;
import gr.uom.java.xmi.diff.ReplaceAnonymousWithLambdaRefactoring;
import gr.uom.java.xmi.diff.ReplaceConditionalWithTernaryRefactoring;
import gr.uom.java.xmi.diff.ReplaceLoopWithPipelineRefactoring;
import gr.uom.java.xmi.diff.ReplacePipelineWithLoopRefactoring;
import gr.uom.java.xmi.diff.SplitConditionalRefactoring;
import gr.uom.java.xmi.diff.SplitOperationRefactoring;
import gr.uom.java.xmi.diff.UMLAbstractClassDiff;
import gr.uom.java.xmi.diff.UMLAnonymousClassDiff;

import static org.codetracker.util.CommentTransitionAnalyzer.*;


public class BlockTrackerChangeHistory extends AbstractChangeHistory<Block> {
private final ChangeHistory<Block> blockChangeHistory = new ChangeHistory<>();
Expand Down Expand Up @@ -441,7 +417,7 @@ else if (mapping instanceof LeafMapping && mapping.getFragment1() instanceof Sta
break;
}
*/
case EXTRACT_FIXTURE:
// case EXTRACT_FIXTURE: TODO: upgrade RM version then uncomment
case MOVE_CODE: {
MoveCodeRefactoring moveCodeRefactoring = (MoveCodeRefactoring) refactoring;
Method extractedMethod = Method.of(moveCodeRefactoring.getTargetContainer(), currentVersion);
Expand Down Expand Up @@ -693,9 +669,43 @@ public boolean checkBodyOfMatchedOperations(Version currentVersion, Version pare
// check if it is in the matched
if (isMatched(umlOperationBodyMapper, currentVersion, parentVersion, equalOperator))
return true;
//Check if is added
//check if block got uncommented
if(isBlockUncommented(umlOperationBodyMapper, currentVersion, parentVersion, equalOperator)){
return true;
}
// Check if is added
return isAdded(umlOperationBodyMapper, currentVersion, parentVersion, equalOperator);
}
public boolean isBlockUncommented(UMLOperationBodyMapper umlOperationBodyMapper, Version currentVersion, Version parentVersion, Predicate<Block> equalOperator) {
List<CompositeStatementObject> currentNonMappedInnerNodes = umlOperationBodyMapper.getNonMappedInnerNodesT2();
UMLCommentListDiff umlCommentListDiff = umlOperationBodyMapper.getCommentListDiff();
List<UMLComment> deletedComments = umlCommentListDiff.getDeletedComments();
if(currentNonMappedInnerNodes.size() == 0 || deletedComments == null || deletedComments.isEmpty())
return false;
//reconstruct multiline block signature
Map<String, UMLComment> allDeletedCommentsHashMap = generateCommentTextHashMap(deletedComments);
Map<String, String> deletedCommentsBlockSignatureHashMap = generateUnCommentedBlockSignaturetHashMap(deletedComments);
if(deletedCommentsBlockSignatureHashMap.isEmpty())
return false;
for(CompositeStatementObject nonMappedInnerNode : currentNonMappedInnerNodes) {
String normalizedSignature = nonMappedInnerNode.getActualSignature().replaceAll("\\s+", " ").trim();
String hashOfNonMappedInnerNode = Util.getSHA512(normalizedSignature);
if (!deletedCommentsBlockSignatureHashMap.containsKey(hashOfNonMappedInnerNode))
continue;
Block blockAfter = Block.of(nonMappedInnerNode, umlOperationBodyMapper.getContainer2(), currentVersion);
if (!equalOperator.test(blockAfter))
continue;
//check block body continuity
if (!isBlockBodyUnchangedDuringUncomment(umlOperationBodyMapper, nonMappedInnerNode, allDeletedCommentsHashMap, blockAfter))
continue;
Block virtualBlockBefore = Block.of(nonMappedInnerNode, umlOperationBodyMapper.getContainer2(), parentVersion); // add metadata later, flag isVirtual = true;
blockChangeHistory.addChange(virtualBlockBefore, blockAfter, ChangeFactory.forBlock(Change.Type.UNCOMMENTED_BLOCK));
elements.add(virtualBlockBefore);
blockChangeHistory.connectRelatedNodes();
return true;
}
return false;
}

public boolean isBlockRefactored(Collection<Refactoring> refactorings, Version currentVersion, Version parentVersion, Predicate<Block> equalOperator) {
Set<Block> leftBlockSet = analyseBlockRefactorings(refactorings, currentVersion, parentVersion, equalOperator);
Expand Down Expand Up @@ -1137,7 +1147,16 @@ public boolean isMatched(UMLOperationBodyMapper umlOperationBodyMapper, Version
List<String> stringRepresentationBodyBefore = stringRepresentationBefore.subList(1, stringRepresentationBefore.size());
List<String> stringRepresentationBodyAfter = stringRepresentationAfter.subList(1, stringRepresentationAfter.size());
if (!stringRepresentationBodyBefore.equals(stringRepresentationBodyAfter)) {
blockChangeHistory.addChange(blockBefore, blockAfter, ChangeFactory.forBlock(Change.Type.BODY_CHANGE));
Set<Change.Type> commentTransitions = detectCommentTransitionsInsideMatchedBlock(umlOperationBodyMapper, blockBefore, blockAfter, currentVersion, parentVersion);
if(!commentTransitions.isEmpty()){
for(Change.Type changeType : commentTransitions){
blockChangeHistory.addChange(blockBefore, blockAfter, ChangeFactory.forBlock(changeType));
}
}
else{
blockChangeHistory.addChange(blockBefore, blockAfter, ChangeFactory.forBlock(Change.Type.BODY_CHANGE));
}

}
bodyChange = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ public boolean checkForExtractionOrInline(Version currentVersion, Version parent
}
break;
}
case EXTRACT_FIXTURE:
// case EXTRACT_FIXTURE:TODO: upgrade RM version then uncomment
case MOVE_CODE: {
MoveCodeRefactoring moveCodeRefactoring = (MoveCodeRefactoring) refactoring;
Method extractedMethod = Method.of(moveCodeRefactoring.getTargetContainer(), currentVersion);
Expand Down
Loading