From fdfa32d491489a612dbe992ac2aaccde5c0135e7 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Thu, 25 Mar 2021 21:16:25 +0700 Subject: [PATCH] IDEA-161641 - small refactoring GitOrigin-RevId: fd7ef351dbd9abd0f27cb519de6e11bb2f3964b6 --- .../jlink/JLinkArtifactBuildTaskProvider.java | 91 +++++++++---------- .../impl/jlink/JpsJLinkArtifactType.java | 5 +- .../JpsJLinkModelSerializerExtension.java | 8 +- .../impl/jlink/JpsJLinkProperties.java | 18 +--- .../messages/JavaCompilerBundle.properties | 4 + java/java-impl/src/META-INF/JavaPlugin.xml | 2 +- .../jlink/JLinkArtifactProperties.java | 12 +-- .../jlink/JLinkArtifactPropertiesEditor.java | 14 ++- .../JLinkArtifactPropertiesProvider.java | 4 +- .../packaging/jlink/JLinkArtifactType.java | 10 +- .../resources/messages/JavaBundle.properties | 4 + 11 files changed, 80 insertions(+), 92 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java index ae0ad02aff84..5b957504bc9b 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java @@ -6,6 +6,7 @@ import com.intellij.execution.process.BaseOSProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.openapi.compiler.JavaCompilerBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NlsSafe; @@ -35,7 +36,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { +public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { @Override public @NotNull List createArtifactBuildTasks(@NotNull JpsArtifact artifact, @@ -44,9 +45,7 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { return Collections.emptyList(); } final JpsElement properties = artifact.getProperties(); - if (!(properties instanceof JpsJLinkProperties)) { - return Collections.emptyList(); - } + if (!(properties instanceof JpsJLinkProperties)) return Collections.emptyList(); return Collections.singletonList(new JLinkBuildTask(artifact)); } @@ -59,25 +58,47 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { } @Override - public void build(CompileContext context) throws ProjectBuildException { - LOG.warn("jlink task was started"); + public void build(@NotNull CompileContext context) throws ProjectBuildException { + LOG.info("jlink task was started"); - Set> sdks = context.getProjectDescriptor().getProjectJavaSdks(); - if (sdks.isEmpty()) { + JpsJLinkProperties properties = (JpsJLinkProperties)myArtifact.getProperties(); + String runtimeImagePath = myArtifact.getOutputPath() + File.separator + "jdk"; + List commands = buildCommands(context, properties, runtimeImagePath); + if (commands.isEmpty()) return; + try { + FileUtil.delete(Path.of(runtimeImagePath)); + } + catch (IOException e) { + error(context, JavaCompilerBundle.message("packaging.jlink.build.task.run.time.image.deletion.failure")); return; } - ModuleFinder moduleFinder = ModuleFinder.of(Path.of(myArtifact.getOutputFilePath())); - String modulesStr = moduleFinder.findAll().stream().map(mr -> mr.descriptor().name()).collect(Collectors.joining(",")); - if (modulesStr.isEmpty()) { - error(context, "No module has been found"); + final int errorCode = startProcess(context, commands, properties); + if (errorCode != 0) { + error(context, JavaCompilerBundle.message("packaging.jlink.build.task.failure")); return; } + + LOG.info("jlink task was finished"); + } + + @NotNull + private List buildCommands(@NotNull CompileContext context, + @NotNull JpsJLinkProperties properties, + @NotNull String runtimeImagePath) { + Set> sdks = context.getProjectDescriptor().getProjectJavaSdks(); + if (sdks.isEmpty()) return Collections.emptyList(); + String artifactOutputPath = myArtifact.getOutputFilePath(); + ModuleFinder moduleFinder = ModuleFinder.of(Path.of(artifactOutputPath)); + String modulesSequence = moduleFinder.findAll().stream().map(mr -> mr.descriptor().name()).collect(Collectors.joining(",")); + if (modulesSequence.isEmpty()) { + error(context, JavaCompilerBundle.message("packaging.jlink.build.task.modules.not.found")); + return Collections.emptyList(); + } JpsSdk javaSdk = sdks.iterator().next(); String sdkHomePath = javaSdk.getHomePath(); String jLinkPath = sdkHomePath + File.separatorChar + "bin" + File.separatorChar + "jlink"; List commands = new ArrayList<>(); commands.add(jLinkPath); - JpsJLinkProperties properties = (JpsJLinkProperties)myArtifact.getProperties(); if (properties.compressionLevel.hasCompression()) { addOption(commands, "--compress", String.valueOf(properties.compressionLevel.myValue)); } @@ -85,30 +106,17 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { commands.add("--verbose"); } commands.add("--module-path"); - commands.add(myArtifact.getOutputFilePath()); + commands.add(artifactOutputPath); commands.add("--add-modules"); - commands.add(modulesStr); - String outputPath = myArtifact.getOutputFilePath() + File.separator + "jdk"; - addOption(commands, "--output", outputPath); - - LOG.warn(String.join(" ", commands)); - - try { - FileUtil.delete(Path.of(outputPath)); - } - catch (IOException e) { - error(context,"Couldn't delete existing run-time image: " + e.getMessage()); - } - - final int errorCode = startProcess(context, commands, properties); - if (errorCode != 0) { - error(context,"jlink task has failed"); - } - - LOG.warn("jlink task was finished"); + commands.add(modulesSequence); + addOption(commands, "--output", runtimeImagePath); + LOG.info(String.join(" ", commands)); + return commands; } - private int startProcess(@NotNull CompileContext context, @NotNull List commands, @NotNull JpsJLinkProperties properties) { + private static int startProcess(@NotNull CompileContext context, + @NotNull List commands, + @NotNull JpsJLinkProperties properties) { try { final AtomicInteger exitCode = new AtomicInteger(); final @NlsSafe StringBuilder errorOutput = new StringBuilder(); @@ -117,18 +125,8 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { final Process process = new ProcessBuilder(CommandLineUtil.toCommandLine(commands)).start(); BaseOSProcessHandler handler = new BaseOSProcessHandler(process, commands.toString(), null); handler.addProcessListener(new ProcessAdapter() { - @Override - public void startNotified(@NotNull ProcessEvent event) { - if (properties.verbose) { - LOG.info("Started " + commands); - } - } - @Override public void processTerminated(@NotNull ProcessEvent event) { - if (properties.verbose) { - LOG.info("Terminated " + commands + ", exit code: " + event.getExitCode()); - } exitCode.set(event.getExitCode()); } @@ -140,7 +138,6 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { errorOutput.append(event.getText()); } else { - LOG.info(message); if (properties.verbose) { info(context, message); } @@ -180,11 +177,11 @@ public class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { } } - private void error(@NotNull CompileContext compileContext, @Nls String message) { + private static void error(@NotNull CompileContext compileContext, @Nls String message) { compileContext.processMessage(new CompilerMessage("jlink", BuildMessage.Kind.ERROR, message)); } - private void info(@NotNull CompileContext compileContext, @Nls String message) { + private static void info(@NotNull CompileContext compileContext, @Nls String message) { compileContext.processMessage(new CompilerMessage("jlink", BuildMessage.Kind.INFO, message)); } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java index a27b2abc1eaa..690b3a304a8d 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java @@ -4,9 +4,8 @@ package com.intellij.packaging.impl.jlink; import org.jetbrains.jps.model.artifact.JpsArtifactType; import org.jetbrains.jps.model.ex.JpsElementTypeBase; -public class JpsJLinkArtifactType extends JpsElementTypeBase implements JpsArtifactType { - - public static final JpsJLinkArtifactType INSTANCE = new JpsJLinkArtifactType(); +final class JpsJLinkArtifactType extends JpsElementTypeBase implements JpsArtifactType { + static final JpsJLinkArtifactType INSTANCE = new JpsJLinkArtifactType(); private JpsJLinkArtifactType() { } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java index 452c293e4b1f..9b781a1d9e4e 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java @@ -12,14 +12,14 @@ import org.jetbrains.jps.model.serialization.artifact.JpsArtifactPropertiesSeria import java.util.Collections; import java.util.List; -public class JpsJLinkModelSerializerExtension extends JpsModelSerializerExtension { +public final class JpsJLinkModelSerializerExtension extends JpsModelSerializerExtension { @Override public @NotNull List> getArtifactTypePropertiesSerializers() { return Collections.singletonList(new JpsJLinkArtifactPropertiesSerializer()); } - static class JpsJLinkArtifactPropertiesSerializer extends JpsArtifactPropertiesSerializer { + private static class JpsJLinkArtifactPropertiesSerializer extends JpsArtifactPropertiesSerializer { JpsJLinkArtifactPropertiesSerializer() { super("jlink", JpsJLinkArtifactType.INSTANCE); @@ -30,9 +30,7 @@ public class JpsJLinkModelSerializerExtension extends JpsModelSerializerExtensio final ArtifactPropertiesState state = findApplicationProperties(stateList); if (state != null) { final Element options = state.getOptions(); - if (options != null) { - return new JpsJLinkProperties(XmlSerializer.deserialize(options, JpsJLinkProperties.class)); - } + if (options != null) return new JpsJLinkProperties(XmlSerializer.deserialize(options, JpsJLinkProperties.class)); } return new JpsJLinkProperties(); } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java index 50ebb29c4734..198e00f7a85d 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java @@ -2,19 +2,16 @@ package com.intellij.packaging.impl.jlink; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.ex.JpsElementBase; -import java.util.stream.Stream; - -public class JpsJLinkProperties extends JpsElementBase { +final class JpsJLinkProperties extends JpsElementBase { public CompressionLevel compressionLevel = CompressionLevel.ZERO; public boolean verbose; - public JpsJLinkProperties() { + JpsJLinkProperties() { } - public JpsJLinkProperties(@NotNull JpsJLinkProperties properties) { + JpsJLinkProperties(@NotNull JpsJLinkProperties properties) { copyToThis(properties); } @@ -33,7 +30,7 @@ public class JpsJLinkProperties extends JpsElementBase { verbose = copy.verbose; } - public enum CompressionLevel { + enum CompressionLevel { ZERO(0), FIRST(1), SECOND(2); @@ -43,12 +40,7 @@ public class JpsJLinkProperties extends JpsElementBase { this.myValue = value; } - @Nullable - public static CompressionLevel getLevelByValue(int value) { - return Stream.of(values()).filter(v -> v.myValue == value).findFirst().orElse(null); - } - - public boolean hasCompression() { + boolean hasCompression() { return this == FIRST || this == SECOND; } } diff --git a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties index 3f8b219655cd..7910eb77b79b 100644 --- a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties +++ b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties @@ -105,6 +105,10 @@ checkbox.text.compile.affected.unloaded.modules=Compile affected &unloaded modul dialog.title.output.directory.for.artifact=Output Directory for Artifact chooser.description.select.output.directory.for.0.artifact=Select output directory for ''{0}'' artifact +packaging.jlink.build.task.modules.not.found=JPMS modules not found +packaging.jlink.build.task.run.time.image.deletion.failure=Couldn't delete existing run-time image +packaging.jlink.build.task.failure=jlink task has failed + #package file action action.name.package.file=Package File action.description.package.file=Update the file in the corresponding artifacts diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 2795bb948632..51464402d55e 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -269,7 +269,7 @@ - + { +final class JLinkArtifactProperties extends ArtifactProperties { public CompressionLevel compressionLevel = CompressionLevel.ZERO; public boolean verbose; @Override public ArtifactPropertiesEditor createEditor(@NotNull ArtifactEditorContext context) { - return new JLinkArtifactPropertiesEditor(this, context.getProject()); + return new JLinkArtifactPropertiesEditor(this); } @Override - public @Nullable JLinkArtifactProperties getState() { + public @NotNull JLinkArtifactProperties getState() { return this; } @@ -29,7 +29,7 @@ public class JLinkArtifactProperties extends ArtifactProperties v.myValue == value).findFirst().orElse(null); } - - public boolean hasCompression() { - return this == FIRST || this == SECOND; - } } } diff --git a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java index 73ad8074b835..96cdd39399f4 100644 --- a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java +++ b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java @@ -1,7 +1,7 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.packaging.jlink; -import com.intellij.openapi.project.Project; +import com.intellij.java.JavaBundle; import com.intellij.openapi.ui.ComboBox; import com.intellij.packaging.ui.ArtifactPropertiesEditor; import com.intellij.util.ui.FormBuilder; @@ -15,22 +15,20 @@ import java.util.Optional; import static com.intellij.packaging.jlink.JLinkArtifactProperties.CompressionLevel; -public class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { +final class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { private final JLinkArtifactProperties myProperties; - private final Project myProject; private ComboBox myCompressionLevel; private JCheckBox myVerbose; - public JLinkArtifactPropertiesEditor(@NotNull JLinkArtifactProperties properties, @NotNull Project project) { + JLinkArtifactPropertiesEditor(@NotNull JLinkArtifactProperties properties) { myProperties = properties; - myProject = project; } @Nls @Override public String getTabName() { - return "JLink"; + return JavaBundle.message("packaging.jlink.artifact.name"); } @Override @@ -39,9 +37,9 @@ public class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { myCompressionLevel = new ComboBox<>(EnumSet.allOf(CompressionLevel.class).stream().map(level -> level.myValue).toArray(Integer[]::new)); myCompressionLevel.setItem(myProperties.compressionLevel.myValue); - builder.addLabeledComponent("Compress level", myCompressionLevel); + builder.addLabeledComponent(JavaBundle.message("packaging.jlink.compression.level"), myCompressionLevel); - myVerbose = new JCheckBox("Enable verbose tracing", myProperties.verbose); + myVerbose = new JCheckBox(JavaBundle.message("packaging.jlink.verbose.tracing"), myProperties.verbose); builder.addComponent(myVerbose); return builder.getPanel(); diff --git a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesProvider.java b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesProvider.java index 6157e468ef80..0945ce5e3314 100644 --- a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesProvider.java +++ b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesProvider.java @@ -6,8 +6,8 @@ import com.intellij.packaging.artifacts.ArtifactPropertiesProvider; import com.intellij.packaging.artifacts.ArtifactType; import org.jetbrains.annotations.NotNull; -public class JLinkArtifactPropertiesProvider extends ArtifactPropertiesProvider { - protected JLinkArtifactPropertiesProvider() { +public final class JLinkArtifactPropertiesProvider extends ArtifactPropertiesProvider { + public JLinkArtifactPropertiesProvider() { super("jlink-properties"); } diff --git a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactType.java b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactType.java index 3dab6e26031f..2777ca7490d9 100644 --- a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactType.java +++ b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactType.java @@ -2,18 +2,18 @@ package com.intellij.packaging.jlink; import com.intellij.icons.AllIcons; +import com.intellij.java.JavaBundle; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.elements.PackagingElementFactory; import com.intellij.packaging.elements.PackagingElementOutputKind; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; -public class JLinkArtifactType extends ArtifactType { - protected JLinkArtifactType() { - super("jlink", () -> "Run-time image"); +public final class JLinkArtifactType extends ArtifactType { + public JLinkArtifactType() { + super("jlink", () -> JavaBundle.message("packaging.jlink.artifact.title")); } @Override @@ -22,7 +22,7 @@ public class JLinkArtifactType extends ArtifactType { } @Override - public @Nullable String getDefaultPathFor(@NotNull PackagingElementOutputKind kind) { + public @NotNull String getDefaultPathFor(@NotNull PackagingElementOutputKind kind) { return "/"; } diff --git a/java/openapi/resources/messages/JavaBundle.properties b/java/openapi/resources/messages/JavaBundle.properties index b19fa2e68127..790f85794d38 100644 --- a/java/openapi/resources/messages/JavaBundle.properties +++ b/java/openapi/resources/messages/JavaBundle.properties @@ -1037,6 +1037,10 @@ override.implement.broken.file.template.message=Please Correct "Overridden/Imple override.implement.broken.file.template.title=File Template Error package.dependencies.production.node.text=Production Classes package.dependencies.test.node.text=Test Classes +packaging.jlink.artifact.name=JLink +packaging.jlink.artifact.title=Run-time image +packaging.jlink.compression.level=Compression level +packaging.jlink.verbose.tracing=Enable verbose tracing paste.class.command.name=Paste class ''{0}'' please.report.a.bug=Please report a bug popup.title.choose.framework=Choose Framework