/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.cli;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.TreeSet;
import org.tmatesoft.svn.cli.svn.SVNOption;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.util.SVNHashMap;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public abstract class AbstractSVNCommand {
private static final Comparator DEFAULT_COMMAND_COMPARATOR = new Comparator() {
public int compare(Object o1, Object o2) {
AbstractSVNCommand c1 = (AbstractSVNCommand) o1;
AbstractSVNCommand c2 = (AbstractSVNCommand) o2;
return c1.getName().compareTo(c2.getName());
}
};
private static Map ourCommands = new SVNHashMap();
private String myName;
private String[] myAliases;
private Collection myOptions;
private AbstractSVNCommandEnvironment myEnvironment;
private Collection myValidOptions;
private boolean myIsFailed;
public static void registerCommand(AbstractSVNCommand command) {
ourCommands.put(command.getName(), command);
for (int i = 0; i < command.getAliases().length; i++) {
ourCommands.put(command.getAliases()[i], command);
}
}
public static AbstractSVNCommand getCommand(String nameOrAlias) {
return (AbstractSVNCommand) ourCommands.get(nameOrAlias);
}
public static Iterator availableCommands(Comparator comparator) {
comparator = comparator == null ? DEFAULT_COMMAND_COMPARATOR : comparator;
TreeSet sortedList = new TreeSet(comparator);
sortedList.addAll(ourCommands.values());
return sortedList.iterator();
}
protected AbstractSVNCommand(String name, String[] aliases) {
myName = name;
myAliases = aliases == null ? new String[0] : aliases;
myOptions = createSupportedOptions();
if (myOptions == null) {
myOptions = new LinkedList();
}
myValidOptions = new LinkedList(myOptions);
myOptions.addAll(getGlobalOptions());
}
public boolean isFailed() {
return myIsFailed;
}
public void setFailed(boolean failed) {
myIsFailed = failed;
}
public abstract void run() throws SVNException;
protected abstract Collection createSupportedOptions();
protected abstract String getResourceBundleName();
public String getName() {
return myName;
}
public String[] getAliases() {
return myAliases;
}
public Collection getSupportedOptions() {
return myOptions;
}
public Collection getValidOptions() {
return myValidOptions;
}
public abstract Collection getGlobalOptions();
public void init(AbstractSVNCommandEnvironment env) {
myEnvironment = env;
}
protected AbstractSVNCommandEnvironment getEnvironment() {
return myEnvironment;
}
public String getDescription() {
ResourceBundle bundle = null;
try {
bundle = ResourceBundle.getBundle(getResourceBundleName());
} catch (MissingResourceException missing) {
missing.printStackTrace();
bundle = null;
}
if (bundle != null) {
try {
return bundle.getString(getName() + ".description");
} catch (MissingResourceException missing) {}
}
return MessageFormat.format("No description has been found for ''{0}'' command.", new Object[] {getName()});
}
public boolean isAlias(String alias) {
String[] aliases = getAliases();
for (int i = 0; i < aliases.length; i++) {
if (aliases[i].equals(alias)) {
return true;
}
}
return false;
}
public boolean isOptionSupported(AbstractSVNOption option) {
boolean supported = getSupportedOptions() != null && getSupportedOptions().contains(option);
if (!supported) {
return option == SVNOption.HELP || option == SVNOption.QUESTION;
}
return supported;
}
}