From ef92b183cecbb5399e4270c918a159bb5309f124 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Fri, 15 Dec 2017 17:00:47 +0300 Subject: [PATCH] Javafx: Write output of the packager to the build log (IDEA-183393) --- .../packaging/AbstractJavaFxPackager.java | 74 +++++++++++++++++-- .../javaFX/packaging/JavaFxAntGenerator.java | 9 +++ .../packaging/JavaFxPackagerConstants.java | 22 ++++++ .../javaFX/packaging/JavaFxAntTaskTest.java | 48 ++++++++++++ .../JpsJavaFxArtifactBuildTaskProvider.java | 10 +++ .../javaFX/JpsJavaFxArtifactProperties.java | 10 +++ .../packaging/JavaFxArtifactProperties.java | 19 +++++ .../ant/JavaFxChunkBuildExtension.java | 2 + 8 files changed, 186 insertions(+), 8 deletions(-) diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java index 94ad6f48263a..724c340d7a34 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/AbstractJavaFxPackager.java @@ -16,8 +16,13 @@ package org.jetbrains.plugins.javaFX.packaging; import com.intellij.execution.CommandLineUtil; +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.application.PathManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; @@ -25,12 +30,14 @@ import com.intellij.util.ArrayUtilRt; import com.intellij.util.Base64; import com.intellij.util.PathUtilRt; import com.intellij.util.io.ZipUtil; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public abstract class AbstractJavaFxPackager { private static final Logger LOG = Logger.getInstance(AbstractJavaFxPackager.class); @@ -77,8 +84,12 @@ public abstract class AbstractJavaFxPackager { protected abstract void registerJavaFxPackagerError(final String message); + protected abstract void registerJavaFxPackagerInfo(final String message); + protected abstract JavaFxApplicationIcons getIcons(); + protected abstract JavaFxPackagerConstants.MsgOutputLevel getMsgOutputLevel(); + public void buildJavaFxArtifact(final String homePath) { if (!checkNotEmpty(getAppClass(), "Application class")) return; if (!checkNotEmpty(getWidth(), "Width")) return; @@ -246,16 +257,59 @@ public abstract class AbstractJavaFxPackager { private int startProcess(List commands) { try { + final AtomicInteger exitCode = new AtomicInteger(); + final StringBuilder errorOutput = new StringBuilder(); + final List delayedInfoOutput = new ArrayList<>(); + boolean isVerbose = getMsgOutputLevel() != null && getMsgOutputLevel().isVerbose(); + final Process process = new ProcessBuilder(CommandLineUtil.toCommandLine(commands)).start(); - final String message = new String(FileUtil.loadBytes(process.getErrorStream())); - if (!StringUtil.isEmptyOrSpaces(message)) { - registerJavaFxPackagerError(message); - } - final int result = process.waitFor(); + BaseOSProcessHandler handler = new BaseOSProcessHandler(process, commands.toString(), null); + handler.addProcessListener(new ProcessAdapter() { + @Override + public void startNotified(@NotNull ProcessEvent event) { + if (isVerbose) { + LOG.info("Started " + commands); + } + } + + @Override + public void processTerminated(@NotNull ProcessEvent event) { + if (isVerbose) { + LOG.info("Terminated " + commands + ", exit code: " + event.getExitCode()); + } + exitCode.set(event.getExitCode()); + } + + @Override + public void onTextAvailable(@NotNull ProcessEvent event, @NotNull Key outputType) { + String message = StringUtil.trimTrailing(event.getText()); + if (outputType == ProcessOutputTypes.STDERR) { + LOG.error(message, (Throwable)null); + errorOutput.append(event.getText()); + } + else { + LOG.info(message); + if (isVerbose) { + registerJavaFxPackagerInfo(message); + } + else { + delayedInfoOutput.add(message); + } + } + } + }); + + handler.startNotify(); + handler.waitFor(); + + int result = exitCode.get(); if (result != 0) { - final String explanationMessage = new String(FileUtil.loadBytes(process.getInputStream())); - if (!StringUtil.isEmptyOrSpaces(explanationMessage)) { - registerJavaFxPackagerError(explanationMessage); + final String message = errorOutput.toString(); + if (!StringUtil.isEmptyOrSpaces(message)) { + registerJavaFxPackagerError(message); + } + for (String info : delayedInfoOutput) { + registerJavaFxPackagerInfo(info); } } return result; @@ -283,6 +337,10 @@ public abstract class AbstractJavaFxPackager { javaHome + "/lib/ant-javafx.jar" + File.pathSeparator + javaHome + "/jre/lib/jfxrt.jar"); commands.add("org.apache.tools.ant.launch.Launcher"); + String cmdLineParam = getMsgOutputLevel() != null ? getMsgOutputLevel().getCmdLineParam() : ""; + if (!cmdLineParam.isEmpty()) { + commands.add(cmdLineParam); + } commands.add("-f"); try { File tempFile = FileUtil.createTempFile("build", ".xml"); diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java index 9b83e6f724f8..90b132c91f03 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxAntGenerator.java @@ -99,6 +99,7 @@ public class JavaFxAntGenerator { //create jar task final SimpleTag createJarTag = new SimpleTag("fx:jar", Couple.of("destfile", tempDirPath + "/" + artifactFileName)); + addVerboseAttribute(createJarTag, packager); createJarTag.add(new SimpleTag("fx:application", Couple.of("refid", appId))); final List fileset2Jar = new ArrayList<>(); @@ -137,6 +138,7 @@ public class JavaFxAntGenerator { if (!StringUtil.isEmpty(packager.getHtmlPlaceholderId())) { deployTag.addAttribute(Couple.of("placeholderId", packager.getHtmlPlaceholderId())); } + addVerboseAttribute(deployTag, packager); if (packager.isEnabledSigning()) { deployTag.add(new SimpleTag("fx:permissions", Couple.of("elevated", "true"))); @@ -161,6 +163,13 @@ public class JavaFxAntGenerator { return topLevelTagsCollector; } + private static void addVerboseAttribute(SimpleTag tag, @NotNull AbstractJavaFxPackager packager) { + JavaFxPackagerConstants.MsgOutputLevel msgOutputLevel = packager.getMsgOutputLevel(); + if (msgOutputLevel != null && msgOutputLevel.isVerbose()) { + tag.addAttribute(Couple.of("verbose", "true")); + } + } + @NotNull private static List getManifestAttributes(@NotNull AbstractJavaFxPackager packager) { final List manifestAttributes = new ArrayList<>(); diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxPackagerConstants.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxPackagerConstants.java index 92ef85368eed..8638829273ca 100644 --- a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxPackagerConstants.java +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxPackagerConstants.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.javaFX.packaging; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; public class JavaFxPackagerConstants { @NonNls public static final String UPDATE_MODE_BACKGROUND = "background"; @@ -38,4 +39,25 @@ public class JavaFxPackagerConstants { return this == all || this == exe || this == msi; } } + + public enum MsgOutputLevel { + Quiet("-quiet", false), Default("", false), Verbose("-verbose", true), Debug("-debug", true); + + private final String myCmdLineParam; + private final boolean myIsVerbose; + + MsgOutputLevel(String cmdLineParam, boolean isVerbose) { + myCmdLineParam = cmdLineParam; + myIsVerbose = isVerbose; + } + + @NotNull + public String getCmdLineParam() { + return myCmdLineParam; + } + + public boolean isVerbose() { + return myIsVerbose; + } + } } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java index 0c7c39ab36d0..acdd802382d8 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/packaging/JavaFxAntTaskTest.java @@ -36,6 +36,7 @@ public class JavaFxAntTaskTest extends TestCase { private static final String PLACEHOLDER = "placeholder"; private static final String PRELOADER_JAR = "preloaderJar"; private static final String SIGNED = "signed"; + private static final String VERBOSE = "verbose"; public void testJarDeployNoInfo() { doTest("\n" + @@ -348,6 +349,35 @@ public class JavaFxAntTaskTest extends TestCase { "\n", options); } + public void testJarDeployVerbose() { + doTest("\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n", Collections.singletonMap(VERBOSE, "true")); + } + private void doTest(final String expected, Map options) { final String artifactName = UsefulTestCase.getTestName(getName(), true); final String artifactFileName = artifactName + ".jar"; @@ -398,6 +428,10 @@ public class JavaFxAntTaskTest extends TestCase { packager.setSigned(true); } + if (options.containsKey(VERBOSE)) { + packager.setMsgOutputLevel(JavaFxPackagerConstants.MsgOutputLevel.Verbose); + } + final List temp = JavaFxAntGenerator .createJarAndDeployTasks(packager, artifactFileName, artifactName, "temp", "temp" + "/" + "deploy", relativeToBaseDirPath); final StringBuilder buf = new StringBuilder(); @@ -425,6 +459,7 @@ public class JavaFxAntTaskTest extends TestCase { private List myCustomManifestAttributes; private JavaFxApplicationIcons myIcons; private JavaFxPackagerConstants.NativeBundles myNativeBundle = JavaFxPackagerConstants.NativeBundles.none; + private JavaFxPackagerConstants.MsgOutputLevel myMsgOutputLevel = JavaFxPackagerConstants.MsgOutputLevel.Default; private MockJavaFxPackager(String outputPath) { myOutputPath = outputPath; @@ -482,6 +517,10 @@ public class JavaFxAntTaskTest extends TestCase { myNativeBundle = nativeBundle; } + public void setMsgOutputLevel(JavaFxPackagerConstants.MsgOutputLevel msgOutputLevel) { + myMsgOutputLevel = msgOutputLevel; + } + @Override protected String getArtifactName() { return getArtifactRootName(); @@ -566,6 +605,10 @@ public class JavaFxAntTaskTest extends TestCase { protected void registerJavaFxPackagerError(String message) { } + @Override + protected void registerJavaFxPackagerInfo(String message) { + } + @Override public String getKeypass() { return null; @@ -620,5 +663,10 @@ public class JavaFxAntTaskTest extends TestCase { public JavaFxApplicationIcons getIcons() { return myIcons; } + + @Override + public JavaFxPackagerConstants.MsgOutputLevel getMsgOutputLevel() { + return myMsgOutputLevel; + } } } diff --git a/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactBuildTaskProvider.java b/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactBuildTaskProvider.java index eda9356e8cc3..d60f74ff4df2 100644 --- a/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactBuildTaskProvider.java +++ b/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactBuildTaskProvider.java @@ -171,6 +171,11 @@ public class JpsJavaFxArtifactBuildTaskProvider extends ArtifactBuildTaskProvide myCompileContext.processMessage(new CompilerMessage(COMPILER_NAME, BuildMessage.Kind.ERROR, message)); } + @Override + protected void registerJavaFxPackagerInfo(String message) { + myCompileContext.processMessage(new CompilerMessage(COMPILER_NAME, BuildMessage.Kind.INFO, message)); + } + @Override protected String getHtmlTemplateFile() { return myProperties.myState.getHtmlTemplateFile(); @@ -260,6 +265,11 @@ public class JpsJavaFxArtifactBuildTaskProvider extends ArtifactBuildTaskProvide return myProperties.myState.getCustomManifestAttributes(); } + @Override + protected JavaFxPackagerConstants.MsgOutputLevel getMsgOutputLevel() { + return myProperties.myState.getMsgOutputLevel(); + } + private JpsArtifact getPreloaderArtifact() { for (JpsPackagingElement element : myArtifact.getRootElement().getChildren()) { if (element instanceof JpsArtifactOutputPackagingElement) { diff --git a/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactProperties.java b/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactProperties.java index a421e929bfa0..36890bca7b96 100644 --- a/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactProperties.java +++ b/plugins/javaFX/javaFX-jps-plugin/src/org/jetbrains/plugins/javaFX/JpsJavaFxArtifactProperties.java @@ -42,6 +42,7 @@ public class JpsJavaFxArtifactProperties extends JpsElementBase myCustomManifestAttributes = new ArrayList<>(); private JavaFxApplicationIcons myIcons = new JavaFxApplicationIcons(); + private JavaFxPackagerConstants.MsgOutputLevel myMsgOutputLevel = JavaFxPackagerConstants.MsgOutputLevel.Default; public String getTitle() { return myTitle; @@ -254,5 +256,13 @@ public class JpsJavaFxArtifactProperties extends JpsElementBase customManifestAttributes) { myCustomManifestAttributes = customManifestAttributes; } + + public JavaFxPackagerConstants.MsgOutputLevel getMsgOutputLevel() { + return myMsgOutputLevel; + } + + public void setMsgOutputLevel(JavaFxPackagerConstants.MsgOutputLevel msgOutputLevel) { + myMsgOutputLevel = msgOutputLevel; + } } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java index dff1c04637d5..597abd94e1c8 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java @@ -71,6 +71,7 @@ public class JavaFxArtifactProperties extends ArtifactProperties myCustomManifestAttributes = new ArrayList<>(); private JavaFxApplicationIcons myIcons = new JavaFxApplicationIcons(); + private String myMsgOutputLevel = JavaFxPackagerConstants.MsgOutputLevel.Default.name(); @Override public void onBuildFinished(@NotNull final Artifact artifact, @NotNull final CompileContext compileContext) { @@ -107,6 +108,11 @@ public class JavaFxArtifactProperties extends ArtifactProperties getCustomManifestAttributes() { return myProperties.getCustomManifestAttributes(); } + + @Override + protected JavaFxPackagerConstants.MsgOutputLevel getMsgOutputLevel() { + return JavaFxPackagerConstants.MsgOutputLevel.valueOf(myProperties.getMsgOutputLevel()); + } } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java index 6b1369366ae3..12ff34310ff5 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/ant/JavaFxChunkBuildExtension.java @@ -141,6 +141,8 @@ public class JavaFxChunkBuildExtension extends ChunkBuildExtension { new JavaFxArtifactProperties.JavaFxPackager(artifact, properties, context.getProject()) { @Override protected void registerJavaFxPackagerError(String message) {} + @Override + protected void registerJavaFxPackagerInfo(String message) {} }; final String tempDirDeployPath = tempDirPath + "/deploy"; final List tags =