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.EncapsulateSymptom;
import br.uff.ic.gems.peixeespadacliente.symptom.Symptom;
import java.util.ArrayList;
import java.util.List;
import net.sf.refactorit.classmodel.BinCIType;
import net.sf.refactorit.classmodel.BinCITypeRef;
import net.sf.refactorit.classmodel.BinField;
import net.sf.refactorit.classmodel.BinModifier;
import net.sf.refactorit.refactorings.PropertyNameUtil;
import net.sf.refactorit.refactorings.RefactoringStatus;
import net.sf.refactorit.refactorings.encapsulatefield.EncapsulateField;
import net.sf.refactorit.test.refactorings.NullContext;
import translation.Translate;
/**
*
* @author Heliomar, João Felipe
*/
public class EncapsulateFields extends AbstractRefactoringTool {
private BinField currentField;
public EncapsulateFields(ProjectVCS projectVCS) {
super(projectVCS);
}
@Override
public boolean prepareSymptom(Symptom symptom) throws RefactoringException {
loadEnvironment();
EncapsulateSymptom encapsulateSymptom = (EncapsulateSymptom) symptom;
BinCIType owner = getProject().getTypeRefForSourceName(encapsulateSymptom.getParentQualifiedName()).getBinCIType();
currentField = owner.getDeclaredField(encapsulateSymptom.getMemberName());
return true;
}
@Override
public List<Symptom> findAllSymptoms() throws RefactoringException {
if (!loadEnvironment()) {
return null;
}
List<Symptom> result = new ArrayList<Symptom>();
for (Object object : getProject().getDefinedTypes()) {
BinCITypeRef binCITypeRef = (BinCITypeRef) object;
BinCIType bcitr = binCITypeRef.getBinCIType();
if (!classShouldBeVerified(binCITypeRef)) {
continue;
}
int fim = bcitr.getDeclaredFields() != null ? bcitr.getDeclaredFields().length : 0;
for (int i = 0; i < fim; i++) {
BinField field = binCITypeRef.getBinCIType().getDeclaredFields()[i];
if (field.getModifiers() <= BinModifier.PUBLIC) {
Symptom symptom = new EncapsulateSymptom(field, this);
result.add(symptom);
}
}
}
return result;
}
@Override
public boolean applyCheckingPreAndPosCondictions(Resolution resolution) throws RefactoringException {
Translate translate = Translate.getTranslate();
EncapsulateField encapsulator = new EncapsulateField(new NullContext(currentField.getProject()), currentField);
refactoring = encapsulator;
// SetupUtils.setup(project);
RefactoringStatus status = checkPreconditions();
if (status.isErrorOrFatal()) {
System.err.println(translate.notRefactored(status.getAllMessages()));
return false;
}
String setterName = PropertyNameUtil.getDefaultSetterName(currentField);
String getterName = PropertyNameUtil.getDefaultGetterName(currentField)[0];
encapsulator.setGetterName(getterName);
encapsulator.setSetterName(setterName);
encapsulator.setUsages(encapsulator.getAllUsages());
encapsulator.setFieldVisibility(BinModifier.PRIVATE);
encapsulator.setEncapsulateRead(true);
encapsulator.setEncapsulateWrite(true);
status.merge(checkUserInput());
status.merge(encapsulator.apply());
if (!status.isOk()) {
System.err.println(translate.error(status.getAllMessages()));
return false;
}
System.out.println(status.getAllMessages());
return true;
}
}