1 /*
   2  * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.javafx.tools.packager;
  27 
  28 import com.oracle.tools.packager.*;
  29 import com.oracle.tools.packager.ConfigException;
  30 import com.oracle.tools.packager.UnsupportedPlatformException;
  31 import com.sun.javafx.tools.packager.bundlers.Bundler.BundleType;
  32 
  33 import java.io.File;
  34 import java.io.FileInputStream;
  35 import java.io.IOException;
  36 import java.text.MessageFormat;
  37 import java.util.*;
  38 
  39 import jdk.packager.internal.JLinkBundlerHelper;
  40 
  41 
  42 public class Main {
  43 
  44     private static final ResourceBundle bundle =
  45             ResourceBundle.getBundle("com/sun/javafx/tools/packager/Bundle");
  46 
  47     private static final String version = bundle.getString("MSG_Version")
  48             + " " + PackagerLib.JAVAFX_VERSION + "\n";
  49     private static final String help = bundle.getString("MSG_Help_1")
  50                                         + bundle.getString("MSG_Help_2")
  51                                         + bundle.getString("MSG_Help_3")
  52                                         + bundle.getString("MSG_Help_4")
  53                                         + bundle.getString("MSG_Help_5")
  54                                         + bundle.getString("MSG_Help_6")
  55                                         + bundle.getString("MSG_Help_7");
  56 
  57     private static String nextArg(String args[], int i) {
  58         return (i == args.length - 1) ? "" : args[i + 1];
  59     }
  60 
  61     private static boolean verbose = false;
  62     private static boolean packageAsJar = false;
  63     private static boolean genJNLP = false;
  64     private static boolean genPackages = false;
  65     private static boolean css2Bin = false;
  66     private static boolean signJar = false;
  67     private static boolean makeAll = false;
  68 
  69     private static void addResources(CommonParams commonParams,
  70                                      String baseDir, String s) {
  71         if (s == null || "".equals(s)) {
  72             return;
  73         }
  74 
  75         String ls = ".";
  76 
  77         if (s != null) {
  78             ls = s;
  79         }
  80 
  81         String[] pathArray = ls.split(File.pathSeparator);
  82 
  83         File lbaseDir = null;
  84 
  85         if (baseDir != null) {
  86             lbaseDir = new File(baseDir);
  87         }
  88 
  89         for (final String path: pathArray) {
  90             commonParams.addResource(lbaseDir, path);
  91         }
  92     }
  93 
  94     private static void addArgument(DeployParams deployParams, String argument) {
  95         if (deployParams.arguments != null) {
  96             deployParams.arguments.add(argument);
  97         } else {
  98             List<String> list = new LinkedList<>();
  99             list.add(argument);
 100             deployParams.setArguments(list);
 101         }
 102     }
 103 
 104     private static void addArgument(CreateJarParams deployParams, String argument) {
 105         if (deployParams.arguments != null) {
 106             deployParams.arguments.add(argument);
 107         } else {
 108             List<String> list = new LinkedList<>();
 109             list.add(argument);
 110             deployParams.setArguments(list);
 111         }
 112     }
 113 
 114     private static Map<String, String> createAttrMap(String arg) {
 115         Map<String, String> map = new HashMap<>();
 116         if (arg == null || "".equals(arg)) {
 117             return null;
 118         }
 119         String[] pairsArray = arg.split(",");
 120         for (String pair: pairsArray) {
 121             String[] attr = pair.split("=");
 122             map.put(attr[0].trim(), attr[1].trim());
 123         }
 124         return map;
 125     }
 126 
 127     private static List<Param> parseParams(String filename) throws IOException {
 128         File paramFile = new File(filename);
 129         Properties properties = new Properties();
 130         FileInputStream in = new FileInputStream(paramFile);
 131         properties.load(in);
 132         in.close();
 133 
 134         List<Param> parameters = new ArrayList<>(properties.size());
 135 
 136         for (Map.Entry en : properties.entrySet()) {
 137             Param p = new Param();
 138             p.setName((String)en.getKey());
 139             p.setValue((String)en.getValue());
 140             parameters.add(p);
 141         }
 142         return parameters;
 143     }
 144 
 145     private static List<HtmlParam> parseHtmlParams(String filename) throws IOException {
 146         File paramFile = new File(filename);
 147         Properties properties = new Properties();
 148         FileInputStream in = new FileInputStream(paramFile);
 149         properties.load(in);
 150         in.close();
 151 
 152         List<HtmlParam> parameters = new ArrayList<>(properties.size());
 153 
 154         for (Map.Entry en : properties.entrySet()) {
 155             HtmlParam p = new HtmlParam();
 156             p.setName((String)en.getKey());
 157             p.setValue((String)en.getValue());
 158             parameters.add(p);
 159         }
 160         return parameters;
 161     }
 162 
 163     private static List<JSCallback> parseCallbacks(String param) {
 164         String[] callbacks = param.split(",");
 165         List<JSCallback> list = new ArrayList<>(callbacks.length);
 166 
 167         for (String cb: callbacks) {
 168             String[] nameCmd = cb.split(":");
 169             if (nameCmd.length == 2) {
 170                 list.add(new JSCallback(nameCmd[0], nameCmd[1]));
 171             }
 172         }
 173         return list;
 174     }
 175 
 176 
 177     @SuppressWarnings("deprecation")
 178     public static void main(String... args) throws Exception {
 179         if (args.length == 0 || args.length == 1 && args[0].equals("-help")) {
 180             System.out.println(help);
 181         } else if (args.length == 1 && args[0].equals("-version")) {
 182             System.out.println(version);
 183         } else {
 184             PackagerLib packager = new PackagerLib();
 185             CreateJarParams createJarParams = new CreateJarParams();
 186             DeployParams deployParams = new DeployParams();
 187             CreateBSSParams createBssParams = new CreateBSSParams();
 188             SignJarParams signJarParams = new SignJarParams();
 189             MakeAllParams makeAllParams = new MakeAllParams();
 190             String srcdir = null;
 191             String srcfiles = null;
 192 
 193             try {
 194                 if (args[0].equalsIgnoreCase("-createjar")) {
 195                     for (int i = 1; i < args.length; i++) {
 196                         String arg = args[i];
 197                         if (arg.equalsIgnoreCase("-appclass")) {
 198                             createJarParams.setApplicationClass(nextArg(args, i++));
 199                         } else if (arg.equalsIgnoreCase("-preloader")) {
 200                             createJarParams.setPreloader(nextArg(args, i++));
 201                         } else if (arg.equalsIgnoreCase("-classpath")) {
 202                             createJarParams.setClasspath(nextArg(args, i++));
 203                         } else if (arg.equalsIgnoreCase("-manifestAttrs")) {
 204                             createJarParams.setManifestAttrs(createAttrMap(nextArg(args, i++)));
 205                         } else if (arg.equalsIgnoreCase("-noembedlauncher")) {
 206                             System.err.println("-noembedlauncher is deprecated");
 207                         } else if (arg.equalsIgnoreCase("-nocss2bin")) {
 208                             createJarParams.setCss2bin(false);
 209                         } else if (arg.equalsIgnoreCase("-runtimeVersion")) {
 210                             createJarParams.setFxVersion(nextArg(args, i++));
 211                             System.err.println("-runtimeVersion is deprecated");
 212                         } else if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 213                             createJarParams.setVerbose(true);
 214                             verbose = true;
 215                         } else if (arg.equalsIgnoreCase("-outdir")) {
 216                             createJarParams.setOutdir(new File(nextArg(args, i++)));
 217                         } else if (arg.equalsIgnoreCase("-outfile")) {
 218                             createJarParams.setOutfile(nextArg(args, i++));
 219                         } else if (arg.equalsIgnoreCase("-" + StandardBundlerParam.SOURCE_DIR.getID())) {
 220                             srcdir = nextArg(args, i++);
 221                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 222                             srcfiles = nextArg(args, i++);
 223                         } else if (arg.equalsIgnoreCase("-argument")) {
 224                             addArgument(createJarParams, nextArg(args, i++));
 225                         }  else if (arg.equalsIgnoreCase("-paramFile")) {
 226                             createJarParams.setParams(parseParams(nextArg(args, i++)));
 227                         } else {
 228                             throw new PackagerException("ERR_UnknownArgument", arg);
 229                         }
 230                     }
 231 
 232                     addResources(createJarParams, srcdir, srcfiles);
 233                     packageAsJar = true;
 234                 } else if (args[0].equalsIgnoreCase("-deploy")) {
 235                     File templateInFile = null;
 236                     File templateOutFile = null;
 237                     deployParams.setBundleType(BundleType.JNLP);
 238                     deployParams.setTargetFormat("jnlp");
 239 
 240 
 241                     //can only set it to true with command line, reset default
 242                     deployParams.setEmbedJNLP(false);
 243                     for (int i = 1; i < args.length; i++) {
 244                         String arg = args[i];
 245                         if (arg.startsWith("-B")) {
 246                             String key;
 247                             String value;
 248 
 249                             int keyStart = 2;
 250                             int equals = arg.indexOf("=");
 251                             int len = arg.length();
 252                             if (equals < keyStart) {
 253                                 if (keyStart < len) {
 254                                     key = arg.substring(keyStart, len);
 255                                     value = Boolean.TRUE.toString();
 256                                 } else {
 257                                     continue;
 258                                 }
 259                             } else if (keyStart < equals) {
 260                                 key = arg.substring(keyStart, equals);
 261                                 value = arg.substring(equals+1, len);
 262                             } else {
 263                                 continue;
 264                             }
 265                             deployParams.addBundleArgument(key, value);
 266                         } else if (arg.equalsIgnoreCase("-title")) {
 267                             deployParams.setTitle(nextArg(args, i++));
 268                         } else if (arg.equalsIgnoreCase("-vendor")) {
 269                             deployParams.setVendor(nextArg(args, i++));
 270                         } else if (arg.equalsIgnoreCase("-native")) {
 271                             BundleType type = BundleType.NONE;
 272                             String format = null; //null means ANY
 273                             if (i+1 < args.length && !args[i+1].startsWith("-")) {
 274                                 String v = args[++i];
 275                                 com.sun.javafx.tools.packager.bundlers.Bundler.Bundle bundle =
 276                                         com.sun.javafx.tools.packager.bundlers.Bundler.stringToBundle(v);
 277                                 type = bundle.type;
 278                                 format = bundle.format;
 279                             }
 280                             deployParams.setBundleType(type);
 281                             deployParams.setTargetFormat(format);
 282                         } else if (arg.equalsIgnoreCase("-description")) {
 283                             deployParams.setDescription(nextArg(args, i++));
 284                         } else if(arg.equalsIgnoreCase("-appclass")) {
 285                             deployParams.setApplicationClass(nextArg(args, i++));
 286                         } else if(arg.equalsIgnoreCase("-daemon")) {
 287                             deployParams.setServiceHint(true);
 288                         } else if(arg.equalsIgnoreCase("-installdirChooser")) {
 289                             deployParams.setInstalldirChooser(true);
 290                         } else if (arg.equalsIgnoreCase("-preloader")) {
 291                             deployParams.setPreloader(nextArg(args, i++));
 292                         } else if (arg.equalsIgnoreCase("-paramFile")) {
 293                             deployParams.setParams(parseParams(nextArg(args, i++)));
 294                         } else if (arg.equalsIgnoreCase("-htmlParamFile")) {
 295                             deployParams.setHtmlParams(parseHtmlParams(nextArg(args, i++)));
 296                         } else if (arg.equalsIgnoreCase("-width")) {
 297                             deployParams.setWidth(Integer.parseInt(nextArg(args, i++)));
 298                         } else if (arg.equalsIgnoreCase("-height")) {
 299                             deployParams.setHeight(Integer.parseInt(nextArg(args, i++)));
 300                         } else if (arg.equalsIgnoreCase("-name")) {
 301                             deployParams.setAppName(nextArg(args, i++));
 302                         } else if (arg.equalsIgnoreCase("-embedJNLP")) {
 303                             deployParams.setEmbedJNLP(true);
 304                         } else if (arg.equalsIgnoreCase("-embedCertificates")) {
 305                             System.err.println("-embedCertificates is deprecated");
 306                         } else if (arg.equalsIgnoreCase("-allpermissions")) {
 307                             deployParams.setAllPermissions(true);
 308                         } else if (arg.equalsIgnoreCase("-updatemode")) {
 309                             deployParams.setUpdateMode(nextArg(args, i++));
 310                         } else if (arg.equalsIgnoreCase("-isExtension")) {
 311                             deployParams.setExtension(true);
 312                         } else if (arg.equalsIgnoreCase("-callbacks")) {
 313                             deployParams.setJSCallbacks(parseCallbacks(nextArg(args, i++)));
 314                         } else if (arg.equalsIgnoreCase("-templateInFilename")) {
 315                             templateInFile = new File(nextArg(args, i++));
 316                         } else if (arg.equalsIgnoreCase("-templateOutFilename")) {
 317                             templateOutFile = new File(nextArg(args, i++));
 318                         } else if (arg.equalsIgnoreCase("-appId") || arg.equalsIgnoreCase("-templateId")) {
 319                             String appIdArg = nextArg(args, i++);
 320                             deployParams.setAppId(appIdArg);
 321                             deployParams.setId(appIdArg);
 322                         } else if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 323                             deployParams.setVerbose(true);
 324                             verbose = true;
 325                         } else if (arg.equalsIgnoreCase("-includedt")) {
 326                             deployParams.setIncludeDT(true);
 327                         } else if (arg.equalsIgnoreCase("-outdir")) {
 328                             deployParams.setOutdir(new File(nextArg(args, i++)));
 329                         } else if (arg.equalsIgnoreCase("-outfile")) {
 330                             deployParams.setOutfile(nextArg(args, i++));
 331                         } else if (arg.equalsIgnoreCase("-" + StandardBundlerParam.SOURCE_DIR.getID())) {
 332                             srcdir = nextArg(args, i++);
 333                             deployParams.srcdir = srcdir;
 334                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 335                             srcfiles = nextArg(args, i++);
 336                         } else if (arg.equalsIgnoreCase("-argument")) {
 337                             addArgument(deployParams, nextArg(args, i++));
 338                         } else if (arg.equalsIgnoreCase("-nosign")) {
 339                             deployParams.setSignBundle(false);
 340                         } else if (arg.equals(ADD_MODULES)) {
 341                             deployParams.addAddModule(nextArg(args, i++));
 342                         } else if (arg.startsWith(ADD_MODULES + "=")) {
 343                             deployParams.addAddModule(arg.replace(ADD_MODULES + "=", ""));
 344                         } else if (arg.equals(LIMIT_MODULES)) {
 345                             deployParams.addLimitModule(nextArg(args, i++));
 346                         } else if (arg.startsWith(LIMIT_MODULES + "=")) {
 347                             deployParams.addLimitModule(arg.replace(LIMIT_MODULES + "=", ""));
 348                         } else if (arg.equals(STRIP_NATIVE_COMMANDS)) {
 349                             deployParams.setStripNativeCommands(Boolean.valueOf(nextArg(args, i++)));
 350                         } else if (arg.equals(STRIP_NATIVE_COMMANDS + "=")) {
 351                             deployParams.setStripNativeCommands(Boolean.valueOf(arg.replace(STRIP_NATIVE_COMMANDS + "=", "")));
 352                         } else if (arg.equals(DETECT_MODULES)) {
 353                             deployParams.setDetectModules(true);
 354                         } else if (arg.equals(MODULE_PATH) || arg.equals(P)) {
 355                             deployParams.modulePath = nextArg(args, i++);
 356                         } else if (arg.equals(MODULE_PATH + "=")) {
 357                             deployParams.modulePath = arg.replace(MODULE_PATH + "=", "");
 358                         } else if (arg.equals(MODULE) || arg.equals(M)) {
 359                             deployParams.setModule(nextArg(args, i++));
 360                         } else if (arg.equals(MODULE + "=")) {
 361                             deployParams.setModule(arg.replace(MODULE + "=", ""));
 362                         } else if (arg.startsWith(J_XDEBUG)) {
 363                             deployParams.setDebug(arg.replace(J_XDEBUG, ""));
 364                         } else {
 365                             throw new PackagerException("ERR_UnknownArgument", arg);
 366                         }
 367                     }
 368                     if (templateInFile != null) {
 369                         deployParams.addTemplate(templateInFile, templateOutFile);
 370                     }
 371 
 372                     if (deployParams.validateForJNLP()) {
 373                         genJNLP = true;
 374                     }
 375 
 376                     if (deployParams.validateForBundle()) {
 377                         genPackages = true;
 378                     }
 379 
 380                     addResources(deployParams, srcdir, srcfiles);
 381                 } else if (args[0].equalsIgnoreCase("-createbss")) {
 382                     for (int i = 1; i < args.length; i++) {
 383                         String arg = args[i];
 384                         if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 385                             createBssParams.setVerbose(true);
 386                             verbose = true;
 387                         } else if (arg.equalsIgnoreCase("-outdir")) {
 388                             createBssParams.setOutdir(new File(nextArg(args, i++)));
 389                         } else if (arg.equalsIgnoreCase("-srcdir")) {
 390                             srcdir = nextArg(args, i++);
 391                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 392                             srcfiles = nextArg(args, i++);
 393                         } else {
 394                             throw new PackagerException("ERR_UnknownArgument", arg);
 395                         }
 396                     }
 397 
 398                     addResources(createBssParams, srcdir, srcfiles);
 399                     css2Bin = true;
 400                 } else if (args[0].equalsIgnoreCase("-signJar")) {
 401                     for (int i = 1; i < args.length; i++) {
 402                         String arg = args[i];
 403                         if (arg.equalsIgnoreCase("-keyStore")) {
 404                             signJarParams.setKeyStore(new File(nextArg(args, i++)));
 405                         } else if(arg.equalsIgnoreCase("-alias")) {
 406                             signJarParams.setAlias(nextArg(args, i++));
 407                         } else if(arg.equalsIgnoreCase("-storePass")) {
 408                             signJarParams.setStorePass(nextArg(args, i++));
 409                         } else if(arg.equalsIgnoreCase("-keyPass")) {
 410                             signJarParams.setKeyPass(nextArg(args, i++));
 411                         } else if(arg.equalsIgnoreCase("-storeType")) {
 412                             signJarParams.setStoreType(nextArg(args, i++));
 413                         } else if(arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 414                             signJarParams.setVerbose(true);
 415                             verbose = true;
 416                         } else if (arg.equalsIgnoreCase("-outdir")) {
 417                             signJarParams.setOutdir(new File(nextArg(args, i++)));
 418                         } else if (arg.equalsIgnoreCase("-srcdir")) {
 419                             srcdir = nextArg(args, i++);
 420                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 421                             srcfiles = nextArg(args, i++);
 422                         } else {
 423                             throw new PackagerException("ERR_UnknownArgument", arg);
 424                         }
 425                     }
 426 
 427                     addResources(signJarParams, srcdir, srcfiles);
 428                     signJar = true;
 429                 } else if (args[0].equalsIgnoreCase("-makeall")) {
 430                     System.err.println("-makeall is deprecated");
 431                     for (int i = 1; i < args.length; i++) {
 432                         String arg = args[i];
 433                         if (arg.equalsIgnoreCase("-appclass")) {
 434                             makeAllParams.setAppClass(nextArg(args, i++));
 435                         } else if (arg.equalsIgnoreCase("-preloader")) {
 436                             makeAllParams.setPreloader(nextArg(args, i++));
 437                         } else if (arg.equalsIgnoreCase("-classpath")) {
 438                             makeAllParams.setClasspath(nextArg(args, i++));
 439                         } else if (arg.equalsIgnoreCase("-name")) {
 440                             makeAllParams.setAppName(nextArg(args, i++));
 441                         } else if(arg.equalsIgnoreCase("-width")) {
 442                             makeAllParams.setWidth(Integer.parseInt(nextArg(args, i++)));
 443                         } else if(arg.equalsIgnoreCase("-height")) {
 444                             makeAllParams.setHeight(Integer.parseInt(nextArg(args, i++)));
 445                         } else if(arg.equalsIgnoreCase("-v")) {
 446                             makeAllParams.setVerbose(true);
 447                         } else {
 448                             throw new PackagerException("ERR_UnknownArgument", arg);
 449                         }
 450                     }
 451                     makeAll = true;
 452                 } else if (args[0].equalsIgnoreCase("-help")) {
 453                     showBundlerHelp(args[1], args.length > 2 && "-verbose".equals(args[2]));
 454                 } else {
 455                     System.err.println(MessageFormat.format(
 456                                         bundle.getString("ERR_UnknownCommand"),
 457                                         args[0]));
 458                     System.exit(-1);
 459                 }
 460 
 461                 //set default logger
 462                 if (verbose) {
 463                     com.oracle.tools.packager.Log.setLogger(new com.oracle.tools.packager.Log.Logger(true));
 464                 } else {
 465                     com.oracle.tools.packager.Log.setLogger(new com.oracle.tools.packager.Log.Logger(false));
 466                 }
 467 
 468                 if (css2Bin) {
 469                     createBssParams.validate();
 470                     packager.generateBSS(createBssParams);
 471                 }
 472                 if (packageAsJar) {
 473                     createJarParams.validate();
 474                     packager.packageAsJar(createJarParams);
 475                 }
 476                 if (genJNLP) {
 477                     deployParams.setBundleType(BundleType.JNLP);
 478                     deployParams.validate();
 479                     packager.generateDeploymentPackages(deployParams);
 480                 }
 481                 if (genPackages) {
 482                     deployParams.setBundleType(BundleType.NATIVE);
 483                     deployParams.validate();
 484                     packager.generateDeploymentPackages(deployParams);
 485                 }
 486                 if (signJar) {
 487                     signJarParams.validate();
 488                     if (signJarParams.storePass == null) {
 489                         char[] passwd = System.console().readPassword(bundle.getString("MSG_EnterKeystorePassword"));
 490                         if (passwd == null) {
 491                             signJarParams.storePass = "";
 492                         } else {
 493                             signJarParams.storePass = new String(passwd);
 494                         }
 495                     }
 496                     if (signJarParams.keyPass == null) {
 497                         char[] passwd = System.console().readPassword(bundle.getString("MSG_EnterKeyPassword"), signJarParams.alias);
 498                         if (passwd == null) {
 499                             signJarParams.keyPass = "";
 500                         } else {
 501                             signJarParams.keyPass = new String(passwd);
 502                         }
 503                     }
 504                     packager.signJar(signJarParams);
 505                 }
 506                 if (makeAll) {
 507                     makeAllParams.validate();
 508                     packager.makeAll(makeAllParams);
 509                 }
 510 
 511             } catch (Exception e) {
 512                 if (verbose) {
 513                     throw e;
 514                 } else {
 515                     System.err.println(e.getMessage());
 516                     if (e.getCause() != null && e.getCause() != e) {
 517                         System.err.println(e.getCause().getMessage());
 518                     }
 519                     System.exit(-1);
 520                 }
 521             }
 522         }
 523     }
 524 
 525     private static final String MODULE = "--" + StandardBundlerParam.MODULE.getID();
 526     private static final String M = "-m";
 527     private static final String MODULE_PATH = "--" + StandardBundlerParam.MODULE_PATH.getID();
 528     private static final String P = "-p";
 529     private static final String ADD_MODULES = "--" + StandardBundlerParam.ADD_MODULES.getID();
 530     private static final String LIMIT_MODULES = "--" + StandardBundlerParam.LIMIT_MODULES.getID();
 531     private static final String STRIP_NATIVE_COMMANDS = "--" + StandardBundlerParam.STRIP_NATIVE_COMMANDS.getID();
 532 
 533     private static final String J_XDEBUG = JLinkBundlerHelper.DEBUG.getID() + ":";
 534     private static final String DETECT_MODULES = "--" + JLinkBundlerHelper.DETECT_MODULES.getID();
 535 
 536     public static void showBundlerHelp(String bundlerName, boolean verbose) {
 537         //TODO I18N
 538         if ("bundlers".equals(bundlerName)) {
 539             // enumerate bundlers
 540             System.out.println("Known Bundlers -- \n");
 541             for (Bundler bundler : Bundlers.createBundlersInstance().getBundlers()) {
 542                 try {
 543                     bundler.validate(new HashMap<>());
 544                 } catch (UnsupportedPlatformException upe) {
 545                     // don't list bundlers this platform cannot run
 546                     continue;
 547                 } catch (ConfigException ignore) {
 548                     // but requiring more than an empty map is perfectly fine.
 549                 //} catch (RuntimeException re) {
 550                 //    re.printStackTrace();
 551                 }
 552 
 553                 if (verbose) {
 554                     System.out.printf(
 555                             "%s - %s - %s\n\t%s\n",
 556                             bundler.getID(),
 557                             bundler.getName(),
 558                             bundler.getBundleType(),
 559                             bundler.getDescription()
 560                     );
 561                 } else {
 562                     System.out.printf(
 563                             "%s - %s - %s\n",
 564                             bundler.getID(),
 565                             bundler.getName(),
 566                             bundler.getBundleType()
 567                     );
 568                 }
 569             }
 570         } else {
 571             // enumerate parameters for a bundler
 572             for (Bundler bundler : Bundlers.createBundlersInstance().getBundlers()) {
 573                 if (bundler.getID().equals(bundlerName)) {
 574                     System.out.printf("Bundler Parameters for %s (%s) --\n", bundler.getName(), bundler.getID());
 575                     for (BundlerParamInfo bpi : bundler.getBundleParameters()) {
 576                         if (bpi.getStringConverter() == null) continue;
 577                         if (verbose) {
 578                             System.out.printf(
 579                                     "%s - %s - %s\n\t%s\n",
 580                                     bpi.getID(),
 581                                     bpi.getName(),
 582                                     bpi.getValueType().getSimpleName(),
 583                                     bpi.getDescription()
 584                             );
 585                         } else {
 586                             System.out.printf(
 587                                     "%s - %s - %s\n",
 588                                     bpi.getID(),
 589                                     bpi.getName(),
 590                                     bpi.getValueType().getSimpleName()
 591                             );
 592                         }
 593                     }
 594                     return;
 595                 }
 596             }
 597             System.out.printf("Sorry, no bundler matching the id %s was found.\n", bundlerName);
 598         }
 599     }
 600 }