package br.uff.ic.gems.peixeespadacliente.tool;
import br.uff.ic.gems.peixeespadacliente.exception.RefactoringException;
import br.uff.ic.gems.peixeespadacliente.model.ProjectVCS;
import br.uff.ic.gems.peixeespadacliente.resolution.Resolution;
import br.uff.ic.gems.peixeespadacliente.symptom.CleanImportSymptom;
import br.uff.ic.gems.peixeespadacliente.symptom.Symptom;
import java.util.ArrayList;
import java.util.List;
import net.sf.refactorit.classmodel.CompilationUnit;
import net.sf.refactorit.parser.ASTImpl;
import net.sf.refactorit.query.usage.InvocationData;
import net.sf.refactorit.refactorings.ImportUtils;
import net.sf.refactorit.refactorings.RefactoringStatus;
import net.sf.refactorit.source.edit.CompoundASTImpl;
import net.sf.refactorit.source.edit.StringEraser;
import net.sf.refactorit.transformations.TransformationManager;
import translation.Translate;
/**
*
* @author Heliomar, João Felipe
*/
public class CleanImports extends AbstractRefactoringTool {
private InvocationData currentInvocationData = null;
public CleanImports(ProjectVCS projectVCS) {
super(projectVCS);
}
@Override
public boolean prepareSymptom(Symptom symptom) throws RefactoringException {
loadEnvironment();
CleanImportSymptom cleanImportSymptom = (CleanImportSymptom) symptom;
CompilationUnit compilationUnit = getProject().getCompilationUnitForName(cleanImportSymptom.getCompilationUnitPath());
ASTImpl[] unusedImports = ImportUtils.listUnusedImports(compilationUnit);
for (ASTImpl aSTImpl : unusedImports) {
CompoundASTImpl node = new CompoundASTImpl(aSTImpl.getParent());
if (node.getText().equals(cleanImportSymptom.getImportText())) {
currentInvocationData = new InvocationData(null, compilationUnit, aSTImpl);
}
}
return true;
}
@Override
public List<Symptom> findAllSymptoms() throws RefactoringException {
if (!loadEnvironment()) {
return null;
}
List<Symptom> result = new ArrayList<Symptom>();
List<CompilationUnit> compilationUnits = getProject().getCompilationUnits();
for (int i = 0, max = compilationUnits.size(); i < max; i++) {
CompilationUnit compilationUnit = compilationUnits.get(i);
ASTImpl[] list = ImportUtils.listUnusedImports(compilationUnit);
for (ASTImpl aSTImpl : list) {
Symptom symptom = new CleanImportSymptom(aSTImpl, compilationUnit, this);
result.add(symptom);
}
}
return result;
}
@Override
public boolean applyCheckingPreAndPosCondictions(Resolution resolution) throws RefactoringException {
StringBuilder stringBuilder = new StringBuilder();
TransformationManager manager = new TransformationManager(null);
CompilationUnit sf = currentInvocationData.getCompilationUnit();
ASTImpl importNode = currentInvocationData.getWhereAst();
CompoundASTImpl node = new CompoundASTImpl(importNode.getParent());
final StringEraser eraser = new StringEraser(sf, node, true);
stringBuilder.append("\n -").append(node.getText());
manager.add(eraser);
RefactoringStatus status = manager.performTransformations();
if (status.isErrorOrFatal() || !status.isOk()) {
stringBuilder.append(Translate.getTranslate().notRefactored(status.getAllMessages()));
return false;
}
return true;
}
}