From e025da901f7a209c0831aaefab2ca63793558acc Mon Sep 17 00:00:00 2001 From: "peter.gromov" Date: Thu, 2 Dec 2010 17:12:40 +0300 Subject: [PATCH] [rev=romka,nik] don't lock the UI while computing ant targets for gant (IDEA-60919) --- .../plugins/groovy/gant/AntTasksProvider.java | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java index 877ec41e2b4c..72b6c688f636 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java @@ -16,8 +16,11 @@ package org.jetbrains.plugins.groovy.gant; import com.intellij.lang.ant.psi.impl.ReflectedProject; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.roots.ProjectRootManager; @@ -42,11 +45,13 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlo import java.net.URL; import java.util.*; +import java.util.concurrent.*; /** - * @author ilyas + * @author ilyas, peter */ public class AntTasksProvider { + private static final Logger LOG = Logger.getInstance("#org.jetbrains.plugins.groovy.gant.AntTasksProvider"); public static final boolean antAvailable; private static final Key>> GANT_METHODS = Key.create("gantMethods"); private static final Key>> ANT_OBJECTS = Key.create("antObjects"); @@ -112,16 +117,44 @@ public class AntTasksProvider { urls.add(VfsUtil.convertToURL(PathUtil.getLocalFile(jar).getUrl())); } final ClassLoader loader = new UrlClassLoader(urls, null, false, false, true); - final ReflectedProject antProject = ReflectedProject.getProject(loader); + Future future = ApplicationManager.getApplication().executeOnPooledThread(new Callable() { + @Override + public ReflectedProject call() throws Exception { + try { + return ReflectedProject.getProject(loader); + } + catch (Exception e) { + LOG.error(e); + return null; + } + } + }); + + ReflectedProject antProject = null; + while (true) { + try { + antProject = future.get(100, TimeUnit.MILLISECONDS); + break; + } + catch (TimeoutException ignore) { + } + catch (Exception e) { + LOG.error(e); + break; + } + ProgressManager.checkCanceled(); + } final Map result = new HashMap(); - final Map taskDefinitions = antProject.getTaskDefinitions(); - if (taskDefinitions != null) { - result.putAll(taskDefinitions); - } - final Map dataTypeDefinitions = antProject.getDataTypeDefinitions(); - if (dataTypeDefinitions != null) { - result.putAll(dataTypeDefinitions); + if (antProject != null) { + final Map taskDefinitions = antProject.getTaskDefinitions(); + if (taskDefinitions != null) { + result.putAll(taskDefinitions); + } + final Map dataTypeDefinitions = antProject.getDataTypeDefinitions(); + if (dataTypeDefinitions != null) { + result.putAll(dataTypeDefinitions); + } } return Result.create(result, ProjectRootManager.getInstance(groovyFile.getProject())); }