/* * Copyright (c) 2010-2011 by Bjoern Kolbeck, * Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package de.mxro.thrd.xstreemfs.foundation.util; import java.util.LinkedList; import java.util.List; /** * * @author bjko */ public class CLOptionParser { private final String programName; private final List<CLOption> options; private final List<String> arguments; public CLOptionParser(String programName) { this.programName = programName; options = new LinkedList<CLOption>(); arguments = new LinkedList<String>(); } public CLOption addOption(CLOption option) { CLOption rv = option; for (CLOption tmp : options) { if (( (tmp.getName(true) == null) || tmp.getName(true).equals(option.getName(true)) ) && ( (tmp.getName(false) == null) || tmp.getName(false).equals(option.getName(false))) ) { rv = tmp; break; } } if (rv == option) options.add(option); return rv; } public void printUsage(String arguments) { System.out.println(programName+" [options] "+arguments); printOptionHelp(); System.out.println(""); } public void printOptionHelp() { for (CLOption option : options) { System.out.println("\t"+option.getHelp()); } } public void parse(String[] args) throws IllegalArgumentException { int position = 0; boolean nextIsValue = false; CLOption currentOption = null; while (position < args.length) { if (nextIsValue) { assert(currentOption != null); currentOption.parse(args[position]); currentOption = null; nextIsValue = false; } else { if (args[position].charAt(0) == '-') { boolean useShortName; String name; String value = null; if (args[position].charAt(1) == '-') { useShortName = false; name = args[position].substring(2); if (name.length() == 0) { throw new IllegalArgumentException("-- is not a valid option"); } int posEq = name.indexOf("="); if (posEq >= 0) { value = name.substring(posEq+1); name = name.substring(0, posEq); } } else { useShortName = true; name = args[position].substring(1); if (name.length() == 0) { throw new IllegalArgumentException("- is not a valid option"); } } boolean optFound = false; for (CLOption option : options) { final String optName = option.getName(useShortName); if ((optName != null) && optName.equals(name)) { if (option.requiresArgument()) { if (value == null) { currentOption = option; nextIsValue = true; } else { option.parse(value); } } else { option.parse(null); } optFound = true; break; } } if (!optFound) throw new IllegalArgumentException("'"+args[position]+"' is not a valid option"); } else { arguments.add(args[position]); } } position++; } if (nextIsValue) { throw new IllegalArgumentException("expected value for option '"+currentOption.getName()+"'"); } } public List<String> getArguments() { return this.arguments; } }