From 8f887cfec28ee9d16db177e0b30bd9dad0189cd3 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Mon, 26 Mar 2012 11:45:02 +0400 Subject: [PATCH] IDEA-83394 Gradle: project refresh does nothing after removing Gradle home from Template Project Settings 1. Using per-project slave gradle process now; 2. Corrected GradleConfigurable balloon processing; (cherry picked from commit 7dd904a) --- plugins/gradle/src/META-INF/plugin.xml | 4 +- .../action/GradleRefreshProjectAction.java | 3 +- .../gradle/config/GradleConfigurable.java | 57 ++++++-- .../importing/GradleModulesImporter.java | 2 +- .../gradle/remote/GradleApiFacadeManager.java | 132 ++++++++++++------ .../gradle/task/AbstractGradleTask.java | 15 +- .../gradle/task/GradleResolveProjectTask.java | 14 +- .../gradle/task/GradleTaskManager.java | 12 +- .../gradle/util/GradleLibraryManager.java | 9 -- .../plugins/gradle/util/GradleUtil.java | 2 +- 10 files changed, 171 insertions(+), 79 deletions(-) diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 7afc8950dde5..46b953b6956c 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -53,7 +53,6 @@ - org.jetbrains.plugins.gradle.notification.GradleConfigNotificationManager + + org.jetbrains.plugins.gradle.task.GradleTaskManager + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java index 52007519dc49..e47bc21333b3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRefreshProjectAction.java @@ -2,7 +2,6 @@ package org.jetbrains.plugins.gradle.action; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -32,7 +31,7 @@ public class GradleRefreshProjectAction extends AbstractGradleLinkedProjectActio @Override protected void doUpdate(@NotNull Presentation presentation, @NotNull Project project, @NotNull String linkedProjectPath) { boolean enabled = false; - final GradleTaskManager taskManager = ServiceManager.getService(GradleTaskManager.class); + final GradleTaskManager taskManager = project.getComponent(GradleTaskManager.class); if (taskManager != null) { enabled = !taskManager.hasTaskOfTypeInProgress(GradleTaskType.RESOLVE_PROJECT); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java index 5c42b3763ba2..7416ae2ec650 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java @@ -37,6 +37,8 @@ import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.File; import java.util.concurrent.TimeUnit; @@ -117,6 +119,22 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. } } }; + myComponent.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (!"ancestor".equals(evt.getPropertyName())) { + return; + } + + // Configure the balloon to show on initial configurable drawing. + myShowBalloonIfNecessary = evt.getNewValue() != null && evt.getOldValue() == null; + + if (evt.getNewValue() == null && evt.getOldValue() != null) { + // Cancel delayed balloons when the configurable is hidden. + myAlarm.cancelAllRequests(); + } + } + }); GridBagConstraints constraints = new GridBagConstraints(); constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.weightx = 1; @@ -151,7 +169,6 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. @Override public boolean isModified() { - myShowBalloonIfNecessary = true; if (!myPathManuallyModified) { return false; } @@ -169,17 +186,25 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. useNormalColorForPath(); String path = myGradleHomeComponent.getPath(); GradleSettings.applyGradleHome(path, myProject); - - // There is a possible case that user defines gradle home for particular open project. We want to apply that value - // to the default project as well if it's still non-defined. - Project defaultProject = ProjectManager.getInstance().getDefaultProject(); - if (defaultProject == myProject) { + + if (isValidGradleHome(path)) { + myGradleHomeSettingType = GradleHomeSettingType.EXPLICIT_CORRECT; + // There is a possible case that user defines gradle home for particular open project. We want to apply that value + // to the default project as well if it's still non-defined. + Project defaultProject = ProjectManager.getInstance().getDefaultProject(); + if (defaultProject != myProject && !isValidGradleHome(GradleSettings.getInstance(defaultProject).getGradleHome())) { + GradleSettings.applyGradleHome(path, defaultProject); + } return; } - if (isValidGradleHome(path) && !isValidGradleHome(GradleSettings.getInstance(defaultProject).getGradleHome())) { - GradleSettings.applyGradleHome(path, defaultProject); - } + if (StringUtil.isEmpty(path)) { + myGradleHomeSettingType = GradleHomeSettingType.UNKNOWN; + } + else { + myGradleHomeSettingType = GradleHomeSettingType.EXPLICIT_INCORRECT; + new DelayedBalloonInfo(MessageType.ERROR, myGradleHomeSettingType, 0).run(); + } } private boolean isValidGradleHome(@Nullable String path) { @@ -203,7 +228,7 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. GradleHomeSettingType.EXPLICIT_CORRECT : GradleHomeSettingType.EXPLICIT_INCORRECT; if (myGradleHomeSettingType == GradleHomeSettingType.EXPLICIT_INCORRECT) { - new DelayedBalloonInfo(MessageType.ERROR, myGradleHomeSettingType).run(); + new DelayedBalloonInfo(MessageType.ERROR, myGradleHomeSettingType, 0).run(); } else { myAlarm.cancelAllRequests(); @@ -283,9 +308,13 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. private final long myTriggerTime; DelayedBalloonInfo(@NotNull MessageType messageType, @NotNull GradleHomeSettingType settingType) { + this(messageType, settingType, BALLOON_DELAY_MILLIS); + } + + DelayedBalloonInfo(@NotNull MessageType messageType, @NotNull GradleHomeSettingType settingType, long delayMillis) { myMessageType = messageType; myText = settingType.getDescription(); - myTriggerTime = System.currentTimeMillis() + BALLOON_DELAY_MILLIS; + myTriggerTime = System.currentTimeMillis() + delayMillis; } @Override @@ -296,11 +325,15 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable. myAlarm.addRequest(this, diff); return; } - if (myGradleHomeComponent == null || !myGradleHomeComponent.getPathComponent().isShowing()) { + if (myGradleHomeComponent == null) { myAlarm.cancelAllRequests(); myAlarm.addRequest(this, 200); return; } + if (!myGradleHomeComponent.getPathComponent().isShowing()) { + // Don't schedule the balloon if the configurable is hidden. + return; + } GradleUtil.showBalloon(myGradleHomeComponent.getPathComponent(), myMessageType, myText); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java index 1c192c1cef84..edc0ea2d1184 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java @@ -338,7 +338,7 @@ public class GradleModulesImporter { public void run(@NotNull final ProgressIndicator indicator) { GradleResolveProjectTask task = new GradleResolveProjectTask(intellijProject, gradleProjectPath, true); task.execute(indicator); - GradleProject projectWithResolvedLibraries = task.getProject(); + GradleProject projectWithResolvedLibraries = task.getGradleProject(); gradleProjectRef.set(projectWithResolvedLibraries); ApplicationManager.getApplication().invokeLater(setupExternalDependenciesTask, ModalityState.NON_MODAL); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/remote/GradleApiFacadeManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/remote/GradleApiFacadeManager.java index beafc16f69e6..a54979f44b8d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/remote/GradleApiFacadeManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/remote/GradleApiFacadeManager.java @@ -14,11 +14,15 @@ import com.intellij.execution.process.ProcessTerminatedListener; import com.intellij.execution.rmi.RemoteProcessSupport; import com.intellij.execution.runners.ProgramRunner; import com.intellij.ide.actions.OpenProjectFileChooserDescriptor; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.roots.DependencyScope; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.text.StringUtil; @@ -27,8 +31,10 @@ import com.intellij.psi.PsiBundle; import com.intellij.util.Alarm; import com.intellij.util.PathUtil; import com.intellij.util.SystemProperties; +import com.intellij.util.containers.ConcurrentWeakHashMap; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.notification.GradleProgressNotificationManager; import org.jetbrains.plugins.gradle.notification.GradleProgressNotificationManagerImpl; import org.jetbrains.plugins.gradle.remote.impl.GradleApiFacadeImpl; @@ -49,8 +55,8 @@ import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; /** * Entry point to work with remote {@link GradleApiFacade}. @@ -62,15 +68,19 @@ import java.util.concurrent.atomic.AtomicReference; */ public class GradleApiFacadeManager { + private static final Pair NULL_VALUE = Pair.empty(); + private static final String REMOTE_PROCESS_TTL_IN_MS_KEY = "gradle.remote.process.ttl.ms"; private static final String MAIN_CLASS_NAME = GradleApiFacadeImpl.class.getName(); private static final int REMOTE_FAIL_RECOVERY_ATTEMPTS_NUMBER = 3; - private final AtomicReference> myFacade - = new AtomicReference>(); - private final AtomicReference myExportedProgressManager - = new AtomicReference(); + private final ConcurrentMap myFacadeWrappers + = new ConcurrentWeakHashMap(); + private final ConcurrentMap myRemoteNotificationManagers + = new ConcurrentWeakHashMap(); + private final ConcurrentMap> myRemoteFacades + = new ConcurrentWeakHashMap>(); @NotNull private final GradleLibraryManager myGradleLibraryManager; @NotNull private final GradleProgressNotificationManagerImpl myProgressManager; @@ -78,13 +88,12 @@ public class GradleApiFacadeManager { // Please note that we don't use RemoteGradleProcessSettings as the 'Configuration' type parameter here because we need // to apply the settings to the newly created process. I.e. every time new process is created we need to call // 'GradleApiFacade.applySettings()'. So, we need to hold reference to the last returned 'GradleApiFacade' stub anyway. - private final RemoteProcessSupport mySupport; - private final GradleApiFacade myApiFacade; + private final RemoteProcessSupport mySupport; public GradleApiFacadeManager(@NotNull GradleLibraryManager gradleLibraryManager, @NotNull GradleProgressNotificationManager manager) { myGradleLibraryManager = gradleLibraryManager; myProgressManager = (GradleProgressNotificationManagerImpl)manager; - mySupport = new RemoteProcessSupport(GradleApiFacade.class) { + mySupport = new RemoteProcessSupport(GradleApiFacade.class) { @Override protected void fireModificationCountChanged() { } @@ -95,13 +104,10 @@ public class GradleApiFacadeManager { } @Override - protected RunProfileState getRunProfileState(Object o, Object configuration, Executor executor) throws ExecutionException { - return createRunProfileState(); + protected RunProfileState getRunProfileState(Object o, String configuration, Executor executor) throws ExecutionException { + return createRunProfileState(findProjectByName(configuration)); } }; - myApiFacade = (GradleApiFacade)Proxy.newProxyInstance( - GradleApiFacadeManager.class.getClassLoader(), new Class[]{GradleApiFacade.class}, new MyHandler() - ); ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { public void run() { @@ -110,10 +116,21 @@ public class GradleApiFacadeManager { }); } - private RunProfileState createRunProfileState() { + @NotNull + private static Project findProjectByName(@NotNull String name) { + final ProjectManager projectManager = ProjectManager.getInstance(); + for (Project project : projectManager.getOpenProjects()) { + if (name.equals(project.getName())) { + return project; + } + } + return projectManager.getDefaultProject(); + } + + private RunProfileState createRunProfileState(@Nullable final Project project) { return new CommandLineState(null) { private SimpleJavaParameters createJavaParameters() throws ExecutionException { - Collection gradleLibraries = myGradleLibraryManager.getAllLibraries(); + Collection gradleLibraries = myGradleLibraryManager.getAllLibraries(project); GradleLog.LOG.assertTrue(gradleLibraries != null, GradleBundle.message("gradle.generic.text.error.sdk.undefined")); if (gradleLibraries == null) { throw new ExecutionException("Can't find gradle libraries"); @@ -193,19 +210,29 @@ public class GradleApiFacadeManager { * @throws Exception in case of inability to return the facade */ @NotNull - public GradleApiFacade getFacade() throws Exception { - return myApiFacade; + public GradleApiFacade getFacade(@Nullable Project project) throws Exception { + if (project == null) { + project = ProjectManager.getInstance().getDefaultProject(); + } + final GradleApiFacade facade = myFacadeWrappers.get(project.getName()); + if (facade == null) { + final GradleApiFacade newFacade = (GradleApiFacade)Proxy.newProxyInstance( + GradleApiFacadeManager.class.getClassLoader(), new Class[]{GradleApiFacade.class}, new MyHandler(project) + ); + myFacadeWrappers.putIfAbsent(project.getName(), newFacade); + } + return myFacadeWrappers.get(project.getName()); } - public Object doInvoke(Method method, Object[] args, int invocationNumber) throws Throwable { - GradleApiFacade facade = doGetFacade(); + public Object doInvoke(@NotNull Project project, Method method, Object[] args, int invocationNumber) throws Throwable { + GradleApiFacade facade = doGetFacade(project); try { return method.invoke(facade, args); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof RemoteException && invocationNumber > 0) { Thread.sleep(1000); - return doInvoke(method, args, invocationNumber - 1); + return doInvoke(project, method, args, invocationNumber - 1); } else { throw e; @@ -213,43 +240,57 @@ public class GradleApiFacadeManager { } } + @SuppressWarnings("ConstantConditions") @NotNull - private GradleApiFacade doGetFacade() throws Exception { - if (!GradleUtil.isGradleAvailable()) { + private GradleApiFacade doGetFacade(@NotNull Project project) throws Exception { + if (project.isDisposed() || !GradleUtil.isGradleAvailable(project)) { return GradleApiFacade.NULL_OBJECT; } - Pair pair = myFacade.get(); + Pair pair = myRemoteFacades.get(project.getName()); if (pair != null) { - if (isValid(pair)) { + if (isValid(pair, project)) { return pair.first; } mySupport.stopAll(true); - myFacade.compareAndSet(pair, null); + myFacadeWrappers.clear(); + myRemoteFacades.clear(); + final Pair p = myRemoteFacades.putIfAbsent(project.getName(), NULL_VALUE); + if (p != null && p != NULL_VALUE) { + return p.first; + } } - final GradleApiFacade facade = mySupport.acquire(this, ""); + final GradleApiFacade facade = mySupport.acquire(this, project.getName()); if (facade == null) { - throw new IllegalStateException("Can't obtain facade to working with gradle api at the remote process"); + throw new IllegalStateException("Can't obtain facade to working with gradle api at the remote process. Project: " + project); } + Disposer.register(project, new Disposable() { + @Override + public void dispose() { + mySupport.stopAll(true); + myFacadeWrappers.clear(); + myRemoteFacades.clear(); + } + }); final GradleApiFacade result = new GradleApiFacadeWrapper(facade, myProgressManager); Pair newPair - = new Pair(result, getRemoteSettings()); - if (!myFacade.compareAndSet(null, newPair)) { - GradleLog.LOG.warn("Detected unexpected duplicate tooling api facade instance creation"); - return myFacade.get().first; + = new Pair(result, getRemoteSettings(project)); + if (myRemoteFacades.putIfAbsent(project.getName(), newPair) != null && !myRemoteFacades.replace(project.getName(), NULL_VALUE, newPair)) { + GradleLog.LOG.warn("Detected unexpected duplicate tooling api facade instance creation. Project: " + project); + return myRemoteFacades.get(project.getName()).first; } if (!StringUtil.isEmpty(newPair.second.getJavaHome())) { GradleLog.LOG.info("Instructing gradle to use java from " + newPair.second.getJavaHome()); } result.applySettings(newPair.second); - RemoteGradleProgressNotificationManager exported = myExportedProgressManager.get(); + RemoteGradleProgressNotificationManager exported = myRemoteNotificationManagers.get(project.getName()); if (exported == null) { try { exported = (RemoteGradleProgressNotificationManager)UnicastRemoteObject.exportObject(myProgressManager, 0); - myExportedProgressManager.set(exported); + myRemoteNotificationManagers.putIfAbsent(project.getName(), exported); } catch (RemoteException e) { - exported = myExportedProgressManager.get(); + exported = myRemoteNotificationManagers.get(project.getName()); } } if (exported == null) { @@ -261,7 +302,11 @@ public class GradleApiFacadeManager { return result; } - private boolean isValid(@NotNull Pair pair) { + private boolean isValid(@NotNull Pair pair, @Nullable Project project) { + if (pair == NULL_VALUE) { + return false; + } + // Check remote process is alive. try { pair.first.getResolver(); @@ -272,8 +317,8 @@ public class GradleApiFacadeManager { // Check that significant settings are not changed RemoteGradleProcessSettings oldSettings = pair.second; - RemoteGradleProcessSettings currentSettings = getRemoteSettings(); - + RemoteGradleProcessSettings currentSettings = getRemoteSettings(project); + // We restart the slave process because there is a possible case that it was started with the incorrect classpath. // For example, it could be started with gradle milestone-3 and that means that its classpath doesn't contain BasicIdeaProject.class. // So, even if the user defines gradle milestone-7 to use, the slave process still is unable to operate because its classpath @@ -285,8 +330,8 @@ public class GradleApiFacadeManager { } @NotNull - private RemoteGradleProcessSettings getRemoteSettings() { - File gradleHome = myGradleLibraryManager.getGradleHome(); + private RemoteGradleProcessSettings getRemoteSettings(@Nullable Project project) { + File gradleHome = myGradleLibraryManager.getGradleHome(project); RemoteGradleProcessSettings result = new RemoteGradleProcessSettings(gradleHome.getAbsolutePath()); String ttlAsString = System.getProperty(REMOTE_PROCESS_TTL_IN_MS_KEY); if (ttlAsString != null) { @@ -304,9 +349,16 @@ public class GradleApiFacadeManager { } private class MyHandler implements InvocationHandler { + + @NotNull private final String myProjectName; + + MyHandler(@NotNull Project project) { + myProjectName = project.getName(); + } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return doInvoke(method, args, REMOTE_FAIL_RECOVERY_ATTEMPTS_NUMBER); + return doInvoke(findProjectByName(myProjectName), method, args, REMOTE_FAIL_RECOVERY_ATTEMPTS_NUMBER); } } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/AbstractGradleTask.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/AbstractGradleTask.java index 535ab6660ea1..0d848c744f29 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/AbstractGradleTask.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/AbstractGradleTask.java @@ -3,7 +3,9 @@ package org.jetbrains.plugins.gradle.task; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.notification.GradleProgressNotificationManager; import org.jetbrains.plugins.gradle.notification.GradleTaskNotificationEvent; import org.jetbrains.plugins.gradle.notification.GradleTaskNotificationListener; @@ -28,9 +30,11 @@ public abstract class AbstractGradleTask implements GradleTask { private final AtomicReference myState = new AtomicReference(GradleTaskState.NOT_STARTED); private final AtomicReference myError = new AtomicReference(); - private final GradleTaskId myId; + @Nullable transient private final Project myIntellijProject; + @NotNull private final GradleTaskId myId; - protected AbstractGradleTask(@NotNull GradleTaskType type) { + protected AbstractGradleTask(Project project, @NotNull GradleTaskType type) { + myIntellijProject = project; myId = GradleTaskId.create(type); } @@ -53,13 +57,18 @@ public abstract class AbstractGradleTask implements GradleTask { return myError.get(); } + @Nullable + public Project getIntellijProject() { + return myIntellijProject; + } + public void refreshState() { if (getState() != GradleTaskState.IN_PROGRESS) { return; } final GradleApiFacadeManager manager = ServiceManager.getService(GradleApiFacadeManager.class); try { - final GradleApiFacade facade = manager.getFacade(); + final GradleApiFacade facade = manager.getFacade(myIntellijProject); setState(facade.isTaskInProgress(getId()) ? GradleTaskState.IN_PROGRESS : GradleTaskState.FAILED); } catch (Throwable e) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleResolveProjectTask.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleResolveProjectTask.java index 8cc02d6d86fa..476ed753861d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleResolveProjectTask.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleResolveProjectTask.java @@ -21,20 +21,19 @@ public class GradleResolveProjectTask extends AbstractGradleTask { private final AtomicReference myGradleProject = new AtomicReference(); - private final Project myIntellijProject; + private final String myProjectPath; private final boolean myResolveLibraries; public GradleResolveProjectTask(@Nullable Project project, @NotNull String projectPath, boolean resolveLibraries) { - super(GradleTaskType.RESOLVE_PROJECT); - myIntellijProject = project; + super(project, GradleTaskType.RESOLVE_PROJECT); myProjectPath = projectPath; myResolveLibraries = resolveLibraries; } protected void doExecute() throws Exception { final GradleApiFacadeManager manager = ServiceManager.getService(GradleApiFacadeManager.class); - GradleProjectResolver resolver = manager.getFacade().getResolver(); + GradleProjectResolver resolver = manager.getFacade(getIntellijProject()).getResolver(); setState(GradleTaskState.IN_PROGRESS); final GradleProject project = resolver.resolveProjectInfo(getId(), myProjectPath, myResolveLibraries); if (project == null) { @@ -42,10 +41,11 @@ public class GradleResolveProjectTask extends AbstractGradleTask { } myGradleProject.set(project); setState(GradleTaskState.FINISHED); - if (myIntellijProject == null || myIntellijProject.isDisposed()) { + final Project intellijProject = getIntellijProject(); + if (intellijProject == null || intellijProject.isDisposed()) { return; } - final GradleProjectStructureChangesModel model = myIntellijProject.getComponent(GradleProjectStructureChangesModel.class); + final GradleProjectStructureChangesModel model = intellijProject.getComponent(GradleProjectStructureChangesModel.class); if (model != null) { // This task may be called during the 'import from gradle' processing, hence, no project-level IoC is up. // Model update is necessary for the correct tool window project structure diff showing but we don't have @@ -55,7 +55,7 @@ public class GradleResolveProjectTask extends AbstractGradleTask { } @Nullable - public GradleProject getProject() { + public GradleProject getGradleProject() { return myGradleProject.get(); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleTaskManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleTaskManager.java index 86ae3f72762d..ba0199f94ce0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleTaskManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/task/GradleTaskManager.java @@ -1,5 +1,7 @@ package org.jetbrains.plugins.gradle.task; +import com.intellij.openapi.components.AbstractProjectComponent; +import com.intellij.openapi.project.Project; import com.intellij.util.Alarm; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; @@ -23,7 +25,7 @@ import java.util.concurrent.TimeUnit; * @author Denis Zhdanov * @since 2/8/12 1:52 PM */ -public class GradleTaskManager implements GradleTaskNotificationListener { +public class GradleTaskManager extends AbstractProjectComponent implements GradleTaskNotificationListener { /** * We receive information about the tasks being enqueued to the slave gradle projects here. However, there is a possible @@ -46,7 +48,11 @@ public class GradleTaskManager implements GradleTaskNotificationListener { @NotNull private final GradleApiFacadeManager myFacadeManager; - public GradleTaskManager(@NotNull GradleApiFacadeManager facadeManager, @NotNull GradleProgressNotificationManager notificationManager) { + public GradleTaskManager(@NotNull Project project, + @NotNull GradleApiFacadeManager facadeManager, + @NotNull GradleProgressNotificationManager notificationManager) + { + super(project); myFacadeManager = facadeManager; notificationManager.addNotificationListener(this); myAlarm.addRequest(new Runnable() { @@ -106,7 +112,7 @@ public class GradleTaskManager implements GradleTaskNotificationListener { public void update() { try { - final Map> currentState = myFacadeManager.getFacade().getTasksInProgress(); + final Map> currentState = myFacadeManager.getFacade(myProject).getTasksInProgress(); myTasksInProgress.clear(); for (Set ids : currentState.values()) { for (GradleTaskId id : ids) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleLibraryManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleLibraryManager.java index 864978764d17..b07a24120186 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleLibraryManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleLibraryManager.java @@ -44,15 +44,6 @@ public class GradleLibraryManager { GRADLE_ENV_PROPERTY_NAME = System.getProperty("gradle.home.env.key", "GRADLE_HOME"); } - @Nullable - public Collection getAllLibraries() { - final Project[] projects = ProjectManager.getInstance().getOpenProjects(); - if (projects.length == 1) { - return getAllLibraries(projects[0]); - } - return getAllLibraries(null); - } - /** * Allows to get file handles for the gradle binaries to use. * diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java index 0f346153bb13..892958e6fd22 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java @@ -208,7 +208,7 @@ public class GradleUtil { public void execute(@NotNull ProgressIndicator indicator) { GradleResolveProjectTask task = new GradleResolveProjectTask(project, gradleProjectPath, resolveLibraries); task.execute(indicator); - gradleProject.set(task.getProject()); + gradleProject.set(task.getGradleProject()); final Throwable error = task.getError(); if (error == null) { return;