package org.neo4j.helpers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Parses a String[] argument from a main-method. It expects values to be either
* key/value pairs or just "orphan" values (w/o a key associated).
* <p>
* A key is defined with one or more dashes in the beginning, for example:
*
* <pre>
* '-path'
* '--path'
* </pre>
*
* A key/value pair can be either one single String from the array where there's
* a '=' delimiter between the key and value, like so:
*
* <pre>
* '--path=/my/path/to/something'
* </pre>
* ...or consist of two (consecutive) strings from the array, like so:
* <pre>
* '-path' '/my/path/to/something'
* </pre>
*/
public class Args
{
private final String[] args;
private final Map<String, String> map = new HashMap<String, String>();
private final List<String> orphans = new ArrayList<String>();
public Args( String[] args )
{
this.args = args;
parseArgs( args );
}
public String[] source()
{
return this.args;
}
public Map<String, String> asMap()
{
return new HashMap<String, String>( this.map );
}
public boolean has( String key )
{
return this.map.containsKey( key );
}
public String get( String key, String defaultValue )
{
return this.map.containsKey( key ) ? this.map.get( key ) : defaultValue;
}
public Number getNumber( String key, Number defaultValue )
{
String value = this.map.get( key );
return value != null ? Double.parseDouble( value ) : defaultValue;
}
public Boolean getBoolean( String key, Boolean defaultValue )
{
String value = this.map.get( key );
return value != null ? Boolean.parseBoolean( value ) : defaultValue;
}
public List<String> orphans()
{
return new ArrayList<String>( this.orphans );
}
private static boolean isOption( String arg )
{
return arg.startsWith( "-" );
}
private static String stripOption( String arg )
{
while ( arg.length() > 0 && arg.charAt( 0 ) == '-' )
{
arg = arg.substring( 1 );
}
return arg;
}
private void parseArgs( String[] args )
{
for ( int i = 0; i < args.length; i++ )
{
String arg = args[ i ];
if ( isOption( arg ) )
{
arg = stripOption( arg );
int equalIndex = arg.indexOf( '=' );
if ( equalIndex != -1 )
{
String key = arg.substring( 0, equalIndex );
String value = arg.substring( equalIndex + 1 );
if ( value.length() > 0 )
{
map.put( key, value );
}
}
else
{
String key = arg;
int nextIndex = ++i;
String value = nextIndex < args.length ?
args[ nextIndex ] : null;
value = value == null || isOption( value ) ? null : value;
map.put( key, value );
}
}
else
{
orphans.add( arg );
}
}
}
}