From c46695452c2e00818cc25916039fb136a218febf Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 5 Dec 2011 15:22:31 +0400 Subject: [PATCH] IDEA-77613: all of under the WebContent dir and files to be droped while i rebuild the project --- .../intellij/compiler/impl/CompileDriver.java | 2 + .../impl/compiler/ArtifactCompilerUtil.java | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index a299bba3bb1c..9586c74ecb05 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -77,6 +77,7 @@ import com.intellij.packaging.artifacts.ArtifactManager; import com.intellij.packaging.impl.artifacts.ArtifactImpl; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.packaging.impl.compiler.ArtifactCompileScope; +import com.intellij.packaging.impl.compiler.ArtifactCompilerUtil; import com.intellij.pom.Navigatable; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiDocumentManager; @@ -2474,6 +2475,7 @@ public class CompileDriver { } } } + affectedOutputPaths.addAll(ArtifactCompilerUtil.getArtifactOutputsContainingSourceFiles(myProject)); if (!affectedOutputPaths.isEmpty()) { final StringBuilder paths = new StringBuilder(); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java index f512c68e7a0b..6915ae2e3379 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java @@ -18,14 +18,32 @@ package com.intellij.packaging.impl.compiler; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.elements.ComplexPackagingElement; +import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.artifacts.ArtifactUtil; +import com.intellij.packaging.impl.artifacts.PackagingElementPath; +import com.intellij.packaging.impl.artifacts.PackagingElementProcessor; +import com.intellij.packaging.impl.elements.ArtifactPackagingElement; +import com.intellij.packaging.impl.elements.FileOrDirectoryCopyPackagingElement; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -65,4 +83,40 @@ public class ArtifactCompilerUtil { String fullPath = jarEntry.getPath(); return new File(FileUtil.toSystemDependentName(fullPath.substring(fullPath.indexOf(JarFileSystem.JAR_SEPARATOR)))); } + + + @NotNull + public static Set getArtifactOutputsContainingSourceFiles(final @NotNull Project project) { + final List allOutputs = new ArrayList(); + for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + ContainerUtil.addIfNotNull(artifact.getOutputFile(), allOutputs); + } + + final Set affectedOutputPaths = new HashSet(); + final PackagingElementResolvingContext context = ArtifactManager.getInstance(project).getResolvingContext(); + for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + ArtifactUtil.processPackagingElements(artifact, null, new PackagingElementProcessor>() { + @Override + public boolean shouldProcessSubstitution(ComplexPackagingElement element) { + return !(element instanceof ArtifactPackagingElement); + } + + @Override + public boolean process(@NotNull PackagingElement element, @NotNull PackagingElementPath path) { + if (element instanceof FileOrDirectoryCopyPackagingElement) { + final VirtualFile file = ((FileOrDirectoryCopyPackagingElement)element).findFile(); + if (file != null) { + for (VirtualFile output : allOutputs) { + if (VfsUtilCore.isAncestor(output, file, false)) { + affectedOutputPaths.add(output); + } + } + } + } + return true; + } + }, context, true); + } + return affectedOutputPaths; + } }