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.addModules.add(nextArg(args, i++)); 342 } else if (arg.startsWith(ADD_MODULES + "=")) { 343 deployParams.addModules.add(arg.replace(ADD_MODULES + "=", "")); 344 } else if (arg.equals(LIMIT_MODULES)) { 345 deployParams.limitModules.add(nextArg(args, i++)); 346 } else if (arg.startsWith(LIMIT_MODULES + "=")) { 347 deployParams.limitModules.add(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 }