--- /dev/null 2019-11-18 20:29:53.000000000 -0500 +++ new/src/demo/share/jpackage/JNLPConverter/src/jnlp/converter/parser/JNLPDesc.java 2019-11-18 20:29:49.850515900 -0500 @@ -0,0 +1,617 @@ +/* + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jnlp.converter.parser; + +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Properties; +import jnlp.converter.Log; + +import jnlp.converter.parser.ResourcesDesc.JARDesc; +import jnlp.converter.parser.ResourcesDesc.JREDesc; + +public class JNLPDesc { + private String specVersion = null; + private String codebase = null; + private String version = null; + private String href = null; + private String name = null; + private String title = null; + private String vendor = null; + private String mainJar = null; + private String [] descriptions = null; + private IconDesc [] icons = null; + private ShortcutDesc shortcuts = null; + private AssociationDesc [] associations = null; + private String mainClass = null; + private final List arguments = new ArrayList<>(); + private final List files = new ArrayList<>(); + private final List resources = new ArrayList<>(); + private final List vmArgs = new ArrayList<>(); + private boolean isLibrary = false; + private boolean isInstaller = false; + private boolean isJRESet = false; + private ResourcesDesc resourcesDesc; + private boolean isVersionEnabled = false; + private boolean isSandbox = true; + private boolean isFXApp = false; + + public void setSpecVersion(String specVersion) { + this.specVersion = specVersion; + + // Valid values are 1.0, 1.5, 6.0, 6.0.10, 6.0.18, 7.0, 8.20, 9 or a wildcard such as 1.0+. + if (!specVersion.startsWith("1.0") && + !specVersion.startsWith("1.5") && + !specVersion.startsWith("6.0") && + !specVersion.startsWith("6.0.10") && + !specVersion.startsWith("6.0.18") && + !specVersion.startsWith("7.0") && + !specVersion.startsWith("8.20") && + !specVersion.startsWith("9")) { + System.out.println("Warning: Invalid version of the JNLP specification found: " + + specVersion + ". Valid values are 1.0, 1.5, 6.0, 6.0.10, 6.0.18, 7.0," + + " 8.20, 9 or a wildcard such as 1.0+."); + } + } + + public String getSpecVersion() { + return specVersion; + } + + public void setCodebase(String codebase) { + this.codebase = codebase; + } + + public String getCodebase() { + return codebase; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getVersion() { + return version; + } + + public void setHref(String href) { + this.href = href; + } + + public String getHref() { + return href; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getVendor() { + return vendor; + } + + public void setMainJar(String mainJar) { + if (this.mainJar == null) { + this.mainJar = mainJar; + } else { + Log.warning("Main jar already set to '" + this.mainJar + "'. " + + "Attempt to set main jar to '" + mainJar + "' will be ignored."); + } + } + + public String getMainJar() { + return mainJar; + } + + public void setDescriptions(String [] descriptions) { + this.descriptions = descriptions; + } + + public String getDescription() { + String description = null; + if (descriptions != null) { + if (descriptions[InformationDesc.DESC_DEFAULT] != null) { + description = descriptions[InformationDesc.DESC_DEFAULT]; + } else if (descriptions[InformationDesc.DESC_SHORT] != null) { + description = descriptions[InformationDesc.DESC_SHORT]; + } else if (descriptions[InformationDesc.DESC_ONELINE] != null) { + description = descriptions[InformationDesc.DESC_ONELINE]; + } else if (descriptions[InformationDesc.DESC_TOOLTIP] != null) { + description = descriptions[InformationDesc.DESC_TOOLTIP]; + } + + if (description != null) { + if (description.contains("\r") || description.contains("\n")) { + Log.warning("Multiple lines of text in description is not supported and description will be converted to single line by replacing new lines with spaces."); + Log.warning("Original description:"); + Log.warning(description); + String descs[] = description.split("\n"); + description = ""; + for (String desc : descs) { + desc = desc.trim(); + if (desc.endsWith("\r")) { // In case new line was \r\n + if (desc.length() != 1) { + desc = desc.substring(0, desc.length() - 1); + } else { + continue; + } + } + + if (desc.isEmpty()) { + continue; + } + + if (!description.isEmpty()) { + description += " "; + } + + description += desc; + } + Log.warning("Converted description:"); + Log.warning(description); + } + } + } + + return description; + } + + public void setIcons(IconDesc [] icons) { + this.icons = icons; + } + + public IconDesc getIcon() { + for (IconDesc icon : icons) { + if (icon.getKind() == IconDesc.ICON_KIND_DEFAULT) { + return icon; + } + } + + for (IconDesc icon : icons) { + if (icon.getKind() == IconDesc.ICON_KIND_SHORTCUT) { + return icon; + } + } + + return null; + } + + public String getIconLocation() { + IconDesc icon = getIcon(); + if (icon != null) { + return icon.getLocalLocation(); + } + + return null; + } + + public void setShortcuts(ShortcutDesc shortcuts) { + this.shortcuts = shortcuts; + } + + public boolean isDesktopHint() { + if (shortcuts != null) { + return shortcuts.getDesktop(); + } + + return false; + } + + public boolean isMenuHint() { + if (shortcuts != null) { + return shortcuts.getMenu(); + } + + return false; + } + + public String getSubMenu() { + if (shortcuts != null) { + return shortcuts.getSubmenu(); + } + + return null; + } + + public void setAssociations(AssociationDesc [] associations) { + this.associations = associations; + } + + public AssociationDesc [] getAssociations() { + return associations; + } + + public void setMainClass(String mainClass, boolean isJavafxDesc) { + if (isJavafxDesc) { + this.mainClass = mainClass; + } else if (this.mainClass == null) { + this.mainClass = mainClass; + } + } + + public String getMainClass() { + return mainClass; + } + + public void addArguments(String argument) { + if (argument != null && !argument.isEmpty()) { + arguments.add(argument); + } + } + + public List getArguments() { + return arguments; + } + + public void setProperty(String name, String value) { + if (name.equalsIgnoreCase("jnlp.versionEnabled") && value.equalsIgnoreCase("true")) { + isVersionEnabled = true; + return; + } + + addVMArg("-D" + name + "=" + value); + } + + public boolean isVersionEnabled() { + return isVersionEnabled; + } + + public boolean isSandbox() { + return isSandbox; + } + + public void setIsSandbox(boolean value) { + isSandbox = value; + } + + public boolean isFXApp() { + return isFXApp; + } + + public void setIsFXApp(boolean value) { + isFXApp = value; + } + + public void addFile(String file) { + if (file != null) { + files.add(file); + } + } + + public List getFiles() { + return files; + } + + private boolean isResourceExists(JARDesc resource) { + for (JARDesc r : resources) { + if (r.getLocation().equals(resource.getLocation())) { + return true; + } + } + + return false; + } + + public void addResource(JARDesc resource) { + if (resource != null) { + if (isResourceExists(resource)) { + Log.warning("Ignoring repeated resource " + resource.getLocation()); + return; + } + resources.add(resource); + } + } + + public List getResources() { + return resources; + } + + public void addVMArg(String arg) { + if (arg != null) { + vmArgs.add(arg); + } + } + + public List getVMArgs() { + return vmArgs; + } + + public void setIsLibrary(boolean isLibrary) { + this.isLibrary = isLibrary; + } + + public boolean isLibrary() { + return isLibrary; + } + + public void setIsInstaller(boolean isInstaller) { + this.isInstaller = isInstaller; + } + + public boolean isInstaller() { + return isInstaller; + } + + public void setIsJRESet(boolean isJRESet) { + this.isJRESet = isJRESet; + } + + public boolean isJRESet() { + return isJRESet; + } + + public void setResourcesDesc(ResourcesDesc resourcesDesc) { + this.resourcesDesc = resourcesDesc; + } + + public ResourcesDesc getResourcesDesc() { + return resourcesDesc; + } + + public void parseResourceDesc() throws Exception { + if (resourcesDesc != null && !resourcesDesc.isEmpty()) { + setMainJar(resourcesDesc.getMainJar().getName()); + + JARDesc[] jars = resourcesDesc.getAllJarDescs(); + for (JARDesc jar : jars) { + addResource(jar); + } + + JREDesc jreDesc = resourcesDesc.getJreDesc(); + if (jreDesc != null) { + String [] args = jreDesc.getVmArgsList(); + if (args != null) { + for (String arg : args) { + addVMArg(arg); + } + } + + if (jreDesc.getMinHeap() != -1) { + addVMArg("-Xms" + jreDesc.getMinHeap()); + } + + if (jreDesc.getMaxHeap() != -1) { + addVMArg("-Xmx" + jreDesc.getMaxHeap()); + } + } + + Properties props = resourcesDesc.getResourceProperties(); + Enumeration e = props.propertyNames(); + while (e.hasMoreElements()) { + String key = (String) e.nextElement(); + String value = props.getProperty(key); + setProperty(key, value); + } + } + } + + public static class InformationDesc { + + private final String _title; + private final String _vendor; + private final String[] _descriptions; + private final IconDesc[] _icons; + private ShortcutDesc _shortcutHints; + private AssociationDesc[] _associations; + + public InformationDesc(String title, String vendor, + String[] descriptions, + IconDesc[] icons, + ShortcutDesc shortcutHints, + AssociationDesc[] associations) { + _title = (title == null) ? "" : title; + _vendor = (vendor == null) ? "" : vendor; + if (descriptions == null) { + descriptions = new String[NOF_DESC]; + } + _descriptions = descriptions; + _icons = icons; + _shortcutHints = shortcutHints; + _associations = associations; + } + + /** + * Constants for the getInfoDescription + */ + final public static int DESC_DEFAULT = 0; + final public static int DESC_SHORT = 1; + final public static int DESC_ONELINE = 2; + final public static int DESC_TOOLTIP = 3; + final public static int NOF_DESC = 4; + + /** + * Information + */ + public String getTitle() { + return _title; + } + + public String getVendor() { + return _vendor; + } + + public IconDesc[] getIcons() { + return _icons; + } + + public ShortcutDesc getShortcut() { + if (_shortcutHints == null) { + return null; + } + return new ShortcutDesc(_shortcutHints.getDesktop(), _shortcutHints.getMenu(), _shortcutHints.getSubmenu()); + } + + public AssociationDesc[] getAssociations() { + return _associations; + } + + /** + * Sets new shortcut hints. + * + * @param shortcutDesc the new shortcut hints to set + */ + public void setShortcut(ShortcutDesc shortcut) { + _shortcutHints = shortcut; + } + + /** + * Sets new associations. + * + * @param assoc the association to set + */ + public void setAssociation(AssociationDesc assoc) { + if (assoc == null) { + _associations = null; + } else { + _associations = new AssociationDesc[]{assoc}; + } + } + + /** + * Returns the description of the given kind. will return null if none + * there + */ + public String getDescription(int kind) { + return _descriptions[kind]; + } + + public String[] getDescription() { + return _descriptions; + } + } + + public static class IconDesc { + + private final String _location; + private String _localLocation; + private final int _kind; + + final public static int ICON_KIND_DEFAULT = 0; + final public static int ICON_KIND_SHORTCUT = 5; + + public IconDesc(URL location, int kind) { + _location = location.toExternalForm(); + _kind = kind; + } + + public String getLocation() { + return _location; + } + + public void setLocalLocation(String localLocation) { + _localLocation = localLocation; + } + + public String getLocalLocation() { + return _localLocation; + } + + public int getKind() { + return _kind; + } + } + + public static class ShortcutDesc { + + private final boolean _desktop; + private final boolean _menu; + private final String _submenu; + + public ShortcutDesc(boolean desktop, boolean menu, String submenu) { + _desktop = desktop; + _menu = menu; + _submenu = submenu; + } + + public boolean getDesktop() { + return _desktop; + } + + public boolean getMenu() { + return _menu; + } + + public String getSubmenu() { + return _submenu; + } + } + + public static class AssociationDesc { + + private final String _extensions; + private final String _mimeType; + private final String _description; + private final String _icon; + private String _iconLocalLocation; + + public AssociationDesc(String extensions, String mimeType, String description, URL icon) { + _extensions = extensions; + _mimeType = mimeType; + _description = description; + _icon = (icon != null) ? icon.toExternalForm() : null; + } + + public void setIconLocalLocation(String localLocation) { + _iconLocalLocation = localLocation; + } + + public String getIconLocalLocation() { + return _iconLocalLocation; + } + + public String getExtensions() { + return _extensions; + } + + public String getMimeType() { + return _mimeType; + } + + public String getMimeDescription() { + return _description; + } + + public String getIconUrl() { + return _icon; + } + } +}