command.line/java/com/jetbrains/teamcity/command/CommandRunner.java (184 lines of code) (raw):
package com.jetbrains.teamcity.command;
import com.jetbrains.teamcity.*;
import com.jetbrains.teamcity.resources.ICredential;
import com.jetbrains.teamcity.resources.TCAccess;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import jetbrains.buildServer.IncompatiblePluginError;
import jetbrains.buildServer.core.runtime.IProgressMonitor;
import jetbrains.buildServer.core.runtime.IProgressStatus;
import jetbrains.buildServer.core.runtime.ProgressStatus;
import jetbrains.buildServer.core.runtime.RuntimeUtil;
import jetbrains.buildServer.serverSide.crypt.EncryptUtil;
public class CommandRunner {
// private static Logger LOGGER = Logger.getLogger(CommandRunner.class) ;
static final String USER_ARG = Messages.getString("CommandRunner.global.runtime.param.user"); //$NON-NLS-1$
static final String PASSWORD_ARG = Messages.getString("CommandRunner.global.runtime.param.password"); //$NON-NLS-1$
static final String HOST_ARG = Messages.getString("CommandRunner.global.runtime.param.host"); //$NON-NLS-1$
private static final Comparator<ICredential> ourCredentialComaparator = new Comparator<ICredential>() {
public int compare(ICredential o1, ICredential o2) {
if (o1.getCreationTimestamp() > o2.getCreationTimestamp()) {
return -1;
} else if (o1.getCreationTimestamp() < o2.getCreationTimestamp()) {
return 1;
}
return 0;
}
};
static {
Args.registerArgument(USER_ARG, String.format(".*%s\\s+[^\\s].*", USER_ARG)); //$NON-NLS-1$
Args.registerArgument(PASSWORD_ARG, String.format(".*%s\\s+[^\\s].*", PASSWORD_ARG)); //$NON-NLS-1$
Args.registerArgument(HOST_ARG, String.format(".*%s\\s+https*://.+", HOST_ARG)); //$NON-NLS-1$
}
void run(final String[] args) throws Exception {
final Args arguments = new Args(args);
/**
* instantiate Debug and set mode according to command line
*/
final Debug debug = Debug.getInstance();
debug.setDebug(arguments.isDebugOn());
//wrap Console to reduce stdout in silent mode
final IProgressMonitor consoleMonitor = RuntimeUtil.CONSOLE_MONITOR;
final IProgressMonitor monitor = new IProgressMonitor() {
public void status(IProgressStatus status) {
if (!arguments.isSilentOn()) {
consoleMonitor.status(status);
}
}
public boolean isCancelled() {
return consoleMonitor.isCancelled();
}
public void done() {
if (!arguments.isSilentOn()) {
consoleMonitor.done();
}
}
public void cancel() {
consoleMonitor.cancel();
}
public void beginTask(String taskName) {
if (!arguments.isSilentOn()) {
consoleMonitor.beginTask(taskName);
}
}
};
final ICommand command = CommandRegistry.getInstance().getCommand(arguments.getCommandId());
if (command != null) {
try {
command.validate(arguments);
if (command.isConnectionRequired(arguments)) {
Server server = null;
try {
server = openConnection(arguments, monitor);
command.execute(server, arguments, monitor);
}
finally {
if (server != null) {
server.dispose();
}
}
}
else {
command.execute(null, arguments, monitor);
}
// print success result
reportResult(command);
} catch (Throwable e) {
// print error result
monitor.status(new ProgressStatus(IProgressStatus.ERROR, String.format(Messages.getString("CommandRunner.monitor.error.found"), command.getId())));
reportError(command, e);
System.exit(-1);
}
} else {
final ICommand helpCommand = CommandRegistry.getInstance().getCommand(Help.ID);
helpCommand.execute(null, arguments, monitor);
reportResult(helpCommand);
}
}
public static void main(final String[] args) throws Exception {
new CommandRunner().run(args);
System.exit(0);
}
private static void reportError(final ICommand command, final Throwable e) {
Debug.getInstance().error(CommandRunner.class, e.getMessage(), e);
final String rootMessage = Util.getRootCause(e).getMessage();
if (e instanceof UnknownHostException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.unknown.host.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof URISyntaxException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.invalid.url.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof MalformedURLException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.invalid.url.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof EAuthorizationException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.invalid.credential.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof ECommunicationException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.could.not.connect.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof ERemoteError) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.businesslogic.error.pattern"), rootMessage)); //$NON-NLS-1$
} else if (e instanceof IncompatiblePluginError) {
System.err.println(rootMessage); //$NON-NLS-1$
} else if (e instanceof IllegalArgumentException) {
System.err.println(MessageFormat.format(Messages.getString("CommandRunner.invalid.command.arguments.error.pattern"), rootMessage)); //$NON-NLS-1$
System.err.println();
System.err.println(command.getUsageDescription());
} else {
e.printStackTrace();
}
}
private static void reportResult(ICommand command) {
if (command.getResultDescription() != null && command.getResultDescription().trim().length() != 0) {
System.out.println(command.getResultDescription());
}
}
static Server openConnection(final Args args, final IProgressMonitor monitor) throws MalformedURLException, ECommunicationException, EAuthorizationException {
final String host = getHost(args);
if (host != null) {
String user;
String password;
if (args.hasArgument(USER_ARG, PASSWORD_ARG)) {
user = args.getArgument(USER_ARG);
password = args.getArgument(PASSWORD_ARG);
} else {
// try to load from saved
final ICredential credential = TCAccess.getInstance().findCredential(host);
if (credential != null) {
user = credential.getUser();
try {
password = EncryptUtil.unscramble(credential.getPassword());
} catch (Throwable t) {
// the EncryptUtil raises exception if decoding string was not
// scrambled
password = credential.getPassword();
}
} else {
throw new IllegalArgumentException(MessageFormat.format(Messages.getString("CommandRunner.not.logged.in.error.pattern"), host)); //$NON-NLS-1$
}
}
final Server server = new Server(new URL(host));
monitor.beginTask(MessageFormat.format(Messages.getString("CommandRunner.connecting.step.name"), host)); //$NON-NLS-1$
server.connect();
monitor.done();
monitor.beginTask(Messages.getString("CommandRunner.logging.step.name")); //$NON-NLS-1$
server.logon(user, password);
monitor.done();
return server;
} else {
throw new IllegalArgumentException(MessageFormat.format(Messages.getString("CommandRunner.no.default.host.error.pattern"), HOST_ARG)); //$NON-NLS-1$
}
}
static String getHost(final Args args) {
// load default(any) if omitted
if (!args.hasArgument(HOST_ARG)) {
return getDefaultHost();
} else {
return args.getArgument(HOST_ARG);
}
}
static String getDefaultHost() {
final Collection<ICredential> credentials = TCAccess.getInstance().credentials();
if (!credentials.isEmpty()) {
// sort by creation TS. the newest will be used as default
final ArrayList<ICredential> ordered = new ArrayList<ICredential>(credentials);
Collections.sort(ordered, ourCredentialComaparator);
final ICredential defaultCredential = ordered.iterator().next();
Debug.getInstance().debug(CommandRunner.class, MessageFormat.format("Using \"{0}\" as Default TeamCity Server", defaultCredential.getServer())); //$NON-NLS-1$
return defaultCredential.getServer();
}
Debug.getInstance().debug(CommandRunner.class, "No Default TeamCity Server found"); //$NON-NLS-1$
return null;
}
}