From 4076692232e46214b0b668583ec22efb4f42bb9d Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 3 Dec 2013 10:52:54 +0100 Subject: [PATCH] javafx: allow to configure custom manifest attributes (IDEA-115252) --- .../packaging/AbstractJavaFxPackager.java | 3 + .../javaFX/packaging/JavaFxAntGenerator.java | 13 +- .../packaging/JavaFxManifestAttribute.java | 50 +++++++ .../javaFX/packaging/JavaFxAntTaskTest.java | 7 + .../JpsJavaFxArtifactBuildTaskProvider.java | 6 + .../javaFX/JpsJavaFxArtifactProperties.java | 14 ++ .../packaging/JavaFxArtifactProperties.java | 18 +++ .../JavaFxArtifactPropertiesEditor.form | 35 ++++- .../JavaFxArtifactPropertiesEditor.java | 138 +++++++++++++++++- 9 files changed, 278 insertions(+), 6 deletions(-) create mode 100644 plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxManifestAttribute.java 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 a176b9c419d4..0123556b4e62 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 @@ -18,6 +18,7 @@ package org.jetbrains.plugins.javaFX.packaging; import com.intellij.execution.CommandLineUtil; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtilRt; @@ -358,4 +359,6 @@ public abstract class AbstractJavaFxPackager { public abstract String getPreloaderJar(); public abstract boolean convertCss2Bin(); + + public abstract List getCustomManifestAttributes(); } 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 e9f50e748f04..7ebe6296c042 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 @@ -106,7 +106,18 @@ public class JavaFxAntGenerator { createJarTag.add(new SimpleTag("fileset", fileset2Jar.toArray(new Pair[fileset2Jar.size()]))); createJarTag.add(createResourcesTag(preloaderFiles, false, allButPreloader, allButSelf, all)); - + + List manifestAttributes = packager.getCustomManifestAttributes(); + if (manifestAttributes != null) { + final SimpleTag manifestTag = new SimpleTag("manifest"); + for (JavaFxManifestAttribute pair : manifestAttributes) { + manifestTag.add(new SimpleTag("attribute", + new Pair("name", pair.getName()), + new Pair("value", pair.getValue()))); + } + createJarTag.add(manifestTag); + } + topLevelTagsCollector.add(createJarTag); //deploy task diff --git a/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxManifestAttribute.java b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxManifestAttribute.java new file mode 100644 index 000000000000..52706a2ce4f4 --- /dev/null +++ b/plugins/javaFX/common-javaFX-plugin/src/org/jetbrains/plugins/javaFX/packaging/JavaFxManifestAttribute.java @@ -0,0 +1,50 @@ +package org.jetbrains.plugins.javaFX.packaging; + +public class JavaFxManifestAttribute { + private String myName; + private String myValue; + + public JavaFxManifestAttribute() { + } + + public JavaFxManifestAttribute(String name, String value) { + myName = name; + myValue = value; + } + + public String getName() { + return myName; + } + + public void setName(String name) { + myName = name; + } + + public String getValue() { + return myValue; + } + + public void setValue(String value) { + myValue = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + JavaFxManifestAttribute attribute = (JavaFxManifestAttribute)o; + + if (!myName.equals(attribute.myName)) return false; + if (!myValue.equals(attribute.myValue)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myName.hashCode(); + result = 31 * result + myValue.hashCode(); + return result; + } +} 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 ac4dc5970d8c..1003d26b3ec2 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 @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.javaFX.packaging; +import com.intellij.openapi.util.Pair; import com.intellij.testFramework.UsefulTestCase; import java.io.File; @@ -215,6 +216,7 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ private String myPreloaderJar; private boolean myConvertCss2Bin; private boolean mySigned; + private List myCustomManifestAttributes; private MockJavaFxPackager(String outputPath) { myOutputPath = outputPath; @@ -365,5 +367,10 @@ public class JavaFxAntTaskTest extends UsefulTestCase{ public boolean convertCss2Bin() { return myConvertCss2Bin; } + + @Override + public List getCustomManifestAttributes() { + return myCustomManifestAttributes; + } } } 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 06148e7eaec9..2acbf76d122e 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 @@ -31,6 +31,7 @@ import org.jetbrains.jps.model.java.JpsJavaSdkType; import org.jetbrains.jps.model.library.sdk.JpsSdk; import org.jetbrains.jps.model.library.sdk.JpsSdkType; import org.jetbrains.plugins.javaFX.packaging.AbstractJavaFxPackager; +import org.jetbrains.plugins.javaFX.packaging.JavaFxManifestAttribute; import org.jetbrains.plugins.javaFX.packaging.JavaFxPackagerConstants; import org.jetbrains.plugins.javaFX.preloader.JpsJavaFxPreloaderArtifactProperties; import org.jetbrains.plugins.javaFX.preloader.JpsJavaFxPreloaderArtifactType; @@ -237,6 +238,11 @@ public class JpsJavaFxArtifactBuildTaskProvider extends ArtifactBuildTaskProvide return myProperties.myState.isConvertCss2Bin(); } + @Override + public List getCustomManifestAttributes() { + return myProperties.myState.getCustomManifestAttributes(); + } + 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 14c9e25a6f6b..34e385579520 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 @@ -2,8 +2,12 @@ package org.jetbrains.plugins.javaFX; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.ex.JpsElementBase; +import org.jetbrains.plugins.javaFX.packaging.JavaFxManifestAttribute; import org.jetbrains.plugins.javaFX.packaging.JavaFxPackagerConstants; +import java.util.ArrayList; +import java.util.List; + /** * User: anna * Date: 3/13/13 @@ -36,6 +40,7 @@ public class JpsJavaFxArtifactProperties extends JpsElementBase myCustomManifestAttributes = new ArrayList(); public String getTitle() { return myTitle; @@ -203,5 +209,13 @@ public class JpsJavaFxArtifactProperties extends JpsElementBase getCustomManifestAttributes() { + return myCustomManifestAttributes; + } + + public void setCustomManifestAttributes(List customManifestAttributes) { + myCustomManifestAttributes = customManifestAttributes; + } } } 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 d3227b99ccf8..33f41a1249cf 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactProperties.java @@ -25,6 +25,7 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Pair; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactManager; import com.intellij.packaging.artifacts.ArtifactProperties; @@ -35,6 +36,7 @@ import com.intellij.packaging.impl.elements.ArtifactPackagingElement; import com.intellij.packaging.ui.ArtifactEditorContext; import com.intellij.packaging.ui.ArtifactPropertiesEditor; import com.intellij.util.xmlb.XmlSerializerUtil; +import com.intellij.util.xmlb.annotations.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.javaFX.packaging.preloader.JavaFxPreloaderArtifactProperties; @@ -42,7 +44,9 @@ import org.jetbrains.plugins.javaFX.packaging.preloader.JavaFxPreloaderArtifactP import org.jetbrains.plugins.javaFX.packaging.preloader.JavaFxPreloaderArtifactType; import java.io.File; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Set; /** @@ -69,6 +73,7 @@ public class JavaFxArtifactProperties extends ArtifactProperties myCustomManifestAttributes = new ArrayList(); @Override public void onBuildFinished(@NotNull final Artifact artifact, @NotNull final CompileContext compileContext) { @@ -298,6 +303,14 @@ public class JavaFxArtifactProperties extends ArtifactProperties getCustomManifestAttributes() { + return myCustomManifestAttributes; + } + + public void setCustomManifestAttributes(List customManifestAttributes) { + myCustomManifestAttributes = customManifestAttributes; + } + public static abstract class JavaFxPackager extends AbstractJavaFxPackager { private final Artifact myArtifact; private final JavaFxArtifactProperties myProperties; @@ -423,5 +436,10 @@ public class JavaFxArtifactProperties extends ArtifactProperties getCustomManifestAttributes() { + return myProperties.getCustomManifestAttributes(); + } } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.form b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.form index f32f1a7c1edf..be0f538b27cf 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.form +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.form @@ -3,12 +3,12 @@ - + - + @@ -215,6 +215,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.java index f802e6dab749..0006db9918c7 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/packaging/JavaFxArtifactPropertiesEditor.java @@ -15,21 +15,27 @@ */ package org.jetbrains.plugins.javaFX.packaging; +import com.intellij.execution.util.ListTableWithButtons; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.ui.ArtifactPropertiesEditor; import com.intellij.util.ArrayUtil; import com.intellij.util.Base64Converter; +import com.intellij.util.ui.ColumnInfo; +import com.intellij.util.ui.ListTableModel; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.text.JTextComponent; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; @@ -56,7 +62,10 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { private JButton myEditSignCertificateButton; private JCheckBox myConvertCssToBinCheckBox; private JComboBox myNativeBundleCB; + private JButton myEditAttributesButton; private JavaFxEditCertificatesDialog myDialog; + private CustomManifestAttributesDialog myManifestAttributesDialog; + private List myCustomManifestAttributes; public JavaFxArtifactPropertiesEditor(JavaFxArtifactProperties properties, final Project project, Artifact artifact) { super(); @@ -79,6 +88,17 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { } }); + myEditAttributesButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + myManifestAttributesDialog = new CustomManifestAttributesDialog(myWholePanel, myCustomManifestAttributes); + myManifestAttributesDialog.show(); + if (myManifestAttributesDialog.isOK()) { + myCustomManifestAttributes = myManifestAttributesDialog.getAttrs(); + } + } + }); + final List bundleNames = new ArrayList(); for (JavaFxPackagerConstants.NativeBundles bundle : JavaFxPackagerConstants.NativeBundles.values()) { bundleNames.add(bundle.name()); @@ -121,13 +141,17 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { if (isModified(storepass != null ? Base64Converter.decode(storepass) : "", myDialog.myPanel.myStorePassTF)) return true; if (myProperties.isSelfSigning() != myDialog.myPanel.mySelfSignedRadioButton.isSelected()) return true; } + + if (myManifestAttributesDialog != null) { + if (!Comparing.equal(myManifestAttributesDialog.getAttrs(), myProperties.getCustomManifestAttributes())) return true; + } return false; } private static boolean isModified(final String title, JTextComponent tf) { return !Comparing.strEqual(title, tf.getText().trim()); } - + private static boolean isModified(final String title, TextFieldWithBrowseButton tf) { return !Comparing.strEqual(title, tf.getText().trim()); } @@ -142,7 +166,7 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { myProperties.setHeight(myHeightTF.getText()); myProperties.setHtmlParamFile(myHtmlParams.getText()); myProperties.setParamFile(myParams.getText()); - myProperties.setUpdateMode(myUpdateInBackgroundCB.isSelected() ? JavaFxPackagerConstants.UPDATE_MODE_BACKGROUND + myProperties.setUpdateMode(myUpdateInBackgroundCB.isSelected() ? JavaFxPackagerConstants.UPDATE_MODE_BACKGROUND : JavaFxPackagerConstants.UPDATE_MODE_ALWAYS); myProperties.setEnabledSigning(myEnableSigningCB.isSelected()); myProperties.setConvertCss2Bin(myConvertCssToBinCheckBox.isSelected()); @@ -156,6 +180,10 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { final String storePass = String.valueOf(myDialog.myPanel.myStorePassTF.getPassword()); myProperties.setStorepass(!StringUtil.isEmptyOrSpaces(storePass) ? Base64Converter.encode(storePass) : null); } + + if (myManifestAttributesDialog != null) { + myProperties.setCustomManifestAttributes(myManifestAttributesDialog.getAttrs()); + } } @Nullable @@ -179,6 +207,7 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { myEnableSigningCB.setSelected(myProperties.isEnabledSigning()); myConvertCssToBinCheckBox.setSelected(myProperties.isConvertCss2Bin()); myEditSignCertificateButton.setEnabled(myProperties.isEnabledSigning()); + myCustomManifestAttributes = myProperties.getCustomManifestAttributes(); } private static void setText(TextFieldWithBrowseButton tf, final String title) { @@ -199,4 +228,107 @@ public class JavaFxArtifactPropertiesEditor extends ArtifactPropertiesEditor { myDialog.myPanel = null; } } -} + + private static class CustomManifestAttributesDialog extends DialogWrapper { + private final JPanel myWholePanel = new JPanel(new BorderLayout()); + private final AttributesTable myTable; + + protected CustomManifestAttributesDialog(JPanel panel, List attrs) { + super(panel, true); + myTable = new AttributesTable(); + myTable.setValues(attrs); + myWholePanel.add(myTable.getComponent(), BorderLayout.CENTER); + setTitle("Edit Custom Manifest Attributes"); + init(); + } + + @Override + @Nullable + protected JComponent createCenterPanel() { + return myWholePanel; + } + + @Override + protected void doOKAction() { + myTable.stopEditing(); + super.doOKAction(); + } + + List getAttrs() { + return myTable.getAttrs(); + } + + private static class AttributesTable extends ListTableWithButtons { + @Override + protected ListTableModel createListModel() { + final ColumnInfo name = new ElementsColumnInfoBase("Name") { + @Nullable + @Override + public String valueOf(JavaFxManifestAttribute attribute) { + return attribute.getName(); + } + + @Override + public boolean isCellEditable(JavaFxManifestAttribute attr) { + return true; + } + + @Override + public void setValue(JavaFxManifestAttribute attr, String value) { + attr.setName(value); + } + + @Nullable + @Override + protected String getDescription(JavaFxManifestAttribute element) { + return element.getName(); + } + }; + + final ColumnInfo value = new ElementsColumnInfoBase("Value") { + @Override + public String valueOf(JavaFxManifestAttribute attr) { + return attr.getValue(); + } + + @Override + public boolean isCellEditable(JavaFxManifestAttribute attr) { + return true; + } + + @Override + public void setValue(JavaFxManifestAttribute attr, String s) { + attr.setValue(s); + } + + @Nullable + @Override + protected String getDescription(JavaFxManifestAttribute attr) { + return attr.getValue(); + } + }; + + return new ListTableModel((new ColumnInfo[]{name, value})); + } + + @Override + protected JavaFxManifestAttribute createElement() { + return new JavaFxManifestAttribute("", ""); + } + + @Override + protected JavaFxManifestAttribute cloneElement(JavaFxManifestAttribute attribute) { + return new JavaFxManifestAttribute(attribute.getName(), attribute.getValue()); + } + + @Override + protected boolean canDeleteElement(JavaFxManifestAttribute selection) { + return true; + } + + public List getAttrs() { + return getElements(); + } + } + } +} \ No newline at end of file