gr.uom.java.xmi.diff.UMLAnonymousToClassDiff Maven / Gradle / Ivy
package gr.uom.java.xmi.diff;
import org.apache.commons.lang3.tuple.Pair;
import org.refactoringminer.api.RefactoringMinerTimedOutException;
import gr.uom.java.xmi.UMLAnonymousClass;
import gr.uom.java.xmi.UMLAttribute;
import gr.uom.java.xmi.UMLClass;
import gr.uom.java.xmi.UMLOperation;
import gr.uom.java.xmi.decomposition.UMLOperationBodyMapper;
public class UMLAnonymousToClassDiff extends UMLAbstractClassDiff {
public UMLAnonymousToClassDiff(UMLAnonymousClass originalClass, UMLClass nextClass, UMLModelDiff modelDiff) {
super(originalClass, nextClass, modelDiff);
}
public UMLAnonymousClass getOriginalClass() {
return (UMLAnonymousClass) originalClass;
}
public UMLClass getNextClass() {
return (UMLClass) nextClass;
}
@Override
public void process() throws RefactoringMinerTimedOutException {
processOperations();
processAttributes();
}
@Override
protected void checkForAttributeChanges() throws RefactoringMinerTimedOutException {
//optional step
}
@Override
protected void createBodyMappers() throws RefactoringMinerTimedOutException {
//optional step
}
public boolean containsStatementMappings() {
for(UMLOperationBodyMapper mapper : operationBodyMapperList) {
if(mapper.getMappings().size() > 0) {
return true;
}
}
return false;
}
protected void processOperations() throws RefactoringMinerTimedOutException {
for(UMLOperation operation : originalClass.getOperations()) {
UMLOperation operationWithTheSameSignature = nextClass.operationWithTheSameSignatureIgnoringChangedTypes(operation);
if(operationWithTheSameSignature == null) {
this.removedOperations.add(operation);
}
else if(!mapperListContainsOperation(operation, operationWithTheSameSignature)) {
UMLOperationBodyMapper mapper = new UMLOperationBodyMapper(operation, operationWithTheSameSignature, this);
this.operationBodyMapperList.add(mapper);
}
}
for(UMLOperation operation : nextClass.getOperations()) {
UMLOperation operationWithTheSameSignature = originalClass.operationWithTheSameSignatureIgnoringChangedTypes(operation);
if(operationWithTheSameSignature == null) {
this.addedOperations.add(operation);
}
else if(!mapperListContainsOperation(operationWithTheSameSignature, operation)) {
UMLOperationBodyMapper mapper = new UMLOperationBodyMapper(operationWithTheSameSignature, operation, this);
this.operationBodyMapperList.add(mapper);
}
}
}
protected void processAttributes() throws RefactoringMinerTimedOutException {
for(UMLAttribute attribute : originalClass.getAttributes()) {
UMLAttribute attributeWithTheSameName = nextClass.attributeWithTheSameNameIgnoringChangedType(attribute);
if(attributeWithTheSameName == null) {
this.removedAttributes.add(attribute);
}
else if(!attributeDiffListContainsAttribute(attribute, attributeWithTheSameName)) {
UMLAttributeDiff attributeDiff = new UMLAttributeDiff(attribute, attributeWithTheSameName, this, modelDiff);
if(!attributeDiff.isEmpty()) {
refactorings.addAll(attributeDiff.getRefactorings());
if(!attributeDiffList.contains(attributeDiff)) {
attributeDiffList.add(attributeDiff);
}
}
else {
Pair pair = Pair.of(attribute, attributeWithTheSameName);
if(!commonAtrributes.contains(pair)) {
commonAtrributes.add(pair);
}
if(attributeDiff.encapsulated()) {
refactorings.addAll(attributeDiff.getRefactorings());
}
}
}
}
for(UMLAttribute attribute : nextClass.getAttributes()) {
UMLAttribute attributeWithTheSameName = originalClass.attributeWithTheSameNameIgnoringChangedType(attribute);
if(attributeWithTheSameName == null) {
this.addedAttributes.add(attribute);
}
else if(!attributeDiffListContainsAttribute(attributeWithTheSameName, attribute)) {
UMLAttributeDiff attributeDiff = new UMLAttributeDiff(attributeWithTheSameName, attribute, this, modelDiff);
if(!attributeDiff.isEmpty()) {
refactorings.addAll(attributeDiff.getRefactorings());
if(!attributeDiffList.contains(attributeDiff)) {
attributeDiffList.add(attributeDiff);
}
}
else {
Pair pair = Pair.of(attributeWithTheSameName, attribute);
if(!commonAtrributes.contains(pair)) {
commonAtrributes.add(pair);
}
if(attributeDiff.encapsulated()) {
refactorings.addAll(attributeDiff.getRefactorings());
}
}
}
}
}
private boolean attributeDiffListContainsAttribute(UMLAttribute attribute1, UMLAttribute attribute2) {
for(UMLAttributeDiff diff : attributeDiffList) {
if(diff.getRemovedAttribute().equals(attribute1) || diff.getAddedAttribute().equals(attribute2))
return true;
}
return false;
}
}