package javacodebook.misc.getopt;

import gnu.getopt.*;

/**
 * Auslesen von Übergabeparametern an eine Anwendung.
 * @author  Mark Donnermeyer
 */
public class GetOptTest {
    
    public static void main(String[] args) {
        
        // Option f mit optionalem Argument, o mit obligatorischen Argument sowie 
        // Optionen v und h (jeweils ohne Argument).
        String optStr = "vho::f:";

        // Die Optionen h, o und f gibt es auch in langer Form.
        LongOpt[] longopts = new LongOpt[3];
        longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
        longopts[1] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null, 'o'); 
        longopts[2] = new LongOpt("from", LongOpt.OPTIONAL_ARGUMENT, null, 'f'); 
        
        // Einen Parser für Optionen erzeugen. Als ersten Parameter erwartet
        // Getopt den Namen der Anwendung. 
        Getopt g = new Getopt("GetOptTest", args, optStr, longopts);
        
        String arg;
        int c;
        
        // Getopt soll keine eigenen Fehlerausgaben erzeugen. Darum kümmern wir 
        // uns selbst.
        g.setOpterr(false);
        
        // Die Liste der Optionen durchlaufen. Eine Option wird als int-Wert
        // zurückgegeben.
        while((c = g.getopt()) != -1) {
            switch(c) {
                // Option o (oder output) mit obligatorischem Argument
                case 'o':
                    arg = g.getOptarg();
                    System.out.println("Option o mit Argument: " + arg);
                    break;
                // Option f (oder from) mit optionalem Argument
                case 'f':
                    arg = g.getOptarg();
                    System.out.println("Option f (from) mit Argument: " + arg);
                    break;
                // Option v ohne Argument
                case 'v':
                    System.out.println("Option gefunden: " + (char)c);
                    break;
                // Option h (oder help) ohne Argument
                case 'h':
                    System.out.println("Option h (help) gefunden");
                    break;
                    // Unerlaubte Optionen werden über '?' referenziert. 
                    // getOptopt enthält die unerlaubte Option
                case '?':
                    char wrong = (char)g.getOptopt();
                    System.out.println("Ungültige Option: " + wrong);
            }
        }
    }
}
