public static IdeaPluginDescriptorImpl[] loadDescriptors(@Nullable StartupProgress progress) { if (ClassUtilCore.isLoadingOfExternalPluginsDisabled()) { return IdeaPluginDescriptorImpl.EMPTY_ARRAY; } final List<IdeaPluginDescriptorImpl> result = new ArrayList<IdeaPluginDescriptorImpl>(); int pluginsCount = countPlugins(PathManager.getPluginsPath()) + countPlugins(PathManager.getPreinstalledPluginsPath()); loadDescriptors(PathManager.getPluginsPath(), result, progress, pluginsCount); Application application = ApplicationManager.getApplication(); boolean fromSources = false; if (application == null || !application.isUnitTestMode()) { int size = result.size(); loadDescriptors(PathManager.getPreinstalledPluginsPath(), result, progress, pluginsCount); fromSources = size == result.size(); } loadDescriptorsFromProperty(result); loadDescriptorsFromClassPath(result, fromSources ? progress : null); IdeaPluginDescriptorImpl[] pluginDescriptors = result.toArray(new IdeaPluginDescriptorImpl[result.size()]); try { Arrays.sort(pluginDescriptors, new PluginDescriptorComparator(pluginDescriptors)); } catch (Exception e) { prepareLoadingPluginsErrorMessage( IdeBundle.message("error.plugins.were.not.loaded", e.getMessage())); getLogger().info(e); return findCorePlugin(pluginDescriptors); } return pluginDescriptors; }
@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()); }
private static File getJettyLauncherFile() { final String binDir = PathManager.getPluginsPath() + File.separator + JettyManager.PLUGIN_NAME + File.separator + BIN_DIR; return new File(binDir, getDefaultJettyLauncherFileName()); }
@NotNull private static InputStream retrieveSourceKeymapStream() throws IOException { String keymapPath = PATH_JOINER.join( PathManager.getPluginsPath(), VimPlugin.IDEAVIM_NOTIFICATION_TITLE, VIM_XML); try { return new FileInputStream(keymapPath); } catch (FileNotFoundException e) { if (ApplicationManager.getApplication().isInternal()) { LOG.debug("Development mode on. Trying to retrieve source keymap from resources"); return Resources.getResource(VimKeyMapUtil.class, "/" + VIM_XML).openStream(); } throw e; } }
public static String pluginsRootPath() { return FileUtilRt.toSystemIndependentName(PathManager.getPluginsPath() + "/live-plugins"); }
public class LivePluginAppComponent implements ApplicationComponent { // TODO implement DumbAware? public static final String PLUGIN_EXAMPLES_PATH = "/liveplugin/pluginexamples"; public static final String LIVEPLUGIN_LIBS_PATH = PathManager.getPluginsPath() + "/LivePlugin/lib/"; public static final NotificationGroup livePluginNotificationGroup = NotificationGroup.balloonGroup("Live Plugin"); private static final Logger LOG = Logger.getInstance(LivePluginAppComponent.class); private static final String DEFAULT_PLUGIN_PATH = PLUGIN_EXAMPLES_PATH; private static final String DEFAULT_PLUGIN_SCRIPT = "default-plugin.groovy"; private static final String DEFAULT_PLUGIN_TEST_SCRIPT = "default-plugin-test.groovy"; private static final String DEFAULT_IDEA_OUTPUT_FOLDER = "out"; private static final String COMPONENT_NAME = "LivePluginComponent"; public static String pluginsRootPath() { return FileUtilRt.toSystemIndependentName(PathManager.getPluginsPath() + "/live-plugins"); } public static Map<String, String> pluginIdToPathMap() { final boolean containsIdeaProjectFolder = new File(pluginsRootPath() + "/" + DIRECTORY_STORE_FOLDER).exists(); File[] files = new File(pluginsRootPath()) .listFiles( new FileFilter() { @SuppressWarnings("SimplifiableIfStatement") @Override public boolean accept(@NotNull File file) { if (containsIdeaProjectFolder && file.getName().equals(DEFAULT_IDEA_OUTPUT_FOLDER)) return false; if (file.getName().equals(DIRECTORY_STORE_FOLDER)) return false; return file.isDirectory(); } }); if (files == null) return new HashMap<String, String>(); HashMap<String, String> result = new HashMap<String, String>(); for (File file : files) { result.put(file.getName(), FileUtilRt.toSystemIndependentName(file.getAbsolutePath())); } return result; } public static boolean isInvalidPluginFolder(VirtualFile virtualFile) { File file = new File(virtualFile.getPath()); if (!file.isDirectory()) return false; String[] files = file.list( new FilenameFilter() { @Override public boolean accept(@NotNull File dir, @NotNull String name) { return name.equals(GroovyPluginRunner.MAIN_SCRIPT); } }); return files.length < 1; } public static String defaultPluginScript() { return readSampleScriptFile(DEFAULT_PLUGIN_PATH, DEFAULT_PLUGIN_SCRIPT); } public static String defaultPluginTestScript() { return readSampleScriptFile(DEFAULT_PLUGIN_PATH, DEFAULT_PLUGIN_TEST_SCRIPT); } public static String readSampleScriptFile(String pluginPath, String file) { try { String path = pluginPath + "/" + file; return FileUtil.loadTextAndClose( LivePluginAppComponent.class.getClassLoader().getResourceAsStream(path)); } catch (IOException e) { LOG.error(e); return ""; } } public static boolean pluginExists(String pluginId) { return pluginIdToPathMap().keySet().contains(pluginId); } private static boolean isGroovyOnClasspath() { return IDEUtil.isOnClasspath("org.codehaus.groovy.runtime.DefaultGroovyMethods"); } public static boolean scalaIsOnClassPath() { return IDEUtil.isOnClasspath("scala.Some"); } public static boolean clojureIsOnClassPath() { return IDEUtil.isOnClasspath("clojure.core.Vec"); } private static void runAllPlugins() { ApplicationManager.getApplication() .invokeLater( new Runnable() { @Override public void run() { AnActionEvent event = new AnActionEvent( null, IDEUtil.DUMMY_DATA_CONTEXT, PluginRunner.IDE_STARTUP, new Presentation(), ActionManager.getInstance(), 0); final ErrorReporter errorReporter = new ErrorReporter(); RunPluginAction.runPlugins( pluginIdToPathMap().keySet(), event, errorReporter, RunPluginAction.createPluginRunners(errorReporter)); } }); } private static void installHelloWorldPlugin() { ExamplePluginInstaller pluginInstaller = new ExamplePluginInstaller(PLUGIN_EXAMPLES_PATH + "/helloWorld", asList("plugin.groovy")); pluginInstaller.installPlugin( new ExamplePluginInstaller.Listener() { @Override public void onException(Exception e, String pluginPath) { LOG.warn("Failed to install plugin: " + pluginPath, e); } }); } public static void checkThatGroovyIsOnClasspath() { final File oldGroovyLibrary = new File(LIVEPLUGIN_LIBS_PATH + File.separator + "groovy-all-2.0.6.jar"); NotificationListener listener = new NotificationListener() { @Override public void hyperlinkUpdate( @NotNull Notification notification, @NotNull HyperlinkEvent event) { if (oldGroovyLibrary.exists()) { FileUtil.delete(oldGroovyLibrary); } boolean downloaded = downloadFile( "http://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/2.2.1/", "groovy-all-2.2.1.jar", LIVEPLUGIN_LIBS_PATH); if (downloaded) { notification.expire(); askIsUserWantsToRestartIde( "For Groovy libraries to be loaded IDE restart is required. Restart now?"); } else { livePluginNotificationGroup.createNotification( "Failed to download Groovy libraries", NotificationType.WARNING); } } }; if (oldGroovyLibrary.exists()) { livePluginNotificationGroup .createNotification( "There is old version of groovy library on LivePlugin classpath", "It might work incorrectly. <a href=\"\">Click here to update groovy to 2.2.1</a> (~6Mb)", NotificationType.ERROR, listener) .notify(null); } if (isGroovyOnClasspath()) return; livePluginNotificationGroup .createNotification( "LivePlugin didn't find Groovy libraries on classpath", "Without it plugins won't work. <a href=\"\">Download Groovy libraries</a> (~6Mb)", NotificationType.ERROR, listener) .notify(null); } @Override public void initComponent() { IdeaPluginDescriptor pluginDescriptor = PluginManager.getPlugin(getId("IntelliJEval")); if (pluginDescriptor != null && pluginDescriptor.isEnabled()) { livePluginNotificationGroup .createNotification( "It seems that you have IntelliJEval plugin enabled.<br/>Please disable it to use LivePlugin.", NotificationType.ERROR) .notify(null); return; } checkThatGroovyIsOnClasspath(); Settings settings = Settings.getInstance(); if (settings.justInstalled) { installHelloWorldPlugin(); settings.justInstalled = false; } if (settings.runAllPluginsOnIDEStartup) { runAllPlugins(); } new PluginToolWindowManager().init(); } @Override public void disposeComponent() {} @Override @NotNull public String getComponentName() { return COMPONENT_NAME; } }