org.apache.activemq.console.command.AbstractCommand Maven / Gradle / Ivy
/**
* 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.activemq.console.command;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.util.List;
import org.apache.activemq.ActiveMQConnectionMetaData;
import org.apache.activemq.console.CommandContext;
import org.apache.activemq.util.IntrospectionSupport;
public abstract class AbstractCommand implements Command {
public static final String COMMAND_OPTION_DELIMETER = ",";
private boolean isPrintHelp;
private boolean isPrintVersion;
protected CommandContext context;
public void setCommandContext(CommandContext context) {
this.context = context;
}
/**
* Execute a generic command, which includes parsing the options for the
* command and running the specific task.
*
* @param tokens - command arguments
* @throws Exception
*/
public void execute(List tokens) throws Exception {
// Parse the options specified by "-"
parseOptions(tokens);
// Print the help file of the task
if (isPrintHelp) {
printHelp();
// Print the AMQ version
} else if (isPrintVersion) {
context.printVersion(ActiveMQConnectionMetaData.PROVIDER_VERSION);
// Run the specified task
} else {
runTask(tokens);
}
}
/**
* Parse any option parameters in the command arguments specified by a '-'
* as the first character of the token.
*
* @param tokens - command arguments
* @throws Exception
*/
protected void parseOptions(List tokens) throws Exception {
while (!tokens.isEmpty()) {
String token = tokens.remove(0);
if (token.startsWith("-")) {
// Token is an option
handleOption(token, tokens);
} else {
// Push back to list of tokens
tokens.add(0, token);
return;
}
}
}
/**
* Handle the general options for each command, which includes -h, -?,
* --help, -D, --version.
*
* @param token - option token to handle
* @param tokens - succeeding command arguments
* @throws Exception
*/
protected void handleOption(String token, List tokens) throws Exception {
isPrintHelp = false;
isPrintVersion = false;
// If token is a help option
if (token.equals("-h") || token.equals("-?") || token.equals("--help")) {
isPrintHelp = true;
tokens.clear();
// If token is a version option
} else if (token.equals("--version")) {
isPrintVersion = true;
tokens.clear();
} else if (token.startsWith("-D")) {
// If token is a system property define option
String key = token.substring(2);
String value = "";
int pos = key.indexOf("=");
if (pos >= 0) {
value = key.substring(pos + 1);
key = key.substring(0, pos);
}
System.setProperty(key, value);
} else {
if (token.startsWith("--")) {
String prop = token.substring(2);
if (tokens.isEmpty() || tokens.get(0).startsWith("-")) {
context.print("Property '" + prop + "' is not specified!");
} else if (IntrospectionSupport.setProperty(this, prop, tokens.remove(0))) {
return;
}
}
// Token is unrecognized
context.printInfo("Unrecognized option: " + token);
isPrintHelp = true;
}
}
/**
* Run the specific task.
*
* @param tokens - command arguments
* @throws Exception
*/
protected abstract void runTask(List tokens) throws Exception;
/**
* Print the help messages for the specific task
*/
protected abstract void printHelp();
protected void printHelpFromFile() {
BufferedReader reader = null;
try {
InputStream is = getClass().getResourceAsStream(getName() + ".txt");
reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
context.print(line);
}
} catch (Exception e) {} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {}
}
}
}
protected void handleException(Exception exception, String serviceUrl) throws Exception {
Throwable cause = exception.getCause();
while (true) {
Throwable next = cause.getCause();
if (next == null) {
break;
}
cause = next;
}
if (cause instanceof ConnectException) {
context.printInfo("Broker not available at: " + serviceUrl);
} else {
context.printInfo("Failed to execute " + getName() + " task.");
throw exception;
}
}
}