diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuildersRegistry.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuildersRegistry.java index 9b68004e589f..ee6a9773f42f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuildersRegistry.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuildersRegistry.java @@ -127,7 +127,7 @@ public class LayoutElementBuildersRegistry { @NotNull JpsPackagingElement contextElement) { if (outputUrl != null) { File directory = JpsPathUtil.urlToFile(outputUrl); - creator.addDirectoryCopyInstructions(directory, null, creator.getInstructionsBuilder().createCopyingHandler(directory, contextElement)); + creator.addDirectoryCopyInstructions(directory, null, creator.getInstructionsBuilder().createCopyingHandler(directory, contextElement, creator)); } } @@ -178,7 +178,7 @@ public class LayoutElementBuildersRegistry { final String dirPath = element.getDirectoryPath(); if (dirPath != null) { final File directory = new File(dirPath); - instructionCreator.addDirectoryCopyInstructions(directory, null, instructionCreator.getInstructionsBuilder().createCopyingHandler(directory, element)); + instructionCreator.addDirectoryCopyInstructions(directory, null, instructionCreator.getInstructionsBuilder().createCopyingHandler(directory, element, instructionCreator)); } } @@ -207,7 +207,7 @@ public class LayoutElementBuildersRegistry { final String fileName = element.getRenamedOutputFileName(); String outputFileName = fileName != null ? fileName : file.getName(); instructionCreator.addFileCopyInstruction(file, outputFileName, - instructionCreator.getInstructionsBuilder().createCopyingHandler(file, element)); + instructionCreator.getInstructionsBuilder().createCopyingHandler(file, element, instructionCreator)); } } 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 f64f8c8ead8d..2f994612134e 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 @@ -60,4 +60,11 @@ public interface ArtifactCompilerInstructionCreator { ArtifactCompilerInstructionCreator subFolderByRelativePath(@NotNull String relativeDirectoryPath); ArtifactInstructionsBuilder getInstructionsBuilder(); + + /** + * @return target directory for instructions created by this instance or {@code null} if there is no such directory (e.g. because it corresponds + * to an entry in a JAR file) + */ + @Nullable + File getTargetDirectory(); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java index 8387d97780f7..dd8a4be2aadd 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilder.java @@ -28,6 +28,12 @@ public interface ArtifactInstructionsBuilder { @NotNull List getDescriptors(); + /** + * @deprecated use {@link #createCopyingHandler(File, JpsPackagingElement, ArtifactCompilerInstructionCreator)} instead + */ @NotNull FileCopyingHandler createCopyingHandler(@NotNull File file, @NotNull JpsPackagingElement contextElement); + + @NotNull + FileCopyingHandler createCopyingHandler(@NotNull File file, @NotNull JpsPackagingElement contextElement, @NotNull ArtifactCompilerInstructionCreator instructionCreator); } 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 a8835d23bef4..c88544a67d16 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 @@ -104,6 +104,23 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil return FileCopyingHandler.DEFAULT; } + @NotNull + @Override + public FileCopyingHandler createCopyingHandler(@NotNull File file, + @NotNull JpsPackagingElement contextElement, + @NotNull ArtifactCompilerInstructionCreator instructionCreator) { + File targetDirectory = instructionCreator.getTargetDirectory(); + if (targetDirectory == null) return FileCopyingHandler.DEFAULT; + + for (ArtifactRootCopyingHandlerProvider provider : myCopyingHandlerProviders) { + FileCopyingHandler handler = provider.createCustomHandler(myBuildTarget.getArtifact(), file, targetDirectory, contextElement, myModel, myBuildDataPaths); + if (handler != null) { + return handler; + } + } + return FileCopyingHandler.DEFAULT; + } + public JarBasedArtifactRootDescriptor createJarBasedRoot(@NotNull File jarFile, @NotNull String pathInJar, @NotNull SourceFileFilter filter, diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootCopyingHandlerProvider.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootCopyingHandlerProvider.java index 1c5069a8ed82..3ebb903cf48b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootCopyingHandlerProvider.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootCopyingHandlerProvider.java @@ -39,11 +39,25 @@ public abstract class ArtifactRootCopyingHandlerProvider { /** * Override this method to customize how files from {@code root} are copied to the {@code artifact output}. * @param root file or directory which is configured in {@code artifact} to be copied to its output + * @param targetDirectory target directory under the artifact output to which {@code root} will be copied. * @param contextElement element in the artifact layout to which {@code root} corresponds; it may be for example * {@link JpsDirectoryCopyPackagingElement} (in that case {@code root} will be its {@link JpsDirectoryCopyPackagingElement#getDirectoryPath() directory}) * or {@link JpsModuleOutputPackagingElement} (in that case {@code root} will be the module output directory) */ @Nullable + public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, + @NotNull File root, + @NotNull File targetDirectory, + @NotNull JpsPackagingElement contextElement, + @NotNull JpsModel model, + @NotNull BuildDataPaths buildDataPaths) { + return createCustomHandler(artifact, root, model, buildDataPaths); + } + + /** + * @deprecated override {@link #createCustomHandler(JpsArtifact, File, File, JpsPackagingElement, JpsModel, BuildDataPaths)} instead + */ + @Nullable public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, @NotNull File root, @NotNull JpsPackagingElement contextElement, @@ -53,7 +67,7 @@ public abstract class ArtifactRootCopyingHandlerProvider { } /** - * @deprecated override {@link #createCustomHandler(JpsArtifact, File, JpsPackagingElement, JpsModel, BuildDataPaths)} instead + * @deprecated override {@link #createCustomHandler(JpsArtifact, File, File, JpsPackagingElement, JpsModel, BuildDataPaths)} instead */ @Nullable public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, @NotNull File root, @NotNull JpsModel model, diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/CopyToDirectoryInstructionCreator.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/CopyToDirectoryInstructionCreator.java index f753a6b0ef59..03d72734b0c2 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/CopyToDirectoryInstructionCreator.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/CopyToDirectoryInstructionCreator.java @@ -16,6 +16,9 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; /** * @author nik @@ -54,4 +57,10 @@ public class CopyToDirectoryInstructionCreator extends ArtifactCompilerInstructi } return new PackIntoArchiveInstructionCreator(myInstructionsBuilder, jarInfo, "", destination); } + + @Nullable + @Override + public File getTargetDirectory() { + return new File(myOutputPath); + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/PackIntoArchiveInstructionCreator.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/PackIntoArchiveInstructionCreator.java index 3545ab5569ef..a944418eb00d 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/PackIntoArchiveInstructionCreator.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/PackIntoArchiveInstructionCreator.java @@ -19,6 +19,8 @@ import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.File; + /** * @author nik */ @@ -68,4 +70,10 @@ public class PackIntoArchiveInstructionCreator extends ArtifactCompilerInstructi myJarInfo.addJar(destination.getPathInJar(), jarInfo); return new PackIntoArchiveInstructionCreator(myInstructionsBuilder, jarInfo, "", destination); } + + @Nullable + @Override + public File getTargetDirectory() { + return null; + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/SkipAllInstructionCreator.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/SkipAllInstructionCreator.java index 234316a16efc..b275d19e8401 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/SkipAllInstructionCreator.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/SkipAllInstructionCreator.java @@ -17,6 +17,8 @@ package org.jetbrains.jps.incremental.artifacts.instructions; import org.jetbrains.annotations.NotNull; +import java.io.File; + /** * @author nik */ @@ -46,4 +48,9 @@ public class SkipAllInstructionCreator extends ArtifactCompilerInstructionCreato public SkipAllInstructionCreator archive(@NotNull String archiveFileName) { return this; } + + @Override + public File getTargetDirectory() { + return null; + } } diff --git a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenEjbArtifactRootCopyingHandlerProvider.java b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenEjbArtifactRootCopyingHandlerProvider.java index 2b132281c991..efa824bf9685 100644 --- a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenEjbArtifactRootCopyingHandlerProvider.java +++ b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenEjbArtifactRootCopyingHandlerProvider.java @@ -37,11 +37,11 @@ import java.io.File; * @author nik */ public class MavenEjbArtifactRootCopyingHandlerProvider extends ArtifactRootCopyingHandlerProvider { - @Nullable @Override public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, @NotNull File root, + @NotNull File targetDirectory, @NotNull JpsPackagingElement contextElement, @NotNull JpsModel model, @NotNull BuildDataPaths buildDataPaths) { diff --git a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenWebArtifactRootCopyingHandlerProvider.java b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenWebArtifactRootCopyingHandlerProvider.java index 3d7a58d3996e..1f11c41e876e 100644 --- a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenWebArtifactRootCopyingHandlerProvider.java +++ b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenWebArtifactRootCopyingHandlerProvider.java @@ -45,10 +45,12 @@ import static com.intellij.openapi.util.io.FileUtil.toSystemDependentName; */ public class MavenWebArtifactRootCopyingHandlerProvider extends ArtifactRootCopyingHandlerProvider { private static final Logger LOG = Logger.getInstance(MavenWebArtifactRootCopyingHandlerProvider.class); + @Nullable @Override public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, @NotNull File root, + @NotNull File targetDirectory, @NotNull JpsPackagingElement contextElement, @NotNull JpsModel model, @NotNull BuildDataPaths buildDataPaths) {