private static void updateExistingPluginInfo( IdeaPluginDescriptor descr, IdeaPluginDescriptor existing) { int state = StringUtil.compareVersionNumbers(descr.getVersion(), existing.getVersion()); final PluginId pluginId = existing.getPluginId(); final String idString = pluginId.getIdString(); final JDOMExternalizableStringList installedPlugins = PluginManagerUISettings.getInstance().getInstalledPlugins(); if (!installedPlugins.contains(idString) && !((IdeaPluginDescriptorImpl) existing).isDeleted()) { installedPlugins.add(idString); } final PluginManagerUISettings updateSettings = PluginManagerUISettings.getInstance(); if (state > 0 && !PluginManager.isIncompatible(descr) && !updatedPlugins.contains(descr.getPluginId())) { NewVersions2Plugins.put(pluginId, 1); if (!updateSettings.myOutdatedPlugins.contains(idString)) { updateSettings.myOutdatedPlugins.add(idString); } final IdeaPluginDescriptorImpl plugin = (IdeaPluginDescriptorImpl) existing; plugin.setDownloadsCount(descr.getDownloads()); plugin.setVendor(descr.getVendor()); plugin.setVendorEmail(descr.getVendorEmail()); plugin.setVendorUrl(descr.getVendorUrl()); plugin.setUrl(descr.getUrl()); } else { updateSettings.myOutdatedPlugins.remove(idString); if (NewVersions2Plugins.remove(pluginId) != null) { updatedPlugins.add(pluginId); } } }
private static boolean checkDependants( final IdeaPluginDescriptor pluginDescriptor, final Function<PluginId, IdeaPluginDescriptor> pluginId2Descriptor, final Condition<PluginId> check, final Set<PluginId> processed) { processed.add(pluginDescriptor.getPluginId()); final PluginId[] dependentPluginIds = pluginDescriptor.getDependentPluginIds(); final Set<PluginId> optionalDependencies = new HashSet<PluginId>(Arrays.asList(pluginDescriptor.getOptionalDependentPluginIds())); for (final PluginId dependentPluginId : dependentPluginIds) { if (processed.contains(dependentPluginId)) continue; // TODO[yole] should this condition be a parameter? if (isModuleDependency(dependentPluginId) && (ourAvailableModules.isEmpty() || ourAvailableModules.contains(dependentPluginId.getIdString()))) { continue; } if (!optionalDependencies.contains(dependentPluginId)) { if (!check.value(dependentPluginId)) { return false; } final IdeaPluginDescriptor dependantPluginDescriptor = pluginId2Descriptor.fun(dependentPluginId); if (dependantPluginDescriptor != null && !checkDependants(dependantPluginDescriptor, pluginId2Descriptor, check, processed)) { return false; } } } return true; }
public void registerExtension( final PluginDescriptor pluginDescriptor, final Element extensionElement) { final PluginId pluginId = pluginDescriptor.getPluginId(); String epName = extractEPName(extensionElement); ExtensionComponentAdapter adapter; final PicoContainer container = getPluginContainer(pluginId.getIdString()); final ExtensionPoint extensionPoint = getExtensionPoint(epName); if (extensionPoint.getKind() == ExtensionPoint.Kind.INTERFACE) { String implClass = extensionElement.getAttributeValue("implementation"); if (implClass == null) { throw new RuntimeException( "'implementation' attribute not specified for '" + epName + "' extension in '" + pluginId.getIdString() + "' plugin"); } adapter = new ExtensionComponentAdapter( implClass, extensionElement, container, pluginDescriptor, shouldDeserializeInstance(extensionElement)); } else { adapter = new ExtensionComponentAdapter( extensionPoint.getClassName(), extensionElement, container, pluginDescriptor, true); } myExtensionElement2extension.put(extensionElement, adapter); internalGetPluginContainer().registerComponent(adapter); getExtensionPoint(epName).registerExtensionAdapter(adapter); }
private void setEnabled(IdeaPluginDescriptor ideaPluginDescriptor, final boolean enabled) { final Collection<String> disabledPlugins = PluginManager.getDisabledPlugins(); final PluginId pluginId = ideaPluginDescriptor.getPluginId(); if (!enabled && !disabledPlugins.contains(pluginId.toString())) { myEnabled.put(pluginId, null); } else { myEnabled.put(pluginId, enabled); } }
@Nullable IdeaPluginDescriptor findPlugin(String id) { for (IdeaPluginDescriptor pluginDescriptor : myAllPlugins) { PluginId pluginId = pluginDescriptor.getPluginId(); if (pluginId != null && StringUtil.equals(pluginId.getIdString(), id)) { return pluginDescriptor; } } return null; }
/** Should be called whenever a new plugin is installed or an existing one is updated. */ public void onPluginInstall(@NotNull IdeaPluginDescriptor descriptor) { PluginId id = descriptor.getPluginId(); boolean existing = PluginManager.isPluginInstalled(id); synchronized (myLock) { myOutdatedPlugins.remove(id.getIdString()); if (existing) { myUpdatedPlugins.put(id, descriptor); } else { myInstalledPlugins.put(id, descriptor); } } }
private List<String> getNonOptionalDependencies(final String id) { List<String> result = new ArrayList<String>(); IdeaPluginDescriptor descriptor = findPlugin(id); if (descriptor != null) { for (PluginId pluginId : descriptor.getDependentPluginIds()) { if (pluginId.getIdString().equals("com.intellij")) continue; if (!ArrayUtil.contains(pluginId, descriptor.getOptionalDependentPluginIds())) { result.add(pluginId.getIdString()); } } } return result; }
@Nullable public static String getDownloadVersions() { String userAgent = String.format( "%s / %s / Symfony Plugin %s", ApplicationInfo.getInstance().getVersionName(), ApplicationInfo.getInstance().getBuild(), PluginManager.getPlugin(PluginId.getId("fr.adrienbrault.idea.symfony2plugin")) .getVersion()); try { // @TODO: PhpStorm9: // simple replacement for: com.intellij.util.io.HttpRequests URL url = new URL("http://symfony.com/versions.json"); URLConnection conn = url.openConnection(); conn.setRequestProperty("User-Agent", userAgent); conn.connect(); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String content = ""; String line; while ((line = in.readLine()) != null) { content += line; } in.close(); return content; } catch (IOException e) { return null; } }
public static boolean hasNewerVersion(PluginId descr) { return !wasUpdated(descr) && (NewVersions2Plugins.containsKey(descr) || PluginManagerUISettings.getInstance() .myOutdatedPlugins .contains(descr.getIdString())); }
@Override public boolean isBundled() { if (PluginManagerCore.CORE_PLUGIN_ID.equals(myId.getIdString())) { return true; } String path; try { // to avoid paths like this /home/kb/IDEA/bin/../config/plugins/APlugin path = getPath().getCanonicalPath(); } catch (IOException e) { path = getPath().getAbsolutePath(); } Application app = ApplicationManager.getApplication(); if (app != null && app.isInternal()) { if (path.startsWith( PathManager.getHomePath() + File.separator + "out" + File.separator + "classes")) { return true; } if (app.isUnitTestMode() && !path.startsWith(PathManager.getPluginsPath() + File.separatorChar)) { return true; } } return path.startsWith(PathManager.getPreInstalledPluginsPath()); }
@Override protected void handleInitComponentError( final Throwable ex, final boolean fatal, final String componentClassName) { if (PluginManager.isPluginClass(componentClassName)) { LOG.error(ex); PluginId pluginId = PluginManager.getPluginByClassName(componentClassName); @NonNls final String errorMessage = "Plugin " + pluginId.getIdString() + " failed to initialize and will be disabled:\n" + ex.getMessage() + "\nPlease restart " + ApplicationNamesInfo.getInstance().getFullProductName() + "."; PluginManager.disablePlugin(pluginId.getIdString()); if (!myHeadlessMode) { JOptionPane.showMessageDialog(null, errorMessage); } else { //noinspection UseOfSystemOutOrSystemErr System.out.println(errorMessage); System.exit(1); } return; // do not call super } if (fatal) { LOG.error(ex); @NonNls final String errorMessage = "Fatal error initializing class " + componentClassName + ":\n" + ex.toString() + "\nComplete error stacktrace was written to idea.log"; if (!myHeadlessMode) { JOptionPane.showMessageDialog(null, errorMessage); } else { //noinspection UseOfSystemOutOrSystemErr System.out.println(errorMessage); } } super.handleInitComponentError(ex, fatal, componentClassName); }
static boolean shouldSkipPlugin( final IdeaPluginDescriptor descriptor, IdeaPluginDescriptor[] loaded) { final String idString = descriptor.getPluginId().getIdString(); if (idString.equals(CORE_PLUGIN_ID)) { return false; } //noinspection HardCodedStringLiteral final String pluginId = System.getProperty("idea.load.plugins.id"); if (pluginId == null) { if (descriptor instanceof IdeaPluginDescriptorImpl && !descriptor.isEnabled()) return true; if (!shouldLoadPlugins()) return true; } final List<String> pluginIds = pluginId == null ? null : StringUtil.split(pluginId, ","); final boolean checkModuleDependencies = !ourAvailableModules.isEmpty() && !ourAvailableModules.contains("com.intellij.modules.all"); if (checkModuleDependencies && !hasModuleDependencies(descriptor)) { return true; } boolean shouldLoad; //noinspection HardCodedStringLiteral final String loadPluginCategory = System.getProperty("idea.load.plugins.category"); if (loadPluginCategory != null) { shouldLoad = loadPluginCategory.equals(descriptor.getCategory()); } else { if (pluginIds != null) { shouldLoad = pluginIds.contains(idString); if (!shouldLoad) { Map<PluginId, IdeaPluginDescriptor> map = new HashMap<PluginId, IdeaPluginDescriptor>(); for (final IdeaPluginDescriptor pluginDescriptor : loaded) { map.put(pluginDescriptor.getPluginId(), pluginDescriptor); } addModulesAsDependents(map); final IdeaPluginDescriptor descriptorFromProperty = map.get(PluginId.getId(pluginId)); shouldLoad = descriptorFromProperty != null && isDependent( descriptorFromProperty, descriptor.getPluginId(), map, checkModuleDependencies); } } else { shouldLoad = !getDisabledPlugins().contains(idString); } if (shouldLoad && descriptor instanceof IdeaPluginDescriptorImpl) { if (isIncompatible(descriptor)) return true; } } return !shouldLoad; }
public NamespaceMakeActions_ActionGroup() { super("NamespaceMakeActions", ID); this.setIsInternal(false); this.setPopup(false); { LabelledAnchor action = new LabelledAnchor(NamespaceMakeActions_ActionGroup.LABEL_ID_make); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); NamespaceMakeActions_ActionGroup.this.addAction(action); } }
static { // enables rerun failed tests action in RubyMine final String rerunFailedTestsActionId = "RerunFailedTests"; ActionManager actionManager = ActionManager.getInstance(); AnAction rerunFailedTestsAction = actionManager.getAction(rerunFailedTestsActionId); if (rerunFailedTestsAction == null) { AbstractRerunFailedTestsAction action = new AbstractRerunFailedTestsAction(); actionManager.registerAction( rerunFailedTestsActionId, action, PluginId.getId("org.jetbrains.erlang")); action.getTemplatePresentation().setIcon(AllIcons.RunConfigurations.RerunFailedTests); } }
static boolean isDependent( final IdeaPluginDescriptor descriptor, final PluginId on, Map<PluginId, IdeaPluginDescriptor> map, final boolean checkModuleDependencies) { for (PluginId id : descriptor.getDependentPluginIds()) { if (ArrayUtil.contains(id, (Object[]) descriptor.getOptionalDependentPluginIds())) { continue; } if (!checkModuleDependencies && isModuleDependency(id)) { continue; } if (id.equals(on)) { return true; } final IdeaPluginDescriptor depDescriptor = map.get(id); if (depDescriptor != null && isDependent(depDescriptor, on, map, checkModuleDependencies)) { return true; } } return false; }
@Nullable public static VirtualFile getPluginVirtualDirectory() { IdeaPluginDescriptor descriptor = PluginManager.getPlugin(PluginId.getId("Lua")); if (descriptor != null) { File pluginPath = descriptor.getPath(); String url = VfsUtil.pathToUrl(pluginPath.getAbsolutePath()); return VirtualFileManager.getInstance().findFileByUrl(url); } return null; }
/** * Should be called whenever a list of plugins is loaded from a repository to check if there is an * updated version. */ public void onDescriptorDownload(@NotNull IdeaPluginDescriptor descriptor) { PluginId id = descriptor.getPluginId(); IdeaPluginDescriptor existing = PluginManager.getPlugin(id); if (existing == null || (existing.isBundled() && !existing.allowBundledUpdate()) || wasUpdated(id)) { return; } boolean supersedes = !PluginManagerCore.isIncompatible(descriptor) && (PluginDownloader.compareVersionsSkipBroken(existing, descriptor.getVersion()) > 0 || PluginManagerCore.isIncompatible(existing)); String idString = id.getIdString(); synchronized (myLock) { if (supersedes) { myOutdatedPlugins.add(idString); } else { myOutdatedPlugins.remove(idString); } } }
public GenerateOptions_ActionGroup() { super("GenerateOptions", ID); this.setIsInternal(false); this.setPopup(false); GenerateOptions_ActionGroup.this.addAction("jetbrains.mps.ide.make.actions.Options_Action"); { LabelledAnchor action = new LabelledAnchor(GenerateOptions_ActionGroup.LABEL_ID_saveTransientModels); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide.make")); GenerateOptions_ActionGroup.this.addAction(action); } GenerateOptions_ActionGroup.this.addAction( "jetbrains.mps.ide.make.actions.CheckModelsBeforeGeneration_Action"); }
public LanguageActions_ActionGroup() { super("LanguageActions", ID); this.setIsInternal(false); this.setPopup(false); try { { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_newGroup); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_commonModule); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } LanguageActions_ActionGroup.this.addSeparator(); { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_find_usages); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_find_instances); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_find_javastub_usages); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } LanguageActions_ActionGroup.this.addSeparator(); { LabelledAnchor action = new LabelledAnchor(LanguageActions_ActionGroup.LABEL_ID_ex); ActionManagerEx manager = ActionManagerEx.getInstanceEx(); manager.registerAction(action.getId(), action, PluginId.getId("jetbrains.mps.ide")); LanguageActions_ActionGroup.this.addAction(action); } LanguageActions_ActionGroup.this.addAction( "jetbrains.mps.ide.actions.ModuleProperties_Action"); } catch (Throwable t) { LOG.error("User group error", t); } }
public static void handleComponentError( Throwable t, @Nullable String componentClassName, @Nullable ComponentConfig config) { if (t instanceof StartupAbortedException) { throw (StartupAbortedException) t; } PluginId pluginId = null; if (config != null) { pluginId = config.getPluginId(); } if (pluginId == null || CORE_PLUGIN_ID.equals(pluginId.getIdString())) { if (componentClassName != null) { pluginId = getPluginByClassName(componentClassName); } } if (pluginId == null || CORE_PLUGIN_ID.equals(pluginId.getIdString())) { if (t instanceof PicoPluginExtensionInitializationException) { pluginId = ((PicoPluginExtensionInitializationException) t).getPluginId(); } } if (pluginId != null && !CORE_PLUGIN_ID.equals(pluginId.getIdString())) { getLogger().warn(t); disablePlugin(pluginId.getIdString()); StringWriter message = new StringWriter(); message .append("Plugin '") .append(pluginId.getIdString()) .append("' failed to initialize and will be disabled. "); message .append(" Please restart ") .append(ApplicationNamesInfo.getInstance().getFullProductName()) .append('.'); message.append("\n\n"); t.printStackTrace(new PrintWriter(message)); Main.showMessage("Plugin Error", message.toString(), false); throw new StartupAbortedException(t).exitCode(Main.PLUGIN_ERROR).logError(false); } else { throw new StartupAbortedException("Fatal error initializing '" + componentClassName + "'", t); } }
@Override public void initComponent() { ProjectJdkTable jdkTable = ProjectJdkTable.getInstance(); List<Sdk> sdkList = new ArrayList<Sdk>(); sdkList.addAll(GoSdkUtil.getSdkOfType(GoSdkType.getInstance(), jdkTable)); for (Sdk sdk : sdkList) { GoSdkData sdkData = (GoSdkData) sdk.getSdkAdditionalData(); boolean needsUpgrade = sdkData == null; try { if (!needsUpgrade) { sdkData.checkValid(); } } catch (ConfigurationException ex) { needsUpgrade = true; } if (!needsUpgrade) continue; needsUpgrade = false; GoSdkData data = GoSdkUtil.testGoogleGoSdk(sdk.getHomePath()); if (data == null) needsUpgrade = true; try { if (data != null) { data.checkValid(); } } catch (ConfigurationException ex) { needsUpgrade = true; } if (needsUpgrade) { Notifications.Bus.notify( new Notification( "Go SDK validator", "Corrupt Go SDK", getContent("Go", sdk.getName()), NotificationType.WARNING), myProject); } SdkModificator sdkModificator = sdk.getSdkModificator(); sdkModificator.setSdkAdditionalData(data); sdkModificator.commitChanges(); } sdkList.clear(); sdkList.addAll(GoSdkUtil.getSdkOfType(GoAppEngineSdkType.getInstance(), jdkTable)); Boolean hasGAESdk = sdkList.size() > 0; for (Sdk sdk : sdkList) { GoAppEngineSdkData sdkData = (GoAppEngineSdkData) sdk.getSdkAdditionalData(); if (sdkData == null || sdkData.TARGET_ARCH == null || sdkData.TARGET_OS == null) { Notifications.Bus.notify( new Notification( "Go AppEngine SDK validator", "Corrupt Go App Engine SDK", getContent("Go App Engine", sdk.getName()), NotificationType.WARNING), myProject); continue; } boolean needsUpgrade = false; try { sdkData.checkValid(); } catch (ConfigurationException ex) { needsUpgrade = true; } if (!needsUpgrade) continue; needsUpgrade = false; GoAppEngineSdkData data = GoSdkUtil.testGoAppEngineSdk(sdk.getHomePath()); if (data == null) needsUpgrade = true; try { if (data != null) { data.checkValid(); } } catch (ConfigurationException ex) { needsUpgrade = true; } // GAE SDK auto-update needs a bit more love if (data != null && !(new File(data.GOAPP_BIN_PATH)).exists()) { needsUpgrade = true; } if (needsUpgrade) { Notifications.Bus.notify( new Notification( "Go AppEngine SDK validator", "Corrupt Go App Engine SDK", getContent("Go AppEngine", sdk.getName()), NotificationType.WARNING), myProject); } SdkModificator sdkModificator = sdk.getSdkModificator(); sdkModificator.setSdkAdditionalData(data); sdkModificator.commitChanges(); } if (hasGAESdk) { String sysAppEngineDevServerPath = GoSdkUtil.getAppEngineDevServer(); if (sysAppEngineDevServerPath.isEmpty()) Notifications.Bus.notify( new Notification( "Go AppEngine SDK validator", "Problem with env variables", getInvalidAPPENGINE_DEV_APPSERVEREnvMessage(), NotificationType.WARNING, NotificationListener.URL_OPENING_LISTENER), myProject); } PluginDescriptor pluginDescriptor = PluginManager.getPlugin(PluginId.getId("ro.redeul.google.go")); if (pluginDescriptor != null) { String version = ((IdeaPluginDescriptorImpl) pluginDescriptor).getVersion(); if (version.endsWith("-dev") && !System.getProperty("go.skip.dev.warn", "false").equals("true")) { Notifications.Bus.notify( new Notification( "Go plugin notice", "Development version detected", getDevVersionMessage(), NotificationType.WARNING, null), myProject); } } super.initComponent(); }
private static void addModulesAsDependents(Map<PluginId, ? super IdeaPluginDescriptorImpl> map) { for (String module : ourAvailableModules) { // fake plugin descriptors to satisfy dependencies map.put(PluginId.getId(module), new IdeaPluginDescriptorImpl()); } }
@Nullable static String filterBadPlugins( List<? extends IdeaPluginDescriptor> result, final Map<String, String> disabledPluginNames) { final Map<PluginId, IdeaPluginDescriptor> idToDescriptorMap = new HashMap<PluginId, IdeaPluginDescriptor>(); final StringBuffer message = new StringBuffer(); boolean pluginsWithoutIdFound = false; for (Iterator<? extends IdeaPluginDescriptor> it = result.iterator(); it.hasNext(); ) { final IdeaPluginDescriptor descriptor = it.next(); final PluginId id = descriptor.getPluginId(); if (id == null) { pluginsWithoutIdFound = true; } if (idToDescriptorMap.containsKey(id)) { message.append("<br>"); message.append(IdeBundle.message("message.duplicate.plugin.id")); message.append(id); it.remove(); } else if (descriptor.isEnabled()) { idToDescriptorMap.put(id, descriptor); } } addModulesAsDependents(idToDescriptorMap); final List<String> disabledPluginIds = new ArrayList<String>(); final LinkedHashSet<String> faultyDescriptors = new LinkedHashSet<String>(); for (final Iterator<? extends IdeaPluginDescriptor> it = result.iterator(); it.hasNext(); ) { final IdeaPluginDescriptor pluginDescriptor = it.next(); checkDependants( pluginDescriptor, new Function<PluginId, IdeaPluginDescriptor>() { @Override public IdeaPluginDescriptor fun(final PluginId pluginId) { return idToDescriptorMap.get(pluginId); } }, new Condition<PluginId>() { @Override public boolean value(final PluginId pluginId) { if (!idToDescriptorMap.containsKey(pluginId)) { pluginDescriptor.setEnabled(false); if (!pluginId.getIdString().startsWith(MODULE_DEPENDENCY_PREFIX)) { faultyDescriptors.add(pluginId.getIdString()); disabledPluginIds.add(pluginDescriptor.getPluginId().getIdString()); message.append("<br>"); final String name = pluginDescriptor.getName(); final IdeaPluginDescriptor descriptor = idToDescriptorMap.get(pluginId); String pluginName; if (descriptor == null) { pluginName = pluginId.getIdString(); if (disabledPluginNames.containsKey(pluginName)) { pluginName = disabledPluginNames.get(pluginName); } } else { pluginName = descriptor.getName(); } message.append( getDisabledPlugins().contains(pluginId.getIdString()) ? IdeBundle.message("error.required.plugin.disabled", name, pluginName) : IdeBundle.message( "error.required.plugin.not.installed", name, pluginName)); } it.remove(); return false; } return true; } }); } if (!disabledPluginIds.isEmpty()) { myPlugins2Disable = disabledPluginIds; myPlugins2Enable = faultyDescriptors; message.append("<br>"); message.append("<br>").append("<a href=\"" + DISABLE + "\">Disable "); if (disabledPluginIds.size() == 1) { final PluginId pluginId2Disable = PluginId.getId(disabledPluginIds.iterator().next()); message.append( idToDescriptorMap.containsKey(pluginId2Disable) ? idToDescriptorMap.get(pluginId2Disable).getName() : pluginId2Disable.getIdString()); } else { message.append("not loaded plugins"); } message.append("</a>"); boolean possibleToEnable = true; for (String descriptor : faultyDescriptors) { if (disabledPluginNames.get(descriptor) == null) { possibleToEnable = false; break; } } if (possibleToEnable) { message .append("<br>") .append("<a href=\"" + ENABLE + "\">Enable ") .append( faultyDescriptors.size() == 1 ? disabledPluginNames.get(faultyDescriptors.iterator().next()) : " all necessary plugins") .append("</a>"); } message.append("<br>").append("<a href=\"" + EDIT + "\">Open plugin manager</a>"); } if (pluginsWithoutIdFound) { message.append("<br>"); message.append(IdeBundle.message("error.plugins.without.id.found")); } if (message.length() > 0) { message.insert(0, IdeBundle.message("error.problems.found.loading.plugins")); return message.toString(); } return null; }
// Get version info of our Plugin private String getPluginVersion() { final IdeaPluginDescriptor plugin = PluginManager.getPlugin(PluginId.getId("com.microsoft.vso.idea")); final String v = plugin != null ? plugin.getVersion() : DEFAULT_VERSION; return StringUtils.isNotEmpty(v) ? v : DEFAULT_VERSION; }
private static boolean prepareToInstall( final PluginNode pluginNode, final List<PluginId> pluginIds, List<IdeaPluginDescriptor> allPlugins) throws IOException { // check for dependent plugins at first. if (pluginNode.getDepends() != null && pluginNode.getDepends().size() > 0) { // prepare plugins list for install final PluginId[] optionalDependentPluginIds = pluginNode.getOptionalDependentPluginIds(); final List<PluginNode> depends = new ArrayList<PluginNode>(); final List<PluginNode> optionalDeps = new ArrayList<PluginNode>(); for (int i = 0; i < pluginNode.getDepends().size(); i++) { PluginId depPluginId = pluginNode.getDepends().get(i); if (PluginManager.isPluginInstalled(depPluginId) || PluginManager.isModuleDependency(depPluginId) || (pluginIds != null && pluginIds.contains(depPluginId))) { // ignore installed or installing plugins continue; } PluginNode depPlugin = new PluginNode(depPluginId); depPlugin.setSize("-1"); depPlugin.setName(depPluginId.getIdString()); // prevent from exceptions if (optionalDependentPluginIds != null && ArrayUtil.indexOf(optionalDependentPluginIds, depPluginId) != -1) { if (isPluginInRepo(depPluginId, allPlugins)) { optionalDeps.add(depPlugin); } } else { depends.add(depPlugin); } } if (depends.size() > 0) { // has something to install prior installing the plugin final boolean[] proceed = new boolean[1]; final StringBuffer buf = new StringBuffer(); for (PluginNode depend : depends) { buf.append(depend.getName()).append(","); } try { GuiUtils.runOrInvokeAndWait( new Runnable() { public void run() { proceed[0] = Messages.showYesNoDialog( IdeBundle.message( "plugin.manager.dependencies.detected.message", depends.size(), buf.substring(0, buf.length() - 1)), IdeBundle.message("plugin.manager.dependencies.detected.title"), Messages.getWarningIcon()) == DialogWrapper.OK_EXIT_CODE; } }); } catch (Exception e) { return false; } if (proceed[0]) { if (!prepareToInstall(depends, allPlugins)) { return false; } } else { return false; } } if (optionalDeps.size() > 0) { final StringBuffer buf = new StringBuffer(); for (PluginNode depend : optionalDeps) { buf.append(depend.getName()).append(","); } final boolean[] proceed = new boolean[1]; try { GuiUtils.runOrInvokeAndWait( new Runnable() { public void run() { proceed[0] = Messages.showYesNoDialog( IdeBundle.message( "plugin.manager.optional.dependencies.detected.message", optionalDeps.size(), buf.substring(0, buf.length() - 1)), IdeBundle.message("plugin.manager.dependencies.detected.title"), Messages.getWarningIcon()) == DialogWrapper.OK_EXIT_CODE; } }); } catch (Exception e) { return false; } if (proceed[0]) { if (!prepareToInstall(optionalDeps, allPlugins)) { return false; } } } } synchronized (PluginManager.lock) { final PluginDownloader downloader = PluginDownloader.createDownloader(pluginNode); if (downloader.prepareToInstall(ProgressManager.getInstance().getProgressIndicator())) { downloader.install(); pluginNode.setStatus(PluginNode.STATUS_DOWNLOADED); } else { return false; } } return true; }
public static boolean isModuleDependency(final PluginId dependentPluginId) { return dependentPluginId.getIdString().startsWith(MODULE_DEPENDENCY_PREFIX); }
static void initializePlugins(@Nullable StartupProgress progress) { configureExtensions(); final IdeaPluginDescriptorImpl[] pluginDescriptors = loadDescriptors(progress); final Class callerClass = ReflectionUtil.findCallerClass(1); assert callerClass != null; final ClassLoader parentLoader = callerClass.getClassLoader(); final List<IdeaPluginDescriptorImpl> result = new ArrayList<IdeaPluginDescriptorImpl>(); final HashMap<String, String> disabledPluginNames = new HashMap<String, String>(); for (IdeaPluginDescriptorImpl descriptor : pluginDescriptors) { if (descriptor.getPluginId().getIdString().equals(CORE_PLUGIN_ID)) { final List<String> modules = descriptor.getModules(); if (modules != null) { ourAvailableModules.addAll(modules); } } if (!shouldSkipPlugin(descriptor, pluginDescriptors)) { result.add(descriptor); } else { descriptor.setEnabled(false); disabledPluginNames.put(descriptor.getPluginId().getIdString(), descriptor.getName()); initClassLoader(parentLoader, descriptor); } } prepareLoadingPluginsErrorMessage(filterBadPlugins(result, disabledPluginNames)); final Map<PluginId, IdeaPluginDescriptorImpl> idToDescriptorMap = new HashMap<PluginId, IdeaPluginDescriptorImpl>(); for (final IdeaPluginDescriptorImpl descriptor : result) { idToDescriptorMap.put(descriptor.getPluginId(), descriptor); } final IdeaPluginDescriptor corePluginDescriptor = idToDescriptorMap.get(PluginId.getId(CORE_PLUGIN_ID)); assert corePluginDescriptor != null : CORE_PLUGIN_ID + " not found; platform prefix is " + System.getProperty(PlatformUtilsCore.PLATFORM_PREFIX_KEY); for (IdeaPluginDescriptorImpl descriptor : result) { if (descriptor != corePluginDescriptor) { descriptor.insertDependency(corePluginDescriptor); } } mergeOptionalConfigs(idToDescriptorMap); // sort descriptors according to plugin dependencies Collections.sort(result, getPluginDescriptorComparator(idToDescriptorMap)); for (int i = 0; i < result.size(); i++) { ourId2Index.put(result.get(i).getPluginId(), i); } int i = 0; for (final IdeaPluginDescriptorImpl pluginDescriptor : result) { if (pluginDescriptor.getPluginId().getIdString().equals(CORE_PLUGIN_ID) || pluginDescriptor.isUseCoreClassLoader()) { pluginDescriptor.setLoader(parentLoader, true); } else { final List<File> classPath = pluginDescriptor.getClassPath(); final PluginId[] dependentPluginIds = pluginDescriptor.getDependentPluginIds(); final ClassLoader[] parentLoaders = getParentLoaders(idToDescriptorMap, dependentPluginIds); final ClassLoader pluginClassLoader = createPluginClassLoader( classPath.toArray(new File[classPath.size()]), parentLoaders.length > 0 ? parentLoaders : new ClassLoader[] {parentLoader}, pluginDescriptor); pluginDescriptor.setLoader(pluginClassLoader, true); } pluginDescriptor.registerExtensions(); if (progress != null) { progress.showProgress( "", PLUGINS_PROGRESS_MAX_VALUE + (i++ / (float) result.size()) * 0.35f); } } ourPlugins = pluginDescriptors; }
@Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final Component orig = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (myPluginDescriptor != null) { myNameLabel.setText(myPluginDescriptor.getName()); final PluginId pluginId = myPluginDescriptor.getPluginId(); final String idString = pluginId.getIdString(); if (myPluginDescriptor.isBundled()) { myBundledLabel.setText("Bundled"); } else { final String host = myPlugin2host.get(idString); if (host != null) { String presentableUrl = VfsUtil.urlToPath(host); final int idx = presentableUrl.indexOf('/'); if (idx > -1) { presentableUrl = presentableUrl.substring(0, idx); } myBundledLabel.setText("From " + presentableUrl); } else { if (PluginManagerUISettings.getInstance().getInstalledPlugins().contains(idString)) { myBundledLabel.setText("From repository"); } else { myBundledLabel.setText("Custom"); } } } if (myPluginDescriptor instanceof IdeaPluginDescriptorImpl && ((IdeaPluginDescriptorImpl) myPluginDescriptor).isDeleted()) { myNameLabel.setIcon(AllIcons.Actions.Clean); } else if (hasNewerVersion(pluginId)) { myNameLabel.setIcon(AllIcons.Nodes.Pluginobsolete); myPanel.setToolTipText("Newer version of the plugin is available"); } else { myNameLabel.setIcon(AllIcons.Nodes.Plugin); } final Color fg = orig.getForeground(); final Color bg = orig.getBackground(); final Color grayedFg = isSelected ? fg : Color.GRAY; myPanel.setBackground(bg); myNameLabel.setBackground(bg); myBundledLabel.setBackground(bg); myNameLabel.setForeground(fg); final boolean wasUpdated = wasUpdated(pluginId); if (wasUpdated || PluginManager.getPlugin(pluginId) == null) { if (!isSelected) { myNameLabel.setForeground(FileStatus.COLOR_ADDED); } if (wasUpdated) { myPanel.setToolTipText( "Plugin was updated to the newest version. Changes will be available after restart"); } else { myPanel.setToolTipText("Plugin will be activated after restart."); } } myBundledLabel.setForeground(grayedFg); final Set<PluginId> required = myDependentToRequiredListMap.get(pluginId); if (required != null && required.size() > 0) { myNameLabel.setForeground(Color.RED); final StringBuilder s = new StringBuilder(); if (myEnabled.get(pluginId) == null) { s.append("Plugin was not loaded.\n"); } if (required.contains(PluginId.getId("com.intellij.modules.ultimate"))) { s.append("The plugin requires IntelliJ IDEA Ultimate"); } else { s.append("Required plugin").append(required.size() == 1 ? " \"" : "s \""); s.append( StringUtil.join( required, new Function<PluginId, String>() { @Override public String fun(final PluginId id) { final IdeaPluginDescriptor plugin = PluginManager.getPlugin(id); return plugin == null ? id.getIdString() : plugin.getName(); } }, ",")); s.append(required.size() == 1 ? "\" is not enabled!" : "\" are not enabled!"); } myPanel.setToolTipText(s.toString()); } if (PluginManager.isIncompatible(myPluginDescriptor)) { myPanel.setToolTipText( IdeBundle.message( "plugin.manager.incompatible.tooltip.warning", ApplicationNamesInfo.getInstance().getFullProductName())); myNameLabel.setForeground(Color.red); } } return myPanel; }
/** * @deprecated if more settings are needed for this plugin, you should create a {@link * com.intellij.openapi.components.PersistentStateComponent} and store all the settings in a * separate file without the prefix on the property name. */ @Deprecated private static String getSettingsPrefix() { PluginId pluginId = PluginManager.getPluginByClassName(MTTheme.class.getName()); return pluginId == null ? "com.chrisrm.idea.MaterialThemeUI" : pluginId.getIdString(); }
// used in upsource protected void readExternal(@NotNull Element element) { final PluginBean pluginBean = XmlSerializer.deserialize(element, PluginBean.class); url = pluginBean.url; myName = pluginBean.name; String idString = pluginBean.id; if (idString == null || idString.isEmpty()) { idString = myName; } myId = idString == null ? null : PluginId.getId(idString); String internalVersionString = pluginBean.formatVersion; if (internalVersionString != null) { try { //noinspection ResultOfMethodCallIgnored Integer.parseInt(internalVersionString); } catch (NumberFormatException e) { LOG.error( new PluginException( "Invalid value in plugin.xml format version: '" + internalVersionString + "'", e, myId)); } } myUseIdeaClassLoader = pluginBean.useIdeaClassLoader; myAllowBundledUpdate = pluginBean.allowBundledUpdate; if (pluginBean.ideaVersion != null) { mySinceBuild = pluginBean.ideaVersion.sinceBuild; myUntilBuild = convertExplicitBigNumberInUntilBuildToStar(pluginBean.ideaVersion.untilBuild); } myResourceBundleBaseName = pluginBean.resourceBundle; myDescriptionChildText = pluginBean.description; myChangeNotes = pluginBean.changeNotes; myVersion = pluginBean.pluginVersion; if (myVersion == null) { myVersion = PluginManagerCore.getBuildNumber().asStringWithoutProductCode(); } myCategory = pluginBean.category; if (pluginBean.vendor != null) { myVendor = pluginBean.vendor.name; myVendorEmail = pluginBean.vendor.email; myVendorUrl = pluginBean.vendor.url; myVendorLogoPath = pluginBean.vendor.logo; } // preserve items order as specified in xml (filterBadPlugins will not fail if module comes // first) Set<PluginId> dependentPlugins = new LinkedHashSet<PluginId>(); Set<PluginId> optionalDependentPlugins = new LinkedHashSet<PluginId>(); if (pluginBean.dependencies != null) { myOptionalConfigs = new THashMap<PluginId, String>(); for (PluginDependency dependency : pluginBean.dependencies) { String text = dependency.pluginId; if (!StringUtil.isEmpty(text)) { PluginId id = PluginId.getId(text); dependentPlugins.add(id); if (dependency.optional) { optionalDependentPlugins.add(id); if (!StringUtil.isEmpty(dependency.configFile)) { myOptionalConfigs.put(id, dependency.configFile); } } } } } myDependencies = dependentPlugins.isEmpty() ? PluginId.EMPTY_ARRAY : dependentPlugins.toArray(new PluginId[dependentPlugins.size()]); myOptionalDependencies = optionalDependentPlugins.isEmpty() ? PluginId.EMPTY_ARRAY : optionalDependentPlugins.toArray(new PluginId[optionalDependentPlugins.size()]); if (pluginBean.helpSets == null || pluginBean.helpSets.length == 0) { myHelpSets = HelpSetPath.EMPTY; } else { myHelpSets = new HelpSetPath[pluginBean.helpSets.length]; PluginHelpSet[] sets = pluginBean.helpSets; for (int i = 0, n = sets.length; i < n; i++) { PluginHelpSet pluginHelpSet = sets[i]; myHelpSets[i] = new HelpSetPath(pluginHelpSet.file, pluginHelpSet.path); } } myAppComponents = pluginBean.applicationComponents; myProjectComponents = pluginBean.projectComponents; myModuleComponents = pluginBean.moduleComponents; if (myAppComponents == null) myAppComponents = ComponentConfig.EMPTY_ARRAY; if (myProjectComponents == null) myProjectComponents = ComponentConfig.EMPTY_ARRAY; if (myModuleComponents == null) myModuleComponents = ComponentConfig.EMPTY_ARRAY; StringInterner interner = new StringInterner(); List<Element> extensions = copyElements(pluginBean.extensions, interner); if (extensions != null) { myExtensions = MultiMap.createSmart(); for (Element extension : extensions) { myExtensions.putValue(ExtensionsAreaImpl.extractEPName(extension), extension); } } List<Element> extensionPoints = copyElements(pluginBean.extensionPoints, interner); if (extensionPoints != null) { myExtensionsPoints = MultiMap.createSmart(); for (Element extensionPoint : extensionPoints) { myExtensionsPoints.putValue( StringUtil.notNullize( extensionPoint.getAttributeValue(ExtensionsAreaImpl.ATTRIBUTE_AREA)), extensionPoint); } } myActionsElements = copyElements(pluginBean.actions, interner); if (pluginBean.modules != null && !pluginBean.modules.isEmpty()) { myModules = pluginBean.modules; } }