diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml
index 4df25382cfb6..4dab185f58af 100644
--- a/plugins/gradle/src/META-INF/plugin.xml
+++ b/plugins/gradle/src/META-INF/plugin.xml
@@ -53,6 +53,7 @@
+
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 c663c1815404..35034e6af7e1 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java
@@ -31,10 +31,7 @@ import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBRadioButton;
import com.intellij.util.Alarm;
import com.intellij.util.ui.GridBag;
-import org.jetbrains.annotations.Nls;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.*;
import org.jetbrains.plugins.gradle.util.*;
import javax.swing.*;
@@ -106,13 +103,14 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable.
public GradleConfigurable(@Nullable Project project, @NotNull GradleInstallationManager gradleInstallationManager) {
myProject = project;
myHelper = new DefaultHelper(gradleInstallationManager);
- buildContent();
+ buildContent(false);
}
+ @TestOnly
public GradleConfigurable(@Nullable Project project, @NotNull Helper helper) {
myHelper = helper;
myProject = project;
- buildContent();
+ buildContent(true);
}
@NotNull
@@ -141,7 +139,7 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable.
@Override
public JComponent createComponent() {
if (myComponent == null) {
- buildContent();
+ buildContent(false);
}
return myComponent;
}
@@ -178,11 +176,11 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable.
return myUseWrapperButton;
}
- private void buildContent() {
+ private void buildContent(boolean testMode) {
initContentPanel();
- initLinkedGradleProjectPathControl();
+ initLinkedGradleProjectPathControl(testMode);
initWrapperVsLocalControls();
- initGradleHome();
+ initGradleHome(testMode);
initServiceDirectoryHome();
assert myComponent != null;
@@ -256,13 +254,17 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable.
}
}
- private void initLinkedGradleProjectPathControl() {
+ private void initLinkedGradleProjectPathControl(boolean testMode) {
myLinkedGradleProjectPathField = new TextFieldWithBrowseButton();
+
+ FileChooserDescriptor fileChooserDescriptor = testMode ? new FileChooserDescriptor(true, false, false, false, false, false)
+ : GradleUtil.getGradleProjectFileChooserDescriptor();
+
myLinkedGradleProjectPathField.addBrowseFolderListener(
"",
GradleBundle.message("gradle.settings.label.select.project"),
myProject,
- GradleUtil.getGradleProjectFileChooserDescriptor(),
+ fileChooserDescriptor,
TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT,
false
);
@@ -329,13 +331,17 @@ public class GradleConfigurable implements SearchableConfigurable, Configurable.
group.add(myUseLocalDistributionButton);
}
- private void initGradleHome() {
+ private void initGradleHome(boolean testMode) {
myGradleHomePathField = new TextFieldWithBrowseButton();
+
+ FileChooserDescriptor fileChooserDescriptor = testMode ? new FileChooserDescriptor(true, false, false, false, false, false)
+ : GradleUtil.getGradleHomeFileChooserDescriptor();
+
myGradleHomePathField.addBrowseFolderListener(
"",
GradleBundle.message("gradle.settings.text.home.path"),
null,
- GradleUtil.getGradleHomeFileChooserDescriptor(),
+ fileChooserDescriptor,
TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT,
false
);
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleDependencyManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleDependencyManager.java
index bae8dca2e3b6..6bbfb66b7769 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleDependencyManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleDependencyManager.java
@@ -29,11 +29,11 @@ public class GradleDependencyManager {
myLibraryManager = manager;
}
- public void importDependency(@NotNull GradleDependency dependency, @NotNull Module module) {
- importDependencies(Collections.singleton(dependency), module);
+ public void importDependency(@NotNull GradleDependency dependency, @NotNull Module module, boolean synchronous) {
+ importDependencies(Collections.singleton(dependency), module, synchronous);
}
- public void importDependencies(@NotNull Iterable dependencies, @NotNull Module module) {
+ public void importDependencies(@NotNull Iterable dependencies, @NotNull Module module, boolean synchronous) {
final List moduleDependencies = new ArrayList();
final List libraryDependencies = new ArrayList();
GradleEntityVisitor visitor = new GradleEntityVisitorAdapter() {
@@ -50,17 +50,20 @@ public class GradleDependencyManager {
for (GradleDependency dependency : dependencies) {
dependency.invite(visitor);
}
- importLibraryDependencies(libraryDependencies, module);
- importModuleDependencies(moduleDependencies, module);
+ importLibraryDependencies(libraryDependencies, module, synchronous);
+ importModuleDependencies(moduleDependencies, module, synchronous);
}
@SuppressWarnings("MethodMayBeStatic")
- public void importModuleDependencies(@NotNull final Collection dependencies, @NotNull final Module module) {
+ public void importModuleDependencies(@NotNull final Collection dependencies,
+ @NotNull final Module module,
+ boolean synchronous)
+ {
if (dependencies.isEmpty()) {
return;
}
- GradleUtil.executeProjectChangeAction(module.getProject(), dependencies, new Runnable() {
+ GradleUtil.executeProjectChangeAction(module.getProject(), dependencies, synchronous, new Runnable() {
@Override
public void run() {
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
@@ -95,8 +98,11 @@ public class GradleDependencyManager {
});
}
- public void importLibraryDependencies(@NotNull final Iterable dependencies, @NotNull final Module module) {
- GradleUtil.executeProjectChangeAction(module.getProject(), dependencies, new Runnable() {
+ public void importLibraryDependencies(@NotNull final Iterable dependencies,
+ @NotNull final Module module,
+ final boolean synchronous)
+ {
+ GradleUtil.executeProjectChangeAction(module.getProject(), dependencies, synchronous, new Runnable() {
@Override
public void run() {
LibraryTable libraryTable = myPlatformFacade.getProjectLibraryTable(module.getProject());
@@ -108,7 +114,7 @@ public class GradleDependencyManager {
}
}
if (!librariesToImport.isEmpty()) {
- myLibraryManager.importLibraries(librariesToImport, module.getProject());
+ myLibraryManager.importLibraries(librariesToImport, module.getProject(), synchronous);
}
for (GradleLibraryDependency dependency : dependencies) {
@@ -138,15 +144,19 @@ public class GradleDependencyManager {
});
}
+ public void removeDependency(@NotNull final ExportableOrderEntry dependency, boolean synchronous) {
+ removeDependencies(Collections.singleton(dependency), synchronous);
+ }
+
@SuppressWarnings("MethodMayBeStatic")
- public void removeDependencies(@NotNull final Collection extends ExportableOrderEntry> dependencies) {
+ public void removeDependencies(@NotNull final Collection extends ExportableOrderEntry> dependencies, boolean synchronous) {
if (dependencies.isEmpty()) {
return;
}
for (final ExportableOrderEntry dependency : dependencies) {
final Module module = dependency.getOwnerModule();
- GradleUtil.executeProjectChangeAction(module.getProject(), dependency, new Runnable() {
+ GradleUtil.executeProjectChangeAction(module.getProject(), dependency, synchronous, new Runnable() {
@Override
public void run() {
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleJarManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleJarManager.java
index 614dd7a4d7fe..03ff19eb887f 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleJarManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleJarManager.java
@@ -35,10 +35,7 @@ import org.jetbrains.plugins.gradle.util.GradleLog;
import org.jetbrains.plugins.gradle.util.GradleUtil;
import java.io.File;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
/**
* @author Denis Zhdanov
@@ -54,53 +51,62 @@ public class GradleJarManager {
myLibraryPathTypeMapper = mapper;
}
- public void importJar(@NotNull final GradleJar jar, @NotNull final Project project) {
- GradleUtil.executeProjectChangeAction(project, jar, new Runnable() {
+ public void importJar(@NotNull final GradleJar jar, @NotNull final Project project, boolean synchronous) {
+ importJars(Collections.singleton(jar), project, synchronous);
+ }
+
+ public void importJars(@NotNull final Collection extends GradleJar> jars, @NotNull final Project project, boolean synchronous) {
+ if (jars.isEmpty()) {
+ return;
+ }
+ GradleUtil.executeProjectChangeAction(project, jars, synchronous, new Runnable() {
@Override
public void run() {
LibraryTable table = myPlatformFacade.getProjectLibraryTable(project);
- Library library = table.getLibraryByName(jar.getLibraryId().getLibraryName());
+ Library library = table.getLibraryByName(jars.iterator().next().getLibraryId().getLibraryName());
if (library == null) {
return;
}
Library.ModifiableModel model = library.getModifiableModel();
try {
- OrderRootType ideJarType = myLibraryPathTypeMapper.map(jar.getPathType());
- for (VirtualFile file : model.getFiles(ideJarType)) {
- if (jar.getPath().equals(GradleUtil.getLocalFileSystemPath(file))) {
- return;
+ for (GradleJar jar : jars) {
+ OrderRootType ideJarType = myLibraryPathTypeMapper.map(jar.getPathType());
+ for (VirtualFile file : model.getFiles(ideJarType)) {
+ if (jar.getPath().equals(GradleUtil.getLocalFileSystemPath(file))) {
+ return;
+ }
}
- }
- VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(new File(jar.getPath()));
- if (virtualFile == null) {
- //GradleLog.LOG.warn(
- // String.format("Can't find %s of the library '%s' at path '%s'", entry.getKey(), libraryName, file.getAbsolutePath())
- //);
- return;
- }
- if (virtualFile.isDirectory()) {
- model.addRoot(virtualFile, ideJarType);
- }
- else {
- VirtualFile jarRoot = JarFileSystem.getInstance().getJarRootForLocalFile(virtualFile);
- if (jarRoot == null) {
- GradleLog.LOG.warn(String.format(
- "Can't parse contents of the jar file at path '%s' for the library '%s''", jar.getPath(), library.getName()
- ));
+ VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(new File(jar.getPath()));
+ if (virtualFile == null) {
+ //GradleLog.LOG.warn(
+ // String.format("Can't find %s of the library '%s' at path '%s'", entry.getKey(), libraryName, file.getAbsolutePath())
+ //);
return;
}
- model.addRoot(jarRoot, ideJarType);
+ if (virtualFile.isDirectory()) {
+ model.addRoot(virtualFile, ideJarType);
+ }
+ else {
+ VirtualFile jarRoot = JarFileSystem.getInstance().getJarRootForLocalFile(virtualFile);
+ if (jarRoot == null) {
+ GradleLog.LOG.warn(String.format(
+ "Can't parse contents of the jar file at path '%s' for the library '%s''", jar.getPath(), library.getName()
+ ));
+ return;
+ }
+ model.addRoot(jarRoot, ideJarType);
+ }
}
}
finally {
model.commit();
- }
+ }
}
});
}
- public void removeJars(@NotNull Collection jars, @NotNull Project project) {
+ public void removeJars(@NotNull Collection extends GradleJar> jars, @NotNull Project project, boolean synchronous) {
if (jars.isEmpty()) {
return;
}
@@ -134,7 +140,7 @@ public class GradleJarManager {
}
if (!libraryJars.isEmpty()) {
- removeLibraryJars(libraryJars, project);
+ removeLibraryJars(libraryJars, project, synchronous);
}
}
}
@@ -145,8 +151,8 @@ public class GradleJarManager {
* @param jars jars to remove
* @param project current project
*/
- private void removeLibraryJars(@NotNull final Set jars, @NotNull final Project project) {
- GradleUtil.executeProjectChangeAction(project, jars, new Runnable() {
+ private void removeLibraryJars(@NotNull final Set jars, @NotNull final Project project, boolean synchronous) {
+ GradleUtil.executeProjectChangeAction(project, jars, synchronous, new Runnable() {
@Override
public void run() {
LibraryTable libraryTable = myPlatformFacade.getProjectLibraryTable(project);
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLibraryManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLibraryManager.java
index 0cd0bd4da341..d42df99308c4 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLibraryManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLibraryManager.java
@@ -7,10 +7,13 @@ import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.Function;
import com.intellij.util.NotNullFunction;
import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.containers.ContainerUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.config.PlatformFacade;
+import org.jetbrains.plugins.gradle.model.gradle.GradleJar;
import org.jetbrains.plugins.gradle.model.gradle.GradleLibrary;
import org.jetbrains.plugins.gradle.model.gradle.LibraryPathType;
import org.jetbrains.plugins.gradle.util.GradleLibraryPathTypeMapper;
@@ -28,19 +31,59 @@ public class GradleLibraryManager {
@NotNull private final PlatformFacade myPlatformFacade;
@NotNull private final GradleLibraryPathTypeMapper myLibraryPathTypeMapper;
+ @NotNull private final GradleJarManager myJarManager;
- public GradleLibraryManager(@NotNull PlatformFacade platformFacade, @NotNull GradleLibraryPathTypeMapper mapper) {
+ public GradleLibraryManager(@NotNull PlatformFacade platformFacade,
+ @NotNull GradleLibraryPathTypeMapper mapper,
+ @NotNull GradleJarManager manager)
+ {
myPlatformFacade = platformFacade;
myLibraryPathTypeMapper = mapper;
+ myJarManager = manager;
}
- public void importLibraries(@NotNull Collection extends GradleLibrary> libraries, @NotNull Project project) {
- for (GradleLibrary library : libraries) {
- importLibrary(library, project);
+ public void syncPaths(@NotNull GradleLibrary gradleLibrary,
+ @NotNull final Library ideLibrary,
+ @NotNull Project project,
+ boolean synchronous)
+ {
+ Set toRemove = ContainerUtilRt.newHashSet();
+ Set toAdd = ContainerUtilRt.newHashSet(gradleLibrary.getPaths(LibraryPathType.BINARY));
+ for (VirtualFile ideFile : ideLibrary.getFiles(OrderRootType.CLASSES)) {
+ String idePath = GradleUtil.getLocalFileSystemPath(ideFile);
+ if (!toAdd.remove(idePath)) {
+ toRemove.add(idePath);
+ }
+ }
+ if (toRemove.isEmpty() && toAdd.isEmpty()) {
+ return;
+ }
+
+ Function jarMapper = new Function() {
+ @Override
+ public GradleJar fun(String path) {
+ return new GradleJar(path, LibraryPathType.BINARY, ideLibrary, null);
+ }
+ };
+
+ if (!toRemove.isEmpty()) {
+ List jarsToRemove = ContainerUtil.map(toRemove, jarMapper);
+ myJarManager.removeJars(jarsToRemove, project, synchronous);
+ }
+
+ if (!toAdd.isEmpty()) {
+ List jarsToAdd = ContainerUtil.map(toAdd, jarMapper);
+ myJarManager.importJars(jarsToAdd, project, synchronous);
}
}
- public void importLibrary(@NotNull final GradleLibrary library, @NotNull final Project project) {
+ public void importLibraries(@NotNull Collection extends GradleLibrary> libraries, @NotNull Project project, boolean synchronous) {
+ for (GradleLibrary library : libraries) {
+ importLibrary(library, project, synchronous);
+ }
+ }
+
+ public void importLibrary(@NotNull final GradleLibrary library, @NotNull final Project project, boolean synchronous) {
Map> libraryFiles = new HashMap>();
for (LibraryPathType pathType : LibraryPathType.values()) {
final Set paths = library.getPaths(pathType);
@@ -55,14 +98,15 @@ public class GradleLibraryManager {
}
}));
}
- importLibrary(library.getName(), libraryFiles, project);
+ importLibrary(library.getName(), libraryFiles, project, synchronous);
}
public void importLibrary(@NotNull final String libraryName,
@NotNull final Map> libraryFiles,
- @NotNull final Project project)
+ @NotNull final Project project,
+ boolean synchronous)
{
- GradleUtil.executeProjectChangeAction(project, libraryName, new Runnable() {
+ GradleUtil.executeProjectChangeAction(project, libraryName, synchronous, new Runnable() {
@Override
public void run() {
// Is assumed to be called from the EDT.
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelper.java
index 5f24c1e4a375..d57b1ccd80cd 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelper.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelper.java
@@ -253,26 +253,26 @@ public class GradleLocalNodeManageHelper {
@Override
public void visit(@NotNull GradleLibrary library) {
- myLibraryManager.importLibrary(library, myProjectStructureHelper.getProject());
+ myLibraryManager.importLibrary(library, myProjectStructureHelper.getProject(), false);
}
@Override
public void visit(@NotNull GradleJar jar) {
- myJarManager.importJar(jar, myProjectStructureHelper.getProject());
+ myJarManager.importJar(jar, myProjectStructureHelper.getProject(), false);
}
@Override
public void visit(@NotNull GradleModuleDependency dependency) {
final Module module = myProjectStructureHelper.findIdeModule(dependency.getOwnerModule());
assert module != null;
- myModuleDependencyManager.importDependency(dependency, module);
+ myModuleDependencyManager.importDependency(dependency, module, false);
}
@Override
public void visit(@NotNull GradleLibraryDependency dependency) {
final Module module = myProjectStructureHelper.findIdeModule(dependency.getOwnerModule());
assert module != null;
- myModuleDependencyManager.importDependency(dependency, module);
+ myModuleDependencyManager.importDependency(dependency, module, false);
}
@Override
@@ -320,9 +320,9 @@ public class GradleLocalNodeManageHelper {
}
}
- myJarManager.removeJars(jars, myProjectStructureHelper.getProject());
+ myJarManager.removeJars(jars, myProjectStructureHelper.getProject(), false);
myContentRootManager.removeContentRoots(contentRoots);
- myModuleDependencyManager.removeDependencies(dependencies);
+ myModuleDependencyManager.removeDependencies(dependencies, false);
myModuleManager.removeModules(modules);
}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleModuleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleModuleManager.java
index 916ee0057597..cda05eb425f1 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleModuleManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleModuleManager.java
@@ -122,7 +122,7 @@ public class GradleModuleManager {
for (GradleModule gradleModule : modules) {
final Module intellijModule = moduleMappings.get(gradleModule);
myContentRootImporter.importContentRoots(gradleModule.getContentRoots(), intellijModule);
- myDependencyImporter.importDependencies(gradleModule.getDependencies(), intellijModule);
+ myDependencyImporter.importDependencies(gradleModule.getDependencies(), intellijModule, false);
}
}
});
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleOutdatedLibraryManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleOutdatedLibraryManager.java
index a1ec76153469..d16ffad99061 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleOutdatedLibraryManager.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleOutdatedLibraryManager.java
@@ -125,12 +125,12 @@ public class GradleOutdatedLibraryManager {
libraryDependenciesToImport.add(Pair.create(gradleLibraryDependency, ideModule));
}
}
- myDependencyManager.removeDependencies(ideLibraryDependenciesToRemove);
+ myDependencyManager.removeDependencies(ideLibraryDependenciesToRemove, false);
myLibraryManager.removeLibraries(ideLibsToRemove.values(), myProject);
for (Pair pair : libraryDependenciesToImport) {
// Assuming that dependency manager is smart enough to import library for a given library dependency if it hasn't been
// imported yet.
- myDependencyManager.importDependency(pair.first, pair.second);
+ myDependencyManager.importDependency(pair.first, pair.second, false);
}
//endregion
}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleProjectImportBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleProjectImportBuilder.java
index 673811d32592..46d87c8d1586 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleProjectImportBuilder.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/GradleProjectImportBuilder.java
@@ -235,12 +235,12 @@ public class GradleProjectImportBuilder extends ProjectImportBuilder>(new HashSet());
private final AtomicReference myGradleProject = new AtomicReference();
+ private final Collection myPreProcessors = ContainerUtilRt.createEmptyCOWList();
private final Collection myPostProcessors = ContainerUtilRt.createEmptyCOWList();
@NotNull private final GradleStructureChangesCalculator myChangesCalculator;
@@ -45,6 +46,7 @@ public class GradleProjectStructureChangesModel {
@NotNull GradleStructureChangesCalculator changesCalculator,
@NotNull PlatformFacade platformFacade,
@NotNull GradleLibraryPathTypeMapper mapper,
+ @NotNull GradleDuplicateLibrariesPreProcessor duplicateLibrariesPreProcessor,
@NotNull GradleMovedJarsPostProcessor movedJarsPostProcessor,
@NotNull GradleOutdatedLibraryVersionPostProcessor changedLibraryVersionPostProcessor)
{
@@ -52,6 +54,7 @@ public class GradleProjectStructureChangesModel {
myChangesCalculator = changesCalculator;
myPlatformFacade = platformFacade;
myLibraryPathTypeMapper = mapper;
+ myPreProcessors.add(duplicateLibrariesPreProcessor);
myPostProcessors.add(movedJarsPostProcessor);
myPostProcessors.add(changedLibraryVersionPostProcessor);
}
@@ -81,8 +84,12 @@ public class GradleProjectStructureChangesModel {
* change (an alternative is a manual project structure changes refresh implied by a user)
*/
public void update(@NotNull GradleProject gradleProject, boolean onIdeProjectStructureChange) {
- myGradleProject.set(gradleProject);
- final GradleChangesCalculationContext context = getCurrentChangesContext(gradleProject, onIdeProjectStructureChange);
+ GradleProject projectToUse = gradleProject;
+ for (GradleProjectStructureChangesPreProcessor preProcessor : myPreProcessors) {
+ projectToUse = preProcessor.preProcess(projectToUse, myProject);
+ }
+ myGradleProject.set(projectToUse);
+ final GradleChangesCalculationContext context = getCurrentChangesContext(projectToUse, onIdeProjectStructureChange);
if (!context.hasNewChanges()) {
return;
}
@@ -99,7 +106,13 @@ public class GradleProjectStructureChangesModel {
public GradleProject getGradleProject() {
return myGradleProject.get();
}
-
+
+ @NotNull
+ @TestOnly
+ public Collection getPreProcessors() {
+ return myPreProcessors;
+ }
+
@NotNull
@TestOnly
public Collection getPostProcessors() {
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPreProcessor.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPreProcessor.java
new file mode 100644
index 000000000000..ab2df0481bf7
--- /dev/null
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPreProcessor.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.gradle.sync;
+
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.gradle.model.gradle.GradleProject;
+
+/**
+ * Defines a contract for a callback which is triggered before a project structure changes calculation.
+ *
+ * Implementations of this interface are expected to be thread-safe.
+ *
+ * @author Denis Zhdanov
+ * @since 2/13/13 9:05 AM
+ */
+public interface GradleProjectStructureChangesPreProcessor {
+
+ @NotNull
+ GradleProject preProcess(@NotNull GradleProject gradleProject, @NotNull Project ideProject);
+}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java
index eb047f3b868d..9ec3d669a70b 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureHelper.java
@@ -3,6 +3,7 @@ package org.jetbrains.plugins.gradle.sync;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
+import com.intellij.openapi.roots.impl.ModuleLibraryOrderEntryImpl;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.util.Ref;
@@ -219,6 +220,36 @@ public class GradleProjectStructureHelper {
return null;
}
+ @Nullable
+ public ModuleLibraryOrderEntryImpl findIdeModuleLocalLibraryDependency(@NotNull final String moduleName,
+ @NotNull final String libraryName)
+ {
+ final Module ideModule = findIdeModule(moduleName);
+ if (ideModule == null) {
+ return null;
+ }
+ RootPolicy visitor = new RootPolicy() {
+ @Override
+ public ModuleLibraryOrderEntryImpl visitLibraryOrderEntry(LibraryOrderEntry ideDependency, ModuleLibraryOrderEntryImpl value) {
+ Library library = ideDependency.getLibrary();
+ if (library == null) {
+ return value;
+ }
+ if (ideDependency instanceof ModuleLibraryOrderEntryImpl && libraryName.equals(GradleUtil.getLibraryName(library))) {
+ return (ModuleLibraryOrderEntryImpl)ideDependency;
+ }
+ return value;
+ }
+ };
+ for (OrderEntry entry : myFacade.getOrderEntries(ideModule)) {
+ final ModuleLibraryOrderEntryImpl result = entry.accept(visitor, null);
+ if (result != null) {
+ return result;
+ }
+ }
+ return null;
+ }
+
@Nullable
public LibraryOrderEntry findIdeLibraryDependency(@NotNull final String libraryName,
@NotNull ModifiableRootModel model)
diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelperTest.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelperTest.groovy
index 7077b657f2d9..349c43e54fc3 100644
--- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelperTest.groovy
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/manage/GradleLocalNodeManageHelperTest.groovy
@@ -29,8 +29,6 @@ public class GradleLocalNodeManageHelperTest extends AbstractGradleTest {
protected void configureContainer(MutablePicoContainer container) {
container.registerComponentImplementation(GradleLocalNodeManageHelper)
container.registerComponentImplementation(GradleModuleManager)
- container.registerComponentImplementation(GradleLibraryManager)
- container.registerComponentImplementation(GradleDependencyManager)
container.registerComponentImplementation(GradleContentRootManager)
}
diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractGradleTest.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractGradleTest.groovy
index df0d259c30c6..5fce6f1afdef 100644
--- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractGradleTest.groovy
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testutil/AbstractGradleTest.groovy
@@ -15,13 +15,16 @@ import org.jetbrains.plugins.gradle.diff.dependency.GradleModuleDependencyStruct
import org.jetbrains.plugins.gradle.diff.library.GradleLibraryStructureChangesCalculator
import org.jetbrains.plugins.gradle.diff.module.GradleModuleStructureChangesCalculator
import org.jetbrains.plugins.gradle.diff.project.GradleProjectStructureChangesCalculator
+import org.jetbrains.plugins.gradle.manage.GradleDependencyManager
import org.jetbrains.plugins.gradle.manage.GradleJarManager
+import org.jetbrains.plugins.gradle.manage.GradleLibraryManager
import org.jetbrains.plugins.gradle.model.GradleEntityOwner
import org.jetbrains.plugins.gradle.model.gradle.GradleLibrary
import org.jetbrains.plugins.gradle.model.gradle.LibraryPathType
import org.jetbrains.plugins.gradle.model.id.GradleEntityIdMapper
import org.jetbrains.plugins.gradle.model.id.GradleJarId
import org.jetbrains.plugins.gradle.model.id.GradleLibraryId
+import org.jetbrains.plugins.gradle.sync.GradleDuplicateLibrariesPreProcessor
import org.jetbrains.plugins.gradle.sync.GradleMovedJarsPostProcessor
import org.jetbrains.plugins.gradle.sync.GradleOutdatedLibraryVersionPostProcessor
import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel
@@ -83,7 +86,10 @@ public abstract class AbstractGradleTest {
container.registerComponentImplementation(GradleEntityIdMapper)
container.registerComponentImplementation(GradleProjectStructureContext)
container.registerComponentImplementation(GradleLibraryPathTypeMapper, TestGradleLibraryPathTypeMapper)
+ container.registerComponentImplementation(GradleDependencyManager)
+ container.registerComponentImplementation(GradleLibraryManager)
container.registerComponentImplementation(GradleJarManager, TestGradleJarManager)
+ container.registerComponentImplementation(GradleDuplicateLibrariesPreProcessor)
container.registerComponentImplementation(GradleMovedJarsPostProcessor, TestGradleMovedJarsPostProcessor)
container.registerComponentImplementation(GradleOutdatedLibraryVersionPostProcessor)
configureContainer(container)
@@ -99,6 +105,7 @@ public abstract class AbstractGradleTest {
}
protected void clearChangePostProcessors() {
+ changesModel.preProcessors.clear()
changesModel.postProcessors.clear()
}
diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/TestGradleJarManager.groovy b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/TestGradleJarManager.groovy
index bd09b312bcef..26c9eaf60f0c 100644
--- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/TestGradleJarManager.groovy
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/TestGradleJarManager.groovy
@@ -36,12 +36,12 @@ class TestGradleJarManager extends GradleJarManager {
}
@Override
- void importJar(@NotNull GradleJar jar, @NotNull Project project) {
- importedJars << jar
+ void importJars(@NotNull Collection extends GradleJar> jars, @NotNull Project project, boolean synchronous) {
+ importedJars.addAll(jars)
}
@Override
- void removeJars(@NotNull Collection jars, @NotNull Project project) {
+ void removeJars(@NotNull Collection extends GradleJar> jars, @NotNull Project project, boolean synchronous) {
removedJars.addAll(jars)
}
}