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