blob: a913257e71aceb693c9ebb1efaeab1e010153c2c [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.directory.server.tools;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.cli.AlreadySelectedException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.MissingArgumentException;
import org.apache.commons.cli.MissingOptionException;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.cli.UnrecognizedOptionException;
/**
* The primary command base class.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
public class BaseCommand
{
private Map commands = new HashMap();
private List commandsOrdered = new ArrayList();
private Options global = new Options();
private String productCommand;
private String productVersion;
private String productDisplayName;
private String productUrl;
private String productBanner;
public BaseCommand()
{
init();
}
protected void init()
{
ToolCommand command;
command = new DiagnosticCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new DisconnectNotificationCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new DumpCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new CapacityTestCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new GracefulShutdownCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new ImportCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
command = new IndexCommand();
commands.put( command.getName(), command );
commandsOrdered.add( command.getName() );
Option op = new Option( "i", "install-path", true, "path to installation directory" );
getGlobal().addOption( op );
op = new Option( "b", "banner", false, "suppress banner print outs" );
getGlobal().addOption( op );
op = new Option( "d", "debug", false, "toggle debug mode" );
getGlobal().addOption( op );
op = new Option( "v", "verbose", false, "toggle verbose debugging" );
getGlobal().addOption( op );
op = new Option( "q", "quiet", false, "keep the noise down to a minimum" );
getGlobal().addOption( op );
op = new Option( "c", "configuration", false, "force loading the server.xml (requires -i)" );
getGlobal().addOption( op );
op = new Option( "version", false, "print the version information and exit" );
getGlobal().addOption( op );
}
public static boolean hasBannerOption( String[] args )
{
for ( int ii = 0; ii < args.length; ii++ )
{
if ( args[ii].equals( "-b" ) || args[ii].equals( "-banner" ) )
{
return true;
}
}
return false;
}
public CommandLine getCommandLine( String command, String[] args )
{
Options all = allOptions( command );
CommandLineParser parser = new PosixParser();
CommandLine cmdline = null;
try
{
cmdline = parser.parse( all, args );
}
catch ( AlreadySelectedException ase )
{
System.err.println( "Command line parsing failed for " + command + ". Reason: already selected "
+ ase.getMessage() );
System.exit( 1 );
}
catch ( MissingArgumentException mae )
{
System.err.println( "Command line parsing failed for " + command + ". Reason: missing argument "
+ mae.getMessage() );
System.exit( 1 );
}
catch ( MissingOptionException moe )
{
System.err.println( "Command line parsing failed for " + command + ". Reason: missing option "
+ moe.getMessage() );
System.exit( 1 );
}
catch ( UnrecognizedOptionException uoe )
{
System.err.println( "Command line parsing failed for " + command + ". Reason: unrecognized option"
+ uoe.getMessage() );
System.exit( 1 );
}
catch ( ParseException pe )
{
System.err.println( "Command line parsing failed for " + command + ". Reason: " + pe.getClass() );
System.exit( 1 );
}
return cmdline;
}
public Options allOptions( String command )
{
if ( command.equals( "help" ) )
{
return getGlobal();
}
Options all = new Options();
ToolCommand cmd = ( ToolCommand ) getCommands().get( command );
for ( Iterator ii = getGlobal().getOptions().iterator(); ii.hasNext(); )
{
all.addOption( ( Option ) ii.next() );
}
for ( Iterator ii = cmd.getOptions().getOptions().iterator(); ii.hasNext(); )
{
all.addOption( ( Option ) ii.next() );
}
return all;
}
public static void dumpArgs( String msg, String[] args )
{
if ( args.length == 0 )
{
System.out.println( msg );
System.out.println( "\t NONE" );
return;
}
StringBuffer buf = new StringBuffer();
buf.append( msg ).append( "\n" );
for ( int ii = 0; ii < args.length; ii++ )
{
buf.append( "\targs[" + ii + "] = " ).append( args[ii] ).append( "\n" );
}
System.out.println( buf );
}
public void helpOnCommand( String command )
{
if ( command.equals( "help" ) )
{
printUsage();
System.exit( 0 );
}
if ( getCommands().containsKey( command ) )
{
ToolCommand cmd = ( ToolCommand ) getCommands().get( command );
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( getProductCommand() + " " + cmd + " [options]", cmd.getOptions() );
}
else
{
System.err.println( command + ": unknown command" );
System.exit( 1 );
}
}
public void printUsage()
{
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( getProductCommand() + " <command> [options]", "\nGlobal options:", getGlobal(),
"\nType \"" + getProductCommand() + " help <command>\" for help on a command." );
System.out.println( "\nAvailable commands:" );
Iterator it = commandsOrdered.iterator();
System.out.println( "\thelp" );
while ( it.hasNext() )
{
System.out.println( "\t" + it.next() );
}
System.out.println( "\nThese tools are used to manage " + getProductDisplayName() + "." );
System.out.println( "For additional information, see " + getProductUrl() );
}
static final String BANNER = " _ _ ____ ____ _____ _ \n"
+ " / \\ _ __ __ _ ___| |__ ___| _ \\/ ___| |_ _|__ ___ | |___ \n"
+ " / _ \\ | '_ \\ / _` |/ __| '_ \\ / _ \\ | | \\___ \\ | |/ _ \\ / _ \\| / __| \n"
+ " / ___ \\| |_) | (_| | (__| | | | __/ |_| |___) | | | (_) | (_) | \\__ \\ \n"
+ " /_/ \\_\\ .__/ \\__,_|\\___|_| |_|\\___|____/|____/ |_|\\___/ \\___/|_|___/ \n"
+ " |_| \n";
public void printBanner()
{
System.out.println( getProductBanner() );
}
public void setProductCommand( String productCommand )
{
this.productCommand = productCommand;
}
public String getProductCommand()
{
return productCommand;
}
public void setProductVersion( String productVersion )
{
this.productVersion = productVersion;
}
public String getProductVersion()
{
return productVersion;
}
public void setProductDisplayName( String productDisplayName )
{
this.productDisplayName = productDisplayName;
}
public String getProductDisplayName()
{
return productDisplayName;
}
public void setProductUrl( String productUrl )
{
this.productUrl = productUrl;
}
public String getProductUrl()
{
return productUrl;
}
public void setProductBanner( String productBanner )
{
this.productBanner = productBanner;
}
public String getProductBanner()
{
return productBanner;
}
public void setCommands( Map commands )
{
this.commands = commands;
}
public Map getCommands()
{
return commands;
}
public void setGlobal( Options global )
{
this.global = global;
}
public Options getGlobal()
{
return global;
}
}