diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/AdditionalRootsProviderService.java b/jps/jps-builders/src/org/jetbrains/jps/builders/AdditionalRootsProviderService.java index 04f060466409..cfc2d984f399 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/AdditionalRootsProviderService.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/AdditionalRootsProviderService.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.builders; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import java.io.File; import java.util.Collection; @@ -22,7 +23,7 @@ public abstract class AdditionalRootsProviderService getAdditionalRoots(@NotNull BuildTarget target, File dataStorageRoot) { + public List getAdditionalRoots(@NotNull BuildTarget target, BuildDataPaths dataPaths) { return Collections.emptyList(); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTarget.java index dc21636f6a92..2750aefcfdf5 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTarget.java @@ -2,6 +2,7 @@ package org.jetbrains.jps.builders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.indices.IgnoredFileIndex; import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.JpsModel; @@ -32,7 +33,10 @@ public abstract class BuildTarget { } @NotNull - public abstract List computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex); + public abstract List computeRootDescriptors(JpsModel model, + ModuleExcludeIndex index, + IgnoredFileIndex ignoredFileIndex, + BuildDataPaths dataPaths); @Nullable public abstract BuildRootDescriptor findRootDescriptor(String rootId, BuildRootIndex rootIndex); diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTargetType.java b/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTargetType.java index 2b606f055037..797640408a09 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTargetType.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/BuildTargetType.java @@ -15,7 +15,7 @@ public abstract class BuildTargetType> { myTypeId = typeId; } - public String getTypeId() { + public final String getTypeId() { return myTypeId; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildDataPathsImpl.java b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildDataPathsImpl.java new file mode 100644 index 000000000000..caa7c26f3076 --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildDataPathsImpl.java @@ -0,0 +1,39 @@ +package org.jetbrains.jps.builders.impl; + +import com.intellij.util.PathUtilRt; +import org.jetbrains.jps.builders.BuildTarget; +import org.jetbrains.jps.builders.BuildTargetType; +import org.jetbrains.jps.builders.storage.BuildDataPaths; + +import java.io.File; + +/** + * @author nik + */ +public class BuildDataPathsImpl implements BuildDataPaths { + private final File myDataStorageRoot; + + public BuildDataPathsImpl(File dataStorageRoot) { + myDataStorageRoot = dataStorageRoot; + } + + @Override + public File getDataStorageRoot() { + return myDataStorageRoot; + } + + @Override + public File getTargetsDataRoot() { + return new File(myDataStorageRoot, "targets"); + } + + @Override + public File getTargetTypeDataRoot(BuildTargetType targetType) { + return new File(getTargetsDataRoot(), targetType.getTypeId()); + } + + @Override + public File getTargetDataRoot(BuildTarget target) { + return new File(getTargetTypeDataRoot(target.getTargetType()), PathUtilRt.suggestFileName(target.getId(), true, true)); + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildRootIndexImpl.java b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildRootIndexImpl.java index 3178be5f18f1..9ceaf2fd307e 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildRootIndexImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/impl/BuildRootIndexImpl.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.BuilderRegistry; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.indices.IgnoredFileIndex; @@ -33,32 +34,30 @@ public class BuildRootIndexImpl implements BuildRootIndex { private THashMap> myRootToDescriptor; private ConcurrentMap myFileFilters; - public BuildRootIndexImpl(BuildTargetIndex targetIndex, - JpsModel model, - ModuleExcludeIndex index, - File dataStorageRoot, final IgnoredFileIndex ignoredFileIndex) { + public BuildRootIndexImpl(BuildTargetIndex targetIndex, JpsModel model, ModuleExcludeIndex index, + BuildDataPaths dataPaths, final IgnoredFileIndex ignoredFileIndex) { myRootsByTarget = new HashMap, List>(); myRootToDescriptor = new THashMap>(FileUtil.FILE_HASHING_STRATEGY); myFileFilters = new ConcurrentHashMap(); final Iterable rootsProviders = JpsServiceManager.getInstance().getExtensions(AdditionalRootsProviderService.class); for (BuildTargetType targetType : BuilderRegistry.getInstance().getTargetTypes()) { for (BuildTarget target : targetIndex.getAllTargets(targetType)) { - addRoots(dataStorageRoot, rootsProviders, targetType, target, model, index, ignoredFileIndex); + addRoots(dataPaths, rootsProviders, targetType, target, model, index, ignoredFileIndex); } } } - private void addRoots(File dataStorageRoot, Iterable rootsProviders, + private void addRoots(BuildDataPaths dataPaths, Iterable rootsProviders, BuildTargetType targetType, BuildTarget target, JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex) { - List descriptors = target.computeRootDescriptors(model, index, ignoredFileIndex); + List descriptors = target.computeRootDescriptors(model, index, ignoredFileIndex, dataPaths); for (AdditionalRootsProviderService provider : rootsProviders) { if (provider.getTargetTypes().contains(targetType)) { //noinspection unchecked AdditionalRootsProviderService providerService = (AdditionalRootsProviderService)provider; - final List additionalRoots = providerService.getAdditionalRoots(target, dataStorageRoot); + final List additionalRoots = providerService.getAdditionalRoots(target, dataPaths); if (!additionalRoots.isEmpty()) { descriptors = new ArrayList(descriptors); descriptors.addAll(additionalRoots); diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/storage/BuildDataPaths.java b/jps/jps-builders/src/org/jetbrains/jps/builders/storage/BuildDataPaths.java new file mode 100644 index 000000000000..8925d0d25c81 --- /dev/null +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/storage/BuildDataPaths.java @@ -0,0 +1,19 @@ +package org.jetbrains.jps.builders.storage; + +import org.jetbrains.jps.builders.BuildTarget; +import org.jetbrains.jps.builders.BuildTargetType; + +import java.io.File; + +/** + * @author nik + */ +public interface BuildDataPaths { + File getDataStorageRoot(); + + File getTargetsDataRoot(); + + File getTargetTypeDataRoot(BuildTargetType targetType); + + File getTargetDataRoot(BuildTarget target); +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java index a3bade8b0d37..28d397acd634 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java @@ -11,9 +11,11 @@ import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.BuildTargetLoader; import org.jetbrains.jps.builders.BuildTargetType; +import org.jetbrains.jps.builders.impl.BuildDataPathsImpl; import org.jetbrains.jps.builders.impl.BuildRootIndexImpl; import org.jetbrains.jps.builders.impl.BuildTargetIndexImpl; import org.jetbrains.jps.builders.java.dependencyView.Callbacks; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.messages.BuildMessage; @@ -55,17 +57,18 @@ public class BuildRunner { public ProjectDescriptor load(MessageHandler msgHandler, File dataStorageRoot, BuildFSState fsState) throws IOException { final JpsModel jpsModel = myModelLoader.loadModel(); + BuildDataPaths dataPaths = new BuildDataPathsImpl(dataStorageRoot); BuildTargetIndexImpl targetIndex = new BuildTargetIndexImpl(jpsModel); ModuleExcludeIndex index = new ModuleExcludeIndexImpl(jpsModel); IgnoredFileIndexImpl ignoredFileIndex = new IgnoredFileIndexImpl(jpsModel); - BuildRootIndexImpl buildRootIndex = new BuildRootIndexImpl(targetIndex, jpsModel, index, dataStorageRoot, ignoredFileIndex); - BuildTargetsState targetsState = new BuildTargetsState(dataStorageRoot, jpsModel, buildRootIndex); + BuildRootIndexImpl buildRootIndex = new BuildRootIndexImpl(targetIndex, jpsModel, index, dataPaths, ignoredFileIndex); + BuildTargetsState targetsState = new BuildTargetsState(dataPaths, jpsModel, buildRootIndex); ProjectTimestamps projectTimestamps = null; BuildDataManager dataManager = null; try { projectTimestamps = new ProjectTimestamps(dataStorageRoot, targetsState); - dataManager = new BuildDataManager(dataStorageRoot, targetsState, STORE_TEMP_CACHES_IN_MEMORY); + dataManager = new BuildDataManager(dataPaths, targetsState, STORE_TEMP_CACHES_IN_MEMORY); if (dataManager.versionDiffers()) { myForceCleanCaches = true; msgHandler.processMessage(new CompilerMessage("build", BuildMessage.Kind.INFO, "Dependency data format has changed, project rebuild required")); @@ -82,9 +85,9 @@ public class BuildRunner { } myForceCleanCaches = true; FileUtil.delete(dataStorageRoot); - targetsState = new BuildTargetsState(dataStorageRoot, jpsModel, buildRootIndex); + targetsState = new BuildTargetsState(dataPaths, jpsModel, buildRootIndex); projectTimestamps = new ProjectTimestamps(dataStorageRoot, targetsState); - dataManager = new BuildDataManager(dataStorageRoot, targetsState, STORE_TEMP_CACHES_IN_MEMORY); + dataManager = new BuildDataManager(dataPaths, targetsState, STORE_TEMP_CACHES_IN_MEMORY); // second attempt succeded msgHandler.processMessage(new CompilerMessage("build", BuildMessage.Kind.INFO, "Project rebuild forced: " + e.getMessage())); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java index 28407dfeef68..b7c0e74a189b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java @@ -18,7 +18,7 @@ public class BuilderRegistry { static final BuilderRegistry ourInstance = new BuilderRegistry(); } private final Map> myModuleLevelBuilders = new HashMap>(); - private final List> myTargetBuilders = new ArrayList>(); + private final List> myTargetBuilders = new ArrayList>(); private final Map> myTargetTypes = new LinkedHashMap>(); public static BuilderRegistry getInstance() { @@ -79,7 +79,7 @@ public class BuilderRegistry { return ContainerUtil.concat(myModuleLevelBuilders.values()); } - public List> getTargetBuilders() { + public List> getTargetBuilders() { return myTargetBuilders; } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java index d2d9455104bc..ce3102a4436b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderService.java @@ -20,7 +20,7 @@ public abstract class BuilderService { } @NotNull - public List> createBuilders() { + public List> createBuilders() { return Collections.emptyList(); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java index 3e9803ea97b3..05b519556582 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java @@ -5,6 +5,7 @@ import com.intellij.openapi.util.io.FileSystemUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.builders.BuildTarget; @@ -131,17 +132,21 @@ public class FSOperations { Timestamps timestamps, boolean forceMarkDirty, @Nullable THashSet currentFiles) throws IOException { final ModuleExcludeIndex rootsIndex = context.getProjectDescriptor().getModuleExcludeIndex(); - final Set excludes = new HashSet(rootsIndex.getModuleExcludes(target.getModule())); - for (JavaSourceRootDescriptor rd : context.getProjectDescriptor().getBuildRootIndex().getTargetRoots(target, context)) { - if (!rd.root.exists()) { + markDirtyFiles(context, target, timestamps, forceMarkDirty, currentFiles, + new HashSet(rootsIndex.getModuleExcludes(target.getModule()))); + } + + static void markDirtyFiles(CompileContext context, BuildTarget target, Timestamps timestamps, boolean forceMarkDirty, @Nullable THashSet currentFiles, final Set excludes) throws IOException { + for (BuildRootDescriptor rd : context.getProjectDescriptor().getBuildRootIndex().getTargetRoots(target, context)) { + if (!rd.getRootFile().exists()) { continue; } context.getProjectDescriptor().fsState.clearRecompile(rd); - traverseRecursively(context, rd, rd.root, excludes, timestamps, forceMarkDirty, currentFiles); + traverseRecursively(context, rd, rd.getRootFile(), excludes, timestamps, forceMarkDirty, currentFiles); } } - private static void traverseRecursively(CompileContext context, final JavaSourceRootDescriptor rd, final File file, Set excludes, @NotNull final Timestamps tsStorage, final boolean forceDirty, @Nullable Set currentFiles) throws IOException { + private static void traverseRecursively(CompileContext context, final BuildRootDescriptor rd, final File file, Set excludes, @NotNull final Timestamps tsStorage, final boolean forceDirty, @Nullable Set currentFiles) throws IOException { final File[] children = file.listFiles(); if (children != null) { // is directory if (children.length > 0 && !JpsPathUtil.isUnder(excludes, file)) { @@ -153,7 +158,7 @@ public class FSOperations { else { // is file boolean markDirty = forceDirty; if (!markDirty) { - markDirty = tsStorage.getStamp(file, rd.target) != FileSystemUtil.lastModified(file); + markDirty = tsStorage.getStamp(file, rd.getTarget()) != FileSystemUtil.lastModified(file); } if (markDirty) { // if it is full project rebuild, all storages are already completely cleared; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 641e1fc95d9f..28d0881a3dbd 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -528,13 +528,19 @@ public class IncProjectBuilder { buildModuleChunk(context, new ModuleChunk(Collections.singleton(moduleBuildTarget))); } else { - buildTarget(target, context); + try { + buildTarget(target, context); + } + catch (IOException e) { + throw new ProjectBuildException(e); + } } } - private void buildTarget(BuildTarget target, CompileContext context) throws ProjectBuildException { - List> builders = BuilderRegistry.getInstance().getTargetBuilders(); - for (TargetBuilder builder : builders) { + private void buildTarget(BuildTarget target, CompileContext context) throws ProjectBuildException, IOException { + ensureFSStateInitialized(context, target); + List> builders = BuilderRegistry.getInstance().getTargetBuilders(); + for (TargetBuilder builder : builders) { buildTarget(target, context, builder); updateDoneFraction(context, 1.0f / builders.size()); } @@ -546,10 +552,17 @@ public class IncProjectBuilder { context.setDone(processed / myTotalTargetsWork); } - private static > void buildTarget(B target, CompileContext context, TargetBuilder builder) throws ProjectBuildException { + private static > void buildTarget(final T target, final CompileContext context, TargetBuilder builder) + throws ProjectBuildException, IOException { if (builder.getTargetTypes().contains(target.getTargetType())) { + DirtyFilesHolder holder = new DirtyFilesHolder() { + @Override + public void processDirtyFiles(@NotNull FileProcessor processor) throws IOException { + context.getProjectDescriptor().fsState.processFilesToRecompile(context, target, processor); + } + }; //noinspection unchecked - ((TargetBuilder)builder).build(target, context); + ((TargetBuilder)builder).build(target, context, holder); context.checkCanceled(); } } @@ -952,6 +965,16 @@ public class IncProjectBuilder { } } + private static void ensureFSStateInitialized(CompileContext context, BuildTarget target) throws IOException { + final ProjectDescriptor pd = context.getProjectDescriptor(); + final Timestamps timestamps = pd.timestamps.getStorage(); + final BuildTargetConfiguration configuration = pd.getTargetsState().getTargetConfiguration(target); + if (context.isProjectRebuild() || configuration.isTargetDirty() || context.getScope().isRecompilationForced(target)) { + FSOperations.markDirtyFiles(context, target, timestamps, true, null, Collections.emptySet()); + configuration.save(); + } + } + private static void ensureFSStateInitialized(CompileContext context, ModuleChunk chunk) throws IOException { final ProjectDescriptor pd = context.getProjectDescriptor(); final Timestamps timestamps = pd.timestamps.getStorage(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index 62fba04a2a3c..99f5a4bc23a9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.incremental; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.builders.BuildRootIndex; import org.jetbrains.jps.builders.BuildTarget; @@ -79,7 +80,10 @@ public class ModuleBuildTarget extends BuildTarget { @NotNull @Override - public List computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex) { + public List computeRootDescriptors(JpsModel model, + ModuleExcludeIndex index, + IgnoredFileIndex ignoredFileIndex, + BuildDataPaths dataPaths) { List roots = new ArrayList(); JavaSourceRootType type = isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; for (JpsTypedModuleSourceRoot> sourceRoot : myModule.getSourceRoots(type)) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/TargetBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/TargetBuilder.java index 6a4d7474a1d7..7fea04440365 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/TargetBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/TargetBuilder.java @@ -1,26 +1,30 @@ package org.jetbrains.jps.incremental; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.BuildTargetType; +import org.jetbrains.jps.builders.DirtyFilesHolder; +import java.io.IOException; import java.util.Collection; /** * Use {@link BuilderService} to register implementations of this class * @author nik */ -public abstract class TargetBuilder> extends Builder { - private final Collection> myTargetTypes; +public abstract class TargetBuilder> extends Builder { + private final Collection> myTargetTypes; - protected TargetBuilder(Collection> targetTypes) { + protected TargetBuilder(Collection> targetTypes) { myTargetTypes = targetTypes; } - public Collection> getTargetTypes() { + public Collection> getTargetTypes() { return myTargetTypes; } - public abstract void build(@NotNull B target, @NotNull CompileContext context) throws ProjectBuildException; + public abstract void build(@NotNull T target, @NotNull CompileContext context, DirtyFilesHolder holder) + throws ProjectBuildException, IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuildTarget.java index 0e39ecbb829f..5cbffd1bc4f3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuildTarget.java @@ -6,20 +6,16 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildRootIndex; import org.jetbrains.jps.builders.BuildTarget; -import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; -import org.jetbrains.jps.incremental.ModuleBuildTarget; -import org.jetbrains.jps.indices.IgnoredFileIndex; -import org.jetbrains.jps.indices.ModuleExcludeIndex; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.artifacts.builders.LayoutElementBuildersRegistry; import org.jetbrains.jps.incremental.artifacts.impl.JpsArtifactUtil; import org.jetbrains.jps.incremental.artifacts.instructions.*; +import org.jetbrains.jps.indices.IgnoredFileIndex; +import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.artifact.JpsArtifact; import org.jetbrains.jps.model.artifact.elements.JpsArtifactOutputPackagingElement; import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement; -import org.jetbrains.jps.model.java.JpsProductionModuleOutputPackagingElement; -import org.jetbrains.jps.model.java.JpsTestModuleOutputPackagingElement; -import org.jetbrains.jps.model.module.JpsModule; import java.io.PrintWriter; import java.util.Collection; @@ -61,18 +57,7 @@ public class ArtifactBuildTarget extends BuildTarget { } } } - else if (element instanceof JpsProductionModuleOutputPackagingElement) { - JpsModule module = ((JpsProductionModuleOutputPackagingElement)element).getModuleReference().resolve(); - if (module != null) { - dependencies.add(new ModuleBuildTarget(module, JavaModuleBuildTargetType.PRODUCTION)); - } - } - else if (element instanceof JpsTestModuleOutputPackagingElement) { - JpsModule module = ((JpsTestModuleOutputPackagingElement)element).getModuleReference().resolve(); - if (module != null) { - dependencies.add(new ModuleBuildTarget(module, JavaModuleBuildTargetType.TEST)); - } - } + dependencies.addAll(LayoutElementBuildersRegistry.getInstance().getDependencies(element)); return true; } }); @@ -102,9 +87,12 @@ public class ArtifactBuildTarget extends BuildTarget { @NotNull @Override - public List computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex) { + public List computeRootDescriptors(JpsModel model, + ModuleExcludeIndex index, + IgnoredFileIndex ignoredFileIndex, + BuildDataPaths dataPaths) { ArtifactInstructionsBuilderImpl builder = new ArtifactInstructionsBuilderImpl(index, ignoredFileIndex, this); - ArtifactInstructionsBuilderContext context = new ArtifactInstructionsBuilderContextImpl(); + ArtifactInstructionsBuilderContext context = new ArtifactInstructionsBuilderContextImpl(model, dataPaths); String outputPath = StringUtil.notNullize(myArtifact.getOutputPath()); final CopyToDirectoryInstructionCreator instructionCreator = new CopyToDirectoryInstructionCreator(builder, outputPath); LayoutElementBuildersRegistry.getInstance().generateInstructions(myArtifact, instructionCreator, context); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java index c609cb7e67db..df816e768ed6 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderService.java @@ -19,7 +19,7 @@ public class ArtifactBuilderService extends BuilderService { @NotNull @Override - public List> createBuilders() { + public List> createBuilders() { return Collections.singletonList(new IncArtifactBuilder()); } } 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 ad50f36d7384..898ae711d18d 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 @@ -9,6 +9,7 @@ import gnu.trove.TIntObjectHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.BuildRootIndex; +import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.storage.SourceToOutputMapping; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.*; @@ -28,7 +29,7 @@ import java.util.*; /** * @author nik */ -public class IncArtifactBuilder extends TargetBuilder { +public class IncArtifactBuilder extends TargetBuilder { public static final String BUILDER_NAME = "artifacts"; public IncArtifactBuilder() { @@ -36,7 +37,9 @@ public class IncArtifactBuilder extends TargetBuilder { } @Override - public void build(@NotNull ArtifactBuildTarget target, @NotNull CompileContext context) throws ProjectBuildException { + public void build(@NotNull ArtifactBuildTarget target, + @NotNull CompileContext context, + DirtyFilesHolder holder) throws ProjectBuildException { JpsArtifact artifact = target.getArtifact(); if (StringUtil.isEmpty(artifact.getOutputPath())) { context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, "Cannot build '" + artifact.getName() + "' artifact: output path is not specified")); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuilderService.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuilderService.java index df1322c2b2ad..261670a00b04 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuilderService.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/builders/LayoutElementBuilderService.java @@ -1,9 +1,14 @@ package org.jetbrains.jps.incremental.artifacts.builders; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactCompilerInstructionCreator; import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactInstructionsBuilderContext; import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement; +import java.util.Collection; +import java.util.Collections; + /** * @author nik */ @@ -16,6 +21,10 @@ public abstract class LayoutElementBuilderService public abstract void generateInstructions(E element, ArtifactCompilerInstructionCreator instructionCreator, ArtifactInstructionsBuilderContext builderContext); + public Collection> getDependencies(@NotNull E element) { + return Collections.emptyList(); + } + public final Class getElementClass() { return myElementClass; } 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 82e3c0143ba5..f594bab2aafe 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 @@ -4,6 +4,12 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ClassMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.BuildTarget; +import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; +import org.jetbrains.jps.incremental.ModuleBuildTarget; +import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactCompilerInstructionCreator; import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactInstructionsBuilderContext; @@ -15,6 +21,8 @@ import org.jetbrains.jps.model.java.JpsTestModuleOutputPackagingElement; import org.jetbrains.jps.service.JpsServiceManager; import java.io.File; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -24,9 +32,9 @@ public class LayoutElementBuildersRegistry { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.artifacts.builders.LayoutElementBuildersRegistry"); private static class InstanceHolder { + static final LayoutElementBuildersRegistry ourInstance = new LayoutElementBuildersRegistry(); } - public static LayoutElementBuildersRegistry getInstance() { return InstanceHolder.ourInstance; } @@ -53,16 +61,30 @@ public class LayoutElementBuildersRegistry { generateInstructions(artifact.getRootElement(), creator, context); } + public Collection> getDependencies(JpsPackagingElement element) { + LayoutElementBuilderService builder = getElementBuilder(element); + if (builder != null) { + //noinspection unchecked + return builder.getDependencies(element); + } + return Collections.emptyList(); + } + private void generateInstructions(JpsPackagingElement layoutElement, ArtifactCompilerInstructionCreator instructionCreator, ArtifactInstructionsBuilderContext builderContext) { - final LayoutElementBuilderService builder = myBuilders.get(layoutElement.getClass()); + final LayoutElementBuilderService builder = getElementBuilder(layoutElement); if (builder != null) { //noinspection unchecked builder.generateInstructions(layoutElement, instructionCreator, builderContext); } - else { + } + + private LayoutElementBuilderService getElementBuilder(JpsPackagingElement layoutElement) { + final LayoutElementBuilderService builder = myBuilders.get(layoutElement.getClass()); + if (builder == null) { LOG.error("Builder not found for artifact output layout element of class " + layoutElement.getClass()); } + return builder; } private void generateChildrenInstructions(JpsCompositePackagingElement element, ArtifactCompilerInstructionCreator instructionCreator, @@ -86,7 +108,7 @@ public class LayoutElementBuildersRegistry { } } - private static void generateModuleOutputInstructions(String outputUrl, ArtifactCompilerInstructionCreator creator) { + private static void generateModuleOutputInstructions(@Nullable String outputUrl, ArtifactCompilerInstructionCreator creator) { if (outputUrl != null) { creator.addDirectoryCopyInstructions(JpsPathUtil.urlToFile(outputUrl)); } @@ -194,6 +216,15 @@ public class LayoutElementBuildersRegistry { ArtifactInstructionsBuilderContext builderContext) { generateModuleOutputInstructions(element.getOutputUrl(), instructionCreator); } + + @Override + public Collection> getDependencies(@NotNull JpsProductionModuleOutputPackagingElement element) { + JpsModule module = element.getModuleReference().resolve(); + if (module != null) { + return Collections.singletonList(new ModuleBuildTarget(module, JavaModuleBuildTargetType.PRODUCTION)); + } + return Collections.emptyList(); + } } private static class ModuleTestOutputElementBuilder extends LayoutElementBuilderService { @@ -207,6 +238,15 @@ public class LayoutElementBuildersRegistry { ArtifactInstructionsBuilderContext builderContext) { generateModuleOutputInstructions(element.getOutputUrl(), instructionCreator); } + + @Override + public Collection> getDependencies(@NotNull JpsTestModuleOutputPackagingElement element) { + JpsModule module = element.getModuleReference().resolve(); + if (module != null) { + return Collections.singletonList(new ModuleBuildTarget(module, JavaModuleBuildTargetType.TEST)); + } + return Collections.emptyList(); + } } private class ComplexElementBuilder extends LayoutElementBuilderService { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContext.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContext.java index b6f7899f9407..892ff84de519 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContext.java @@ -1,5 +1,7 @@ package org.jetbrains.jps.incremental.artifacts.instructions; +import org.jetbrains.jps.builders.storage.BuildDataPaths; +import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.artifact.JpsArtifact; /** @@ -10,4 +12,8 @@ public interface ArtifactInstructionsBuilderContext { boolean enterArtifact(JpsArtifact artifact); void leaveArtifact(JpsArtifact artifact); + + BuildDataPaths getDataPaths(); + + JpsModel getModel(); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContextImpl.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContextImpl.java index cf24cf98c650..8fc91355a537 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContextImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/artifacts/instructions/ArtifactInstructionsBuilderContextImpl.java @@ -1,5 +1,7 @@ package org.jetbrains.jps.incremental.artifacts.instructions; +import org.jetbrains.jps.builders.storage.BuildDataPaths; +import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.artifact.JpsArtifact; import java.util.HashSet; @@ -10,11 +12,25 @@ import java.util.Set; */ public class ArtifactInstructionsBuilderContextImpl implements ArtifactInstructionsBuilderContext { private final Set myParentArtifacts; + private final JpsModel myModel; + private final BuildDataPaths myDataPaths; - public ArtifactInstructionsBuilderContextImpl() { + public ArtifactInstructionsBuilderContextImpl(JpsModel model, BuildDataPaths dataPaths) { + myModel = model; + myDataPaths = dataPaths; myParentArtifacts = new HashSet(); } + @Override + public JpsModel getModel() { + return myModel; + } + + @Override + public BuildDataPaths getDataPaths() { + return myDataPaths; + } + @Override public boolean enterArtifact(JpsArtifact artifact) { return myParentArtifacts.add(artifact); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java index 88727c9752de..4b5cd74d2732 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.impl.BuildTargetChunk; import org.jetbrains.jps.builders.java.dependencyView.Mappings; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.artifacts.ArtifactsBuildData; import java.io.*; @@ -20,7 +21,6 @@ import java.util.Map; public class BuildDataManager implements StorageOwner { private static final int VERSION = 12; private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.storage.BuildDataManager"); - private static final String SRC_TO_OUTPUTS_STORAGE = "src-out"; private static final String SRC_TO_FORM_STORAGE = "src-form"; private static final String MAPPINGS_STORAGE = "mappings"; @@ -31,22 +31,22 @@ public class BuildDataManager implements StorageOwner { private final ArtifactsBuildData myArtifactsBuildData; private final ModuleOutputRootsLayout myOutputRootsLayout; private final Mappings myMappings; - private final File myDataStorageRoot; + private final BuildDataPaths myDataPaths; private final BuildTargetsState myTargetsState; private final File myVersionFile; - public BuildDataManager(final File dataStorageRoot, BuildTargetsState targetsState, final boolean useMemoryTempCaches) throws IOException { - myDataStorageRoot = dataStorageRoot; + public BuildDataManager(final BuildDataPaths dataPaths, BuildTargetsState targetsState, final boolean useMemoryTempCaches) throws IOException { + myDataPaths = dataPaths; myTargetsState = targetsState; mySrcToFormMap = new SourceToFormMapping(new File(getSourceToFormsRoot(), "data")); myOutputRootsLayout = new ModuleOutputRootsLayout(new File(getOutputsLayoutRoot(), "data")); myMappings = new Mappings(getMappingsRoot(), useMemoryTempCaches); - myArtifactsBuildData = new ArtifactsBuildData(new File(dataStorageRoot, "artifacts")); - myVersionFile = new File(myDataStorageRoot, "version.dat"); + myArtifactsBuildData = new ArtifactsBuildData(new File(dataPaths.getDataStorageRoot(), "artifacts")); + myVersionFile = new File(myDataPaths.getDataStorageRoot(), "version.dat"); } private File getOutputsLayoutRoot() { - return new File(myDataStorageRoot, "output-roots"); + return new File(myDataPaths.getDataStorageRoot(), "output-roots"); } public SourceToOutputMappingImpl getSourceToOutputMap(final BuildTarget target) throws IOException { @@ -54,7 +54,7 @@ public class BuildDataManager implements StorageOwner { synchronized (mySourceToOutputLock) { mapping = mySourceToOutputs.get(target); if (mapping == null) { - mapping = new SourceToOutputMappingImpl(new File(myTargetsState.getTargetDataRoot(target), "src-out" + File.separator + "data")); + mapping = new SourceToOutputMappingImpl(new File(myDataPaths.getTargetDataRoot(target), "src-out" + File.separator + "data")); mySourceToOutputs.put(target, mapping); } } @@ -204,16 +204,16 @@ public class BuildDataManager implements StorageOwner { } } - public File getSourceToFormsRoot() { - return new File(myDataStorageRoot, SRC_TO_FORM_STORAGE); + private File getSourceToFormsRoot() { + return new File(myDataPaths.getDataStorageRoot(), SRC_TO_FORM_STORAGE); } - public File getMappingsRoot() { - return new File(myDataStorageRoot, MAPPINGS_STORAGE); + private File getMappingsRoot() { + return new File(myDataPaths.getDataStorageRoot(), MAPPINGS_STORAGE); } - public File getDataStorageRoot() { - return myDataStorageRoot; + public BuildDataPaths getDataPaths() { + return myDataPaths; } private static void wipeStorage(File root, @Nullable AbstractStateStorage storage) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java index 4c177a40d28c..f87b475a846a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java @@ -75,6 +75,6 @@ public class BuildTargetConfiguration { } private File getConfigFile() { - return new File(myTargetsState.getTargetDataRoot(myTarget), "config.dat"); + return new File(myTargetsState.getDataPaths().getTargetDataRoot(myTarget), "config.dat"); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetTypeState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetTypeState.java index 5657be9c0a91..477843622e5a 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetTypeState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetTypeState.java @@ -27,7 +27,7 @@ public class BuildTargetTypeState { public BuildTargetTypeState(BuildTargetType targetType, BuildTargetsState state) { myTargetType = targetType; myTargetsState = state; - myTargetsFile = new File(state.getTargetTypeDataRoot(targetType), "targets.dat"); + myTargetsFile = new File(state.getDataPaths().getTargetTypeDataRoot(targetType), "targets.dat"); myConfigurations = new ConcurrentHashMap, BuildTargetConfiguration>(); myTargetIds = new HashMap, Integer>(); load(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetsState.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetsState.java index 22a950c81908..8260bb784a86 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetsState.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetsState.java @@ -2,12 +2,12 @@ package org.jetbrains.jps.incremental.storage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.PathUtilRt; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.BuildTargetType; import org.jetbrains.jps.builders.impl.BuildRootIndexImpl; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.BuilderRegistry; import org.jetbrains.jps.model.JpsModel; @@ -20,14 +20,14 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class BuildTargetsState { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.storage.BuildTargetsState"); - private final File myDataStorageRoot; + private final BuildDataPaths myDataPaths; private AtomicInteger myMaxTargetId = new AtomicInteger(0); private ConcurrentMap, BuildTargetTypeState> myTypeStates = new ConcurrentHashMap, BuildTargetTypeState>(); private JpsModel myModel; private final BuildRootIndexImpl myBuildRootIndex; - public BuildTargetsState(File dataStorageRoot, JpsModel model, BuildRootIndexImpl buildRootIndex) { - myDataStorageRoot = dataStorageRoot; + public BuildTargetsState(BuildDataPaths dataPaths, JpsModel model, BuildRootIndexImpl buildRootIndex) { + myDataPaths = dataPaths; myModel = model; myBuildRootIndex = buildRootIndex; File targetTypesFile = getTargetTypesFile(); @@ -49,16 +49,8 @@ public class BuildTargetsState { } } - public File getTargetTypeDataRoot(BuildTargetType targetType) { - return new File(getTargetsDataRoot(), targetType.getTypeId()); - } - - public File getTargetsDataRoot() { - return new File(myDataStorageRoot, "targets"); - } - private File getTargetTypesFile() { - return new File(getTargetsDataRoot(), "targetTypes.dat"); + return new File(myDataPaths.getTargetsDataRoot(), "targetTypes.dat"); } public void save() { @@ -113,12 +105,8 @@ public class BuildTargetsState { return myMaxTargetId.incrementAndGet(); } - public File getTargetDataRoot(BuildTarget target) { - return new File(getTargetTypeDataRoot(target.getTargetType()), PathUtilRt.suggestFileName(target.getId(), true, true)); - } - public void clean() { - FileUtil.delete(getTargetsDataRoot()); + FileUtil.delete(myDataPaths.getTargetsDataRoot()); } public JpsModel getModel() { @@ -128,4 +116,8 @@ public class BuildTargetsState { public BuildRootIndexImpl getBuildRootIndex() { return myBuildRootIndex; } + + public BuildDataPaths getDataPaths() { + return myDataPaths; + } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java index 67fc6a462b96..cdb04c9cd468 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java @@ -6,6 +6,8 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.UsefulTestCase; import com.intellij.util.io.TestFileSystemBuilder; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.impl.BuildDataPathsImpl; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.api.CanceledStatus; import org.jetbrains.jps.builders.impl.BuildRootIndexImpl; @@ -125,10 +127,11 @@ public abstract class JpsBuildTestCase extends UsefulTestCase { BuildTargetIndexImpl targetIndex = new BuildTargetIndexImpl(myModel); ModuleExcludeIndex index = new ModuleExcludeIndexImpl(myModel); IgnoredFileIndexImpl ignoredFileIndex = new IgnoredFileIndexImpl(myModel); - BuildRootIndexImpl buildRootIndex = new BuildRootIndexImpl(targetIndex, myModel, index, myDataStorageRoot, ignoredFileIndex); - BuildTargetsState targetsState = new BuildTargetsState(myDataStorageRoot, myModel, buildRootIndex); + BuildDataPaths dataPaths = new BuildDataPathsImpl(myDataStorageRoot); + BuildRootIndexImpl buildRootIndex = new BuildRootIndexImpl(targetIndex, myModel, index, dataPaths, ignoredFileIndex); + BuildTargetsState targetsState = new BuildTargetsState(dataPaths, myModel, buildRootIndex); ProjectTimestamps timestamps = new ProjectTimestamps(myDataStorageRoot, targetsState); - BuildDataManager dataManager = new BuildDataManager(myDataStorageRoot, targetsState, true); + BuildDataManager dataManager = new BuildDataManager(dataPaths, targetsState, true); return new ProjectDescriptor(myModel, new BuildFSState(true), timestamps, dataManager, buildLoggingManager, index, targetsState, targetIndex, buildRootIndex, ignoredFileIndex); } @@ -186,7 +189,7 @@ public abstract class JpsBuildTestCase extends UsefulTestCase { return module; } - protected void doRebuild() { + protected void rebuildAll() { ProjectDescriptor descriptor = createProjectDescriptor(new BuildLoggingManager(new ArtifactBuilderLoggerImpl(), new JavaBuilderLoggerImpl())); try { CompileScope scope = new CompileScopeImpl(true, BuilderRegistry.getInstance().getTargetTypes(), Collections.>emptySet(), Collections.,Set>emptyMap()); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy index 76d6d892ee9c..c0d6192d2626 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/rebuild/JpsRebuildTestCase.groovy @@ -39,7 +39,7 @@ abstract class JpsRebuildTestCase extends JpsBuildTestCase { protected void rebuild() { JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myProject).outputUrl = JpsPathUtil.pathToUrl(FileUtil.toSystemIndependentName(getOrCreateOutputDirectory().getAbsolutePath())) - doRebuild() + rebuildAll() } private File getOrCreateOutputDirectory() { diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java index a4eca58617fe..bc9dcfa02c41 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java @@ -25,7 +25,7 @@ public class ResourceCopyingTest extends JpsBuildTestCase { public void testSimple() { String file = createFile("src/a.xml"); JpsModule m = addModule("m", PathUtil.getParentPath(file)); - doRebuild(); + rebuildAll(); assertOutput(m, fs().file("a.xml")); } public void testPackagePrefix() { @@ -35,7 +35,7 @@ public class ResourceCopyingTest extends JpsBuildTestCase { JpsTypedModuleSourceRoot> typed = sourceRoot.asTyped(JavaSourceRootType.SOURCE); assertNotNull(typed); typed.getProperties().setData(new JavaSourceRootProperties("xxx")); - doRebuild(); + rebuildAll(); assertOutput(m, fs().dir("xxx").file("a.xml")); } } diff --git a/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java b/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java index 02bf56a777b8..4fe47bf9892e 100644 --- a/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java +++ b/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java @@ -1,6 +1,8 @@ package org.jetbrains.jps.util; +import com.intellij.openapi.util.SystemInfoRt; import com.intellij.openapi.util.io.FileUtilRt; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.Set; @@ -39,6 +41,23 @@ public class JpsPathUtil { return url; } + //todo[nik] copied from VfsUtil + @NotNull + public static String fixURLforIDEA(@NotNull String url ) { + int idx = url.indexOf(":/"); + if( idx >= 0 && idx+2 < url.length() && url.charAt(idx+2) != '/' ) { + String prefix = url.substring(0, idx); + String suffix = url.substring(idx+2); + + if (SystemInfoRt.isWindows) { + url = prefix+"://"+suffix; + } else { + url = prefix+":///"+suffix; + } + } + return url; + } + public static String pathToUrl(String path) { return "file://" + path; } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetSerializer.java index 4e75ee9d5a81..10e0640db0d0 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetSerializer.java @@ -7,7 +7,9 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; +import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.module.JpsModuleReference; import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; import java.util.List; @@ -68,4 +70,13 @@ public class JpsFacetSerializer { } return null; } + + public static JpsModuleReference createModuleReference(String facetId) { + String moduleName = facetId.substring(0, facetId.indexOf('/')); + return JpsElementFactory.getInstance().createModuleReference(moduleName); + } + + public static String getFacetId(final JpsModuleReference moduleReference, final String facetTypeId, final String facetName) { + return moduleReference.getModuleName() + "/" + facetTypeId + "/" + facetName; + } } diff --git a/platform/platform-api/src/com/intellij/execution/configurations/ParametersList.java b/platform/platform-api/src/com/intellij/execution/configurations/ParametersList.java index ea58d2795e91..c7a03937eef3 100644 --- a/platform/platform-api/src/com/intellij/execution/configurations/ParametersList.java +++ b/platform/platform-api/src/com/intellij/execution/configurations/ParametersList.java @@ -22,8 +22,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.EnvironmentUtil; -import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.execution.ParametersListUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -254,64 +254,27 @@ public class ParametersList implements Cloneable { } /** - *

Joins list of parameters into single string, which may be then parsed back into list by {@link #parse(String)}.

- *

- *

- * Conversion rules: - *

    - *
  • double quotes are escaped by backslash (\);
  • - *
  • empty parameters parameters and parameters with spaces inside are surrounded with double quotes (");
  • - *
  • parameters are separated by single whitespace.
  • - *
- *

- *

- *

Examples:

- *

- * ['a', 'b'] => 'a b'
- * ['a="1 2"', 'b'] => '"a \"1 2\"" b' - *

- * - * @param parameters a list of parameters to join. - * @return a string with parameters. + * @see ParametersListUtil#join(java.util.List) */ @NotNull public static String join(@NotNull final List parameters) { - return ParametersTokenizer.encode(parameters); - } - - @NotNull - public static String join(final String... parameters) { - return ParametersTokenizer.encode(Arrays.asList(parameters)); + return ParametersListUtil.join(parameters); } /** - *

Converts single parameter string (as created by {@link #join(java.util.List)}) into list of parameters.

- *

- *

- * Conversion rules: - *

    - *
  • starting/whitespaces are trimmed;
  • - *
  • parameters are split by whitespaces, whitespaces itself are dropped
  • - *
  • parameters inside double quotes ("a b") are kept as single one;
  • - *
  • double quotes are dropped, escaped double quotes (\") are un-escaped.
  • - *
- *

- *

- *

Examples:

- *

- * ' a b ' => ['a', 'b']
- * 'a="1 2" b' => ['a=1 2', 'b']
- * 'a " " b' => ['a', ' ', 'b']
- * '"a \"1 2\"" b' => ['a="1 2"', 'b'] - *

- * - * @param string parameter string to split. - * @return array of parameters. + * @see ParametersListUtil#join(java.util.List) + */ + @NotNull + public static String join(final String... parameters) { + return ParametersListUtil.join(parameters); + } + + /** + * @see ParametersListUtil#parseToArray(String) */ @NotNull public static String[] parse(@NotNull final String string) { - final List params = ParametersTokenizer.decode(string); - return ArrayUtil.toStringArray(params); + return ParametersListUtil.parseToArray(string); } public String expandMacros(String text) { @@ -356,84 +319,4 @@ public class ParametersList implements Cloneable { return myParameters.toString(); } - private static class ParametersTokenizer { - private ParametersTokenizer() { - } - - @NotNull - public static String encode(@NotNull final List parameters) { - final StringBuilder buffer = new StringBuilder(); - for (final String parameter : parameters) { - if (buffer.length() > 0) { - buffer.append(' '); - } - buffer.append(encode(parameter)); - } - return buffer.toString(); - } - - @NotNull - public static String encode(@NotNull String parameter) { - final StringBuilder builder = StringBuilderSpinAllocator.alloc(); - try { - builder.append(parameter); - StringUtil.escapeQuotes(builder); - if (builder.length() == 0 || StringUtil.indexOf(builder, ' ') >= 0 || StringUtil.indexOf(builder, '|') >= 0) { - StringUtil.quote(builder); - } - return builder.toString(); - } - finally { - StringBuilderSpinAllocator.dispose(builder); - } - } - - @NotNull - public static List decode(@NotNull String parameterString) { - parameterString = parameterString.trim(); - - final ArrayList params = ContainerUtil.newArrayList(); - final StringBuilder token = new StringBuilder(128); - boolean inQuotes = false; - boolean escapedQuote = false; - boolean nonEmpty = false; - - for (int i = 0; i < parameterString.length(); i++) { - final char ch = parameterString.charAt(i); - - if (ch == '\"') { - if (!escapedQuote) { - inQuotes = !inQuotes; - nonEmpty = true; - continue; - } - escapedQuote = false; - } - else if (Character.isWhitespace(ch)) { - if (!inQuotes) { - if (token.length() > 0 || nonEmpty) { - params.add(token.toString()); - token.setLength(0); - nonEmpty = false; - } - continue; - } - } - else if (ch == '\\') { - if (i < parameterString.length() - 1 && parameterString.charAt(i + 1) == '"') { - escapedQuote = true; - continue; - } - } - - token.append(ch); - } - - if (token.length() > 0 || nonEmpty) { - params.add(token.toString()); - } - - return params; - } - } } diff --git a/platform/util/src/com/intellij/util/execution/ParametersListUtil.java b/platform/util/src/com/intellij/util/execution/ParametersListUtil.java new file mode 100644 index 000000000000..9d8ac99297c1 --- /dev/null +++ b/platform/util/src/com/intellij/util/execution/ParametersListUtil.java @@ -0,0 +1,171 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.util.execution; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.StringBuilderSpinAllocator; +import com.intellij.util.containers.ContainerUtilRt; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author nik + */ +public class ParametersListUtil { + /** + *

Joins list of parameters into single string, which may be then parsed back into list by {@link #parseToArray(String)}.

+ *

+ *

+ * Conversion rules: + *

    + *
  • double quotes are escaped by backslash (\);
  • + *
  • empty parameters parameters and parameters with spaces inside are surrounded with double quotes (");
  • + *
  • parameters are separated by single whitespace.
  • + *
+ *

+ *

+ *

Examples:

+ *

+ * ['a', 'b'] => 'a b'
+ * ['a="1 2"', 'b'] => '"a \"1 2\"" b' + *

+ * + * @param parameters a list of parameters to join. + * @return a string with parameters. + */ + @NotNull + public static String join(@NotNull final List parameters) { + return encode(parameters); + } + + @NotNull + public static String join(final String... parameters) { + return encode(Arrays.asList(parameters)); + } + + /** + * @see #parse(String) + */ + @NotNull + public static String[] parseToArray(@NotNull final String string) { + final List params = parse(string); + return ArrayUtil.toStringArray(params); + } + + /** + *

Converts single parameter string (as created by {@link #join(java.util.List)}) into list of parameters.

+ *

+ *

+ * Conversion rules: + *

    + *
  • starting/whitespaces are trimmed;
  • + *
  • parameters are split by whitespaces, whitespaces itself are dropped
  • + *
  • parameters inside double quotes ("a b") are kept as single one;
  • + *
  • double quotes are dropped, escaped double quotes (\") are un-escaped.
  • + *
+ *

+ *

+ *

Examples:

+ *

+ * ' a b ' => ['a', 'b']
+ * 'a="1 2" b' => ['a=1 2', 'b']
+ * 'a " " b' => ['a', ' ', 'b']
+ * '"a \"1 2\"" b' => ['a="1 2"', 'b'] + *

+ * + * @param string parameter string to split. + * @return array of parameters. + */ + @NotNull + public static List parse(@NotNull String parameterString) { + parameterString = parameterString.trim(); + + final ArrayList params = ContainerUtilRt.newArrayList(); + final StringBuilder token = new StringBuilder(128); + boolean inQuotes = false; + boolean escapedQuote = false; + boolean nonEmpty = false; + + for (int i = 0; i < parameterString.length(); i++) { + final char ch = parameterString.charAt(i); + + if (ch == '\"') { + if (!escapedQuote) { + inQuotes = !inQuotes; + nonEmpty = true; + continue; + } + escapedQuote = false; + } + else if (Character.isWhitespace(ch)) { + if (!inQuotes) { + if (token.length() > 0 || nonEmpty) { + params.add(token.toString()); + token.setLength(0); + nonEmpty = false; + } + continue; + } + } + else if (ch == '\\') { + if (i < parameterString.length() - 1 && parameterString.charAt(i + 1) == '"') { + escapedQuote = true; + continue; + } + } + + token.append(ch); + } + + if (token.length() > 0 || nonEmpty) { + params.add(token.toString()); + } + + return params; + } + + @NotNull + private static String encode(@NotNull final List parameters) { + final StringBuilder buffer = new StringBuilder(); + for (final String parameter : parameters) { + if (buffer.length() > 0) { + buffer.append(' '); + } + buffer.append(encode(parameter)); + } + return buffer.toString(); + } + + @NotNull + private static String encode(@NotNull String parameter) { + final StringBuilder builder = StringBuilderSpinAllocator.alloc(); + try { + builder.append(parameter); + StringUtil.escapeQuotes(builder); + if (builder.length() == 0 || StringUtil.indexOf(builder, ' ') >= 0 || StringUtil.indexOf(builder, '|') >= 0) { + StringUtil.quote(builder); + } + return builder.toString(); + } + finally { + StringBuilderSpinAllocator.dispose(builder); + } + } +} diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAdditionalRootProviderService.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAdditionalRootProviderService.java index e23a7d31cf50..5a2872e57753 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAdditionalRootProviderService.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAdditionalRootProviderService.java @@ -5,6 +5,7 @@ import org.jetbrains.jps.builders.AdditionalRootsProviderService; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.ModuleBuildTarget; import java.io.File; @@ -22,9 +23,9 @@ public class AndroidAdditionalRootProviderService extends AdditionalRootsProvide @NotNull @Override - public List getAdditionalRoots(@NotNull BuildTarget target, File dataStorageRoot) { + public List getAdditionalRoots(@NotNull BuildTarget target, BuildDataPaths dataPaths) { ModuleBuildTarget buildTarget = (ModuleBuildTarget)target; - final File generatedSourcesRoot = AndroidJpsUtil.getGeneratedSourcesStorage(buildTarget.getModule(), dataStorageRoot); + final File generatedSourcesRoot = AndroidJpsUtil.getGeneratedSourcesStorage(buildTarget.getModule(), dataPaths); final List result = new ArrayList(); addRoot(result, buildTarget, new File(generatedSourcesRoot, AndroidJpsUtil.AAPT_GENERATED_SOURCE_ROOT_NAME)); diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java index 85d1f0f5e35e..d6863127ca92 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java @@ -28,7 +28,7 @@ public class AndroidBuilderService extends BuilderService { @NotNull @Override - public List> createBuilders() { + public List> createBuilders() { return Arrays.asList(new AndroidDexBuilder(), new AndroidPackagingBuilder()); } diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java index 7684f661b890..7354f9e55e80 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java @@ -33,6 +33,8 @@ import org.jetbrains.jps.ProjectPaths; import org.jetbrains.jps.android.builder.AndroidProjectBuildTarget; import org.jetbrains.jps.android.model.JpsAndroidModuleExtension; import org.jetbrains.jps.android.model.JpsAndroidSdkProperties; +import org.jetbrains.jps.builders.BuildRootDescriptor; +import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.cmdline.ClasspathBootstrap; import org.jetbrains.jps.incremental.*; @@ -53,7 +55,7 @@ import java.util.*; /** * @author Eugene.Kudelevsky */ -public class AndroidDexBuilder extends TargetBuilder { +public class AndroidDexBuilder extends TargetBuilder { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.android.AndroidDexBuilder"); @NonNls private static final String BUILDER_NAME = "android-dex"; @@ -66,7 +68,8 @@ public class AndroidDexBuilder extends TargetBuilder } @Override - public void build(@NotNull AndroidProjectBuildTarget target, @NotNull CompileContext context) throws ProjectBuildException { + public void build(@NotNull AndroidProjectBuildTarget target, @NotNull CompileContext context, + DirtyFilesHolder holder) throws ProjectBuildException { if (target.getKind() != AndroidProjectBuildTarget.AndroidBuilderKind.DEX && AndroidJpsUtil.isLightBuild(context)) { return; } @@ -83,7 +86,7 @@ public class AndroidDexBuilder extends TargetBuilder } private static void doBuild(CompileContext context) throws IOException, ProjectBuildException { - final File root = context.getProjectDescriptor().dataManager.getDataStorageRoot(); + final File root = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(); AndroidFileSetStorage dexStateStorage = null; AndroidFileSetStorage proguardStateStorage = null; diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java index a58439655916..79d8c1e7a22f 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java @@ -16,6 +16,7 @@ import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.util.JpsPathUtil; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.ProjectPaths; @@ -153,7 +154,7 @@ public class AndroidJpsUtil { @NotNull public static File getDirectoryForIntermediateArtifacts(@NotNull CompileContext context, @NotNull JpsModule module) { - final File androidStorage = new File(context.getProjectDescriptor().dataManager.getDataStorageRoot(), ANDROID_STORAGE_DIR); + final File androidStorage = new File(context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(), ANDROID_STORAGE_DIR); return new File(new File(androidStorage, INTERMEDIATE_ARTIFACTS_STORAGE), module.getName()); } @@ -520,7 +521,7 @@ public class AndroidJpsUtil { @NotNull public static File getResourcesCacheDir(@NotNull CompileContext context, @NotNull JpsModule module) { - final File androidStorage = new File(context.getProjectDescriptor().dataManager.getDataStorageRoot(), ANDROID_STORAGE_DIR); + final File androidStorage = new File(context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(), ANDROID_STORAGE_DIR); return new File(new File(androidStorage, RESOURCE_CACHE_STORAGE), module.getName()); } @@ -585,19 +586,19 @@ public class AndroidJpsUtil { @NotNull public static File getGeneratedSourcesStorage(@NotNull JpsModule module, BuildDataManager dataManager) { - return getGeneratedSourcesStorage(module, dataManager.getDataStorageRoot()); + return getGeneratedSourcesStorage(module, dataManager.getDataPaths()); } @NotNull - public static File getGeneratedSourcesStorage(@NotNull JpsModule module, final File dataStorageRoot) { - final File androidStorageRoot = new File(dataStorageRoot, ANDROID_STORAGE_DIR); + public static File getGeneratedSourcesStorage(@NotNull JpsModule module, final BuildDataPaths dataPaths) { + final File androidStorageRoot = new File(dataPaths.getDataStorageRoot(), ANDROID_STORAGE_DIR); final File generatedSourcesRoot = new File(androidStorageRoot, GENERATED_SOURCES_FOLDER_NAME); return new File(generatedSourcesRoot, module.getName()); } @NotNull public static File getGeneratedResourcesStorage(@NotNull JpsModule module, BuildDataManager dataManager) { - final File dataStorageRoot = dataManager.getDataStorageRoot(); + final File dataStorageRoot = dataManager.getDataPaths().getDataStorageRoot(); final File androidStorageRoot = new File(dataStorageRoot, ANDROID_STORAGE_DIR); final File generatedSourcesRoot = new File(androidStorageRoot, GENERATED_RESOURCES_DIR_NAME); return new File(generatedSourcesRoot, module.getName()); diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java index 2421a9fca633..fca96bda9677 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java @@ -18,6 +18,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.ProjectPaths; import org.jetbrains.jps.android.builder.AndroidProjectBuildTarget; import org.jetbrains.jps.android.model.JpsAndroidModuleExtension; +import org.jetbrains.jps.builders.BuildRootDescriptor; +import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.messages.BuildMessage; @@ -38,7 +40,7 @@ import java.util.*; /** * @author Eugene.Kudelevsky */ -public class AndroidPackagingBuilder extends TargetBuilder { +public class AndroidPackagingBuilder extends TargetBuilder { @NonNls private static final String BUILDER_NAME = "android-packager"; @NonNls private static final String RELEASE_SUFFIX = ".release"; @NonNls private static final String UNSIGNED_SUFFIX = ".unsigned"; @@ -58,7 +60,8 @@ public class AndroidPackagingBuilder extends TargetBuilder holder) throws ProjectBuildException { if (target.getKind() != AndroidProjectBuildTarget.AndroidBuilderKind.PACKAGING || AndroidJpsUtil.isLightBuild(context)) { return; } @@ -123,7 +126,7 @@ public class AndroidPackagingBuilder extends TargetBuilder modules, @NotNull Map module2state) throws IOException { boolean success = true; - final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataStorageRoot(); + final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(); final AndroidFileSetStorage storage = new AndroidFileSetStorage(dataStorageRoot, "resource_caching"); try { @@ -212,7 +215,7 @@ public class AndroidPackagingBuilder extends TargetBuilder manifestFiles) throws IOException { boolean success = true; - final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataStorageRoot(); + final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(); final boolean releaseBuild = AndroidJpsUtil.isReleaseBuild(context); AndroidFileSetStorage resourcesStorage = null; AndroidFileSetStorage assetsStorage = null; @@ -292,7 +295,7 @@ public class AndroidPackagingBuilder extends TargetBuilder modules) throws IOException { final boolean release = AndroidJpsUtil.isReleaseBuild(context); - final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataStorageRoot(); + final File dataStorageRoot = context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(); boolean success = true; diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java index ab3aef84ee90..ee604d2c8b52 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java @@ -162,7 +162,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { success = false; } - final File dataStorageRoot = dataManager.getDataStorageRoot(); + final File dataStorageRoot = dataManager.getDataPaths().getDataStorageRoot(); final AndroidAptStateStorage aptStorage = new AndroidAptStateStorage(dataStorageRoot); try { diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidProjectBuildTarget.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidProjectBuildTarget.java index 89b7525ed1d4..244355050dbc 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidProjectBuildTarget.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidProjectBuildTarget.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.android.AndroidJpsUtil; import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; +import org.jetbrains.jps.builders.storage.BuildDataPaths; import org.jetbrains.jps.incremental.ModuleBuildTarget; import org.jetbrains.jps.indices.IgnoredFileIndex; import org.jetbrains.jps.indices.ModuleExcludeIndex; @@ -81,7 +82,10 @@ public class AndroidProjectBuildTarget extends BuildTarget @NotNull @Override - public List computeRootDescriptors(JpsModel model, ModuleExcludeIndex index, IgnoredFileIndex ignoredFileIndex) { + public List computeRootDescriptors(JpsModel model, + ModuleExcludeIndex index, + IgnoredFileIndex ignoredFileIndex, + BuildDataPaths dataPaths) { return Collections.emptyList(); } diff --git a/plugins/maven/jps-plugin/testSrc/org/jetbrains/jps/maven/model/JpsMavenJavaBuildingTest.java b/plugins/maven/jps-plugin/testSrc/org/jetbrains/jps/maven/model/JpsMavenJavaBuildingTest.java index 56363ee875ad..003b88ff60f4 100644 --- a/plugins/maven/jps-plugin/testSrc/org/jetbrains/jps/maven/model/JpsMavenJavaBuildingTest.java +++ b/plugins/maven/jps-plugin/testSrc/org/jetbrains/jps/maven/model/JpsMavenJavaBuildingTest.java @@ -32,6 +32,6 @@ public class JpsMavenJavaBuildingTest extends JpsBuildTestCase { FileUtil.copyDir(srcDir, workDir); addJdk("1.6"); loadProject(workDir.getAbsolutePath()); - doRebuild(); + rebuildAll(); } } diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/JpsUiDesignerExtensionService.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/JpsUiDesignerExtensionService.java index df5f0ac82bc4..1ec6aee21b86 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/JpsUiDesignerExtensionService.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/JpsUiDesignerExtensionService.java @@ -16,5 +16,5 @@ public abstract class JpsUiDesignerExtensionService { @Nullable public abstract JpsUiDesignerConfiguration getUiDesignerConfiguration(@NotNull JpsProject project); - public abstract void setUiDesignerConfiguration(@NotNull JpsProject project, @Nullable JpsUiDesignerConfiguration configuration); + public abstract void setUiDesignerConfiguration(@NotNull JpsProject project, @NotNull JpsUiDesignerConfiguration configuration); } diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerConfigurationSerializer.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerConfigurationSerializer.java index dcf8f9fbc7f1..cba28c775213 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerConfigurationSerializer.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerConfigurationSerializer.java @@ -22,6 +22,9 @@ public class JpsUiDesignerConfigurationSerializer extends JpsProjectExtensionSer @Override public void loadExtension(@NotNull JpsProject element, @NotNull Element componentTag) { JpsUiDesignerConfigurationImpl.UiDesignerConfigurationState state = XmlSerializer.deserialize(componentTag, JpsUiDesignerConfigurationImpl.UiDesignerConfigurationState.class); + if (state == null) { + state = new JpsUiDesignerConfigurationImpl.UiDesignerConfigurationState(); + } JpsUiDesignerExtensionService.getInstance().setUiDesignerConfiguration(element, new JpsUiDesignerConfigurationImpl(state)); } diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerExtensionServiceImpl.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerExtensionServiceImpl.java index c39dc9044fdb..9f5a04ad81f8 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerExtensionServiceImpl.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/model/impl/JpsUiDesignerExtensionServiceImpl.java @@ -17,7 +17,7 @@ public class JpsUiDesignerExtensionServiceImpl extends JpsUiDesignerExtensionSer } @Override - public void setUiDesignerConfiguration(@NotNull JpsProject project, @Nullable JpsUiDesignerConfiguration configuration) { + public void setUiDesignerConfiguration(@NotNull JpsProject project, @NotNull JpsUiDesignerConfiguration configuration) { project.getContainer().setChild(JpsUiDesignerConfigurationImpl.ROLE, configuration); } }