public ITurnSnapshot readSnapshot(int currentTime) { if (objectReadStream == null) { return null; } try { // TODO implement seek to currentTime, warn you. turns don't have same size in bytes return (ITurnSnapshot) objectReadStream.readObject(); } catch (EOFException e) { logError(e); return null; } catch (Exception e) { logError(e); return null; } }
public void prepareInputStream() { try { fileReadStream = new FileInputStream(tempFile); bufferedReadStream = new BufferedInputStream(fileReadStream); objectReadStream = new ObjectInputStream(bufferedReadStream); } catch (FileNotFoundException e) { logError(e); fileReadStream = null; bufferedReadStream = null; objectReadStream = null; } catch (IOException e) { logError(e); fileReadStream = null; bufferedReadStream = null; objectReadStream = null; } }
private void createTempFile() { try { if (tempFile == null) { tempFile = File.createTempFile("robocode-battle-records", ".tmp"); tempFile.deleteOnExit(); } else { if (!tempFile.delete()) { Logger.logError("Could not delete temp file"); } if (!tempFile.createNewFile()) { throw new Error("Temp file creation failed"); } } } catch (IOException e) { logError(e); throw new Error("Temp file creation failed", e); } }
public void onRoundStarted(RoundStartedEvent event) { for (IBattleListener listener : listeners) { try { listener.onRoundStarted(event); } catch (Throwable ex) { logError("onRoundStarted " + listener.getClass(), ex); } } }
public void onBattleMessage(BattleMessageEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleMessage(event); } catch (Throwable ex) { logError("onBattleMessage " + listener.getClass(), ex); } } }
private void cleanup() { cleanupStreams(); if (tempFile != null && tempFile.exists()) { if (tempFile.delete() == false) { Logger.logError("Could not delete temp file"); } tempFile = null; } recordInfo = null; }
public void writeTurn(ITurnSnapshot turn, int round, int time) { try { if (time != recordInfo.turnsInRounds[round]) { throw new Error("Something rotten"); } if (time == 0) { objectWriteStream.reset(); } recordInfo.turnsInRounds[round]++; recordInfo.roundsCount = round + 1; objectWriteStream.writeObject(turn); } catch (IOException e) { logError(e); } }
public void createRecordInfo(BattleRules rules, int numRobots) { try { createTempFile(); fileWriteStream = new FileOutputStream(tempFile); bufferedWriteStream = new BufferedOutputStream(fileWriteStream, 1024 * 1024); objectWriteStream = new ObjectOutputStream(bufferedWriteStream); } catch (IOException e) { logError(e); } recordInfo = new BattleRecordInfo(); recordInfo.robotCount = numRobots; recordInfo.battleRules = rules; recordInfo.turnsInRounds = new Integer[rules.getNumRounds()]; for (int i = 0; i < rules.getNumRounds(); i++) { recordInfo.turnsInRounds[i] = 0; } }
private void printResultsData(BattleCompletedEvent event) { // Do not print out if no result file has been specified and the GUI is enabled if ((setup.resultsFilename == null && (!setup.exitOnComplete || windowManager.isGUIEnabled()))) { return; } PrintStream out = null; FileOutputStream fos = null; try { if (setup.resultsFilename == null) { out = Logger.realOut; } else { File f = new File(setup.resultsFilename); try { fos = new FileOutputStream(f); out = new PrintStream(fos); } catch (IOException e) { Logger.logError(e); } } if (out != null) { BattleResultsTableModel resultsTable = new BattleResultsTableModel( event.getSortedResults(), event.getBattleRules().getNumRounds()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); resultsTable.print(new PrintStream(baos)); out.append(StringUtil.toBasicLatin(baos.toString())); } } finally { FileUtil.cleanupStream(out); FileUtil.cleanupStream(fos); } }
public void saveRecord( String recordFilename, BattleRecordFormat format, SerializableOptions options) { FileOutputStream fos = null; BufferedOutputStream bos = null; ZipOutputStream zos = null; ObjectOutputStream oos = null; OutputStreamWriter osw = null; XmlWriter xwr = null; FileInputStream fis = null; BufferedInputStream bis = null; ObjectInputStream ois = null; final boolean isbin = format == BattleRecordFormat.BINARY || format == BattleRecordFormat.BINARY_ZIP; final boolean isxml = format == BattleRecordFormat.XML || format == BattleRecordFormat.XML_ZIP; Calendar calendar = Calendar.getInstance(); try { fos = new FileOutputStream(recordFilename); bos = new BufferedOutputStream(fos, 1024 * 1024); if (format == BattleRecordFormat.BINARY) { oos = new ObjectOutputStream(bos); } else if (format == BattleRecordFormat.BINARY_ZIP) { zos = new ZipOutputStream(bos); zos.putNextEntry(new ZipEntry(dateFormat.format(calendar.getTime()) + "-robocode.br")); oos = new ObjectOutputStream(zos); } else if (format == BattleRecordFormat.XML) { final Charset utf8 = Charset.forName("UTF-8"); osw = new OutputStreamWriter(bos, utf8); xwr = new XmlWriter(osw, true); } else if (format == BattleRecordFormat.XML_ZIP) { final Charset utf8 = Charset.forName("UTF-8"); zos = new ZipOutputStream(bos); zos.putNextEntry(new ZipEntry(dateFormat.format(calendar.getTime()) + "-robocode.xml")); osw = new OutputStreamWriter(zos, utf8); xwr = new XmlWriter(osw, false); } if (isbin) { oos.writeObject(recordInfo); } else if (isxml) { xwr.startDocument(); xwr.startElement("record"); xwr.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); if (options.shortAttributes) { xwr.writeAttribute("xsi:noNamespaceSchemaLocation", "battleRecordS.xsd"); } else { xwr.writeAttribute("xsi:noNamespaceSchemaLocation", "battleRecord.xsd"); } recordInfo.writeXml(xwr, options); xwr.startElement("turns"); } if (recordInfo.turnsInRounds != null) { fis = new FileInputStream(tempFile); bis = new BufferedInputStream(fis, 1024 * 1024); ois = new ObjectInputStream(bis); for (int i = 0; i < recordInfo.turnsInRounds.length; i++) { if (recordInfo.turnsInRounds[i] > 0) { for (int j = 0; j <= recordInfo.turnsInRounds[i] - 1; j++) { try { TurnSnapshot turn = (TurnSnapshot) ois.readObject(); if (j != turn.getTurn()) { throw new Error("Something rotten"); } if (isbin) { turn.stripDetails(options); oos.writeObject(turn); } else if (isxml) { turn.writeXml(xwr, options); } } catch (ClassNotFoundException e) { logError(e); } } if (isbin) { oos.flush(); } else if (isxml) { osw.flush(); } bos.flush(); fos.flush(); } } if (isxml) { xwr.endElement(); // turns xwr.endElement(); // record osw.flush(); } } } catch (IOException e) { logError(e); recorder = new BattleRecorder(this, properties); createTempFile(); } finally { FileUtil.cleanupStream(ois); FileUtil.cleanupStream(bis); FileUtil.cleanupStream(fis); FileUtil.cleanupStream(oos); FileUtil.cleanupStream(zos); FileUtil.cleanupStream(bos); FileUtil.cleanupStream(fos); FileUtil.cleanupStream(osw); } }
public void loadRecord(String recordFilename, BattleRecordFormat format) { FileInputStream fis = null; BufferedInputStream bis = null; ZipInputStream zis = null; ObjectInputStream ois = null; InputStream xis = null; FileOutputStream fos = null; BufferedOutputStream bos = null; ObjectOutputStream oos = null; try { createTempFile(); fis = new FileInputStream(recordFilename); bis = new BufferedInputStream(fis, 1024 * 1024); if (format == BattleRecordFormat.BINARY) { ois = new ObjectInputStream(bis); } else if (format == BattleRecordFormat.BINARY_ZIP) { zis = new ZipInputStream(bis); zis.getNextEntry(); ois = new ObjectInputStream(zis); } else if (format == BattleRecordFormat.XML_ZIP) { zis = new ZipInputStream(bis); zis.getNextEntry(); xis = zis; } else if (format == BattleRecordFormat.XML) { xis = bis; } if (format == BattleRecordFormat.BINARY || format == BattleRecordFormat.BINARY_ZIP) { recordInfo = (BattleRecordInfo) ois.readObject(); if (recordInfo.turnsInRounds != null) { fos = new FileOutputStream(tempFile); bos = new BufferedOutputStream(fos, 1024 * 1024); oos = new ObjectOutputStream(bos); for (int i = 0; i < recordInfo.turnsInRounds.length; i++) { for (int j = recordInfo.turnsInRounds[i] - 1; j >= 0; j--) { try { ITurnSnapshot turn = (ITurnSnapshot) ois.readObject(); oos.writeObject(turn); } catch (ClassNotFoundException e) { logError(e); } } } } } else { final RecordRoot root = new RecordRoot(); fos = new FileOutputStream(tempFile); bos = new BufferedOutputStream(fos, 1024 * 1024); root.oos = new ObjectOutputStream(bos); XmlReader.deserialize(xis, root); if (root.lastException != null) { logError(root.lastException); } recordInfo = root.recordInfo; } } catch (IOException e) { logError(e); createTempFile(); recordInfo = null; } catch (ClassNotFoundException e) { if (e.getMessage().contains("robocode.recording.BattleRecordInfo")) { Logger.logError( "Sorry, backward compatibility with record from version 1.6 is not provided."); } else { logError(e); } createTempFile(); recordInfo = null; } finally { FileUtil.cleanupStream(oos); FileUtil.cleanupStream(bos); FileUtil.cleanupStream(fos); FileUtil.cleanupStream(ois); FileUtil.cleanupStream(zis); FileUtil.cleanupStream(bis); FileUtil.cleanupStream(fis); } }
public void loadSetup(String[] args) { final String nosecMessage = "Robocode is running without a security manager.\n" + "Robots have full access to your system.\n" + "You should only run robots which you trust!"; final String exMessage = "Robocode is running in experimental mode.\n" + "Robots have access to their IRobotPeer interfaces.\n" + "You should only run robots which you trust!"; if (RobocodeProperties.isSecurityOff()) { Logger.logWarning(nosecMessage); } if (System.getProperty("EXPERIMENTAL", "false").equals("true")) { Logger.logWarning(exMessage); } setup.tps = properties.getOptionsBattleDesiredTPS(); // Disable canonical file path cache under Windows as it causes trouble when returning // paths with differently-capitalized file names. if (System.getProperty("os.name").toLowerCase().startsWith("windows ")) { System.setProperty("sun.io.useCanonCaches", "false"); } // Initialize the system property so the AWT does not use headless mode meaning that the // GUI (Awt and Swing) is enabled per default when running starting Robocode. // It might be set to true later, if the -nodisplay option is set (in the setEnableGUI method). // Read more about headless mode here: // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ System.setProperty("java.awt.headless", "false"); for (int i = 0; i < args.length; i++) { String currentArg = args[i]; if (currentArg.equalsIgnoreCase("-cwd") && (i < args.length + 1)) { changeDirectory(args[i + 1]); i++; } else if (currentArg.equalsIgnoreCase("-battle") && (i < args.length + 1)) { setup.battleFilename = args[i + 1]; i++; } else if (currentArg.equalsIgnoreCase("-record") && (i < args.length + 1)) { setup.recordFilename = args[i + 1]; i++; } else if (currentArg.equalsIgnoreCase("-recordXML") && (i < args.length + 1)) { setup.recordXmlFilename = args[i + 1]; i++; } else if (currentArg.equalsIgnoreCase("-replay") && (i < args.length + 1)) { setup.replayFilename = args[i + 1]; i++; } else if (currentArg.equalsIgnoreCase("-results") && (i < args.length + 1)) { setup.resultsFilename = args[i + 1]; i++; } else if (currentArg.equalsIgnoreCase("-tps") && (i < args.length + 1)) { setup.tps = Integer.parseInt(args[i + 1]); if (setup.tps < 1) { Logger.logError("tps must be > 0"); System.exit(8); } i++; } else if (currentArg.equalsIgnoreCase("-minimize")) { setup.minimize = true; } else if (currentArg.equalsIgnoreCase("-nodisplay")) { if (windowManager != null) { windowManager.setEnableGUI(false); } if (soundManager != null) { soundManager.setEnableSound(false); } setup.tps = 10000; // set TPS to maximum } else if (currentArg.equalsIgnoreCase("-nosound")) { if (soundManager != null) { soundManager.setEnableSound(false); } } else if (currentArg.equals("-?") || currentArg.equalsIgnoreCase("-help")) { printUsage(); System.exit(0); } else { Logger.logError("Not understood: " + currentArg); printUsage(); System.exit(8); } } File robotsDir = FileUtil.getRobotsDir(); if (robotsDir == null) { System.err.println("No valid robot directory is specified"); System.exit(8); } else if (!(robotsDir.exists() && robotsDir.isDirectory())) { System.err.println('\'' + robotsDir.getAbsolutePath() + "' is not a valid robot directory"); System.exit(8); } // The Default Toolkit must be set as soon as we know if we are going to use headless mode or // not. // That is if the toolkit must be headless or not (GUI on/off). If we are running in headless // mode // from this point, a HeadlessException will be thrown if we access a AWT/Swing component. // Read more about headless mode here: // http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ Toolkit.getDefaultToolkit(); }
public void run() { Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable t) { t.printStackTrace(); } }); try { hostManager.initSecurity(); // Set the Look and Feel (LAF) if (windowManager != null && windowManager.isGUIEnabled()) { windowManager.init(); } properties.setOptionsBattleDesiredTPS(setup.tps); battleManager.addListener(battleObserver); if (windowManager != null && windowManager.isGUIEnabled()) { if (!setup.minimize && setup.battleFilename == null && soundManager != null) { soundManager.playThemeMusic(); windowManager.showSplashScreen(); } windowManager.showRobocodeFrame(true, setup.minimize); windowManager.showBarCodeScanDialog(true); // Play the intro battle if a battle file is not specified and this is the first time // Robocode is being run if (setup.battleFilename == null && versionManager.isLastRunVersionChanged()) { properties.saveProperties(); windowManager.runIntroBattle(); } } final boolean enableCLIRecording = (setup.recordFilename != null || setup.recordXmlFilename != null); // Note: At this point the GUI should be opened (if enabled) before starting the battle from a // battle file if (setup.battleFilename != null) { if (setup.replayFilename != null) { System.err.println( "You cannot run both a battle and replay a battle record in the same time."); System.exit(8); } setup.exitOnComplete = true; battleManager.setBattleFilename(setup.battleFilename); if (new File(battleManager.getBattleFilename()).exists()) { battleManager.startNewBattle( battleManager.loadBattleProperties(), false, enableCLIRecording); } else { System.err.println( "The specified battle file '" + setup.battleFilename + "' was not found"); System.exit(8); } } else if (setup.replayFilename != null) { setup.exitOnComplete = true; if (setup.replayFilename.toLowerCase().endsWith("xml.zip")) { recordManager.loadRecord(setup.replayFilename, BattleRecordFormat.XML_ZIP); } else { recordManager.loadRecord(setup.replayFilename, BattleRecordFormat.BINARY_ZIP); } if (new File(setup.replayFilename).exists()) { battleManager.replay(); } else { System.err.println( "The specified battle record file '" + setup.replayFilename + "' was not found"); System.exit(8); } } } catch (Throwable e) { Logger.logError(e); } }