diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java index efd4b4889425..9708faf52f97 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactSourceFilesState.java @@ -85,10 +85,10 @@ public class ArtifactSourceFilesState extends CompositeStorageOwner { myDeletedFiles.clear(); getOrCreateInstructions().processRoots(new ArtifactRootProcessor() { @Override - public boolean process(ArtifactSourceRoot root, int rootIndex, Collection destinations) throws IOException { + public boolean process(ArtifactSourceRoot root, DestinationInfo destinations) throws IOException { final File rootFile = root.getRootFile(); if (rootFile.exists()) { - processRecursively(rootFile, rootIndex, dataManager, root.getFilter(), currentPaths); + processRecursively(rootFile, root.getRootIndex(), dataManager, root.getFilter(), currentPaths); } return true; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java index ded0ff369ee7..30387e061cde 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/IncArtifactBuilder.java @@ -130,23 +130,21 @@ public class IncArtifactBuilder extends ProjectLevelBuilder { final Set changedJars = new THashSet(); instructions.processRoots(new ArtifactRootProcessor() { @Override - public boolean process(ArtifactSourceRoot root, int rootIndex, Collection destinations) throws IOException { + public boolean process(ArtifactSourceRoot root, DestinationInfo destination) throws IOException { if (context.getCancelStatus().isCanceled()) return false; - final Set sourcePaths = filesToProcess.get(rootIndex); + final Set sourcePaths = filesToProcess.get(root.getRootIndex()); if (sourcePaths == null) return true; for (String sourcePath : sourcePaths) { if (!root.containsFile(sourcePath, pd.dataManager)) continue;//todo[nik] this seems to be unnecessary - for (DestinationInfo destination : destinations) { - if (destination instanceof ExplodedDestinationInfo) { - root.copyFromRoot(sourcePath, rootIndex, destination.getOutputPath(), context, srcOutMapping, outSrcMapping); - } - else if (outSrcMapping.getState(destination.getOutputFilePath()) == null) { - outSrcMapping.update(destination.getOutputFilePath(), Collections.emptyList()); - changedJars.add(((JarDestinationInfo)destination).getJarInfo()); - } + if (destination instanceof ExplodedDestinationInfo) { + root.copyFromRoot(sourcePath, root.getRootIndex(), destination.getOutputPath(), context, srcOutMapping, outSrcMapping); + } + else if (outSrcMapping.getState(destination.getOutputFilePath()) == null) { + outSrcMapping.update(destination.getOutputFilePath(), Collections.emptyList()); + changedJars.add(((JarDestinationInfo)destination).getJarInfo()); } } return true; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java index 8f8c2aa8f431..f8ab346c98d0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/impl/JarsBuilder.java @@ -164,8 +164,7 @@ public class JarsBuilder { final String relativePath = pair.getFirst(); if (pair.getSecond() instanceof ArtifactSourceRoot) { final ArtifactSourceRoot root = (ArtifactSourceRoot)pair.getSecond(); - final int rootIndex = myInstructions.getRootIndex(root); - LOG.assertTrue(rootIndex != -1, root + " not found in instructions"); + final int rootIndex = root.getRootIndex(); final ArtifactBuilderLogger logger = myContext.getLoggingManager().getArtifactBuilderLogger(); if (root instanceof FileBasedArtifactSourceRoot) { addFileToJar(jarOutputStream, jarFile, root.getRootFile(), root.getFilter(), relativePath, targetJarPath, writtenPaths, 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 137680283691..98b77d9a592f 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 @@ -45,14 +45,14 @@ public abstract class ArtifactCompilerInstructionCreatorBase implements Artifact public void addDirectoryCopyInstructions(@NotNull File directory, @Nullable SourceFileFilter filter) { final boolean copyExcluded = myInstructionsBuilder.getRootsIndex().isExcluded(directory); SourceFileFilter fileFilter = new SourceFileFilterImpl(filter, myInstructionsBuilder.getRootsIndex(), myInstructionsBuilder.getIgnoredFilePatterns(), copyExcluded); - addDirectoryCopyInstructions(new FileBasedArtifactSourceRoot(directory, fileFilter)); + addDirectoryCopyInstructions(myInstructionsBuilder.createFileBasedRoot(directory, fileFilter)); } @Override public void addExtractDirectoryInstruction(@NotNull File jarFile, @NotNull String pathInJar) { final SourceFileFilterImpl filter = new SourceFileFilterImpl(null, myInstructionsBuilder.getRootsIndex(), myInstructionsBuilder.getIgnoredFilePatterns(), false); - addDirectoryCopyInstructions(new JarBasedArtifactSourceRoot(jarFile, pathInJar, filter)); + addDirectoryCopyInstructions(myInstructionsBuilder.createJarBasedRoot(jarFile, pathInJar, filter)); } protected abstract void addDirectoryCopyInstructions(ArtifactSourceRoot root); 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 765d26cdf747..b76651b760c1 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 @@ -1,8 +1,5 @@ package org.jetbrains.jps.incremental.artifacts.instructions; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import java.io.IOException; /** @@ -10,9 +7,4 @@ import java.io.IOException; */ public interface ArtifactInstructionsBuilder { void processRoots(ArtifactRootProcessor processor) throws IOException; - - @Nullable - JarInfo getJarInfo(String outputPath); - - int getRootIndex(@NotNull ArtifactSourceRoot root); } 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 c6449044298b..e71fae026463 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 @@ -1,17 +1,16 @@ package org.jetbrains.jps.incremental.artifacts.instructions; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.containers.LinkedMultiMap; -import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.IgnoredFilePatterns; import org.jetbrains.jps.incremental.ModuleRootsIndex; import java.io.File; import java.io.IOException; -import java.util.Collection; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -19,15 +18,16 @@ import java.util.Map; */ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuilder { private final Map myJarByPath; - private final MultiMap myInstructions; + private final List> myInstructions; private final ModuleRootsIndex myRootsIndex; private final IgnoredFilePatterns myIgnoredFilePatterns; + private int myRootIndex; public ArtifactInstructionsBuilderImpl(ModuleRootsIndex rootsIndex, IgnoredFilePatterns patterns) { myRootsIndex = rootsIndex; myIgnoredFilePatterns = patterns; myJarByPath = new HashMap(); - myInstructions = new LinkedMultiMap(); + myInstructions = new ArrayList>(); } public IgnoredFilePatterns getIgnoredFilePatterns() { @@ -40,7 +40,7 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil return false; } - myInstructions.putValue(root, destinationInfo); + myInstructions.add(Pair.create(root, destinationInfo)); return true; } @@ -56,32 +56,23 @@ public class ArtifactInstructionsBuilderImpl implements ArtifactInstructionsBuil return true; } - @Override - @Nullable - public JarInfo getJarInfo(String outputPath) { - return myJarByPath.get(outputPath); - } - - @Override - public int getRootIndex(@NotNull ArtifactSourceRoot root) { - int i = 0; - for (Map.Entry> entry : myInstructions.entrySet()) { - if (entry.getKey().equals(root)) { - return i; - } - i++; - } - return -1; - } - @Override public void processRoots(ArtifactRootProcessor processor) throws IOException { - int i = 0; - for (Map.Entry> entry : myInstructions.entrySet()) { - if (!processor.process(entry.getKey(), i, entry.getValue())) { + for (Pair pair : myInstructions) { + if (!processor.process(pair.getFirst(), pair.getSecond())) { break; } - i++; } } + + public FileBasedArtifactSourceRoot createFileBasedRoot(@NotNull File file, + @NotNull SourceFileFilter filter) { + return new FileBasedArtifactSourceRoot(file, filter, myRootIndex++); + } + + public JarBasedArtifactSourceRoot createJarBasedRoot(@NotNull File jarFile, + @NotNull String pathInJar, + @NotNull SourceFileFilter filter) { + return new JarBasedArtifactSourceRoot(jarFile, pathInJar, filter, myRootIndex++); + } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java index aa1e2395b327..66c278688176 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactRootProcessor.java @@ -7,5 +7,5 @@ import java.util.Collection; * @author nik */ public interface ArtifactRootProcessor { - boolean process(ArtifactSourceRoot root, int rootIndex, Collection destinations) throws IOException; + boolean process(ArtifactSourceRoot root, DestinationInfo destinations) throws IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java index 318e39693c27..04f6eb1c4683 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactSourceRoot.java @@ -14,9 +14,11 @@ import java.io.IOException; */ public abstract class ArtifactSourceRoot { private final SourceFileFilter myFilter; + private final int myRootIndex; - protected ArtifactSourceRoot(@NotNull SourceFileFilter filter) { + protected ArtifactSourceRoot(@NotNull SourceFileFilter filter, int index) { myFilter = filter; + myRootIndex = index; } @NotNull @@ -44,4 +46,8 @@ public abstract class ArtifactSourceRoot { public int hashCode() { return myFilter.hashCode(); } + + public int getRootIndex() { + return myRootIndex; + } } 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 312d3b1d29c8..d7acc17c2970 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 @@ -31,7 +31,7 @@ public class CopyToDirectoryInstructionCreator extends ArtifactCompilerInstructi } public void addFileCopyInstruction(@NotNull File file, @NotNull String outputFileName) { - myInstructionsBuilder.addDestination(new FileBasedArtifactSourceRoot(file, SourceFileFilter.ALL), new ExplodedDestinationInfo(myOutputPath + "/" + outputFileName)); + myInstructionsBuilder.addDestination(myInstructionsBuilder.createFileBasedRoot(file, SourceFileFilter.ALL), new ExplodedDestinationInfo(myOutputPath + "/" + outputFileName)); } @Override diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java index a930c1ffb168..43f49f96288f 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/FileBasedArtifactSourceRoot.java @@ -18,8 +18,8 @@ import java.util.Collections; public class FileBasedArtifactSourceRoot extends ArtifactSourceRoot { private final File myFile; - public FileBasedArtifactSourceRoot(@NotNull File file, @NotNull SourceFileFilter filter) { - super(filter); + public FileBasedArtifactSourceRoot(@NotNull File file, @NotNull SourceFileFilter filter, int index) { + super(filter, index); myFile = file; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java index 6159a09e6f1d..b95f9c237c91 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/JarBasedArtifactSourceRoot.java @@ -24,8 +24,8 @@ public class JarBasedArtifactSourceRoot extends ArtifactSourceRoot { private final File myJarFile; private final String myPathInJar; - public JarBasedArtifactSourceRoot(@NotNull File jarFile, @NotNull String pathInJar, @NotNull SourceFileFilter filter) { - super(filter); + public JarBasedArtifactSourceRoot(@NotNull File jarFile, @NotNull String pathInJar, @NotNull SourceFileFilter filter, int index) { + super(filter, index); myJarFile = jarFile; myPathInJar = pathInJar; } 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 1e80318d1203..9b006d987174 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 @@ -15,7 +15,6 @@ */ package org.jetbrains.jps.incremental.artifacts.instructions; -import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -42,7 +41,7 @@ public class PackIntoArchiveInstructionCreator extends ArtifactCompilerInstructi } public void addFileCopyInstruction(@NotNull File file, @NotNull String outputFileName) { - addCopyInstruction(childPathInJar(outputFileName), new FileBasedArtifactSourceRoot(file, SourceFileFilter.ALL)); + addCopyInstruction(childPathInJar(outputFileName), myInstructionsBuilder.createFileBasedRoot(file, SourceFileFilter.ALL)); } private void addCopyInstruction(String pathInJar, final ArtifactSourceRoot root) {