/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.diff.merge;
import java.util.Vector;
import org.openflexo.diff.merge.MergeChange.MergeChangeSource;
public class AutomaticMergeResolvingModel implements AutomaticMergeResolvingModelInterface {
private Vector<AutomaticMergeResolvingRule> _primaryRules;
private Vector<AutomaticMergeResolvingRule> _detailedRules;
public AutomaticMergeResolvingModel() {
super();
_primaryRules = new Vector<AutomaticMergeResolvingRule>();
_detailedRules = new Vector<AutomaticMergeResolvingRule>();
}
public void addToPrimaryRules(AutomaticMergeResolvingRule aRule) {
_primaryRules.add(aRule);
}
public void addToDetailedRules(AutomaticMergeResolvingRule aRule) {
_detailedRules.add(aRule);
}
@Override
public boolean resolve(MergeChange change) {
// System.out.println("Resolve "+change);
if (change.getMergeChangeSource() == MergeChangeSource.Conflict) {
if (change.getMerge() instanceof DetailedMerge) {
// This is a change from a detailed merge,
// review all detailed rules
for (AutomaticMergeResolvingRule rule : _detailedRules) {
if (rule.isApplicable(change)) {
// This rule apply, ok return result
// return rule.getMergedResult(change);
change.setAutomaticResolvedMerge(rule.getMergedResult(change));
change.setAutomaticMergeReason(localizedForKey(rule.getDescription()));
return true;
}
}
// Not resolvable
return false;
// return null;
} else {
// This is a change that might be tokenized
// Before to analyse deeply, look if a primary
// rule may resolve conflict
for (AutomaticMergeResolvingRule rule : _primaryRules) {
if (rule.isApplicable(change)) {
// This rule apply, ok return result
// return rule.getMergedResult(change);
change.setAutomaticResolvedMerge(rule.getMergedResult(change));
change.setAutomaticMergeReason(localizedForKey(rule.getDescription()));
return true;
}
}
DetailedMerge detailedMerge = change.getDetailedMerge();
for (MergeChange c : detailedMerge.getChanges()) {
if (!resolve(c)) {
// At least one change was not resolvable, return null
return false;
// return null;
}
}
// Arriving here means that all changes were resolved,
// and thus that the supplied change is resolved
change.setAutomaticResolvedMerge(detailedMerge.getMergedSource().getText());
change.setAutomaticMergeReason(localizedForKey("all_changes_are_resolved_by_detailed_analysis"));
return true;
}
} else {
return true;
// return change.getMergeChangeResult().merge;
}
}
protected String localizedForKey(String key) {
return key;
}
}