From f439750a4a0ad3eb4cebf58dc16c2b98ec64ceb2 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 25 Dec 2012 19:24:28 +0400 Subject: [PATCH] JSP validation fixed for external build --- .../intellij/compiler/impl/CompileDriver.java | 18 +++++++- .../impl/compiler/ArtifactCompilerUtil.java | 43 +++++++++++++++++-- .../impl/compiler/ArtifactsCompiler.java | 9 ++-- 3 files changed, 62 insertions(+), 8 deletions(-) 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 0ab10734a505..91dc22679bd5 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -39,6 +39,7 @@ import com.intellij.openapi.compiler.Compiler; import com.intellij.openapi.compiler.ex.CompileContextEx; import com.intellij.openapi.compiler.ex.CompilerPathsEx; import com.intellij.openapi.compiler.generic.GenericCompiler; +import com.intellij.openapi.deployment.DeploymentUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.extensions.PluginId; @@ -76,6 +77,7 @@ 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.packaging.impl.compiler.ArtifactsCompiler; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiDocumentManager; import com.intellij.util.Chunk; @@ -88,6 +90,7 @@ import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import com.intellij.util.containers.OrderedSet; import com.intellij.util.messages.MessageBus; +import gnu.trove.THashSet; import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -498,7 +501,7 @@ public class CompileDriver { } final MessageBus messageBus = myProject.getMessageBus(); - + final MultiMap outputToArtifact = ArtifactCompilerUtil.containsArtifacts(scopes) ? ArtifactCompilerUtil.createOutputToArtifactMap(myProject) : null; final BuildManager buildManager = BuildManager.getInstance(); buildManager.cancelAutoMakeTasks(myProject); return buildManager.scheduleBuild(myProject, compileContext.isRebuild(), compileContext.isMake(), onlyCheckUpToDate, scopes, paths, builderParams, new DefaultMessageHandler(myProject) { @@ -561,10 +564,23 @@ public class CompileDriver { case FILES_GENERATED: final List generated = event.getGeneratedFilesList(); final CompilationStatusListener publisher = messageBus.syncPublisher(CompilerTopics.COMPILATION_STATUS); + Set writtenArtifactOutputPaths = outputToArtifact != null ? new THashSet(FileUtil.PATH_HASHING_STRATEGY) : null; for (CmdlineRemoteProto.Message.BuilderMessage.BuildEvent.GeneratedFile generatedFile : generated) { final String root = FileUtil.toSystemIndependentName(generatedFile.getOutputRoot()); final String relativePath = FileUtil.toSystemIndependentName(generatedFile.getRelativePath()); publisher.fileGenerated(root, relativePath); + if (outputToArtifact != null) { + Collection artifacts = outputToArtifact.get(root); + if (!artifacts.isEmpty()) { + for (Artifact artifact : artifacts) { + ArtifactsCompiler.addChangedArtifact(compileContext, artifact); + } + writtenArtifactOutputPaths.add(FileUtil.toSystemDependentName(DeploymentUtil.appendToPath(root, relativePath))); + } + } + } + if (writtenArtifactOutputPaths != null && !writtenArtifactOutputPaths.isEmpty()) { + ArtifactsCompiler.addWrittenPaths(compileContext, writtenArtifactOutputPaths); } break; case BUILD_COMPLETED: 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 e13b8ec07b36..0de7e05ad7dc 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,6 +18,8 @@ package com.intellij.packaging.impl.compiler; import com.intellij.facet.Facet; import com.intellij.facet.FacetManager; import com.intellij.facet.FacetRootsProvider; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.Result; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.diagnostic.Logger; @@ -25,6 +27,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; @@ -39,16 +42,17 @@ 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 com.intellij.util.containers.MultiMap; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.ParametersMessage.TargetTypeBuildScope; +import org.jetbrains.jps.incremental.artifacts.ArtifactBuildTargetType; 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.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -139,4 +143,35 @@ public class ArtifactCompilerUtil { } return affectedOutputPaths; } + + public static boolean containsArtifacts(List scopes) { + for (TargetTypeBuildScope scope : scopes) { + if (ArtifactBuildTargetType.INSTANCE.getTypeId().equals(scope.getTypeId())) { + return true; + } + } + return false; + } + + public static MultiMap createOutputToArtifactMap(final Project project) { + final MultiMap result = new MultiMap() { + @Override + protected Map> createMap() { + return new THashMap>(FileUtil.PATH_HASHING_STRATEGY); + } + }; + new ReadAction() { + protected void run(final Result r) { + for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + String outputPath = artifact.getOutputFilePath(); + if (!StringUtil.isEmpty(outputPath)) { + result.putValue(outputPath, artifact); + } + } + } + }.execute(); + + + return result; + } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java index 189f4748fc1d..9875816045ea 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactsCompiler.java @@ -15,9 +15,12 @@ */ package com.intellij.packaging.impl.compiler; -import com.intellij.openapi.compiler.generic.*; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.compiler.generic.CompileItem; +import com.intellij.openapi.compiler.generic.GenericCompiler; +import com.intellij.openapi.compiler.generic.GenericCompilerInstance; +import com.intellij.openapi.compiler.generic.VirtualFilePersistentState; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.packaging.artifacts.Artifact; @@ -46,7 +49,7 @@ public class ArtifactsCompiler extends GenericCompiler artifacts = context.getUserData(CHANGED_ARTIFACTS); if (artifacts == null) { artifacts = new THashSet(); @@ -55,7 +58,7 @@ public class ArtifactsCompiler extends GenericCompiler writtenPaths) { + public static void addWrittenPaths(final CompileContext context, Set writtenPaths) { Set paths = context.getUserData(WRITTEN_PATHS_KEY); if (paths == null) { paths = new THashSet();