blob: da95ac352c98067662642a063927a5088722f0d3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class CommandLineOptionParser implements CommandLineOptionConstants {
//states
private static int STARTED = 0;
private static int NEW_OPTION = 1;
private static int SUB_PARAM_OF_OPTION = 2;
private Map commandLineOptions;
public CommandLineOptionParser(Map commandLineOptions) {
this.commandLineOptions = commandLineOptions;
}
public CommandLineOptionParser(String[] args) {
this.commandLineOptions = this.parse(args);
}
/**
* Return a list with <code>CommandLineOption</code> objects
*
* @param args
* @return CommandLineOption List
*/
private Map parse(String[] args) {
Map commandLineOptions = new HashMap();
if (0 == args.length) {
return commandLineOptions;
}
//State 0 means started
//State 1 means earlier one was a new -option
//State 2 means earlier one was a sub param of a -option
int state = STARTED;
ArrayList optionBundle = null;
String optionType = null;
CommandLineOption commandLineOption;
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("-")) {
if (STARTED == state) {
// fresh one
state = NEW_OPTION;
optionType = args[i];
} else if (SUB_PARAM_OF_OPTION == state || NEW_OPTION == state) {
// new one but old one should be saved
commandLineOption =
new CommandLineOption(optionType, optionBundle);
commandLineOptions.put(commandLineOption.getOptionType(),
commandLineOption);
state = NEW_OPTION;
optionType = args[i];
optionBundle = null;
}
} else {
if (STARTED == state) {
commandLineOption =
new CommandLineOption(
CommandLineOptionConstants.SOLE_INPUT,
args);
commandLineOptions.put(commandLineOption.getOptionType(),
commandLineOption);
return commandLineOptions;
} else if (NEW_OPTION == state) {
optionBundle = new ArrayList();
optionBundle.add(args[i]);
state = SUB_PARAM_OF_OPTION;
} else if (SUB_PARAM_OF_OPTION == state) {
optionBundle.add(args[i]);
}
}
}
commandLineOption = new CommandLineOption(optionType, optionBundle);
commandLineOptions.put(commandLineOption.getOptionType(), commandLineOption);
return commandLineOptions;
}
public Map getAllOptions() {
return this.commandLineOptions;
}
public List getInvalidOptions(OptionsValidator validator) {
List faultList = new ArrayList();
Iterator iterator = this.commandLineOptions.values().iterator();
while (iterator.hasNext()) {
CommandLineOption commandLineOption = ((CommandLineOption) (iterator.next()));
if (validator.isInvalid(commandLineOption)) {
faultList.add(commandLineOption);
}
}
return faultList;
}
}