From b9e76ef620f908700dd1835e4c63ab8875165ed6 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 15 Jan 2014 20:13:14 +0400 Subject: [PATCH] external build for artifacts: added API to filter contents of directory extracted from jar file --- .../ArtifactCompilerInstructionCreator.java | 16 +++++++++++++++- .../ArtifactCompilerInstructionCreatorBase.java | 16 ++++++++++------ .../ArtifactInstructionsBuilderImpl.java | 7 +++++-- .../JarBasedArtifactRootDescriptor.java | 11 +++++++++-- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreator.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreator.java index 56ec002e2ca5..5648eb96f16a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreator.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreator.java @@ -15,6 +15,7 @@ */ package org.jetbrains.jps.incremental.artifacts.instructions; +import com.intellij.openapi.util.Condition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,9 +32,22 @@ public interface ArtifactCompilerInstructionCreator { void addDirectoryCopyInstructions(@NotNull File directory, @Nullable SourceFileFilter filter); + /** + * Add instruction to extract directory from a jar file into the current place in the artifact layout. + * + * @param jarFile jar file to extract + * @param pathInJar relative path to directory inside {@code jarFile} which need to be extracted. Use "/" to extract the whole jar contents + */ void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar); - void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar, @Nullable SourceFileFilter sourceFileFilter); + /** + * Add instruction to extract directory from a jar file into the current place in the artifact layout. + * @param jarFile jar file to extract + * @param pathInJar relative path to directory inside {@code jarFile} which need to be extracted. Use "/" to extract the whole jar contents + * @param pathInJarFilter a filter instance specifying which entries should be extracted. It should accept paths inside the jar file + * relative to {@code pathInJar} root and return {@code true} if the entry should be extracted and {@code false} otherwise + */ + void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar, @NotNull Condition pathInJarFilter); ArtifactCompilerInstructionCreator subFolder(@NotNull String directoryName); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreatorBase.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreatorBase.java index 454384ebe7a9..2e5aa50ad45b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreatorBase.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactCompilerInstructionCreatorBase.java @@ -15,14 +15,16 @@ */ package org.jetbrains.jps.incremental.artifacts.instructions; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.PathUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.cmdline.ProjectDescriptor; +import org.jetbrains.jps.incremental.artifacts.JarPathUtil; import org.jetbrains.jps.indices.IgnoredFileIndex; import org.jetbrains.jps.indices.ModuleExcludeIndex; -import org.jetbrains.jps.incremental.artifacts.JarPathUtil; import java.io.File; import java.io.IOException; @@ -56,20 +58,22 @@ public abstract class ArtifactCompilerInstructionCreatorBase implements Artifact @Override public void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar) { - addExtractDirectoryInstruction(jarFile, pathInJar, null); + addExtractDirectoryInstruction(jarFile, pathInJar, Conditions.alwaysTrue()); } @Override - public void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar, @Nullable SourceFileFilter sourceFileFilter) { + public void addExtractDirectoryInstruction(@NotNull File jarFile, + @NotNull String pathInJar, + @NotNull Condition pathInJarFilter) { //an entry of a jar file is excluded if and only if the jar file itself is excluded. In that case we should unpack entries to the artifact - // because the jar itself is explicitly added to the artifact layout. + //because the jar itself is explicitly added to the artifact layout. boolean includeExcluded = true; - final SourceFileFilterImpl filter = new SourceFileFilterImpl(sourceFileFilter, myInstructionsBuilder.getRootsIndex(), + final SourceFileFilterImpl filter = new SourceFileFilterImpl(null, myInstructionsBuilder.getRootsIndex(), myInstructionsBuilder.getIgnoredFileIndex(), includeExcluded); DestinationInfo destination = createDirectoryDestination(); if (destination != null) { - ArtifactRootDescriptor descriptor = myInstructionsBuilder.createJarBasedRoot(jarFile, pathInJar, filter, destination); + ArtifactRootDescriptor descriptor = myInstructionsBuilder.createJarBasedRoot(jarFile, pathInJar, filter, destination, pathInJarFilter); if (myInstructionsBuilder.addDestination(descriptor)) { onAdded(descriptor); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java index ae9993d7214e..0352417b0e24 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderImpl.java @@ -15,6 +15,7 @@ */ package org.jetbrains.jps.incremental.artifacts.instructions; +import com.intellij.openapi.util.Condition; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.incremental.artifacts.ArtifactBuildTarget; import org.jetbrains.jps.indices.IgnoredFileIndex; @@ -79,7 +80,9 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil public JarBasedArtifactRootDescriptor createJarBasedRoot(@NotNull File jarFile, @NotNull String pathInJar, - @NotNull SourceFileFilter filter, final DestinationInfo destinationInfo) { - return new JarBasedArtifactRootDescriptor(jarFile, pathInJar, filter, myRootIndex++, myBuildTarget, destinationInfo); + @NotNull SourceFileFilter filter, + @NotNull DestinationInfo destinationInfo, + @NotNull Condition pathInJarFilter) { + return new JarBasedArtifactRootDescriptor(jarFile, pathInJar, filter, myRootIndex++, myBuildTarget, destinationInfo, pathInJarFilter); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactRootDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactRootDescriptor.java index 8c3f762238a0..c5eb04940b85 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactRootDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactRootDescriptor.java @@ -15,6 +15,7 @@ */ package org.jetbrains.jps.incremental.artifacts.instructions; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; @@ -39,14 +40,18 @@ import java.util.zip.ZipFile; */ public class JarBasedArtifactRootDescriptor extends ArtifactRootDescriptor { private final String myPathInJar; + private final Condition myPathInJarFilter; public JarBasedArtifactRootDescriptor(@NotNull File jarFile, @NotNull String pathInJar, @NotNull SourceFileFilter filter, int index, - ArtifactBuildTarget target, DestinationInfo destinationInfo) { + @NotNull ArtifactBuildTarget target, + @NotNull DestinationInfo destinationInfo, + @NotNull Condition pathInJarFilter) { super(jarFile, filter, index, target, destinationInfo); myPathInJar = pathInJar; + myPathInJarFilter = pathInJarFilter; } public void processEntries(EntryProcessor processor) throws IOException { @@ -68,7 +73,9 @@ public class JarBasedArtifactRootDescriptor extends ArtifactRootDescriptor { final String name = entry.getName(); if (name.startsWith(prefix)) { String relativePath = name.substring(prefix.length()); - processor.process(entry.isDirectory() ? null : zipFile.getInputStream(entry), relativePath, entry); + if (myPathInJarFilter.value(relativePath)) { + processor.process(entry.isDirectory() ? null : zipFile.getInputStream(entry), relativePath, entry); + } } } }