/*
 * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.java.util.jar.pack;

import java.util.ListResourceBundle;

public class DriverResource extends ListResourceBundle {

    public static final String VERSION = "VERSION";
    public static final String BAD_ARGUMENT = "BAD_ARGUMENT";
    public static final String BAD_OPTION = "BAD_OPTION";
    public static final String BAD_REPACK_OUTPUT = "BAD_REPACK_OUTPUT";
    public static final String DETECTED_ZIP_COMMENT = "DETECTED_ZIP_COMMENT";
    public static final String SKIP_FOR_REPACKED = "SKIP_FOR_REPACKED";
    public static final String WRITE_PACK_FILE = "WRITE_PACK_FILE";
    public static final String WRITE_PACKGZ_FILE = "WRITE_PACKGZ_FILE";
    public static final String SKIP_FOR_MOVE_FAILED = "SKIP_FOR_MOVE_FAILED";
    public static final String PACK_HELP = "PACK_HELP";
    public static final String UNPACK_HELP = "UNPACK_HELP";
    public static final String MORE_INFO = "MORE_INFO";
    public static final String DUPLICATE_OPTION = "DUPLICATE_OPTION";
    public static final String BAD_SPEC = "BAD_SPEC";

    /*
     * The following are the output of 'pack200' and 'unpack200' commands.
     * Do not translate command arguments and words with a prefix of '-' or '--'.
     */
    private static final Object[][] resource = {
        {VERSION, "{0} version {1}"}, // parameter 0:class name;parameter 1: version value
        {BAD_ARGUMENT, "Bad argument: {0}"},
        {BAD_OPTION, "Bad option: {0}={1}"}, // parameter 0:option name;parameter 1:option value
        {BAD_REPACK_OUTPUT, "Bad --repack output: {0}"}, // parameter 0:filename
        {DETECTED_ZIP_COMMENT, "Detected ZIP comment: {0}"}, // parameter 0:comment
        {SKIP_FOR_REPACKED, "Skipping because already repacked: {0}"}, // parameter 0:filename
        {WRITE_PACK_FILE, "To write a *.pack file, specify --no-gzip: {0}"}, // parameter 0:filename
        {WRITE_PACKGZ_FILE, "To write a *.pack.gz file, specify --gzip: {0}"}, // parameter 0:filename
        {SKIP_FOR_MOVE_FAILED, "Skipping unpack because move failed: {0}"}, // parameter 0:filename
        {PACK_HELP, new String[] {
                "Usage:  pack200 [-opt... | --option=value]... x.pack[.gz] y.jar",
                "",
                "Packing Options",
                "  -r, --repack                    repack or normalize a jar, suitable for ",
                "                                  signing with jarsigner",
                "  -g, --no-gzip                   output a plain pack file, suitable to be",
                "                                  compressed with a file compression utility",
                "  --gzip                          (default) post compress the pack output",
                "                                  with gzip",
                "  -G, --strip-debug               remove debugging attributes (SourceFile,",
                "                                  LineNumberTable, LocalVariableTable",
                "                                  and LocalVariableTypeTable) while packing",
                "  -O, --no-keep-file-order        do not transmit file ordering information",
                "  --keep-file-order               (default) preserve input file ordering",
                "  -S{N}, --segment-limit={N}      limit segment sizes (default unlimited)",
                "  -E{N}, --effort={N}             packing effort (default N=5)",
                "  -H{h}, --deflate-hint={h}       transmit deflate hint: true, false,",
                "                                  or keep (default)",
                "  -m{V}, --modification-time={V}  transmit modtimes: latest or keep (default)",
                "  -P{F}, --pass-file={F}          transmit the given input element(s) unchanged",
                "  -U{a}, --unknown-attribute={a}  unknown attribute action: error, strip,",
                "                                  or pass (default)",
                "  -C{N}={L}, --class-attribute={N}={L}  (user-defined attribute)",
                "  -F{N}={L}, --field-attribute={N}={L}  (user-defined attribute)",
                "  -M{N}={L}, --method-attribute={N}={L} (user-defined attribute)",
                "  -D{N}={L}, --code-attribute={N}={L}   (user-defined attribute)",
                "  -f{F}, --config-file={F}        read file F for Pack200.Packer properties",
                "  -v, --verbose                   increase program verbosity",
                "  -q, --quiet                     set verbosity to lowest level",
                "  -l{F}, --log-file={F}           output to the given log file, ",
                "                                  or '-' for System.out",
                "  -?, -h, --help                  print this message",
                "  -V, --version                   print program version",
                "  -J{X}                           pass option X to underlying Java VM",
                "",
                "Notes:",
                "  The -P, -C, -F, -M, and -D options accumulate.",
                "  Example attribute definition:  -C SourceFile=RUH .",
                "  Config. file properties are defined by the Pack200 API.",
                "  For meaning of -S, -E, -H-, -m, -U values, see Pack200 API.",
                "  Layout definitions (like RUH) are defined by JSR 200.",
                "",
                "Repacking mode updates the JAR file with a pack/unpack cycle:",
                "    pack200 [-r|--repack] [-opt | --option=value]... [repackedy.jar] y.jar\n",
                "",
                "Exit Status:",
                "  0 if successful, >0 if an error occurred"
            }
        },
        {UNPACK_HELP, new String[] {
                "Usage:  unpack200 [-opt... | --option=value]... x.pack[.gz] y.jar\n",
                "",
                "Unpacking Options",
                "  -H{h}, --deflate-hint={h}     override transmitted deflate hint:",
                "                                true, false, or keep (default)",
                "  -r, --remove-pack-file        remove input file after unpacking",
                "  -v, --verbose                 increase program verbosity",
                "  -q, --quiet                   set verbosity to lowest level",
                "  -l{F}, --log-file={F}         output to the given log file, or",
                "                                '-' for System.out",
                "  -?, -h, --help                print this message",
                "  -V, --version                 print program version",
                "  -J{X}                         pass option X to underlying Java VM"
            }
        },
        {MORE_INFO, "(For more information, run {0} --help .)"}, // parameter 0:command name
        {DUPLICATE_OPTION, "duplicate option: {0}"}, // parameter 0:option
        {BAD_SPEC, "bad spec for {0}: {1}"}, // parameter 0:option;parameter 1:specifier
    };

    protected Object[][] getContents() {
        return resource;
    }
}
