diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java | 88 |
1 files changed, 36 insertions, 52 deletions
diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java index a101cd47c5..7b2d619d6e 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java @@ -39,8 +39,6 @@ import org.eclipse.ui.PlatformUI; import java.io.File; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -338,9 +336,45 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup Map<SetupTask, SetupTask> substitutions = getSubstitutions(setupTasks); setup = copySetup(setupTasks, substitutions); + reorder(setupTasks); + perform(setupTasks); } + private void reorder(EList<SetupTask> setupTasks) + { + for (int i = 0, size = setupTasks.size(), count = 0; i < size; ++i) + { + SetupTask setupTask = setupTasks.get(i); + if (count == size) + { + throw new IllegalArgumentException("Circular requirements " + setupTask); + } + + EList<SetupTask> requirements = setupTask.getRequirements(); + boolean changed = false; + for (SetupTask requirement : requirements) + { + int index = setupTasks.indexOf(requirement); + if (index > i) + { + setupTasks.move(i, index); + changed = true; + } + } + + if (changed) + { + --i; + ++count; + } + else + { + count = 0; + } + } + } + private void perform(EList<SetupTask> setupTasks) throws Exception { final EList<SetupTask> neededTasks = getNeededTasks(setupTasks); @@ -383,8 +417,6 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup private Map<SetupTask, SetupTask> getSubstitutions(EList<SetupTask> setupTasks) { - SetupTaskComparator.sort(setupTasks); - Map<Object, SetupTask> overrides = new HashMap<Object, SetupTask>(); Map<SetupTask, SetupTask> substitutions = new HashMap<SetupTask, SetupTask>(); @@ -457,7 +489,6 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup } } - SetupTaskComparator.sort(setupTasks); return setup; } @@ -490,51 +521,4 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup { SetupTaskPerformer.progress = progress; } - - /** - * @author Eike Stepper - */ - public static class SetupTaskComparator implements Comparator<SetupTask> - { - public static void sort(EList<SetupTask> setupTasks) - { - Collections.sort(setupTasks, new SetupTaskComparator()); - } - - public int compare(SetupTask t1, SetupTask t2) - { - boolean t1RequiresT2 = t1.requires(t2); - boolean t2RequiresT1 = t2.requires(t1); - if (t1RequiresT2 && t2RequiresT1) - { - throw new IllegalStateException("Requirements cycle detected between " + t1 + " and " + t2); - } - - if (t1RequiresT2 && !t2RequiresT1) - { - return 1; - } - - if (!t1RequiresT2 && t2RequiresT1) - { - return -1; - } - - int scope1 = t1.getScope().getValue(); - int scope2 = t2.getScope().getValue(); - if (scope1 < scope2) - { - return -1; - } - - if (scope1 > scope2) - { - return 1; - } - - String uri1 = EcoreUtil.getURI(t1).toString(); - String uri2 = EcoreUtil.getURI(t2).toString(); - return uri1.compareTo(uri2); // Arbitrary but symmetric within one ResourceSet - } - } } |