Monday, September 12, 2005

Commons CLI

วันนี้เขียนโปรแกรม utility เล็กๆ ที่สามารถ run จาก command line ได้
ก็เลยมองหา api ที่ช่วย parse argument
Commons CLI ของ jakarta เป็น api ที่ช่วยในการ parse argument
โดยมีวิธีการใช้ดังนี้

  • ระบุ Options ที่โปรแกรมเรารับได้
    Options opt = new Options();
    opt.addOption("d", true, "extract only specific date");
    opt.addOption("w", true, "extract only week that contain given date");
    opt.addOption("m", true, "extract for specific month,year");

    parameter ตัวที่ 2 ที่เรา pass ให้ method addOption ก็คือ การระบุว่า
    option ตัวนี้ต้องมี argument ตามมาด้วยหรือไม่
    อย่างในตัวอย่างที่เขียนนี้ ผู้ใช้สามารถเรียกใช้โปรแกรมได้ดังนี้
    program -d yymmdd -w yymmdd -y yymm infile outfile

    กรณีที่เราต้องการให้เลือกเฉพาะ option ใด option หนึ่งเท่านั้น
    ก็สามารถเขียนได้ดังนี้
    Options opt = new Options();
    OptionGroup grp = new OptionGroup();

    grp.addOption(new Option("d", true, "extract only specific date"));
    grp.addOption(new Option("w", true, "extract only week that contain given date")
    );
    grp.addOption(new Option("m", true, "extract for specific month,year"));

    opt.addOptionGroup(grp);

    ก็คือเราเปลี่ยนไปใช้ Optiongroup ในการ control ไม่ให้มีการเลือก
    มากกว่า 1 choice พร้อมๆกัน

  • ทำการ parse String[] args โดยระบุ parser ซึ่งเลือกได้ 3 แบบคือ BasicParser, GnuParser, PosixParser
    PosixParser parser = new PosixParser();
    CommandLine cmdline = parser.parse(opt, args);


  • เลือกใช้งาน argument หรือ option ผ่านทาง method getOptionValue
    หรือ getArgs()
    CommandLine cmdline = parser.parse(opt, args);

    File inFile = new File(cmdline.getArgs()[0]);

    if (cmdline.hasOption("d")) {
    Calendar[] ranges = parseDate(cmdline.getOptionValue("d"));
    ...
    }
    if (cmdline.hasOption("w")) {
    filter.setWeek(parseWeek(cmdline.getOptionValue("w")));
    }

Related link from Roti

No comments: