nashorn/src/jdk/nashorn/internal/runtime/options/Options.java
author sundar
Mon, 27 May 2013 20:41:34 +0530
changeset 17776 59fb7b69846d
parent 17749 0f0fad887be7
child 19459 79e75274df99
permissions -rw-r--r--
8015352: "i".toUpperCase() => currently returns "İ", but should be "I" (with Turkish locale) Reviewed-by: jlaskey, lagergren
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime.options;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.io.PrintWriter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import java.security.AccessController;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.security.PrivilegedAction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import java.text.MessageFormat;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import java.util.ArrayList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import java.util.Collection;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.util.Collections;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.util.Enumeration;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import java.util.HashMap;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import java.util.LinkedList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import java.util.Locale;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import java.util.Map;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import java.util.MissingResourceException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import java.util.ResourceBundle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import java.util.StringTokenizer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import java.util.TimeZone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import java.util.TreeMap;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import java.util.TreeSet;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import jdk.nashorn.internal.runtime.Logging;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import jdk.nashorn.internal.runtime.QuotedStringTokenizer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
 * Manages global runtime options.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
public final class Options {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
    /** Resource tag. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
    private final String resource;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    /** Error writer. */
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    58
    private final PrintWriter err;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    /** File list. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    private final List<String> files;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    /** Arguments list */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    private final List<String> arguments;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    /** The options map of enabled options */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    private final TreeMap<String, Option<?>> options;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
16533
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
    69
    /** System property that can be used for command line option propagation */
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
    70
    private static final String NASHORN_ARGS_PROPERTY = "nashorn.args";
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
    71
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    /**
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    73
     * Constructor
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    74
     *
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    75
     * Options will use System.err as the output stream for any errors
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
     * @param resource resource prefix for options e.g. "nashorn"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
     */
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    79
    public Options(final String resource) {
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    80
        this(resource, new PrintWriter(System.err, true));
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    81
    }
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    82
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    83
    /**
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    84
     * Constructor
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    85
     *
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    86
     * @param resource resource prefix for options e.g. "nashorn"
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    87
     * @param err      error stream for reporting parse errors
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    88
     */
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    89
    public Options(final String resource, final PrintWriter err) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
        this.resource  = resource;
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
    91
        this.err       = err;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
        this.files     = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        this.arguments = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
        this.options   = new TreeMap<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
        // set all default values
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        for (final OptionTemplate t : Options.validOptions) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
            if (t.getDefaultValue() != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
                // populate from system properties
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
                final String v = getStringProperty(t.getKey(), null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
                if (v != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
                    set(t.getKey(), createOption(t, v));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
                } else if (t.getDefaultValue() != null) {
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   104
                    set(t.getKey(), createOption(t, t.getDefaultValue()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
                 }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
     * Get the resource for this Options set, e.g. "nashorn"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
     * @return the resource
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    public String getResource() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        return resource;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
        return options.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
     * Convenience function for getting system properties in a safe way
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
     * @param name of boolean property
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
     * @return true if set to true, false if unset or set to false
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
    public static boolean getBooleanProperty(final String name) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
        name.getClass(); // null check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
        if (!name.startsWith("nashorn.")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
            throw new IllegalArgumentException(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
        return AccessController.doPrivileged(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
                new PrivilegedAction<Boolean>() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
                    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
                    public Boolean run() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
                        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
                            final String property = System.getProperty(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
                            return property != null && !"false".equalsIgnoreCase(property);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
                        } catch (final SecurityException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
                            // if no permission to read, assume false
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
                            return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
                });
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
     * Convenience function for getting system properties in a safe way
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
     * @param name of string property
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     * @param defValue the default value if unset
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     * @return string property if set or default value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
    public static String getStringProperty(final String name, final String defValue) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
        name.getClass(); // null check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
        if (! name.startsWith("nashorn.")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
            throw new IllegalArgumentException(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
        return AccessController.doPrivileged(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
                new PrivilegedAction<String>() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
                    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
                    public String run() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
                        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
                            return System.getProperty(name, defValue);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
                        } catch (final SecurityException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
                            // if no permission to read, assume the default value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
                            return defValue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
                });
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
     * Convenience function for getting system properties in a safe way
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
     * @param name of integer property
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
     * @param defValue the default value if unset
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
     * @return integer property if set or default value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
    public static int getIntProperty(final String name, final int defValue) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
        name.getClass(); // null check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
        if (! name.startsWith("nashorn.")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
            throw new IllegalArgumentException(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
        return AccessController.doPrivileged(
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
                new PrivilegedAction<Integer>() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
                    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
                    public Integer run() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
                        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
                            return Integer.getInteger(name, defValue);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
                        } catch (final SecurityException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
                            // if no permission to read, assume the default value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
                            return defValue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
                });
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
     * Return an option given its resource key. If the key doesn't begin with
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16234
diff changeset
   206
     * {@literal <resource>}.option it will be completed using the resource from this
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     * instance
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
     * @param key key for option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
     * @return an option value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    public Option<?> get(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
        return options.get(key(key));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
     * Return an option as a boolean
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
     * @param key key for option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
     * @return an option value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
    public boolean getBoolean(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
        final Option<?> option = get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
        return option != null ? (Boolean)option.getValue() : false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
     * Return an option as a integer
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
     * @param key key for option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
     * @return an option value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
    public int getInteger(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
        final Option<?> option = get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
        return option != null ? (Integer)option.getValue() : 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
     * Return an option as a String
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
     * @param key key for option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
     * @return an option value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
    public String getString(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
        final Option<?> option = get(key);
17519
19c9d2553e35 8013871: mem usage histograms enabled with compiler logging level set to more specific than or equals to info when --print-mem-usage flag is used
lagergren
parents: 17257
diff changeset
   246
        if (option != null) {
17257
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   247
            final String value = (String)option.getValue();
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   248
            if(value != null) {
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   249
                return value.intern();
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   250
            }
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   251
        }
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 16533
diff changeset
   252
        return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
     * Set an option, overwriting an existing state if one exists
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
     * @param key    option key
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
     * @param option option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
    public void set(final String key, final Option<?> option) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
        options.put(key(key), option);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
     * Set an option as a boolean value, overwriting an existing state if one exists
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
     * @param key    option key
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
     * @param option option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
    public void set(final String key, final boolean option) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
        set(key, new Option<>(option));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
     * Set an option as a String value, overwriting an existing state if one exists
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
     * @param key    option key
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
     * @param option option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
    public void set(final String key, final String option) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
        set(key, new Option<>(option));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
     * Return the user arguments to the program, i.e. those trailing "--" after
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
     * the filename
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
     * @return a list of user arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
    public List<String> getArguments() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
        return Collections.unmodifiableList(this.arguments);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
     * Return the JavaScript files passed to the program
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
     * @return a list of files
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
    public List<String> getFiles() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
        return Collections.unmodifiableList(files);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
     * Return the option templates for all the valid option supported.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
     * @return a collection of OptionTemplate objects.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
    public static Collection<OptionTemplate> getValidOptions() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
        return Collections.unmodifiableCollection(validOptions);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
     * Make sure a key is fully qualified for table lookups
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
     * @param shortKey key for option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
     * @return fully qualified key
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
    private String key(final String shortKey) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
        String key = shortKey;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
        while (key.startsWith("-")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
            key = key.substring(1, key.length());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
        key = key.replace("-", ".");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
        final String keyPrefix = this.resource + ".option.";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
        if (key.startsWith(keyPrefix)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
            return key;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
        return keyPrefix + key;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
    static String getMsg(final String msgId, final String... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
            final String msg = Options.bundle.getString(msgId);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
            if (args.length == 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
                return msg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
            return new MessageFormat(msg).format(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
        } catch (final MissingResourceException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
            throw new IllegalArgumentException(e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
     * Display context sensitive help
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
     * @param e  exception that caused a parse error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
    public void displayHelp(final IllegalArgumentException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
        if (e instanceof IllegalOptionException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
            final OptionTemplate template = ((IllegalOptionException)e).getTemplate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
            if (template.isXHelp()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
                // display extended help information
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
                displayHelp(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
            } else {
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   356
                err.println(((IllegalOptionException)e).getTemplate());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
            return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
        if (e != null && e.getMessage() != null) {
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   362
            err.println(getMsg("option.error.invalid.option",
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
                    e.getMessage(),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
                    helpOptionTemplate.getShortName(),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
                    helpOptionTemplate.getName()));
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   366
            err.println();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
            return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
        displayHelp(false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
     * Display full help
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
     * @param extended show the extended help for all options, including undocumented ones
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    public void displayHelp(final boolean extended) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
        for (final OptionTemplate t : Options.validOptions) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
            if ((extended || !t.isUndocumented()) && t.getResource().equals(resource)) {
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   381
                err.println(t);
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16152
diff changeset
   382
                err.println();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
     * Processes the arguments and stores their information. Throws
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
     * IllegalArgumentException on error. The message can be analyzed by the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
     * displayHelp function to become more context sensitive
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   391
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   392
     * @param args arguments from command line
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
    public void process(final String[] args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
        final LinkedList<String> argList = new LinkedList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
        Collections.addAll(argList, args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
16533
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   398
    final String extra = getStringProperty(NASHORN_ARGS_PROPERTY, null);
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   399
    if (extra != null) {
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   400
        final StringTokenizer st = new StringTokenizer(extra);
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   401
        while (st.hasMoreTokens()) {
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   402
        argList.add(st.nextToken());
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   403
        }
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   404
    }
6ae708677f92 8010706: -Dnashorn.args system property to create command lines to wrapped nashorn.jar:s
lagergren
parents: 16272
diff changeset
   405
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
        while (!argList.isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
            final String arg = argList.remove(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
            // skip empty args
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
            if (arg.isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
            // user arguments to the script
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
            if ("--".equals(arg)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
                arguments.addAll(argList);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
                argList.clear();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
            // if it doesn't start with -, it's a file
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
            if (!arg.startsWith("-")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
                files.add(arg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
            if (arg.startsWith(definePropPrefix)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
                final String value = arg.substring(definePropPrefix.length());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
                final int eq = value.indexOf('=');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
                if (eq != -1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
                    // -Dfoo=bar Set System property "foo" with value "bar"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
                    System.setProperty(value.substring(0, eq), value.substring(eq + 1));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
                    // -Dfoo is fine. Set System property "foo" with "" as it's value
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16155
diff changeset
   435
                    if (!value.isEmpty()) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
                        System.setProperty(value, "");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   437
                    } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
                        // do not allow empty property name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
                        throw new IllegalOptionException(definePropTemplate);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
            // it is an argument,  it and assign key, value and template
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
            final ParsedArg parg = new ParsedArg(arg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
            // check if the value of this option is passed as next argument
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
            if (parg.template.isValueNextArg()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
                if (argList.isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
                    throw new IllegalOptionException(parg.template);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
                parg.value = argList.remove(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
            // -h [args...]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
            if (parg.template.isHelp()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
                // check if someone wants help on an explicit arg
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
                if (!argList.isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
                    try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
                        final OptionTemplate t = new ParsedArg(argList.get(0)).template;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
                        throw new IllegalOptionException(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
                    } catch (final IllegalArgumentException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
                        throw e;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
                throw new IllegalArgumentException(); // show help for
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
                // everything
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
            if (parg.template.isXHelp()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
                throw new IllegalOptionException(parg.template);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
            set(parg.template.getKey(), createOption(parg.template, parg.value));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
            // Arg may have a dependency to set other args, e.g.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
            // scripting->anon.functions
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
            if (parg.template.getDependency() != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
                argList.addFirst(parg.template.getDependency());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   485
    private static OptionTemplate getOptionTemplate(final String key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
        for (final OptionTemplate t : Options.validOptions) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
            if (t.matches(key)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
                return t;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
        return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
    private static Option<?> createOption(final OptionTemplate t, final String value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
        switch (t.getType()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
        case "string":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
            // default value null
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
            return new Option<>(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
        case "timezone":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
            // default value "TimeZone.getDefault()"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
            return new Option<>(TimeZone.getTimeZone(value));
17776
59fb7b69846d 8015352: "i".toUpperCase() => currently returns "İ", but should be "I" (with Turkish locale)
sundar
parents: 17749
diff changeset
   502
        case "locale":
59fb7b69846d 8015352: "i".toUpperCase() => currently returns "İ", but should be "I" (with Turkish locale)
sundar
parents: 17749
diff changeset
   503
            return new Option<>(Locale.forLanguageTag(value));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
        case "keyvalues":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
            return new KeyValueOption(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
        case "log":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
            final KeyValueOption kv = new KeyValueOption(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
            Logging.initialize(kv.getValues());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
            return kv;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
        case "boolean":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
            return new Option<>(value != null && Boolean.parseBoolean(value));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
        case "integer":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
            try {
16152
ea430b83d74d 8005789: Forgot to document -Dnashorn.unstable.relink.threshold
lagergren
parents: 16151
diff changeset
   514
                return new Option<>((value == null) ? 0 : Integer.parseInt(value));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
            } catch (final NumberFormatException nfe) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
                throw new IllegalOptionException(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
        case "properties":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
            //swallow the properties and set them
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
            initProps(new KeyValueOption(value));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
        throw new IllegalArgumentException(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
    private static void initProps(final KeyValueOption kv) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
        for (final Map.Entry<String, String> entry : kv.getValues().entrySet()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
            System.setProperty(entry.getKey(), entry.getValue());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
     * Resource name for properties file
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
    private static final String MESSAGES_RESOURCE = "jdk.nashorn.internal.runtime.resources.Options";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
     * Resource bundle for properties file
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
    private static ResourceBundle bundle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
     * Usages per resource from properties file
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
    private static HashMap<Object, Object> usage;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
     * Valid options from templates in properties files
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
    private static Collection<OptionTemplate> validOptions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
     * Help option
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
    private static OptionTemplate helpOptionTemplate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
     * Define property option template.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
    private static OptionTemplate definePropTemplate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   564
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
     * Prefix of "define property" option.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
    private static String definePropPrefix;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
    static {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
        // Without do privileged, under security manager messages can not be
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
        // loaded.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
        Options.bundle = AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
            @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
            public ResourceBundle run() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
                return ResourceBundle.getBundle(Options.MESSAGES_RESOURCE, Locale.getDefault());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
        });
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
        Options.validOptions = new TreeSet<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
        Options.usage        = new HashMap<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
        for (final Enumeration<String> keys = Options.bundle.getKeys(); keys.hasMoreElements(); ) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
            final String key = keys.nextElement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
            final StringTokenizer st = new StringTokenizer(key, ".");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
            String resource = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
            String type = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
            if (st.countTokens() > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
                resource = st.nextToken(); // e.g. "nashorn"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
            if (st.countTokens() > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
                type = st.nextToken(); // e.g. "option"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
            if ("option".equals(type)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
                String helpKey = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
                String xhelpKey = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
                String definePropKey = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
                try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
                    helpKey = Options.bundle.getString(resource + ".options.help.key");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
                    xhelpKey = Options.bundle.getString(resource + ".options.xhelp.key");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
                    definePropKey = Options.bundle.getString(resource + ".options.D.key");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
                } catch (final MissingResourceException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
                    //ignored: no help
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
                final boolean        isHelp = key.equals(helpKey);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   608
                final boolean        isXHelp = key.equals(xhelpKey);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
                final OptionTemplate t      = new OptionTemplate(resource, key, Options.bundle.getString(key), isHelp, isXHelp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
                Options.validOptions.add(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
                if (isHelp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
                    helpOptionTemplate = t;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
                if (key.equals(definePropKey)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
                    definePropPrefix = t.getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
                    definePropTemplate = t;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
            } else if (resource != null && "options".equals(type)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
                Options.usage.put(resource, Options.bundle.getObject(key));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
    @SuppressWarnings("serial")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
    private static class IllegalOptionException extends IllegalArgumentException {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
        private final OptionTemplate template;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
        IllegalOptionException(final OptionTemplate t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
            super();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
            this.template = t;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
        OptionTemplate getTemplate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   636
            return this.template;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
     * This is a resolved argument of the form key=value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
    private static class ParsedArg {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
        /** The resolved option template this argument corresponds to */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
        OptionTemplate template;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
        /** The value of the argument */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
        String value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
        ParsedArg(final String argument) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
            final QuotedStringTokenizer st = new QuotedStringTokenizer(argument, "=");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
            if (!st.hasMoreTokens()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
                throw new IllegalArgumentException();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
            final String token = st.nextToken();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
            this.template = Options.getOptionTemplate(token);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
            if (this.template == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
                throw new IllegalArgumentException(argument);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
            value = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
            if (st.hasMoreTokens()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
                while (st.hasMoreTokens()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
                    value += st.nextToken();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
                    if (st.hasMoreTokens()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
                        value += ':';
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
            } else if ("boolean".equals(this.template.getType())) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
                value = "true";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
}