/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed 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.axis.utils ;
/**
* General purpose command line options parser.
* If this is used outside of Axis just remove the Axis specific sections.
*
* @author Doug Davis (dug@us.ibm.com)
*/
import org.apache.axis.components.logger.LogFactory;
import org.apache.commons.logging.Log;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Vector;
public class Options {
protected static Log log =
LogFactory.getLog(Options.class.getName());
String args[] = null ;
Vector usedArgs = null ;
URL defaultURL = null ;
//////////////////////////////////////////////////////////////////////////
// SOASS (Start of Axis Specific Stuff)
// EOASS
//////////////////////////////////////////////////////////////////////////
/**
* Constructor - just pass in the <b>args</b> from the command line.
*/
public Options(String _args[]) throws MalformedURLException {
if (_args == null) {
_args = new String [] {};
}
args = _args ;
usedArgs = null ;
defaultURL = new URL("http://localhost:8080/axis/servlet/AxisServlet");
///////////////////////////////////////////////////////////////////////
// SOASS
/* Process these well known options first */
/******************************************/
try {
getURL();
} catch( MalformedURLException e ) {
log.error( Messages.getMessage("cantDoURL00") );
throw e ;
}
getUser();
getPassword();
// EOASS
///////////////////////////////////////////////////////////////////////
}
public void setDefaultURL(String url) throws MalformedURLException {
defaultURL = new URL(url);
}
public void setDefaultURL(URL url) {
defaultURL = url ;
}
/**
* Returns an int specifying the number of times that the flag was
* specified on the command line. Once this flag is looked for you
* must save the result because if you call it again for the same
* flag you'll get zero.
*/
public int isFlagSet(char optChar) {
int value = 0 ;
int loop ;
int i ;
for ( loop = 0 ; usedArgs != null && loop < usedArgs.size() ; loop++ ) {
String arg = (String) usedArgs.elementAt(loop);
if ( arg.charAt(0) != '-' ) continue ;
for ( i = 0 ; i < arg.length() ; i++ )
if ( arg.charAt(i) == optChar ) value++ ;
}
for ( loop = 0 ; loop < args.length ; loop++ ) {
if ( args[loop] == null || args[loop].length() == 0 ) continue ;
if ( args[loop].charAt(0) != '-' ) continue ;
while (args[loop] != null &&
(i = args[loop].indexOf(optChar)) != -1) {
args[loop] = args[loop].substring(0, i) + args[loop].substring(i+1) ;
if ( args[loop].length() == 1 )
args[loop] = null ;
value++ ;
if ( usedArgs == null ) usedArgs = new Vector();
usedArgs.add( "-" + optChar );
}
}
return( value );
}
/**
* Returns a string (or null) specifying the value for the passed
* option. If the option isn't there then null is returned. The
* option's value can be specified one of two ways:
* -x value
* -xvalue
* Note that: -ax value
* is not value (meaning flag 'a' followed by option 'x'.
* Options with values must be the first char after the '-'.
* If the option is specified more than once then the last one wins.
*/
public String isValueSet(char optChar) {
String value = null ;
int loop ;
int i ;
for ( loop = 0 ; usedArgs != null && loop < usedArgs.size() ; loop++ ) {
String arg = (String) usedArgs.elementAt(loop);
if ( arg.charAt(0) != '-' || arg.charAt(1) != optChar )
continue ;
value = arg.substring(2);
if ( loop+1 < usedArgs.size() )
value = (String) usedArgs.elementAt(++loop);
}
for ( loop = 0 ; loop < args.length ; loop++ ) {
if ( args[loop] == null || args[loop].length() == 0 ) continue ;
if ( args[loop].charAt(0) != '-' ) continue ;
i = args[loop].indexOf( optChar );
if ( i != 1 ) continue ;
if ( i != args[loop].length()-1 ) {
// Not at end of arg, so use rest of arg as value
value = args[loop].substring(i+1) ;
args[loop] = args[loop].substring(0, i);
}
else {
// Remove the char from the current arg
args[loop] = args[loop].substring(0, i);
// Nothing after char so use next arg
if ( loop+1 < args.length && args[loop+1] != null ) {
// Next arg is there and non-null
if ( args[loop+1].charAt(0) != '-' ) {
value = args[loop+1];
args[loop+1] = null ;
}
}
else {
// Next is null or not there - do nothing
// value = null ;
}
}
if ( args[loop].length() == 1 )
args[loop] = null ;
// For now, keep looping to get that last on there
// break ;
}
if ( value != null ) {
if ( usedArgs == null ) usedArgs = new Vector();
usedArgs.add( "-" + optChar );
if ( value.length() > 0 ) usedArgs.add( value );
}
return( value );
}
/**
* This just returns a string with the unprocessed flags - mainly
* for error reporting - so you can report the unknown flags.
*/
public String getRemainingFlags() {
StringBuffer sb = null ;
int loop ;
for ( loop = 0 ; loop < args.length ; loop++ ) {
if ( args[loop] == null || args[loop].length() == 0 ) continue ;
if ( args[loop].charAt(0) != '-' ) continue ;
if ( sb == null ) sb = new StringBuffer();
sb.append( args[loop].substring(1) );
}
return( sb == null ? null : sb.toString() );
}
/**
* This returns an array of unused args - these are the non-option
* args from the command line.
*/
public String[] getRemainingArgs() {
ArrayList al = null ;
int loop ;
for ( loop = 0 ; loop < args.length ; loop++ ) {
if ( args[loop] == null || args[loop].length() == 0 ) continue ;
if ( args[loop].charAt(0) == '-' ) continue ;
if ( al == null ) al = new ArrayList();
al.add( (String) args[loop] );
}
if ( al == null ) return( null );
String a[] = new String[ al.size() ];
for ( loop = 0 ; loop < al.size() ; loop++ )
a[loop] = (String) al.get(loop);
return( a );
}
//////////////////////////////////////////////////////////////////////////
// SOASS
public String getURL() throws MalformedURLException {
String tmp ;
String host = null ; // -h also -l (url)
String port = null ; // -p
String servlet = null ; // -s also -f (file)
String protocol = null ;
URL url = null ;
// Just in case...
org.apache.axis.client.Call.initialize();
if ( (tmp = isValueSet( 'l' )) != null ) {
url = new URL( tmp );
host = url.getHost();
port = "" + url.getPort();
servlet = url.getFile();
protocol = url.getProtocol();
}
if ( (tmp = isValueSet( 'f' )) != null ) {
host = "";
port = "-1";
servlet = tmp;
protocol = "file";
}
tmp = isValueSet( 'h' ); if ( host == null ) host = tmp ;
tmp = isValueSet( 'p' ); if ( port == null ) port = tmp ;
tmp = isValueSet( 's' ); if ( servlet == null ) servlet = tmp ;
if ( host == null ) host = defaultURL.getHost();
if ( port == null ) port = "" + defaultURL.getPort();
if ( servlet == null ) servlet = defaultURL.getFile();
else
if ( servlet.length()>0 && servlet.charAt(0)!='/' )
servlet = "/" + servlet ;
if (url == null) {
if (protocol == null) protocol = defaultURL.getProtocol();
tmp = protocol + "://" + host ;
if ( port != null && !port.equals("-1")) tmp += ":" + port ;
if ( servlet != null ) tmp += servlet ;
} else tmp = url.toString();
log.debug( Messages.getMessage("return02", "getURL", tmp) );
return( tmp );
}
public String getHost() {
try {
URL url = new URL(getURL());
return( url.getHost() );
}
catch( Exception exp ) {
return( "localhost" );
}
}
public int getPort() {
try {
URL url = new URL(getURL());
return( url.getPort() );
}
catch( Exception exp ) {
return( -1 );
}
}
public String getUser() {
return( isValueSet('u') );
}
public String getPassword() {
return( isValueSet('w') );
}
// EOASS
//////////////////////////////////////////////////////////////////////////
}
|