/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2017 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.plugin.services.importexport;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.Parser;
import org.pentaho.platform.plugin.services.messages.Messages;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class CmdParser extends Parser {
private List<Object> tokens = new ArrayList<>();
private boolean eatTheRest;
private Option currentOption;
private Options options;
@Override
protected String[] flatten( Options options, String[] arguments, boolean stopAtNonOption ) {
init();
this.options = options;
// an iterator for the command line tokens
Iterator iter = Arrays.asList( arguments ).iterator();
// process each command line token
while ( iter.hasNext() ) {
// get the next command line token
String token = (String) iter.next();
// handle long option --foo or --foo=bar
if ( token.startsWith( "--" ) ) {
handleToken( options, stopAtNonOption, token );
} else if ( "-".equals( token ) ) { // single hyphen
tokens.add( token );
} else if ( token.startsWith( "-" ) ) {
if ( token.length() == 2 || options.hasOption( token ) ) {
processOptionToken( token, stopAtNonOption );
} else {
handleToken( options, stopAtNonOption, token );
}
} else {
processNonOptionToken( token, stopAtNonOption );
}
gobble( iter );
}
return (String[]) tokens.toArray( new String[ tokens.size() ] );
}
private void handleToken( Options options, boolean stopAtNonOption, String token ) {
int pos = token.indexOf( '=' );
String opt = pos == -1 ? token : token.substring( 0, pos ); // --foo
if ( !options.hasOption( opt ) ) {
processNonOptionToken( token, stopAtNonOption );
} else {
Option option = options.getOption( opt );
boolean isLongOptAndExists = opt.startsWith( "--" ) && option.getLongOpt().equals( opt.substring( 2, opt.length() ) );
boolean isShortOptAndExists = opt.startsWith( "-" ) && option.getOpt().equals( opt.substring( 1, opt.length() ) );
if ( isLongOptAndExists || isShortOptAndExists ) {
currentOption = option;
tokens.add( opt );
if ( pos != -1 ) {
tokens.add( token.substring( pos + 1 ) );
}
} else {
throw new IllegalArgumentException( Messages.getInstance().getErrorString(
"CommandLineProcessor.ERROR_0008_INVALID_PARAMETER", opt ) );
}
}
}
private void init() {
eatTheRest = false;
tokens.clear();
}
private void processNonOptionToken( String value, boolean stopAtNonOption ) {
if ( stopAtNonOption && ( currentOption == null || !currentOption.hasArg() ) ) {
eatTheRest = true;
tokens.add( "--" );
}
tokens.add( value );
}
private void processOptionToken( String token, boolean stopAtNonOption ) {
if ( stopAtNonOption && !options.hasOption( token ) ) {
eatTheRest = true;
}
if ( options.hasOption( token ) ) {
currentOption = options.getOption( token );
}
tokens.add( token );
}
private void gobble( Iterator iter ) {
if ( eatTheRest ) {
while ( iter.hasNext() ) {
tokens.add( iter.next() );
}
}
}
}