diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java index 729972d24cdf..64018fe883de 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java @@ -285,7 +285,7 @@ public class AddSupportForFrameworksPanel implements Disposable { String underlyingFrameworkId = provider.getUnderlyingFrameworkId(); FrameworkSupportNode parentNode = null; if (underlyingFrameworkId != null) { - FrameworkSupportProvider parentProvider = findProvider(underlyingFrameworkId); + FrameworkSupportProvider parentProvider = findProvider(underlyingFrameworkId, myProviders); if (parentProvider == null) { LOG.info("Cannot find id = " + underlyingFrameworkId); return null; @@ -300,8 +300,8 @@ public class AddSupportForFrameworksPanel implements Disposable { } @Nullable - private FrameworkSupportProvider findProvider(@NotNull String id) { - for (FrameworkSupportProvider provider : myProviders) { + private static FrameworkSupportProvider findProvider(@NotNull String id, final List providers) { + for (FrameworkSupportProvider provider : providers) { if (id.equals(provider.getId())) { return provider; } @@ -362,13 +362,7 @@ public class AddSupportForFrameworksPanel implements Disposable { } private void sortFrameworks(final List nodes) { - DFSTBuilder builder = new DFSTBuilder(GraphGenerator.create(CachingSemiGraph.create(new ProvidersGraph(myProviders)))); - if (!builder.isAcyclic()) { - Pair pair = builder.getCircularDependency(); - LOG.error("Circular dependency between providers '" + pair.getFirst().getId() + "' and '" + pair.getSecond().getId() + "' was found."); - } - - final Comparator comparator = builder.comparator(); + final Comparator comparator = getFrameworkSupportProvidersComparator(myProviders); Collections.sort(nodes, new Comparator() { public int compare(final FrameworkSupportNode o1, final FrameworkSupportNode o2) { return comparator.compare(o1.getProvider(), o2.getProvider()); @@ -376,7 +370,19 @@ public class AddSupportForFrameworksPanel implements Disposable { }); } - private class ProvidersGraph implements GraphGenerator.SemiGraph { + public static Comparator getFrameworkSupportProvidersComparator(final List providers) { + DFSTBuilder + builder = new DFSTBuilder(GraphGenerator.create(CachingSemiGraph.create( + new ProvidersGraph(providers)))); + if (!builder.isAcyclic()) { + Pair pair = builder.getCircularDependency(); + LOG.error("Circular dependency between providers '" + pair.getFirst().getId() + "' and '" + pair.getSecond().getId() + "' was found."); + } + + return builder.comparator(); + } + + private static class ProvidersGraph implements GraphGenerator.SemiGraph { private final List myFrameworkSupportProviders; public ProvidersGraph(final List frameworkSupportProviders) { @@ -392,13 +398,13 @@ public class AddSupportForFrameworksPanel implements Disposable { List dependencies = new ArrayList(); String underlyingId = provider.getUnderlyingFrameworkId(); if (underlyingId != null) { - FrameworkSupportProvider underlyingProvider = findProvider(underlyingId); + FrameworkSupportProvider underlyingProvider = findProvider(underlyingId, myFrameworkSupportProviders); if (underlyingProvider != null) { dependencies.add(underlyingProvider); } } for (String id : ids) { - FrameworkSupportProvider dependency = findProvider(id); + FrameworkSupportProvider dependency = findProvider(id, myFrameworkSupportProviders); if (dependency != null) { dependencies.add(dependency); } diff --git a/java/java-tests/testSrc/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderTestCase.java b/java/java-tests/testSrc/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderTestCase.java index eb63696cd21a..9b843125a545 100644 --- a/java/java-tests/testSrc/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderTestCase.java +++ b/java/java-tests/testSrc/com/intellij/ide/util/frameworkSupport/FrameworkSupportProviderTestCase.java @@ -4,6 +4,7 @@ import com.intellij.facet.Facet; import com.intellij.facet.FacetManager; import com.intellij.facet.FacetTypeId; import com.intellij.facet.ui.FacetBasedFrameworkSupportProvider; +import com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksPanel; import com.intellij.ide.util.newProjectWizard.FrameworkSupportNode; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportCommunicator; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelImpl; @@ -31,7 +32,9 @@ public abstract class FrameworkSupportProviderTestCase extends IdeaTestCase { super.setUp(); myFrameworkSupportModel = new FrameworkSupportModelImpl(getProject(), null); myNodes = new HashMap(); - for (FrameworkSupportProvider provider : FrameworkSupportProvider.EXTENSION_POINT.getExtensions()) { + final FrameworkSupportProvider[] providers = FrameworkSupportProvider.EXTENSION_POINT.getExtensions().clone(); + Arrays.sort(providers, AddSupportForFrameworksPanel.getFrameworkSupportProvidersComparator(new ArrayList(Arrays.asList(providers)))); + for (FrameworkSupportProvider provider : providers) { final FrameworkSupportNode node = new FrameworkSupportNode(provider, null, myFrameworkSupportModel, null, getTestRootDisposable()); myNodes.put(provider, node); myFrameworkSupportModel.registerComponent(provider, node);