package br.uff.ic.gems.peixeespadacliente.conflicts;
import br.uff.ic.gems.peixeespadacliente.resolution.PullPushResolution;
import br.uff.ic.gems.peixeespadacliente.exception.RefactoringException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.refactorit.refactorings.RefactoringStatus;
import net.sf.refactorit.refactorings.conflicts.ChangedFunctionalityConflict;
import net.sf.refactorit.refactorings.conflicts.Conflict;
import net.sf.refactorit.refactorings.conflicts.ConflictData;
import net.sf.refactorit.refactorings.conflicts.ConflictModel;
import net.sf.refactorit.refactorings.conflicts.ConflictResolver;
import net.sf.refactorit.refactorings.conflicts.DeleteOtherImplementersConflict;
import net.sf.refactorit.refactorings.conflicts.MRUpDownMemberConflict;
import net.sf.refactorit.refactorings.conflicts.MRUpMemberConflict;
import net.sf.refactorit.refactorings.conflicts.UnresolvableConflict;
import net.sf.refactorit.refactorings.conflicts.resolution.ConflictResolution;
import net.sf.refactorit.refactorings.conflicts.resolution.DeleteOtherImplementersResolution;
import translation.Translate;
/**
*
* @author João Felipe
*/
public class ConflictManager {
private ConflictResolver resolver;
private List<RefactoringStatus.Entry> unresolvedConflictList;
private List<RefactoringStatus.Entry> resolvedConflictList;
private Map<Conflict, List> mapSugestion = new HashMap<Conflict, List>();
private List<Conflict> conflictList = new ArrayList<Conflict>();
private int[] resArray;
public ConflictManager(ConflictResolver resolver) throws RefactoringException {
this.resolver = resolver;
this.findUnresolvedAndResolvedConflicts();
this.findAllConflictsAndResolutions();
this.makeConflictList();
}
public void setResolver(ConflictResolver resolver) {
this.resolver = resolver;
}
public List<RefactoringStatus.Entry> getUnresolvedConflictList() {
return unresolvedConflictList;
}
public final void findUnresolvedAndResolvedConflicts() throws RefactoringException {
unresolvedConflictList = new ArrayList();
resolvedConflictList = new ArrayList();
ConflictModel conflictModel = new ConflictModel(resolver);
List binMembersToMove = resolver.getBinMembersToMove();
for (int i = 0, max = binMembersToMove.size(); i < max; i++) {
ConflictData data = resolver.getConflictData(binMembersToMove.get(i));
if (data.unresolvedConflictsExist()) {
RefactoringStatus status = conflictModel.getUnresolvedConflictsStatus(data);
if (status != null) {
List entries = status.getEntries();
unresolvedConflictList.add((RefactoringStatus.Entry) entries.get(0));
}
}
if (data.resolvedConflictsExist()) {
RefactoringStatus status = conflictModel.getResolvedConflictsStatus(data);
if (status != null) {
List entries = status.getEntries();
resolvedConflictList.add((RefactoringStatus.Entry) entries.get(0));
}
}
}
}
public final void findResolvedConflicts() throws RefactoringException {
resolvedConflictList = new ArrayList();
ConflictModel conflictModel = new ConflictModel(resolver);
List binMembersToMove = resolver.getBinMembersToMove();
for (int i = 0, max = binMembersToMove.size(); i < max; i++) {
ConflictData data = resolver.getConflictData(binMembersToMove.get(i));
if (data.resolvedConflictsExist()) {
RefactoringStatus status = conflictModel.getResolvedConflictsStatus(
data);
if (status == null) {
continue;
}
List entries = status.getEntries();
resolvedConflictList.add((RefactoringStatus.Entry) entries.get(0));
}
}
}
public boolean isUnresovableConflictsExists() {
for (RefactoringStatus.Entry unresolvedConflict : unresolvedConflictList) {
Object entryBin = unresolvedConflict.getBin();
if (!resolver.getConflictData(entryBin).unresolvableConflictsExist()) {
Conflict conflict = findLastConflict(unresolvedConflict);
List resolutionList = getResolutionsList(conflict);
if (resolutionList.isEmpty()) {
return true;
}
} else {
return true;
}
}
return false;
}
public List<ConflictWithResolution> prepareNextResolutionAnagram() {
if (incrementResArrayIndex(0)) {
return readResArray();
} else {
return null;
}
}
public void reloadResolutions(PullPushResolution sequence, StringBuilder builder) throws RefactoringException {
int count = 0;
while (sequence.getResolutions().size() > count) {
findUnresolvedAndResolvedConflicts();
findAllConflictsAndResolutions();
List<Conflict> conflicts = new ArrayList<Conflict>();
conflicts.clear();
conflicts.addAll(mapSugestion.keySet());
for (Conflict conflict : conflicts) {
count++;
ConflictResolution resolution;
try {
PullPushConflictResolution pullPushResolution = sequence.getResolutions().get(conflict.getDescription());
resolution = getResolution(mapSugestion.get(conflict), pullPushResolution);
} catch (Exception e) {
PullPushConflictResolution pullPushResolution = sequence.getResolutions().get(conflict.getDescription());
resolution = getResolution(mapSugestion.get(conflict), pullPushResolution);
throw new RefactoringException(e);
}
ConflictWithResolution conflictWithResolution = new ConflictWithResolution(conflict, resolution, resolver);
conflictWithResolution.resolveConflict();
resolutionMessage(resolution, builder, conflict);
}
resolver.resolveConflicts();
findUnresolvedAndResolvedConflicts();
}
if (sequence.getResolutions().isEmpty()) {
resolver.resolveConflicts();
findUnresolvedAndResolvedConflicts();
}
}
public void resolutionMessage(ConflictResolution resolution, StringBuilder builder, Conflict conflict) {
Translate translate = Translate.getTranslate();
if (conflict != null) {
builder.append(translate.conflictSelected());
translate.conflictDescription(builder, conflict.getDescription());
}
translate.resolutionDescription(builder, resolution.getDescription());
List downMembers = resolution.getDownMembers();
if (!downMembers.isEmpty()) {
for (Object object : downMembers) {
try {
Class classe = Class.forName(object.getClass().getName());
Method metodo = classe.getMethod("getQualifiedName", new Class[0]);
String mensagem = (String) metodo.invoke(object, new Object[0]);
translate.resolutionItem(builder, mensagem);
} catch (Exception ex) {
System.out.println("Aqui");
}
}
}
}
private List getResolutionsList(Conflict conflict) {
List retorno = new ArrayList();
if (conflict == null) {
} else if (conflict instanceof UnresolvableConflict) {
} else if (conflict instanceof ChangedFunctionalityConflict) {
// conflict.setResolution(null);
// retorno.add(conflict.getResolution());
} else if (conflict instanceof MRUpMemberConflict) {
retorno = ((MRUpMemberConflict) conflict).getPossibleResolutions();
} else if (conflict instanceof DeleteOtherImplementersConflict) {
retorno.add(new DeleteOtherImplementersResolution(((DeleteOtherImplementersConflict) conflict).getDownMembers()));
// conflict.setResolution(null);
} else if (conflict instanceof MRUpDownMemberConflict) {
retorno = ((MRUpDownMemberConflict) conflict).getPossibleResolutions();
} else {
//CreateOnlyDeclarationConflict, AddImplementationConflict,
//OtherImplementersExistConflict, MakeStaticConflict,
//SubstituteAbstractMethodConflict, MoveDependentConflict,
//WeakAccessConflict, MockConflict*
retorno.add(conflict.getResolution());
}
return retorno;
}
private Conflict findLastConflict(RefactoringStatus.Entry unresolved) {
Conflict conflict = null;
if (unresolved.getSubEntries() == null) {
conflict = unresolved.getConflict();
} else {
for (Object subEntry : unresolved.getSubEntries()) {
Conflict temp = findLastConflict((RefactoringStatus.Entry) subEntry);
if (temp != null) {
conflict = temp;
} else {
conflict = ((RefactoringStatus.Entry) subEntry).getConflict();
}
if (conflict != null) {
break;
}
}
}
return conflict;
}
private boolean findAllConflictsAndResolutions() {
mapSugestion.clear();
for (RefactoringStatus.Entry unresolvedConflict : unresolvedConflictList) {
Object entryBin = unresolvedConflict.getBin();
if (!resolver.getConflictData(entryBin).unresolvableConflictsExist()) {
Conflict conflict = findLastConflict(unresolvedConflict);
List resolutionList = getResolutionsList(conflict);
if (resolutionList.isEmpty()) {
return false;
} else {
mapSugestion.put(conflict, resolutionList);
}
} else {
return false;
}
}
return true;
}
private void makeConflictList() {
conflictList.clear();
conflictList.addAll(mapSugestion.keySet());
resArray = new int[conflictList.size()];
if (!conflictList.isEmpty()) {
resArray[0] = -1;
}
}
private List<ConflictWithResolution> readResArray() {
List<ConflictWithResolution> result = new ArrayList<ConflictWithResolution>();
for (int i = 0; i < resArray.length; i++) {
Conflict conflict = conflictList.get(i);
ConflictResolution resolution = (ConflictResolution) mapSugestion.get(conflict).get(resArray[i]);
result.add(new ConflictWithResolution(conflict, resolution, resolver));
}
return result;
}
private boolean incrementResArrayIndex(int index) {
try {
resArray[index] = resArray[index] + 1;
if (resArray[index] == mapSugestion.get(conflictList.get(index)).size()) {
resArray[index] = 0;
return incrementResArrayIndex(index + 1);
}
return true;
} catch (Exception e) {
return false;
}
}
private ConflictResolution getResolution(List resolutions, PullPushConflictResolution conflictResolution) {
for (Object r : resolutions) {
if (conflictResolution.equals((ConflictResolution) r)) {
return (ConflictResolution) r;
}
}
return null;
}
// MockConflict -> Não achei
// UpMemberConflict:
// CreateOnlyDeclarationConflict -> getResolution() -
// ChangedFunctionalityConflict: getResolution() -
// MethodInheritanceConflict: getResolution() =
// OverridesMethodsConflict -> getResolution() =
// OverridenMethodConflict -> getResolution() =
// MRUpMemberConflict: -
// DeclarationOfDefinitionConflict -> getPossibleResolutions =
// UpDownMemberConflict:
// AddImplementationConflict -> getResolution() -
// DeleteOtherImplementersConflict -> new DeleteOtherImplementersResolution -
// OtherImplementersExistConflict -> getResolution() -
// MRUpDownMemberConflict: => getPossibleResolutions -
// MRUsedByConflict -> getPossibleResolutions * =
// MRUsesConflict -> getPossibleResolutions =
// MakeStaticConflit -> getResolution() -
// SubstituteAbstractMethodConflict -> getResolution() -
// MoveDependentConflict -> getResolution() -
// UnresolvableConflict -> null -
// ImportNotPossibleConflict =
// InstanceNotAccessibleConflict =
// WeakAccessConflict -> getResolution() -
}