src/demo/share/jpackager/JNLPConverter/src/jnlp/converter/parser/XMLFormat.java
author herrick
Fri, 12 Oct 2018 19:00:51 -0400
branchJDK-8200758-branch
changeset 56963 eaca4369b068
permissions -rw-r--r--
8198472: Add support for creating bundles from JNLP files Submitten-by: almatvee Reviewed-by: herrick, kcr, prr, asemenyuk
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56963
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     1
/*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     2
 * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     4
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     7
 * published by the Free Software Foundation.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     8
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    13
 * accompanied this code).
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    14
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    18
 *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    21
 * questions.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    22
 */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    23
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    24
package jnlp.converter.parser;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    25
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    26
import java.net.URL;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    27
import java.util.Arrays;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    28
import java.util.ArrayList;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    29
import jnlp.converter.JNLPConverter;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    30
import jnlp.converter.parser.exception.MissingFieldException;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    31
import jnlp.converter.parser.exception.BadFieldException;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    32
import jnlp.converter.parser.exception.JNLParseException;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    33
import jnlp.converter.parser.xml.XMLEncoding;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    34
import jnlp.converter.parser.xml.XMLParser;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    35
import jnlp.converter.parser.xml.XMLNode;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    36
import jnlp.converter.parser.JNLPDesc.AssociationDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    37
import jnlp.converter.parser.JNLPDesc.IconDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    38
import jnlp.converter.parser.JNLPDesc.InformationDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    39
import jnlp.converter.parser.JNLPDesc.ShortcutDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    40
import jnlp.converter.parser.ResourcesDesc.JARDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    41
import jnlp.converter.parser.ResourcesDesc.JREDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    42
import jnlp.converter.Log;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    43
import jnlp.converter.parser.ResourcesDesc.ExtensionDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    44
import jnlp.converter.parser.ResourcesDesc.PropertyDesc;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    45
import org.xml.sax.SAXParseException;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    46
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    47
public class XMLFormat {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    48
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    49
    public static XMLNode parseBits(byte[] bits) throws JNLParseException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    50
        return parse(decode(bits));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    51
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    52
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    53
    private static String decode(byte[] bits) throws JNLParseException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    54
        try {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    55
            return XMLEncoding.decodeXML(bits);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    56
        } catch (Exception e) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    57
            throw new JNLParseException(e,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    58
                "exception determining encoding of jnlp file", 0);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    59
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    60
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    61
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    62
    private static XMLNode parse(String source) throws JNLParseException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    63
        try {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    64
            return (new XMLParser(source).parse());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    65
        } catch (SAXParseException spe) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    66
            throw new JNLParseException(spe,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    67
                        "exception parsing jnlp file", spe.getLineNumber());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    68
        } catch (Exception e) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    69
            throw new JNLParseException(e,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    70
                        "exception parsing jnlp file", 0);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    71
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    72
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    73
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    74
    /**
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    75
     * thisCodebase, if set, is used to determine the codebase,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    76
     *     if JNLP codebase is not absolute.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    77
     *
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    78
     * @param thisCodebase base URL of this JNLPDesc location
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    79
     */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    80
    public static JNLPDesc parse(byte[] bits, URL thisCodebase, String jnlp)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    81
            throws Exception {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    82
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    83
        JNLPDesc jnlpd = new JNLPDesc();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    84
        String source = decode(bits).trim();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    85
        XMLNode root = parse(source);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    86
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    87
        if (root == null || root.getName() == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    88
            throw new JNLParseException(null, null, 0);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    89
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    90
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    91
        // Check that root element is a <jnlp> tag
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    92
        if (!root.getName().equals("jnlp")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    93
            throw (new MissingFieldException(source, "<jnlp>"));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    94
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    95
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    96
        // Read <jnlp> attributes (path is empty, i.e., "")
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    97
        // (spec, version, codebase, href)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    98
        String specVersion = XMLUtils.getAttribute(root, "", "spec", "1.0+");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
    99
        jnlpd.setSpecVersion(specVersion);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   100
        String version = XMLUtils.getAttribute(root, "", "version");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   101
        jnlpd.setVersion(version);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   102
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   103
        // Make sure the codebase URL ends with a '/'.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   104
        //
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   105
        // Regarding the JNLP spec,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   106
        // the thisCodebase is used to determine the codebase.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   107
        //      codebase = new URL(thisCodebase, codebase)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   108
        URL codebase = GeneralUtil.asPathURL(XMLUtils.getAttributeURL(source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   109
            thisCodebase, root, "", "codebase"));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   110
        if (codebase == null && thisCodebase != null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   111
            codebase = thisCodebase;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   112
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   113
        jnlpd.setCodebase(codebase.toExternalForm());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   114
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   115
        // Get href for JNLP file
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   116
        URL href = XMLUtils.getAttributeURL(source, codebase, root, "", "href");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   117
        jnlpd.setHref(href.toExternalForm());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   118
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   119
        // Read <security> attributes
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   120
        if (XMLUtils.isElementPath(root, "<security><all-permissions>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   121
            jnlpd.setIsSandbox(false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   122
        } else if (XMLUtils.isElementPath(root,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   123
                "<security><j2ee-application-client-permissions>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   124
            jnlpd.setIsSandbox(false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   125
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   126
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   127
        // We can be fxapp, and also be applet, or application, or neither
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   128
        boolean isFXApp = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   129
        boolean isApplet = false;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   130
        if (XMLUtils.isElementPath(root, "<javafx-desc>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   131
            // no new type for javafx-desc - needs one of the others
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   132
            buildFXAppDesc(source, root, "<javafx-desc>", jnlpd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   133
            jnlpd.setIsFXApp(true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   134
            isFXApp = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   135
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   136
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   137
        /*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   138
         * Note - the jnlp specification says there must be exactly one of
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   139
         * the descriptor types.  This code has always violated (or at least
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   140
         * not checked for) that condition.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   141
         * Instead it uses precedent order app, component, installer, applet
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   142
         * and ignores any other descriptors given.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   143
         */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   144
        if (XMLUtils.isElementPath(root, "<application-desc>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   145
            buildApplicationDesc(source, root, jnlpd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   146
        } else if (XMLUtils.isElementPath(root, "<component-desc>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   147
            jnlpd.setIsLibrary(true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   148
        } else if (XMLUtils.isElementPath(root, "<installer-desc>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   149
            Log.warning("<installer-desc> is not supported and will be ignored in " + jnlp);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   150
            jnlpd.setIsInstaller(true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   151
        } else if (XMLUtils.isElementPath(root, "<applet-desc>")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   152
            isApplet = true;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   153
        } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   154
            if (!isFXApp) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   155
                throw (new MissingFieldException(source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   156
                    "<jnlp>(<application-desc>|<applet-desc>|" +
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   157
                    "<installer-desc>|<component-desc>)"));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   158
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   159
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   160
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   161
        if (isApplet && !isFXApp) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   162
            Log.error("Applet based applications deployed with <applet-desc> element are not supported.");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   163
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   164
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   165
        if (!jnlpd.isLibrary() && !jnlpd.isInstaller()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   166
            buildInformationDesc(source, codebase, root, jnlpd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   167
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   168
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   169
        if (!jnlpd.isInstaller()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   170
            buildResourcesDesc(source, codebase, root, false, jnlpd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   171
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   172
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   173
        if (!jnlpd.isLibrary() && !jnlpd.isInstaller()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   174
            jnlpd.parseResourceDesc();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   175
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   176
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   177
        if (!jnlpd.isInstaller()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   178
            if (jnlpd.isSandbox()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   179
                if (jnlpd.isLibrary()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   180
                    Log.warning(jnlp + " is sandbox extension. JNLPConverter does not support sandbox environment and converted application will run without security manager.");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   181
                } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   182
                    Log.warning("This is sandbox Web-Start application. JNLPConverter does not support sandbox environment and converted application will run without security manager.");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   183
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   184
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   185
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   186
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   187
        return jnlpd;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   188
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   189
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   190
    /**
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   191
     * Create a combine informationDesc in the two informationDesc.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   192
     * The information present in id1 overwrite the information present in id2
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   193
     */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   194
    private static InformationDesc combineInformationDesc(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   195
                                   InformationDesc id1, InformationDesc id2) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   196
        if (id1 == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   197
            return id2;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   198
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   199
        if (id2 == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   200
            return id1;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   201
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   202
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   203
        String t1 = id1.getTitle();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   204
        String title  = (t1 != null && t1.length() > 0) ?
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   205
            t1 : id2.getTitle();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   206
        String v1 = id1.getVendor();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   207
        String vendor = (v1 != null && v1.length() > 0) ?
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   208
            v1 : id2.getVendor();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   209
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   210
        /** Copy descriptions */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   211
        String[] descriptions = new String[InformationDesc.NOF_DESC];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   212
        for (int i = 0; i < descriptions.length; i++) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   213
            descriptions[i] = (id1.getDescription(i) != null)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   214
                    ? id1.getDescription(i) : id2.getDescription(i);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   215
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   216
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   217
        /** Icons */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   218
        ArrayList<IconDesc> iconList = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   219
        if (id2.getIcons() != null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   220
            iconList.addAll(Arrays.asList(id2.getIcons()));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   221
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   222
        if (id1.getIcons() != null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   223
            iconList.addAll(Arrays.asList(id1.getIcons()));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   224
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   225
        IconDesc[] icons = new IconDesc[iconList.size()];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   226
        icons = iconList.toArray(icons);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   227
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   228
        ShortcutDesc hints = (id1.getShortcut() != null) ?
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   229
                             id1.getShortcut() : id2.getShortcut();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   230
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   231
        AssociationDesc[] asd = ( AssociationDesc[] ) addArrays(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   232
            (Object[])id1.getAssociations(), (Object[])id2.getAssociations());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   233
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   234
        return new InformationDesc(title,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   235
                                   vendor,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   236
                                   descriptions,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   237
                                   icons,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   238
                                   hints,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   239
                                   asd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   240
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   241
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   242
    /** Extract data from <information> tag */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   243
    private static void buildInformationDesc(final String source, final URL codebase, XMLNode root, JNLPDesc jnlpd)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   244
        throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   245
        final ArrayList<InformationDesc> list = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   246
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   247
        // Iterates over all <information> nodes ignoring the type
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   248
        XMLUtils.visitElements(root,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   249
            "<information>", new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   250
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   251
            public void visitElement(XMLNode e) throws
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   252
                BadFieldException, MissingFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   253
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   254
                // Check for right os, arch, and locale
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   255
                String[] os = GeneralUtil.getStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   256
                            XMLUtils.getAttribute(e, "", "os", null));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   257
                String[] arch = GeneralUtil.getStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   258
                            XMLUtils.getAttribute(e, "", "arch", null));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   259
                String[] locale = GeneralUtil.getStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   260
                            XMLUtils.getAttribute(e, "", "locale", null));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   261
                if (GeneralUtil.prefixMatchStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   262
                                os, GeneralUtil.getOSFullName()) &&
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   263
                    GeneralUtil.prefixMatchArch(arch) &&
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   264
                    matchDefaultLocale(locale))
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   265
                {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   266
                    // Title, vendor
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   267
                    String title = XMLUtils.getElementContents(e, "<title>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   268
                    String vendor = XMLUtils.getElementContents(e, "<vendor>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   269
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   270
                    // Descriptions
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   271
                    String[] descriptions =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   272
                                new String[InformationDesc.NOF_DESC];
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   273
                    descriptions[InformationDesc.DESC_DEFAULT] =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   274
                        XMLUtils.getElementContentsWithAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   275
                        e, "<description>", "kind", "", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   276
                    descriptions[InformationDesc.DESC_ONELINE] =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   277
                        XMLUtils.getElementContentsWithAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   278
                        e, "<description>", "kind", "one-line", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   279
                    descriptions[InformationDesc.DESC_SHORT] =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   280
                        XMLUtils.getElementContentsWithAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   281
                        e, "<description>", "kind", "short", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   282
                    descriptions[InformationDesc.DESC_TOOLTIP] =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   283
                        XMLUtils.getElementContentsWithAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   284
                        e, "<description>", "kind", "tooltip", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   285
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   286
                    // Icons
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   287
                    IconDesc[] icons = getIconDescs(source, codebase, e);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   288
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   289
                    // Shortcut hints
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   290
                    ShortcutDesc shortcuts = getShortcutDesc(e);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   291
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   292
                    // Association hints
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   293
                    AssociationDesc[] associations = getAssociationDesc(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   294
                                                        source, codebase, e);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   295
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   296
                    list.add(new InformationDesc(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   297
                        title, vendor, descriptions, icons,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   298
                        shortcuts, associations));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   299
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   300
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   301
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   302
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   303
        /* Combine all information desc. information in a single one for
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   304
         * the current locale using the following priorities:
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   305
         *   1. locale == language_country_variant
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   306
         *   2. locale == lauguage_country
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   307
         *   3. locale == lauguage
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   308
         *   4. no or empty locale
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   309
         */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   310
        InformationDesc normId = new InformationDesc(null, null, null, null, null, null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   311
        for (InformationDesc id : list) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   312
            normId = combineInformationDesc(id, normId);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   313
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   314
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   315
        jnlpd.setTitle(normId.getTitle());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   316
        jnlpd.setVendor(normId.getVendor());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   317
        jnlpd.setDescriptions(normId.getDescription());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   318
        jnlpd.setIcons(normId.getIcons());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   319
        jnlpd.setShortcuts(normId.getShortcut());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   320
        jnlpd.setAssociations(normId.getAssociations());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   321
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   322
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   323
    private static Object[] addArrays (Object[] a1, Object[] a2) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   324
        if (a1 == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   325
            return a2;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   326
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   327
        if (a2 == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   328
            return a1;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   329
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   330
        ArrayList<Object> list = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   331
        int i;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   332
        for (i=0; i<a1.length; list.add(a1[i++]));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   333
        for (i=0; i<a2.length; list.add(a2[i++]));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   334
        return list.toArray(a1);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   335
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   336
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   337
    public static boolean matchDefaultLocale(String[] localeStr) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   338
        return GeneralUtil.matchLocale(localeStr, GeneralUtil.getDefaultLocale());
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   339
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   340
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   341
    /** Extract data from <resources> tag. There is only one. */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   342
    static void buildResourcesDesc(final String source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   343
            final URL codebase, XMLNode root, final boolean ignoreJres, JNLPDesc jnlpd)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   344
            throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   345
        // Extract classpath directives
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   346
        final ResourcesDesc rdesc = new ResourcesDesc();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   347
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   348
        // Iterate over all entries
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   349
        XMLUtils.visitElements(root, "<resources>",
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   350
                new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   351
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   352
            public void visitElement(XMLNode e)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   353
                    throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   354
                // Check for right os, archictecture, and locale
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   355
                String[] os = GeneralUtil.getStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   356
                        XMLUtils.getAttribute(e, "", "os", null));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   357
                final String arch = XMLUtils.getAttribute(e, "", "arch", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   358
                String[] locale = GeneralUtil.getStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   359
                        XMLUtils.getAttribute(e, "", "locale", null));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   360
                if (GeneralUtil.prefixMatchStringList(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   361
                        os, GeneralUtil.getOSFullName())
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   362
                        && matchDefaultLocale(locale)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   363
                    // Now visit all children in this node
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   364
                    XMLUtils.visitChildrenElements(e,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   365
                            new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   366
                        @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   367
                        public void visitElement(XMLNode e2)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   368
                                throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   369
                            handleResourceElement(source, codebase,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   370
                                    e2, rdesc, ignoreJres, arch, jnlpd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   371
                        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   372
                    });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   373
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   374
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   375
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   376
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   377
        if (!rdesc.isEmpty()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   378
            jnlpd.setResourcesDesc(rdesc);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   379
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   380
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   381
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   382
    private static IconDesc[] getIconDescs(final String source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   383
            final URL codebase, XMLNode e)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   384
            throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   385
        final ArrayList<IconDesc> answer = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   386
        XMLUtils.visitElements(e, "<icon>", new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   387
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   388
            public void visitElement(XMLNode icon) throws
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   389
                    MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   390
                String kindStr = XMLUtils.getAttribute(icon, "", "kind", "");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   391
                URL href = XMLUtils.getRequiredURL(source, codebase, icon, "", "href");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   392
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   393
                if (href != null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   394
                    if (!JNLPConverter.isIconSupported(href.toExternalForm())) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   395
                        return;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   396
                    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   397
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   398
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   399
                int kind;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   400
                if (kindStr == null || kindStr.isEmpty() || kindStr.equals("default")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   401
                    kind = IconDesc.ICON_KIND_DEFAULT;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   402
                } else if (kindStr.equals("shortcut")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   403
                    kind = IconDesc.ICON_KIND_SHORTCUT;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   404
                } else {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   405
                    Log.warning("Ignoring unsupported icon \"" + href + "\" with kind \"" + kindStr + "\".");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   406
                    return;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   407
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   408
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   409
                answer.add(new IconDesc(href, kind));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   410
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   411
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   412
        return answer.toArray(new IconDesc[answer.size()]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   413
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   414
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   415
    private static ShortcutDesc getShortcutDesc(XMLNode e)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   416
                throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   417
        final ArrayList<ShortcutDesc> shortcuts = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   418
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   419
        XMLUtils.visitElements(e, "<shortcut>", new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   420
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   421
            public void visitElement(XMLNode shortcutNode)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   422
                throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   423
                boolean desktopHinted =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   424
                    XMLUtils.isElementPath(shortcutNode, "<desktop>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   425
                boolean menuHinted =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   426
                    XMLUtils.isElementPath(shortcutNode, "<menu>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   427
                String submenuHinted =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   428
                    XMLUtils.getAttribute(shortcutNode, "<menu>", "submenu");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   429
                shortcuts.add(new ShortcutDesc(desktopHinted, menuHinted, submenuHinted));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   430
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   431
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   432
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   433
        if (shortcuts.size() > 0) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   434
            return shortcuts.get(0);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   435
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   436
        return null;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   437
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   438
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   439
    private static AssociationDesc[] getAssociationDesc(final String source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   440
        final URL codebase, XMLNode e)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   441
                throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   442
        final ArrayList<AssociationDesc> answer = new ArrayList<>();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   443
        XMLUtils.visitElements(e, "<association>",
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   444
            new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   445
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   446
            public void visitElement(XMLNode node)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   447
                throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   448
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   449
                String extensions = XMLUtils.getAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   450
                                       node, "", "extensions");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   451
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   452
                String mimeType = XMLUtils.getAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   453
                                       node, "", "mime-type");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   454
                String description = XMLUtils.getElementContents(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   455
                                        node, "<description>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   456
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   457
                URL icon = XMLUtils.getAttributeURL(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   458
                                source, codebase, node, "<icon>", "href");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   459
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   460
                if (!JNLPConverter.isIconSupported(icon.toExternalForm())) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   461
                    icon = null;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   462
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   463
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   464
                if (extensions == null && mimeType == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   465
                    throw new MissingFieldException(source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   466
                                 "<association>(<extensions><mime-type>)");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   467
                } else if (extensions == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   468
                    throw new MissingFieldException(source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   469
                                     "<association><extensions>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   470
                } else if (mimeType == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   471
                    throw new MissingFieldException(source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   472
                                     "<association><mime-type>");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   473
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   474
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   475
                // don't support uppercase extension and mime-type on gnome.
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   476
                if ("gnome".equals(System.getProperty("sun.desktop"))) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   477
                    extensions = extensions.toLowerCase();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   478
                    mimeType = mimeType.toLowerCase();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   479
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   480
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   481
                answer.add(new AssociationDesc(extensions, mimeType,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   482
                                                description, icon));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   483
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   484
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   485
        return answer.toArray(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   486
                new AssociationDesc[answer.size()]);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   487
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   488
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   489
    /** Handle the individual entries in a resource desc */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   490
    private static void handleResourceElement(String source, URL codebase,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   491
        XMLNode e, ResourcesDesc rdesc, boolean ignoreJres, String arch, JNLPDesc jnlpd)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   492
        throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   493
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   494
        String tag = e.getName();
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   495
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   496
        boolean matchArch = GeneralUtil.prefixMatchArch(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   497
            GeneralUtil.getStringList(arch));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   498
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   499
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   500
        if (matchArch && (tag.equals("jar") || tag.equals("nativelib"))) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   501
            /*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   502
             * jar/nativelib elements
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   503
             */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   504
            URL href = XMLUtils.getRequiredURL(source, codebase, e, "", "href");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   505
            String version = XMLUtils.getAttribute(e, "", "version", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   506
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   507
            String mainStr = XMLUtils.getAttribute(e, "", "main");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   508
            boolean isNativeLib = tag.equals("nativelib");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   509
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   510
            boolean isMain = "true".equalsIgnoreCase(mainStr);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   511
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   512
            JARDesc jd = new JARDesc(href, version, isMain, isNativeLib, rdesc);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   513
            rdesc.addResource(jd);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   514
        } else if (matchArch && tag.equals("property")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   515
            /*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   516
             *  property tag
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   517
             */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   518
            String name  = XMLUtils.getRequiredAttribute(source, e, "", "name");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   519
            String value = XMLUtils.getRequiredAttributeEmptyOK(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   520
                    source, e, "", "value");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   521
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   522
            rdesc.addResource(new PropertyDesc(name, value));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   523
        } else if (matchArch && tag.equals("extension")) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   524
            URL href = XMLUtils.getRequiredURL(source, codebase, e, "", "href");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   525
            String version = XMLUtils.getAttribute(e, "", "version", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   526
            rdesc.addResource(new ExtensionDesc(href, version));
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   527
        } else if ((tag.equals("java") || tag.equals("j2se")) && !ignoreJres) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   528
            /*
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   529
             * j2se element
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   530
             */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   531
            String version  =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   532
                XMLUtils.getRequiredAttribute(source, e, "", "version");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   533
            String minheapstr =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   534
                XMLUtils.getAttribute(e, "", "initial-heap-size");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   535
            String maxheapstr =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   536
                XMLUtils.getAttribute(e, "", "max-heap-size");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   537
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   538
            String vmargs =
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   539
                XMLUtils.getAttribute(e, "", "java-vm-args");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   540
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   541
            if (jnlpd.isJRESet()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   542
                if (vmargs == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   543
                    vmargs = "none";
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   544
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   545
                Log.warning("Ignoring repeated element <" + tag + "> with version " + version +
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   546
                        " and java-vm-args: " + vmargs);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   547
                return;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   548
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   549
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   550
            long minheap = GeneralUtil.heapValToLong(minheapstr);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   551
            long maxheap = GeneralUtil.heapValToLong(maxheapstr);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   552
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   553
            ResourcesDesc cbs = null;
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   554
            buildResourcesDesc(source, codebase, e, true, null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   555
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   556
            // JRE
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   557
            JREDesc jreDesc = new JREDesc(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   558
                version,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   559
                minheap,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   560
                maxheap,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   561
                vmargs,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   562
                cbs,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   563
                arch);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   564
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   565
            rdesc.addResource(jreDesc);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   566
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   567
            jnlpd.setIsJRESet(true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   568
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   569
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   570
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   571
    /** Extract data from the application-desc tag */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   572
    private static void buildApplicationDesc(final String source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   573
        XMLNode root, JNLPDesc jnlpd) throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   574
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   575
        String mainclass = XMLUtils.getClassName(source, root,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   576
                           "<application-desc>", "main-class", false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   577
        String appType = XMLUtils.getAttribute(root, "<application-desc>",
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   578
                                               "type", "Java");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   579
        String progressclass  = XMLUtils.getClassName(source, root,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   580
                                "<application-desc>", "progress-class", false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   581
        if (progressclass != null && !progressclass.isEmpty()) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   582
            Log.warning("JNLPConverter does not support progress indication. \"" + progressclass + "\" will not be loaded and will be ignored.");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   583
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   584
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   585
        if (!("Java".equalsIgnoreCase(appType) ||
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   586
            "JavaFx".equalsIgnoreCase(appType))) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   587
            throw new BadFieldException(source, XMLUtils.getPathString(root) +
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   588
                "<application-desc>type", appType);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   589
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   590
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   591
        if ("JavaFx".equalsIgnoreCase(appType)) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   592
            jnlpd.setIsFXApp(true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   593
        }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   594
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   595
        XMLUtils.visitElements(root, "<application-desc><argument>", new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   596
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   597
            public void visitElement(XMLNode e) throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   598
                String arg = XMLUtils.getElementContents(e, "", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   599
                if (arg == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   600
                    throw new BadFieldException(source, XMLUtils.getPathString(e), "");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   601
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   602
                jnlpd.addArguments(arg);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   603
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   604
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   605
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   606
        XMLUtils.visitElements(root, "<application-desc><param>",
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   607
            new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   608
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   609
            public void visitElement(XMLNode e) throws MissingFieldException,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   610
                BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   611
                String pn = XMLUtils.getRequiredAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   612
                            source, e, "", "name");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   613
                String pv = XMLUtils.getRequiredAttributeEmptyOK(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   614
                            source, e, "", "value");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   615
                jnlpd.setProperty(pn, pv);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   616
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   617
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   618
        jnlpd.setMainClass(mainclass, false);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   619
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   620
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   621
    /** Extract data from the javafx-desc tag */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   622
    private static void buildFXAppDesc(final String source,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   623
        XMLNode root, String element, JNLPDesc jnlpd)
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   624
             throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   625
        String mainclass = XMLUtils.getClassName(source, root, element,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   626
                                                 "main-class", true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   627
        String name = XMLUtils.getRequiredAttribute(source, root,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   628
                                        "<javafx-desc>", "name");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   629
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   630
        /* extract arguments */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   631
        XMLUtils.visitElements(root, "<javafx-desc><argument>", new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   632
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   633
            public void visitElement(XMLNode e) throws MissingFieldException, BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   634
                String arg = XMLUtils.getElementContents(e, "", null);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   635
                if (arg == null) {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   636
                    throw new BadFieldException(source, XMLUtils.getPathString(e), "");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   637
                }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   638
                jnlpd.addArguments(arg);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   639
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   640
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   641
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   642
        /* extract parameters */
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   643
        XMLUtils.visitElements(root, "<javafx-desc><param>",
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   644
            new XMLUtils.ElementVisitor() {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   645
            @Override
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   646
            public void visitElement(XMLNode e) throws MissingFieldException,
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   647
                BadFieldException {
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   648
                String pn = XMLUtils.getRequiredAttribute(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   649
                            source, e, "", "name");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   650
                String pv = XMLUtils.getRequiredAttributeEmptyOK(
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   651
                            source, e, "", "value");
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   652
                jnlpd.setProperty(pn, pv);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   653
            }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   654
        });
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   655
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   656
        jnlpd.setMainClass(mainclass, true);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   657
        jnlpd.setName(name);
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   658
    }
eaca4369b068 8198472: Add support for creating bundles from JNLP files
herrick
parents:
diff changeset
   659
}