/* * Copyright 2003-2011 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. */ package jetbrains.mps.plugins.applicationplugins; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.extensions.PluginId; import jetbrains.mps.ide.MPSCoreComponents; import jetbrains.mps.plugins.BasePluginManager; import jetbrains.mps.plugins.PluginContributor; import jetbrains.mps.plugins.PluginLoaderRegistry; import jetbrains.mps.workbench.action.IActionsRegistry; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.workbench.action.IRegistryManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.*; /** * Is a {@link BasePluginManager} which is responsible for loading application plugins {@link BaseApplicationPlugin}; * Triggered from the superclass (#afterPluginsCreated) */ public class ApplicationPluginManager extends BasePluginManager<BaseApplicationPlugin> implements ApplicationComponent, IRegistryManager { private static final Logger LOG = LogManager.getLogger(ApplicationPluginManager.class); private volatile boolean myInitialized = false; /** * FIXME * WARNING: the dependency on Ide_PluginInitializer is a hack. We need either to init ide plugin explicitly or remove the plugin factories at all, * replace them with usual application_components and project_components. */ public ApplicationPluginManager(MPSCoreComponents coreComponents, PluginLoaderRegistry pluginLoaderRegistry) { super(coreComponents.getModuleRepository(), pluginLoaderRegistry); } public BaseApplicationPlugin getPlugin(PluginId id) { for (BaseApplicationPlugin p : getPlugins()) { if (p.getId() == id) { return p; } } return null; } @Override public IActionsRegistry getActionsRegistry(PluginId id) { return getPlugin(id); } @Override protected BaseApplicationPlugin createPlugin(PluginContributor contributor) { return contributor.createApplicationPlugin(); } @Override protected void afterPluginsCreated(List<BaseApplicationPlugin> plugins) { createKeyMaps(plugins); createGroups(plugins); adjustGroups(plugins); createCustomParts(plugins); GroupAdjuster.adjustTopLevelGroups(); GroupAdjuster.refreshCustomizations(); } private void createKeyMaps(List<BaseApplicationPlugin> plugins) { for (BaseApplicationPlugin plugin : plugins) { try { plugin.createKeymaps(); } catch (Throwable t1) { LOG.error("Plugin " + plugin + " threw an exception during key maps creating ", t1); } } } private void createGroups(List<BaseApplicationPlugin> plugins) { for (BaseApplicationPlugin plugin : plugins) { try { plugin.createGroups(); } catch (Throwable t1) { LOG.error("Plugin " + plugin + " threw an exception during groups creating ", t1); } } } private void adjustGroups(List<BaseApplicationPlugin> plugins) { for (BaseApplicationPlugin plugin : plugins) { try { plugin.adjustGroups(); } catch (Throwable t1) { LOG.error("Plugin " + plugin + " threw an exception during groups adjusting ", t1); } } } private void createCustomParts(List<BaseApplicationPlugin> plugins) { for (BaseApplicationPlugin plugin : plugins) { try { plugin.createCustomParts(); } catch (Throwable t1) { LOG.error("Plugin " + plugin + " threw an exception during creating custom parts ", t1); } } } @Override protected void beforePluginsDisposed(List<BaseApplicationPlugin> plugins) { } @Override protected void disposePlugin(BaseApplicationPlugin plugin) { plugin.dispose(); } @Override @NonNls @NotNull public String getComponentName() { return ApplicationPluginManager.class.getName(); } /** * Cannot load existing plugins here since: * 1. we need to initialize ide plugin at the first place here (other plugins' actions depend on it) * 2. it has some action which recursively addresses this component via Application#getComponent which leads to infinite recursive initialization * fixme we can get rid of that but probably some generated code needs to be rewritten (the only place is {@link jetbrains.mps.plugins.actions.GeneratedActionGroup} * * Thus we state that currently there must be no loaded modules in the repository when #initComponent() is called */ @Override public void initComponent() { LOG.debug("Running startup activity"); register(); LOG.debug("Finished running startup activity"); } @Override public void disposeComponent() { LOG.debug("Running shutdown app activity"); unregister(); LOG.debug("Finished running shutdown app activity"); } @Override public String toString() { return "ApplicationPluginManager"; } }