/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Pavel Savara
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.core;
import net.sf.robocode.io.FileUtil;
import net.sf.robocode.io.Logger;
import robocode.control.events.IBattleListener;
import java.io.File;
import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler;
/**
* There are entrypoints called with reflection from HiddenAccess in robocode.api module,
* they cross classloaders boundaries.
*
* @author Pavel Savara (original)
*/
public abstract class RobocodeMainBase implements Runnable {
public abstract void loadSetup(String[] args);
public abstract void initForRobocodeEngine(IBattleListener listener);
public abstract void cleanup();
// -----------
// entrypoints called with reflection from HiddenAccess in robocode.api module
// -----------
public static void robocodeMain(Object args) {
// here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader
RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class);
main.loadSetup((String[]) args);
// Make sure ALL uncaught exceptions are logged
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
Logger.logError("UncaughtException on thread " + t.getClass(), e);
}
});
ThreadGroup group = new ThreadGroup("Robocode thread group");
new Thread(group, main, "Robocode main thread").start();
}
public static void initContainer() {
// here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader
Container.init();
}
public static void cleanupForRobocodeEngine() {
// here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader
RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class);
main.cleanup();
}
public static void initContainerForRobocodeEngine(File robocodeHome, IBattleListener listener) {
try {
if (robocodeHome == null) {
robocodeHome = FileUtil.getCwd();
}
FileUtil.setCwd(robocodeHome);
File robotsDir = FileUtil.getRobotsDir();
if (robotsDir == null) {
throw new RuntimeException("No valid robot directory is specified");
} else if (!(robotsDir.exists() && robotsDir.isDirectory())) {
throw new RuntimeException('\'' + robotsDir.getAbsolutePath() + "' is not a valid robot directory");
}
} catch (IOException e) {
System.err.println(e);
return;
}
// here we cross transition to EngineClassLoader classes using interface which is defined in system classLoader
RobocodeMainBase main = Container.getComponent(RobocodeMainBase.class);
main.initForRobocodeEngine(listener);
}
}