From 4507f51b8aadb123ba616fe9116a9cb6bbcd050b Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 30 Oct 2020 14:59:17 +0100 Subject: [PATCH] IDEA-250250 broken extension must not break "New Project" action GitOrigin-RevId: 58c373558b48dd9fd83bee61de7dc38e7c071f12 --- .../ide/projectWizard/ProjectCategory.java | 9 +---- .../ide/projectWizard/ProjectTypeStep.java | 39 +++++++++++-------- .../util/newProjectWizard/TemplatesGroup.java | 21 ++-------- .../ide/util/projectWizard/ModuleBuilder.java | 25 ++++++------ .../openapi/module/ModuleTypeManager.java | 4 +- .../module/impl/ModuleTypeManagerImpl.java | 10 ++--- 6 files changed, 48 insertions(+), 60 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java index a851b3c83bf2..d7739e8c8972 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectCategory.java @@ -1,21 +1,14 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.projectWizard; import com.intellij.ide.util.frameworkSupport.FrameworkRole; import com.intellij.ide.util.projectWizard.ModuleBuilder; -import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.util.ArrayUtilRt; import org.jetbrains.annotations.NotNull; import javax.swing.*; -/** - * @author Dmitry Avdeev - */ public abstract class ProjectCategory { - - public static final ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.projectWizard.projectCategory"); - @NotNull public abstract ModuleBuilder createModuleBuilder(); diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java index 24d9c181a9dd..4d73fc516f8e 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -16,6 +16,7 @@ import com.intellij.internal.statistic.utils.PluginInfoDetectorKt; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.WebModuleTypeBase; @@ -68,8 +69,10 @@ import java.util.*; @SuppressWarnings("unchecked") public final class ProjectTypeStep extends ModuleWizardStep implements SettingsStep, Disposable { private static final Logger LOG = Logger.getInstance(ProjectTypeStep.class); + private static final ExtensionPointName EP_NAME = + new ExtensionPointName<>("com.intellij.projectWizard.projectCategory"); - private static final Convertor PROVIDER_STRING_CONVERTOR = + private static final Convertor PROVIDER_STRING_CONVERTOR = o -> o.getId(); private static final Function NODE_STRING_FUNCTION = FrameworkSupportNodeBase::getId; private static final String TEMPLATES_CARD = "templates card"; @@ -246,35 +249,37 @@ public final class ProjectTypeStep extends ModuleWizardStep implements SettingsS return FRAMEWORKS_CARD.equals(myCurrentCard) && getSelectedBuilder().equals(myContext.getProjectBuilder()); } - private List fillTemplatesMap(WizardContext context) { - + private @NotNull List fillTemplatesMap(@NotNull WizardContext context) { List builders = ModuleBuilder.getAllBuilders(); if (context.isCreatingNewProject()) { builders.add(new EmptyModuleBuilder()); } Map groupMap = new HashMap<>(); for (ModuleBuilder builder : builders) { - BuilderBasedTemplate template = new BuilderBasedTemplate(builder); - if (builder.isTemplate()) { - TemplatesGroup group = groupMap.get(builder.getGroupName()); - if (group == null) { - group = new TemplatesGroup(builder); + try { + BuilderBasedTemplate template = new BuilderBasedTemplate(builder); + if (builder.isTemplate()) { + TemplatesGroup group = groupMap.get(builder.getGroupName()); + if (group == null) { + group = new TemplatesGroup(builder); + } + myTemplatesMap.putValue(group, template); + } + else { + TemplatesGroup group = new TemplatesGroup(builder); + groupMap.put(group.getName(), group); + myTemplatesMap.put(group, new ArrayList<>()); } - myTemplatesMap.putValue(group, template); } - else { - TemplatesGroup group = new TemplatesGroup(builder); - groupMap.put(group.getName(), group); - myTemplatesMap.put(group, new ArrayList<>()); + catch (Throwable e) { + LOG.error(e); } } - MultiMap map = getTemplatesMap(context); - myTemplatesMap.putAllValues(map); + myTemplatesMap.putAllValues(getTemplatesMap(context)); - for (ProjectCategory category : ProjectCategory.EXTENSION_POINT_NAME.getExtensions()) { + for (ProjectCategory category : EP_NAME.getExtensionList()) { TemplatesGroup group = new TemplatesGroup(category); - ModuleBuilder builder = group.getModuleBuilder(); if (builder == null || builder.isAvailable()) { myTemplatesMap.remove(group); diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/TemplatesGroup.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/TemplatesGroup.java index cdfc4301314c..1ab11bfd35fa 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/TemplatesGroup.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/TemplatesGroup.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.util.newProjectWizard; import com.intellij.ide.projectWizard.ProjectCategory; @@ -30,8 +16,7 @@ import javax.swing.*; * The groups are shown in "Project Type" selection list. * @author Dmitry Avdeev */ -public class TemplatesGroup implements Comparable { - +public final class TemplatesGroup implements Comparable { private final String myName; private final String myDescription; private final Icon myIcon; @@ -61,7 +46,7 @@ public class TemplatesGroup implements Comparable { myProjectCategory = category; } - public TemplatesGroup(ModuleBuilder builder) { + public TemplatesGroup(@NotNull ModuleBuilder builder) { this(builder.getPresentableName(), builder.getDescription(), builder.getNodeIcon(), builder.getWeight(), builder.getParentGroup(), builder.getBuilderId(), builder); } diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java index 10fd0222da0d..cca65796dde7 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ModuleBuilder.java @@ -30,7 +30,6 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.GuiUtils; import com.intellij.util.EventDispatcher; -import com.intellij.util.containers.ContainerUtil; import org.jdom.JDOMException; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; @@ -43,8 +42,7 @@ import java.io.IOException; import java.util.*; public abstract class ModuleBuilder extends AbstractModuleBuilder { - - public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.moduleBuilder"); + private static final ExtensionPointName EP_NAME = new ExtensionPointName<>("com.intellij.moduleBuilder"); private static final Logger LOG = Logger.getInstance(ModuleBuilder.class); private final Set myUpdaters = new HashSet<>(); @@ -59,16 +57,21 @@ public abstract class ModuleBuilder extends AbstractModuleBuilder { return Collections.emptyList(); } - @NotNull - public static List getAllBuilders() { + public static @NotNull List getAllBuilders() { List result = new ArrayList<>(); - for (final ModuleType moduleType : ModuleTypeManager.getInstance().getRegisteredTypes()) { - result.add(moduleType.createModuleBuilder()); + for (ModuleType moduleType : ModuleTypeManager.getInstance().getRegisteredTypes()) { + ModuleBuilder builder = moduleType.createModuleBuilder(); + if (builder.isAvailable()) { + result.add(builder); + } } - for (ModuleBuilderFactory factory : EP_NAME.getExtensions()) { - result.add(factory.createBuilder()); - } - return ContainerUtil.filter(result, moduleBuilder -> moduleBuilder.isAvailable()); + EP_NAME.forEachExtensionSafe(factory -> { + ModuleBuilder builder = factory.createBuilder(); + if (builder.isAvailable()) { + result.add(builder); + } + }); + return result; } public static void deleteModuleFile(String moduleFilePath) { diff --git a/platform/lang-api/src/com/intellij/openapi/module/ModuleTypeManager.java b/platform/lang-api/src/com/intellij/openapi/module/ModuleTypeManager.java index dc1913cb7a81..4e5bfc56ca03 100644 --- a/platform/lang-api/src/com/intellij/openapi/module/ModuleTypeManager.java +++ b/platform/lang-api/src/com/intellij/openapi/module/ModuleTypeManager.java @@ -6,6 +6,8 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public abstract class ModuleTypeManager { public static ModuleTypeManager getInstance() { return ApplicationManager.getApplication().getService(ModuleTypeManager.class); @@ -21,7 +23,7 @@ public abstract class ModuleTypeManager { @ApiStatus.Internal public abstract void unregisterModuleType(ModuleType type); - public abstract ModuleType[] getRegisteredTypes(); + public abstract @NotNull List> getRegisteredTypes(); public abstract ModuleType findByID(@Nullable String moduleTypeID); diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleTypeManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleTypeManagerImpl.java index 47f8de152f59..4362a929ce30 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleTypeManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleTypeManagerImpl.java @@ -52,15 +52,15 @@ public class ModuleTypeManagerImpl extends ModuleTypeManager { } @Override - public ModuleType[] getRegisteredTypes() { + public @NotNull List> getRegisteredTypes() { List> result = new ArrayList<>(myModuleTypes.keySet()); - for (ModuleTypeEP moduleTypeEP : EP_NAME.getExtensionList()) { - ModuleType moduleType = moduleTypeEP.getModuleType(); + EP_NAME.forEachExtensionSafe(ep -> { + ModuleType moduleType = ep.getModuleType(); if (!myModuleTypes.containsKey(moduleType)) { result.add(moduleType); } - } - return result.toArray(new ModuleType[0]); + }); + return result; } @Override