From 1279c42937da6fe563453bcf3eb05135cd2a23ca Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 23 Jul 2019 15:51:27 +0200 Subject: [PATCH] prevent duplicates when adding ant files GitOrigin-RevId: 9b2ff7f949ff1a58ea5ac952b9005f0e07728e8a --- .../lang/ant/config/AntConfiguration.java | 1 + .../ant/config/actions/AddAntBuildFile.java | 5 +-- .../ant/config/impl/AntConfigurationImpl.java | 35 +++++++++++-------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/plugins/ant/src/com/intellij/lang/ant/config/AntConfiguration.java b/plugins/ant/src/com/intellij/lang/ant/config/AntConfiguration.java index 894963936679..53e2be41b809 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/AntConfiguration.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/AntConfiguration.java @@ -66,6 +66,7 @@ public abstract class AntConfiguration extends SimpleModificationTracker { public abstract List getBuildFileList(); + @Nullable public abstract AntBuildFile addBuildFile(final VirtualFile file) throws AntNoFileException; public abstract void removeBuildFile(final AntBuildFile file); diff --git a/plugins/ant/src/com/intellij/lang/ant/config/actions/AddAntBuildFile.java b/plugins/ant/src/com/intellij/lang/ant/config/actions/AddAntBuildFile.java index 59e4ef14c95c..6ad05d12461b 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/actions/AddAntBuildFile.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/actions/AddAntBuildFile.java @@ -48,8 +48,9 @@ public class AddAntBuildFile extends AnAction { for (VirtualFile file : files) { try { - antConfiguration.addBuildFile(file); - filesAdded++; + if (antConfiguration.addBuildFile(file) != null) { + filesAdded++; + } } catch (AntNoFileException ex) { String message = ex.getMessage(); diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java index 0cce2e4c3ee6..1a1cedb27962 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java @@ -24,10 +24,7 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileEvent; import com.intellij.openapi.vfs.VirtualFileListener; @@ -375,10 +372,11 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis return myBuildFiles; } + @Nullable @Override public AntBuildFile addBuildFile(final VirtualFile file) throws AntNoFileException { - final AntBuildFile[] result = new AntBuildFile[]{null}; - final AntNoFileException[] ex = new AntNoFileException[]{null}; + final Ref result = Ref.create(null); + final Ref ex = Ref.create(null); final String title = AntBundle.message("register.ant.build.progress", file.getPresentableUrl()); ProgressManager.getInstance().run(new Task.Modal(getProject(), title, false) { @NotNull @@ -394,17 +392,26 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis try { indicator.setText(title); incModificationCount(); - ApplicationManager.getApplication().runReadAction(() -> { + boolean added = ApplicationManager.getApplication().runReadAction((Computable)() -> { try { - result[0] = addBuildFileImpl(file); + for (AntBuildFile buildFile : getBuildFiles()) { + final VirtualFile vFile = buildFile.getVirtualFile(); + if (vFile != null && vFile.equals(file)) { + result.set(buildFile); + return Boolean.FALSE; + } + } + result.set(addBuildFileImpl(file)); updateRegisteredActions(); + return Boolean.TRUE; } catch (AntNoFileException e) { - ex[0] = e; + ex.set(e); } + return Boolean.FALSE; }); - if (result[0] != null) { - ApplicationManager.getApplication().invokeLater(() -> myEventDispatcher.getMulticaster().buildFileAdded(result[0])); + if (added) { + ApplicationManager.getApplication().invokeLater(() -> myEventDispatcher.getMulticaster().buildFileAdded(result.get())); } } finally { @@ -412,10 +419,10 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis } } }); - if (ex[0] != null) { - throw ex[0]; + if (ex.get() != null) { + throw ex.get(); } - return result[0]; + return result.get(); } @Override