diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/BuildTargetsFactoryImpl.java b/java/compiler/impl/src/com/intellij/compiler/ant/BuildTargetsFactoryImpl.java index 4065ab8fcb7e..0db7086e81a0 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/BuildTargetsFactoryImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/BuildTargetsFactoryImpl.java @@ -20,27 +20,12 @@ */ package com.intellij.compiler.ant; -import com.intellij.compiler.ant.j2ee.BuildExplodedTarget; -import com.intellij.compiler.ant.j2ee.CompositeBuildTarget; -import com.intellij.compiler.ant.taskdefs.Target; -import com.intellij.openapi.compiler.make.BuildRecipe; import com.intellij.openapi.project.Project; import com.intellij.util.ArrayUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; public class BuildTargetsFactoryImpl extends BuildTargetsFactory { - public CompositeGenerator createCompositeBuildTarget(final ExplodedAndJarTargetParameters parameters, @NonNls final String targetName, - final String description, final String depends, @Nullable String jarPath) { - return new CompositeBuildTarget(parameters, targetName, description, depends, jarPath); - } - - public Target createBuildExplodedTarget(final ExplodedAndJarTargetParameters parameters, final BuildRecipe buildRecipe, final String description) { - return new BuildExplodedTarget(parameters, buildRecipe, description); - } - public Generator createComment(final String comment) { return new Comment(comment); diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/CleanProject.java b/java/compiler/impl/src/com/intellij/compiler/ant/CleanProject.java index 7cb9bbd9243c..730a2fe497a0 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/CleanProject.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/CleanProject.java @@ -18,6 +18,7 @@ package com.intellij.compiler.ant; import com.intellij.compiler.ant.taskdefs.Target; import com.intellij.compiler.ant.artifacts.ArtifactsGenerator; import com.intellij.openapi.compiler.CompilerBundle; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.PrintWriter; @@ -29,7 +30,7 @@ import java.io.PrintWriter; public class CleanProject extends Generator { private final Target myTarget; - public CleanProject(GenerationOptions genOptions, ArtifactsGenerator artifactsGenerator) { + public CleanProject(@NotNull GenerationOptions genOptions, @NotNull ArtifactsGenerator artifactsGenerator) { StringBuffer dependencies = new StringBuffer(); final ModuleChunk[] chunks = genOptions.getModuleChunks(); for (int idx = 0; idx < chunks.length; idx++) { @@ -38,11 +39,9 @@ public class CleanProject extends Generator { } dependencies.append(BuildProperties.getModuleCleanTargetName(chunks[idx].getName())); } - if (artifactsGenerator != null) { - for (String target : artifactsGenerator.getCleanTargetNames()) { - if (dependencies.length() > 0) dependencies.append(", "); - dependencies.append(target); - } + for (String target : artifactsGenerator.getCleanTargetNames()) { + if (dependencies.length() > 0) dependencies.append(", "); + dependencies.append(target); } myTarget = new Target(BuildProperties.TARGET_CLEAN, dependencies.toString(), CompilerBundle.message("generated.ant.build.clean.all.task.comment"), null); diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/ProjectBuild.java b/java/compiler/impl/src/com/intellij/compiler/ant/ProjectBuild.java index eaf0c454a91e..c1e7ee712ae7 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/ProjectBuild.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/ProjectBuild.java @@ -20,7 +20,6 @@ import com.intellij.compiler.ant.taskdefs.AntProject; import com.intellij.compiler.ant.taskdefs.Target; import com.intellij.openapi.compiler.CompilerBundle; import com.intellij.openapi.project.Project; -import com.intellij.packaging.artifacts.ArtifactManager; import java.io.IOException; import java.io.PrintWriter; @@ -68,13 +67,7 @@ public abstract class ProjectBuild extends Generator { initTarget.add(new Comment(CompilerBundle.message("generated.ant.build.initialization.section.comment"))); myAntProject.add(initTarget, 1); - ArtifactsGenerator artifactsGenerator; - if (ArtifactManager.getInstance(project).getArtifacts().length > 0) { - artifactsGenerator = new ArtifactsGenerator(project, genOptions); - } - else { - artifactsGenerator = null; - } + ArtifactsGenerator artifactsGenerator = new ArtifactsGenerator(project, genOptions); myAntProject.add(new CleanProject(genOptions, artifactsGenerator), 1); @@ -83,7 +76,7 @@ public abstract class ProjectBuild extends Generator { StringBuilder buildAllTargetNames = new StringBuilder(); buildAllTargetNames.append(BuildProperties.TARGET_BUILD_MODULES); - if (artifactsGenerator != null) { + if (artifactsGenerator.hasArtifacts()) { List generators = artifactsGenerator.generate(); for (Generator generator : generators) { myAntProject.add(generator, 1); diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactAntGenerationContextImpl.java b/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactAntGenerationContextImpl.java index 4d32b4dbe723..d1a60034ef1a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactAntGenerationContextImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactAntGenerationContextImpl.java @@ -24,7 +24,6 @@ import com.intellij.compiler.ant.taskdefs.Property; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.packaging.artifacts.Artifact; -import com.intellij.packaging.artifacts.ArtifactManager; import com.intellij.packaging.elements.ArtifactAntGenerationContext; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import gnu.trove.THashMap; @@ -50,10 +49,10 @@ public class ArtifactAntGenerationContextImpl implements ArtifactAntGenerationCo private List myBeforeCurrentArtifact = new ArrayList(); private Set myArtifactsToClean = new THashSet(); - public ArtifactAntGenerationContextImpl(Project project, GenerationOptions generationOptions) { + public ArtifactAntGenerationContextImpl(Project project, GenerationOptions generationOptions, List allArtifacts) { myProject = project; myGenerationOptions = generationOptions; - for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + for (Artifact artifact : allArtifacts) { if (ArtifactUtil.shouldClearArtifactOutputBeforeRebuild(artifact)) { myArtifactsToClean.add(artifact); } diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactsGenerator.java b/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactsGenerator.java index 4997d9c42085..4c1f0dd4a487 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactsGenerator.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/artifacts/ArtifactsGenerator.java @@ -38,6 +38,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -46,14 +47,20 @@ import java.util.List; public class ArtifactsGenerator { @NonNls public static final String BUILD_ALL_ARTIFACTS_TARGET = "build.all.artifacts"; @NonNls private static final String INIT_ARTIFACTS_TARGET = "init.artifacts"; - private final Project myProject; private final PackagingElementResolvingContext myResolvingContext; private ArtifactAntGenerationContextImpl myContext; + private List myAllArtifacts; public ArtifactsGenerator(Project project, GenerationOptions genOptions) { - myProject = project; - myResolvingContext = ArtifactManager.getInstance(myProject).getResolvingContext(); - myContext = new ArtifactAntGenerationContextImpl(project, genOptions); + myResolvingContext = ArtifactManager.getInstance(project).getResolvingContext(); + + myAllArtifacts = new ArrayList(Arrays.asList(ArtifactManager.getInstance(project).getSortedArtifacts())); + + myContext = new ArtifactAntGenerationContextImpl(project, genOptions, myAllArtifacts); + } + + public boolean hasArtifacts() { + return !myAllArtifacts.isEmpty(); } public List generate() { @@ -63,8 +70,7 @@ public class ArtifactsGenerator { generators.add(initTarget); initTarget.add(new Property(ArtifactAntGenerationContextImpl.ARTIFACTS_TEMP_DIR_PROPERTY, BuildProperties.propertyRelativePath(BuildProperties.getProjectBaseDirProperty(), "artifactsTemp"))); - final Artifact[] artifacts = ArtifactManager.getInstance(myProject).getSortedArtifacts(); - for (Artifact artifact : artifacts) { + for (Artifact artifact : myAllArtifacts) { if (!myContext.shouldBuildIntoTempDirectory(artifact)) { generators.add(new CleanArtifactTarget(artifact, myContext)); } @@ -76,7 +82,7 @@ public class ArtifactsGenerator { initTarget.add(new Mkdir(BuildProperties.propertyRef(ArtifactAntGenerationContextImpl.ARTIFACTS_TEMP_DIR_PROPERTY))); StringBuilder depends = new StringBuilder(); - for (Artifact artifact : artifacts) { + for (Artifact artifact : myAllArtifacts) { Target target = createArtifactTarget(artifact); generators.add(target); @@ -91,7 +97,7 @@ public class ArtifactsGenerator { } Target buildAllArtifacts = new Target(BUILD_ALL_ARTIFACTS_TARGET, depends.toString(), "Build all artifacts", null); - for (Artifact artifact : artifacts) { + for (Artifact artifact : myAllArtifacts) { final String artifactOutputPath = artifact.getOutputPath(); if (!StringUtil.isEmpty(artifactOutputPath) && myContext.shouldBuildIntoTempDirectory(artifact)) { final String outputPath = BuildProperties.propertyRef(myContext.getConfiguredArtifactOutputProperty(artifact)); @@ -169,7 +175,7 @@ public class ArtifactsGenerator { public List getCleanTargetNames() { final List targets = new ArrayList(); - for (Artifact artifact : ArtifactManager.getInstance(myProject).getArtifacts()) { + for (Artifact artifact : myAllArtifacts) { if (!myContext.shouldBuildIntoTempDirectory(artifact)) { targets.add(myContext.getCleanTargetName(artifact)); } diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/IncrementalPackagingCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/IncrementalPackagingCompiler.java index 44779af155c2..b234b17e7c81 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/IncrementalPackagingCompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/packagingCompiler/IncrementalPackagingCompiler.java @@ -52,19 +52,19 @@ public class IncrementalPackagingCompiler extends PackagingCompilerBase { @Override protected PackagingProcessingItem[] collectItems(OldProcessingItemsBuilderContext builderContext, final Project project) { Module[] allModules = ModuleManager.getInstance(project).getSortedModules(); - final BuildParticipantProvider[] providers = DeploymentUtilImpl.getBuildParticipantProviders(); - for (BuildParticipantProvider provider : providers) { + final BuildParticipantProvider[] providers = DeploymentUtilImpl.getBuildParticipantProviders(); + for (BuildParticipantProvider provider : providers) { addItemsForProvider(provider, allModules, builderContext); } return builderContext.getProcessingItems(); } - private static

void addItemsForProvider(final BuildParticipantProvider

provider, + private static void addItemsForProvider(final BuildParticipantProvider provider, final Module[] modulesToCompile, OldProcessingItemsBuilderContext builderContext) { for (Module module : modulesToCompile) { - final Collection

participants = provider.getParticipants(module); - for (P participant : participants) { + final Collection participants = provider.getParticipants(module); + for (BuildParticipant participant : participants) { addItemsForParticipant(participant, builderContext); } } diff --git a/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java b/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java index 3db688537350..3ffc51c56ea4 100644 --- a/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java +++ b/java/compiler/impl/src/com/intellij/openapi/deployment/DeploymentUtilImpl.java @@ -342,14 +342,6 @@ public class DeploymentUtilImpl extends DeploymentUtil { return classpath; } - public void addJavaModuleOutputs(@NotNull final Module module, - @NotNull ModuleLink[] containingModules, - @NotNull BuildRecipe instructions, - @NotNull CompileContext context, - String explodedPath) { - addJavaModuleOutputs(module, containingModules, instructions, context, explodedPath, ""); - } - public void addJavaModuleOutputs(@NotNull final Module module, @NotNull ModuleLink[] containingModules, @NotNull BuildRecipe instructions, @@ -460,7 +452,7 @@ public class DeploymentUtilImpl extends DeploymentUtil { return buildParticipant.getOrCreateTemporaryDirForExploded(); } - public static BuildParticipantProvider[] getBuildParticipantProviders() { + public static BuildParticipantProvider[] getBuildParticipantProviders() { return Extensions.getExtensions(BuildParticipantProvider.EXTENSION_POINT_NAME); } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java index 6f4081e7a81e..a3a1dcc6e5b1 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/IncrementalArtifactsCompiler.java @@ -24,8 +24,12 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.Result; import com.intellij.openapi.compiler.*; +import com.intellij.openapi.compiler.make.BuildParticipant; +import com.intellij.openapi.compiler.make.BuildParticipantProvider; import com.intellij.openapi.deployment.DeploymentUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; @@ -46,6 +50,7 @@ import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.util.ThrowableRunnable; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.CaseInsensitiveStringHashingStrategy; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -71,7 +76,20 @@ public class IncrementalArtifactsCompiler implements PackagingCompiler { final CompileContext context = builderContext.getCompileContext(); final Set artifactsToBuild = ArtifactCompileScope.getArtifactsToBuild(project, context.getCompileScope()); - for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + List additionalArtifacts = new ArrayList(); + for (BuildParticipantProvider provider : BuildParticipantProvider.EXTENSION_POINT_NAME.getExtensions()) { + for (Module module : ModuleManager.getInstance(project).getModules()) { + final Collection participants = provider.getParticipants(module); + for (BuildParticipant participant : participants) { + ContainerUtil.addIfNotNull(participant.createArtifact(context), additionalArtifacts); + } + } + } + artifactsToBuild.addAll(additionalArtifacts); + + final List allArtifacts = new ArrayList(Arrays.asList(ArtifactManager.getInstance(project).getArtifacts())); + allArtifacts.addAll(additionalArtifacts); + for (Artifact artifact : allArtifacts) { final String outputPath = artifact.getOutputPath(); if (outputPath != null && outputPath.length() != 0) { collectItems(builderContext, artifact, outputPath, project, artifactsToBuild.contains(artifact)); diff --git a/java/compiler/openapi/src/com/intellij/compiler/ant/BuildTargetsFactory.java b/java/compiler/openapi/src/com/intellij/compiler/ant/BuildTargetsFactory.java index 395e9e4839ed..65a758784894 100644 --- a/java/compiler/openapi/src/com/intellij/compiler/ant/BuildTargetsFactory.java +++ b/java/compiler/openapi/src/com/intellij/compiler/ant/BuildTargetsFactory.java @@ -32,11 +32,6 @@ public abstract class BuildTargetsFactory { return ServiceManager.getService(BuildTargetsFactory.class); } - public abstract CompositeGenerator createCompositeBuildTarget(ExplodedAndJarTargetParameters parameters, @NonNls String targetName, - String description, String depends, @Nullable String jarPath); - - public abstract Target createBuildExplodedTarget(ExplodedAndJarTargetParameters parameters, BuildRecipe buildRecipe, String description); - public abstract Generator createComment(String comment); //for test diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java index 4607658c7999..6a7f3e625369 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipant.java @@ -17,6 +17,7 @@ package com.intellij.openapi.compiler.make; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.module.Module; +import com.intellij.packaging.artifacts.Artifact; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -40,6 +41,9 @@ public abstract class BuildParticipant { public abstract BuildConfiguration getBuildConfiguration(); + @Nullable + public abstract Artifact createArtifact(CompileContext context); + @Nullable public String getOrCreateTemporaryDirForExploded() { return null; diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java index 909800187653..cdce76e96993 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java @@ -15,20 +15,7 @@ */ package com.intellij.openapi.compiler.make; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.application.Result; -import com.intellij.openapi.compiler.CompileContext; -import com.intellij.openapi.deployment.DeploymentUtil; import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.descriptors.ConfigFile; -import com.intellij.util.descriptors.CustomConfigFile; -import com.intellij.util.descriptors.ConfigFileMetaData; - -import java.io.File; public abstract class BuildParticipantBase extends BuildParticipant { private final Module myModule; @@ -41,59 +28,4 @@ public abstract class BuildParticipantBase extends BuildParticipant { return myModule; } - public void buildStarted(final CompileContext context) { - new ReadAction() { - protected void run(final Result result) { - ConfigFile[] descriptors = getDeploymentDescriptors(); - for (ConfigFile descriptor : descriptors) { - DeploymentUtil.getInstance().checkConfigFile(descriptor, context, myModule); - } - } - }.execute(); - } - - protected void registerDescriptorCopyingInstructions(final BuildRecipe instructions, final CompileContext context) { - final ConfigFile[] deploymentDescriptors = getDeploymentDescriptors(); - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - registerDescriptorCopyingInstructions(BuildParticipantBase.this.myModule, deploymentDescriptors, instructions); - - - final CustomConfigFile[] customDescriptors = getCustomDescriptors(); - for (CustomConfigFile descriptor : customDescriptors) { - final String url = descriptor.getUrl(); - final VirtualFile virtualFile = VirtualFileManager.getInstance().findFileByUrl(url); - if (virtualFile != null) { - File file = VfsUtil.virtualToIoFile(virtualFile); - instructions.addFileCopyInstruction(file, false, myModule, descriptor.getOutputDirectoryPath() + "/" + virtualFile.getName(), null); - } - } - } - }); - } - - public static void registerDescriptorCopyingInstructions(Module module, ConfigFile[] deploymentDescriptors, BuildRecipe instructions) { - for (ConfigFile descriptor : deploymentDescriptors) { - VirtualFile virtualFile = descriptor.getVirtualFile(); - if (virtualFile != null) { - ConfigFileMetaData metaData = descriptor.getMetaData(); - final File file = VfsUtil.virtualToIoFile(virtualFile); - final String fileName; - if (metaData.isFileNameFixed()) { - fileName = metaData.getFileName(); - } - else { - fileName = virtualFile.getName(); - } - instructions.addFileCopyInstruction(file, false, module, metaData.getDirectoryPath() + "/" + fileName, null); - } - - } - } - - protected CustomConfigFile[] getCustomDescriptors() { - return CustomConfigFile.EMPTY_ARRAY; - } - - protected abstract ConfigFile[] getDeploymentDescriptors(); } diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java index 7d409cbb6040..70fb116fc292 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantProvider.java @@ -24,10 +24,10 @@ import java.util.Collection; /** * @author nik */ -public abstract class BuildParticipantProvider

{ +public abstract class BuildParticipantProvider { public static final ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.compiler.buildParticipantProvider"); - public abstract Collection

getParticipants(Module module); + public abstract Collection getParticipants(Module module); } diff --git a/java/compiler/openapi/src/com/intellij/openapi/deployment/DeploymentUtil.java b/java/compiler/openapi/src/com/intellij/openapi/deployment/DeploymentUtil.java index 2d452613d74f..7dfe739b57c9 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/deployment/DeploymentUtil.java +++ b/java/compiler/openapi/src/com/intellij/openapi/deployment/DeploymentUtil.java @@ -97,15 +97,6 @@ public abstract class DeploymentUtil { @NotNull BuildRecipe instructions, @NotNull CompileContext context, String explodedPath, final String linkContainerDescription); - @Deprecated - /**@deprecated - * use {@link DeploymentUtil.addJavaModuleOutputs()} - */ - public abstract void addJavaModuleOutputs(@NotNull Module module, - @NotNull ModuleLink[] containingModules, - @NotNull BuildRecipe instructions, - @NotNull CompileContext context, - String explodedPath); public static String concatPaths(String... paths) { final StringBuilder builder = new StringBuilder(); diff --git a/plugins/devkit/devkit.iml b/plugins/devkit/devkit.iml index 8b11aab0968b..706f3a214cc2 100644 --- a/plugins/devkit/devkit.iml +++ b/plugins/devkit/devkit.iml @@ -23,6 +23,7 @@ + diff --git a/plugins/devkit/src/DevKitBundle.properties b/plugins/devkit/src/DevKitBundle.properties index 89a70bd94069..37ba6c03681f 100644 --- a/plugins/devkit/src/DevKitBundle.properties +++ b/plugins/devkit/src/DevKitBundle.properties @@ -150,10 +150,7 @@ inspections.component.not.registered.option.ignore.non.public=Ignore non-public inspections.component.not.registered.quickfix.family=Register Component inspections.component.not.registered.quickfix.name=Register {0} inspections.component.not.registered.quickfix.error=Cannot Register {0} -ant.exploded.comment=Call the target to build exploded directory for module ''{0}''.\\n Path to the exploded directory is specified by parameter ''{1}'' -ant.exploded.description=Plugin exploded directory for module ''{0}'' -ant.build.jar.comment=Call the target to build archive for module ''{0}''.\\n Path to the archive file is specified by parameter ''{1}'' -ant.build.description=Build configured plugin directories and archives for module ''{0}'' +ant.build.jar.comment=Build archive for plugin ''{0}'' ant.build.jar.description=Build plugin archive for module ''{0}'' project.title=Plugin Project no.java.sdk.for.idea.sdk.found=No Java SDK of appropriate version found. In addition to the IDEA JDK, you need to define a JSDK with the same Java version ({0}). diff --git a/plugins/devkit/src/build/PluginBuildConfiguration.java b/plugins/devkit/src/build/PluginBuildConfiguration.java index 8cac38d0ddeb..80993671ee72 100644 --- a/plugins/devkit/src/build/PluginBuildConfiguration.java +++ b/plugins/devkit/src/build/PluginBuildConfiguration.java @@ -117,7 +117,7 @@ public class PluginBuildConfiguration extends BuildConfiguration implements Modu public void disposeComponent() { } - + public void readExternal(Element element) throws InvalidDataException { String url = element.getAttributeValue(URL_ATTR); if (url != null) { diff --git a/plugins/devkit/src/build/PluginBuildParticipant.java b/plugins/devkit/src/build/PluginBuildParticipant.java index df2f042f0be1..72fda37c2798 100644 --- a/plugins/devkit/src/build/PluginBuildParticipant.java +++ b/plugins/devkit/src/build/PluginBuildParticipant.java @@ -21,23 +21,26 @@ import com.intellij.openapi.compiler.make.BuildConfiguration; import com.intellij.openapi.compiler.make.BuildParticipantBase; import com.intellij.openapi.compiler.make.BuildRecipe; import com.intellij.openapi.deployment.DeploymentUtil; -import com.intellij.openapi.deployment.LibraryLink; -import com.intellij.openapi.deployment.ModuleLink; -import com.intellij.openapi.deployment.PackagingMethod; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.elements.ArtifactRootElement; +import com.intellij.packaging.elements.CompositePackagingElement; +import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementFactory; +import com.intellij.packaging.impl.artifacts.ArtifactImpl; +import com.intellij.packaging.impl.artifacts.PlainArtifactType; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.descriptors.ConfigFile; -import com.intellij.util.descriptors.CustomConfigFile; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomManager; import org.jetbrains.annotations.NonNls; @@ -48,8 +51,8 @@ import org.jetbrains.idea.devkit.module.PluginModuleType; import org.jetbrains.idea.devkit.projectRoots.IdeaJdk; import org.jetbrains.idea.devkit.util.DescriptorUtil; -import java.util.ArrayList; import java.util.HashSet; +import java.util.List; /** * @author peter @@ -58,43 +61,131 @@ public class PluginBuildParticipant extends BuildParticipantBase { @NonNls private static final String CLASSES = "/classes"; @NonNls private static final String LIB = "/lib/"; @NonNls private static final String LIB_DIRECTORY = "lib"; + private final Module myModule; private final PluginBuildConfiguration myPluginBuildConfiguration; public PluginBuildParticipant(final Module module, final PluginBuildConfiguration pluginBuildConfiguration) { super(module); + myModule = module; myPluginBuildConfiguration = pluginBuildConfiguration; } public BuildRecipe getBuildInstructions(final CompileContext context) { //todo[nik] cache? final BuildRecipe buildRecipe = DeploymentUtil.getInstance().createBuildRecipe(); - registerBuildInstructions(buildRecipe, context); return buildRecipe; } - protected void registerBuildInstructions(final BuildRecipe instructions, final CompileContext context) { - Sdk jdk = IdeaJdk.findIdeaJdk(ModuleRootManager.getInstance(getModule()).getSdk()); + @Override + public Artifact createArtifact(CompileContext context) { + Sdk jdk = IdeaJdk.findIdeaJdk(ModuleRootManager.getInstance(myModule).getSdk()); if (jdk != null && IdeaJdk.isFromIDEAProject(jdk.getHomePath())) { - return; + return null; } - registerDescriptorCopyingInstructions(instructions, context); - if (jdk == null) { - context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("jdk.type.incorrect", getModule().getName()), null, -1, -1); - return; + context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("jdk.type.incorrect", myModule.getName()), null, -1, -1); + return null; } - final Module[] wrongSetDependencies = PluginBuildUtil.getWrongSetDependencies(getModule()); + final String outputPath = PluginBuildUtil.getPluginExPath(myModule); + if (outputPath == null) { + return null; + } + + if (!checkDependencies(context)) { + return null; + } + + + final PackagingElementFactory factory = PackagingElementFactory.getInstance(); + final ArtifactRootElement root = factory.createArtifactRootElement(); + + ConfigFile configFile = myPluginBuildConfiguration.getPluginXML(); + if (configFile != null) { + DeploymentUtil.getInstance().checkConfigFile(configFile, context, myModule); + factory.addFileCopy(root, "META-INF/", VfsUtil.urlToPath(configFile.getUrl())); + + final XmlFile xmlFile = configFile.getXmlFile(); + if (xmlFile != null) { + final XmlDocument document = xmlFile.getDocument(); + if (document != null) { + final DomElement domElement = DomManager.getDomManager(xmlFile.getProject()).getDomElement(document.getRootTag()); + if (domElement instanceof IdeaPlugin) { + for(Dependency dependency: ((IdeaPlugin)domElement).getDependencies()) { + final String file = dependency.getConfigFile().getValue(); + final VirtualFile virtualFile = configFile.getVirtualFile(); + assert virtualFile != null; + final VirtualFile parent = virtualFile.getParent(); + assert parent != null; + final String url = parent.getUrl(); + factory.addFileCopy(root, "META-INF/", VfsUtil.urlToPath(url) + "/" + file); + } + } + } + } + } + + HashSet modules = new HashSet(); + PluginBuildUtil.getDependencies(myModule, modules); + + final CompositePackagingElement classesDir = factory.getOrCreateDirectory(root, CLASSES); + for (Module dep : modules) { + classesDir.addOrFindChild(factory.createModuleOutput(dep)); + } + classesDir.addOrFindChild(factory.createModuleOutput(myModule)); + + HashSet libs = new HashSet(); + PluginBuildUtil.getLibraries(myModule, libs); + for (Module dependentModule : modules) { + PluginBuildUtil.getLibraries(dependentModule, libs); + } + + + // libraries + final VirtualFile libDir = jdk.getHomeDirectory().findFileByRelativePath(LIB_DIRECTORY); + for (Library library : libs) { + boolean hasDirsOnly = true; + VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); + for (VirtualFile file : files) { + if (file.getFileSystem() instanceof JarFileSystem) { + hasDirsOnly = false; + file = ((JarFileSystem)file.getFileSystem()).getVirtualFileForJar(file); + } + if (libDir != null && file != null && VfsUtil.isAncestor(libDir, file, false)) { + context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("dont.add.idea.libs.to.classpath", file.getName()), null, + -1, -1); + } + } + + final List> elements = factory.createLibraryElements(library); + if (hasDirsOnly) { + //todo split one lib into 2 separate libs if there are jars and dirs + classesDir.addOrFindChildren(elements); + } + else { + factory.getOrCreateDirectory(root, LIB).addOrFindChildren(elements); + } + } + + return new ArtifactImpl(getArtifactName(), PlainArtifactType.getInstance(), false, root, FileUtil.toSystemIndependentName(outputPath)); + } + + private String getArtifactName() { + return myModule.getName() + ":plugin"; + } + + private boolean checkDependencies(CompileContext context) { + final Module[] wrongSetDependencies = PluginBuildUtil.getWrongSetDependencies(myModule); if (wrongSetDependencies.length != 0) { boolean realProblems = false; - final String pluginId = DescriptorUtil.getPluginId(getModule()); + final String pluginId = DescriptorUtil.getPluginId(myModule); for (Module dependency : wrongSetDependencies) { if (!PluginModuleType.isOfType(dependency)) { realProblems = true; context.addMessage(CompilerMessageCategory.ERROR, - DevKitBundle.message("incorrect.dependency.non-plugin-module", dependency.getName(), getModule().getName()), null, + DevKitBundle.message("incorrect.dependency.non-plugin-module", dependency.getName(), myModule.getName()), null, -1, -1); } else { @@ -114,115 +205,18 @@ public class PluginBuildParticipant extends BuildParticipantBase { // make this a warning instead? realProblems = true; context.addMessage(CompilerMessageCategory.ERROR, - DevKitBundle.message("incorrect.dependency.not-declared", dependency.getName(), getModule().getName()), null, -1, + DevKitBundle.message("incorrect.dependency.not-declared", dependency.getName(), myModule.getName()), null, -1, -1); } } } - if (realProblems) return; + if (realProblems) return false; } - - final String explodedPath = myPluginBuildConfiguration.getExplodedPath(); - if (explodedPath == null) return; //where to put everything? - HashSet modules = new HashSet(); - PluginBuildUtil.getDependencies(getModule(), modules); - - ModuleLink[] containingModules = new ModuleLink[modules.size()]; - int i = 0; - final DeploymentUtil makeUtil = DeploymentUtil.getInstance(); - for (Module dep : modules) { - ModuleLink link = makeUtil.createModuleLink(dep, getModule()); - containingModules[i++] = link; - link.setPackagingMethod(PackagingMethod.COPY_FILES); - link.setURI(CLASSES); - } - - // output may be excluded, copy it nevertheless - makeUtil.addModuleOutputContents(context, instructions, getModule(), getModule(), CLASSES, explodedPath, null); - - // child Java utility modules - makeUtil.addJavaModuleOutputs(getModule(), containingModules, instructions, context, explodedPath, DevKitBundle.message("presentable.plugin.module.name", - ModuleUtil.getModuleNameInReadAction(getModule()))); - - HashSet libs = new HashSet(); - PluginBuildUtil.getLibraries(getModule(), libs); - for (Module dependentModule : modules) { - PluginBuildUtil.getLibraries(dependentModule, libs); - } - - final LibraryLink[] libraryLinks = new LibraryLink[libs.size()]; - i = 0; - for (Library library : libs) { - LibraryLink link = makeUtil.createLibraryLink(library, getModule()); - libraryLinks[i++] = link; - link.setPackagingMethod(PackagingMethod.COPY_FILES); - final boolean onlyDirs = link.hasDirectoriesOnly(); - if (onlyDirs) {//todo split one lib into 2 separate libs if there are jars and dirs - link.setURI(CLASSES); - } - else { - link.setURI(LIB); - } - } - - // libraries - final VirtualFile libDir = jdk.getHomeDirectory().findFileByRelativePath(LIB_DIRECTORY); - for (i = 0; i < libraryLinks.length; i++) { - LibraryLink libraryLink = libraryLinks[i]; - final Library library = libraryLink.getLibrary(); - if (library != null) { - VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); - for (VirtualFile file : files) { - if (file.getFileSystem() instanceof JarFileSystem) { - file = ((JarFileSystem)file.getFileSystem()).getVirtualFileForJar(file); - } - if (libDir != null && file != null && VfsUtil.isAncestor(libDir, file, false)) { - context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("dont.add.idea.libs.to.classpath", file.getName()), null, - -1, -1); - } - } - makeUtil.addLibraryLink(context, instructions, libraryLink, getModule(), explodedPath); - } - } - } - - protected CustomConfigFile[] getCustomDescriptors() { - final ConfigFile[] configFiles = getDeploymentDescriptors(); - if (configFiles.length == 1) { - final ConfigFile configFile = configFiles[0]; - final XmlFile xmlFile = configFile.getXmlFile(); - if (xmlFile != null) { - final XmlDocument document = xmlFile.getDocument(); - if (document != null) { - final DomElement domElement = DomManager.getDomManager(xmlFile.getProject()).getDomElement(document.getRootTag()); - if (domElement instanceof IdeaPlugin) { - final ArrayList list = new ArrayList(); - for(Dependency dependency: ((IdeaPlugin)domElement).getDependencies()) { - final String file = dependency.getConfigFile().getValue(); - final VirtualFile virtualFile = configFile.getVirtualFile(); - assert virtualFile != null; - final VirtualFile parent = virtualFile.getParent(); - assert parent != null; - final String url = parent.getUrl(); - list.add(new CustomConfigFile(url + "/" + file, configFile.getMetaData().getDirectoryPath())); - } - return list.toArray(new CustomConfigFile[list.size()]); - } - } - } - } - return super.getCustomDescriptors(); - } - - protected ConfigFile[] getDeploymentDescriptors() { - ConfigFile configFile = myPluginBuildConfiguration.getPluginXML(); - if (configFile != null) { - return new ConfigFile[]{configFile}; - } - return ConfigFile.EMPTY_ARRAY; + return true; } public BuildConfiguration getBuildConfiguration() { return myPluginBuildConfiguration; } + } diff --git a/plugins/devkit/src/build/PluginBuildParticipantProvider.java b/plugins/devkit/src/build/PluginBuildParticipantProvider.java index 28f94e728c48..7064ce720196 100644 --- a/plugins/devkit/src/build/PluginBuildParticipantProvider.java +++ b/plugins/devkit/src/build/PluginBuildParticipantProvider.java @@ -26,7 +26,7 @@ import java.util.Collections; /** * @author nik */ -public class PluginBuildParticipantProvider extends BuildParticipantProvider { +public class PluginBuildParticipantProvider extends BuildParticipantProvider { public Collection getParticipants(final Module module) { if (module.getModuleType() != PluginModuleType.getInstance()) { return Collections.emptyList(); diff --git a/plugins/devkit/src/build/ant/BuildJarTarget.java b/plugins/devkit/src/build/ant/BuildJarTarget.java index 8c3083e5692c..2a8fd29eff9e 100644 --- a/plugins/devkit/src/build/ant/BuildJarTarget.java +++ b/plugins/devkit/src/build/ant/BuildJarTarget.java @@ -43,7 +43,8 @@ public class BuildJarTarget extends Target { public BuildJarTarget(final ModuleChunk chunk, final GenerationOptions genOptions, final PluginBuildConfiguration moduleBuildProperties) { - super(PluginBuildProperties.getBuildJarTargetName(chunk.getName()), null, DevKitBundle.message("ant.build.jar.description", chunk.getName()), null); + super(PluginBuildProperties.getBuildJarTargetName(chunk.getName()), BuildProperties.getCompileTargetName(chunk.getName()), + DevKitBundle.message("ant.build.jar.description", chunk.getName()), null); final File moduleBaseDir = chunk.getBaseDir(); diff --git a/plugins/devkit/src/build/ant/ChunkBuildPluginExtension.java b/plugins/devkit/src/build/ant/ChunkBuildPluginExtension.java index bd2fa3c05232..ccea0ee633bb 100644 --- a/plugins/devkit/src/build/ant/ChunkBuildPluginExtension.java +++ b/plugins/devkit/src/build/ant/ChunkBuildPluginExtension.java @@ -21,8 +21,7 @@ package org.jetbrains.idea.devkit.build.ant; import com.intellij.compiler.ant.*; -import com.intellij.openapi.compiler.make.BuildRecipe; -import com.intellij.openapi.compiler.DummyCompileContext; +import com.intellij.compiler.ant.taskdefs.Property; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.libraries.Library; @@ -45,7 +44,7 @@ public class ChunkBuildPluginExtension extends ChunkBuildExtension { @NotNull public String[] getTargets(final ModuleChunk chunk) { - return isPlugins(chunk.getModules()) ? new String[] {"plugin.build."+ BuildProperties.convertName(chunk.getName())} + return isPlugins(chunk.getModules()) ? new String[] {PluginBuildProperties.getBuildJarTargetName(chunk.getName())} : ArrayUtil.EMPTY_STRING_ARRAY; } @@ -56,14 +55,7 @@ public class ChunkBuildPluginExtension extends ChunkBuildExtension { final BuildTargetsFactory factory = BuildTargetsFactory.getInstance(); final Module module = modules[0]; PluginBuildConfiguration buildProperties = PluginBuildConfiguration.getInstance(module); - String configurationName = module.getName(); - ExplodedAndJarTargetParameters parameters = - new ExplodedAndJarTargetParameters(chunk, module, genOptions, buildProperties, - PluginBuildProperties.PLUGIN_DIR_EXPLODED, PluginBuildProperties.PLUGIN_PATH_JAR, - PluginBuildProperties.getBuildExplodedTargetName(configurationName), - PluginBuildProperties.getBuildJarTargetName(configurationName), - PluginBuildProperties.getExplodedPathProperty(configurationName), - PluginBuildProperties.getJarPathProperty(configurationName)); + final Set libs = new HashSet(); PluginBuildUtil.getLibraries(module, libs); @NonNls String jarPath = chunk.getBaseDir().getPath() + "/" + chunk.getName(); @@ -72,17 +64,10 @@ public class ChunkBuildPluginExtension extends ChunkBuildExtension { } else { jarPath += ".zip"; } - @NonNls final String buildTargetName = PluginBuildProperties.getBuildPluginTarget(module); - generator.add(factory.createCompositeBuildTarget(parameters, buildTargetName, - DevKitBundle.message("ant.build.description", module.getName()), - BuildProperties.getCompileTargetName(module.getName()), jarPath)); - generator.add(factory.createComment(DevKitBundle.message("ant.exploded.comment", chunk.getName(), PluginBuildProperties.PLUGIN_DIR_EXPLODED)), 1); - final BuildRecipe buildRecipe = buildProperties.getBuildParticipant().getBuildInstructions(DummyCompileContext.getInstance()); - generator.add(factory.createBuildExplodedTarget(parameters, buildRecipe, - DevKitBundle.message("ant.exploded.description", module.getName()))); + generator.add(new Property(PluginBuildProperties.getJarPathProperty(chunk.getName()), GenerationUtils.toRelativePath(jarPath, chunk, genOptions)), 1); - generator.add(factory.createComment(DevKitBundle.message("ant.build.jar.comment", chunk.getName(), PluginBuildProperties.PLUGIN_PATH_JAR)), 1); + generator.add(factory.createComment(DevKitBundle.message("ant.build.jar.comment", chunk.getName())), 1); generator.add(new BuildJarTarget(chunk, genOptions, buildProperties)); } } diff --git a/plugins/devkit/src/build/ant/PluginBuildProperties.java b/plugins/devkit/src/build/ant/PluginBuildProperties.java index e7b1aaedd5c6..b709f186f58a 100644 --- a/plugins/devkit/src/build/ant/PluginBuildProperties.java +++ b/plugins/devkit/src/build/ant/PluginBuildProperties.java @@ -16,20 +16,14 @@ package org.jetbrains.idea.devkit.build.ant; -import org.jetbrains.annotations.NonNls; import com.intellij.compiler.ant.BuildProperties; -import com.intellij.openapi.module.Module; +import org.jetbrains.annotations.NonNls; /** * @author nik */ public class PluginBuildProperties { - @NonNls public static final String PLUGIN_DIR_EXPLODED = "plugin.dir.exploded"; - @NonNls public static final String PLUGIN_PATH_JAR = "plugin.path.jar"; - - @NonNls - public static String getBuildExplodedTargetName(final String configurationName) { - return "plugin.build.exploded." + BuildProperties.convertName(configurationName); + private PluginBuildProperties() { } @NonNls @@ -37,18 +31,9 @@ public class PluginBuildProperties { return "plugin.build.jar." + BuildProperties.convertName(configurationName); } - @NonNls - public static String getExplodedPathProperty(final String configurationName) { - return BuildProperties.convertName(configurationName) + ".plugin.exploded.dir"; - } - @NonNls public static String getJarPathProperty(final String configurationName) { - return BuildProperties.convertName(configurationName) + ".path.jar"; + return BuildProperties.convertName(configurationName) + ".plugin.path.jar"; } - @NonNls - public static String getBuildPluginTarget(final Module module) { - return "plugin.build." + BuildProperties.convertName(module.getName()); - } } diff --git a/plugins/devkit/testSources/build/GenerateAntTest.java b/plugins/devkit/testSources/build/GenerateAntTest.java index 035e2fc368dc..c7ab30ddbc6e 100644 --- a/plugins/devkit/testSources/build/GenerateAntTest.java +++ b/plugins/devkit/testSources/build/GenerateAntTest.java @@ -65,8 +65,9 @@ public class GenerateAntTest extends IdeaTestCase { dataOutput.flush(); final String lowercased = StringUtil.toLowerCase(myModule.getName()); final String expected = "\n" + - " \n" + + lowercased + "\" depends=\"compile.module." + lowercased + + "\" description=\"Build plugin archive for module '" + myModule.getName() + "'\">\n" + + " \n" + " \n" + " \n" + " \n" +