javafx script engines search: ensure resource found

This commit is contained in:
Anna Kozlova
2014-12-12 19:28:59 +01:00
parent 6670a42931
commit ab8e96f1d3
3 changed files with 39 additions and 16 deletions
@@ -36,7 +36,7 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase {
@Override
public void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry) {
PsiTestUtil.addLibrary(module, model, "javafx", PluginPathManager.getPluginHomePath("javaFX") + "/testData", "jfxrt.jar");
PsiTestUtil.addLibrary(module, model, "groovy", PluginPathManager.getPluginHomePath("groovy") + "/testdata/mockGroovyLib1.8", "groovy-1.8.0-beta-2.jar");
PsiTestUtil.addLibrary(module, model, "javafx", PluginPathManager.getPluginHomePath("javaFX") + "/testData", "groovy-1.8.0.jar");
super.configureModule(module, model, contentEntry);
}
};
@@ -70,7 +70,7 @@ public class JavaFXQuickfixTest extends LightCodeInsightFixtureTestCase {
myFixture.configureByFile(getTestName(true) + ".fxml");
final IntentionAction intention = myFixture.findSingleIntention("Specify page language");
assertNotNull(intention);
Set<String> languages = JavaFxInjectPageLanguageIntention.getAvailableLanguages();
Set<String> languages = JavaFxInjectPageLanguageIntention.getAvailableLanguages(getProject());
assertContainsElements(languages, "groovy");
JavaFxInjectPageLanguageIntention languageIntention = (JavaFxInjectPageLanguageIntention)intention;
languageIntention.registerPageLanguage(getProject(), (XmlFile)myFixture.getFile(), "groovy");
@@ -17,13 +17,14 @@ package org.jetbrains.plugins.javaFX.fxml.codeInsight.intentions;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderEnumerator;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiParserFacade;
@@ -35,15 +36,17 @@ import com.intellij.psi.xml.XmlProlog;
import com.intellij.ui.components.JBList;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.lang.UrlClassLoader;
import org.jetbrains.annotations.NotNull;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
/**
* User: anna
@@ -52,23 +55,43 @@ import java.util.TreeSet;
public class JavaFxInjectPageLanguageIntention extends PsiElementBaseIntentionAction {
public static final Logger LOG = Logger.getInstance("#" + JavaFxInjectPageLanguageIntention.class.getName());
public static Set<String> getAvailableLanguages() {
final List<ScriptEngineFactory> engineFactories = new ScriptEngineManager().getEngineFactories();
public static Set<String> getAvailableLanguages(Project project) {
final List<ScriptEngineFactory> engineFactories = new ScriptEngineManager(composeUserClassLoader(project)).getEngineFactories();
final Set<String> availableNames = new TreeSet<String>();
for (ScriptEngineFactory factory : engineFactories) {
final String engineName = (String)factory.getParameter(ScriptEngine.NAME);
availableNames.add(engineName);
if (engineFactories != null) {
final Set<String> availableNames = new TreeSet<String>();
for (ScriptEngineFactory factory : engineFactories) {
final String engineName = (String)factory.getParameter(ScriptEngine.NAME);
availableNames.add(engineName);
}
return availableNames;
}
return availableNames;
return null;
}
private static ClassLoader composeUserClassLoader(Project project) {
final List<URL> urls = new ArrayList<URL>();
final List<String> list = OrderEnumerator.orderEntries(project).recursively().librariesOnly().runtimeOnly().getPathsList().getPathList();
for (String path : list) {
try {
urls.add(new File(FileUtil.toSystemIndependentName(path)).toURI().toURL());
}
catch (MalformedURLException e1) {
LOG.info(e1);
}
}
return new URLClassLoader(urls.toArray(new URL[urls.size()]));
}
@Override
public void invoke(@NotNull final Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
if (!FileModificationService.getInstance().preparePsiElementsForWrite(element)) return;
final XmlFile containingFile = (XmlFile)element.getContainingFile();
final Set<String> availableLanguages = getAvailableLanguages(project);
LOG.assertTrue(availableLanguages != null);
final Set<String> availableLanguages = getAvailableLanguages();
if (availableLanguages.size() == 1) {
registerPageLanguage(project, containingFile, availableLanguages.iterator().next());
} else {
@@ -110,7 +133,7 @@ public class JavaFxInjectPageLanguageIntention extends PsiElementBaseIntentionAc
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
if (ContainerUtil.isEmpty(getAvailableLanguages())) {
if (ContainerUtil.isEmpty(getAvailableLanguages(project))) {
return false;
}
setText(getFamilyName());
Binary file not shown.