package com.camptocamp.owsproxy;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import com.camptocamp.owsproxy.ConnectionEvent.ConnectionStatus;
import com.camptocamp.owsproxy.logging.OWSLogger;
import com.camptocamp.owsproxy.parameters.ConnectionParameters;
import com.camptocamp.owsproxy.parameters.DevLogFileParameter;
import com.camptocamp.owsproxy.parameters.DevLogLevelParameter;
import com.camptocamp.owsproxy.parameters.HelpParameter;
import com.camptocamp.owsproxy.parameters.KeystoreParameter;
import com.camptocamp.owsproxy.parameters.LogConfigurationParameter;
import com.camptocamp.owsproxy.parameters.Parameter;
import com.camptocamp.owsproxy.parameters.ProxyHostParameter;
import com.camptocamp.owsproxy.parameters.ProxyPortParameter;
import com.camptocamp.owsproxy.parameters.ProxyUserParameter;
import com.camptocamp.owsproxy.parameters.UserLogFileParameter;
/**
* This is the client for running without a graphical user interface.
*
* @author jeichar
*/
public class OWSHeadlessClient implements Observer {
private static final Parameter[] paramaterOptions = new Parameter[] {
new ProxyHostParameter(), new ProxyPortParameter(),
new DevLogLevelParameter(), new DevLogFileParameter(),
new UserLogFileParameter(), new LogConfigurationParameter(),
new HelpParameter(), new ProxyUserParameter(), new KeystoreParameter() };
private Collection<X509Certificate> sessionCertificates = new HashSet<X509Certificate>();
ConnectionManager connManager;
ConnectionParameters params = new ConnectionParameters(null, null, null,
null, -1, "", "", OWSClient.DEFAULT_SECURITY_SETTINGS.keystore, "", false, sessionCertificates); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private ConnectionStatus state = ConnectionStatus.IDLE;
public OWSHeadlessClient() {
connManager = new ConnectionManager();
connManager.addObserver(this);
}
private void run() {
connManager.connect(params);
}
public void update(Observable o, Object arg) {
OWSLogger.DEV.fine(arg.toString());
if (!(arg instanceof ConnectionEvent))
return;
ConnectionEvent connEvent = (ConnectionEvent) arg;
switch (connEvent.status) {
case ERROR: {
OWSLogger.USER.warning(Translations.getString("OWSHeadlessClient.Error", //$NON-NLS-1$
connEvent.message));
if( state == ConnectionStatus.CONNECTING) {
System.exit(0);
}
break;
}
case KEYSTORE_PASSWORD: {
OWSLogger.USER.severe(Translations.getString("OWSHeadlessClient.Error", //$NON-NLS-1$
connEvent.message));
if( state == ConnectionStatus.CONNECTING) {
System.exit(0);
}
break;
}
case NO_KEYSTORE: {
OWSLogger.USER.severe(Translations.getString("OWSHeadlessClient.Error", //$NON-NLS-1$
connEvent.message));
if( state == ConnectionStatus.CONNECTING) {
System.exit(0);
}
break;
}
case UNAUTHORIZED: {
OWSLogger.USER
.severe(Translations.getString("OWSHeadlessClient.Unauthorized")); //$NON-NLS-1$
System.exit(0);
break;
}
case PROXY_AUTH_REQUIRED: {
OWSLogger.USER
.severe(Translations.getString("OWSHeadlessClient.Prox_Unauth")); //$NON-NLS-1$
System.exit(0);
break;
}
case RUNNING: {
OWSLogger.USER.info(Translations.getString("HeadlessRunning", connManager.getListeningAddress())); //$NON-NLS-1$
break;
}
default: {
String message = Translations.getString("OWSHeadlessClient.headlessStatus", connEvent.status); //$NON-NLS-1$
OWSLogger.USER.info(message);
break;
}
}
state = connEvent.status;
}
public static void main(String[] args) {
try {
OWSHeadlessClient client = parseProgramArgs(args);
if (OWSLogger.DEV.isLoggable(Level.FINEST)) {
OWSLogger.enableHttpClientDebug();
}
client.run();
} catch (IllegalArgumentException e) {
usage(e.getMessage());
}
}
static OWSHeadlessClient parseProgramArgs(String... args2)
throws IllegalArgumentException {
if( args2.length==0){
throw new IllegalArgumentException(""); //$NON-NLS-1$
}
OWSHeadlessClient client = new OWSHeadlessClient();
List<String> args = new ArrayList<String>(Arrays.asList(args2));
for (ListIterator<String> iter = args.listIterator(); iter.hasNext();) {
String arg = iter.next();
for (Parameter param : paramaterOptions) {
if (param.match(arg)) {
iter.remove();
if (iter.hasNext()) {
boolean argUsed = param.performAction(iter.next(),
client);
if (argUsed) {
iter.remove();
} else {
iter.previous();
}
} else {
param.performAction("", client); //$NON-NLS-1$
}
}
}
}
if (args.size() != 2) {
throw new IllegalArgumentException(
Translations.getString("OWSHeadlessClient.wrongParams")); //$NON-NLS-1$
}
String usernamePassword = args.get(0);
client.getParams().username = ProxyUserParameter
.parseUsername(usernamePassword);
client.getParams().password = ProxyUserParameter
.parsePassword(usernamePassword);
client.getParams().server = args.get(1);
client.params.checkConfiguration();
return client;
}
private static void usage(String error) {
String usage = Translations.getString("OWSHeadlessClient.usage", error); //$NON-NLS-1$
OWSLogger.USER.info(usage);
}
public ConnectionParameters getParams() {
return params;
}
}