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