/******************************************************************************* * 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 & Flemming N. Larsen * - Initial implementation *******************************************************************************/ package net.sf.robocode.recording; import net.sf.robocode.battle.events.BattleEventDispatcher; import net.sf.robocode.io.FileUtil; import net.sf.robocode.io.Logger; import net.sf.robocode.serialization.SerializableOptions; import net.sf.robocode.settings.ISettingsManager; import robocode.BattleResults; import robocode.control.events.*; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; /** * @author Pavel Savara (original) * @author Flemming N. Larsen (original) */ public class BattleRecorder { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss"); private final RecordManager recordmanager; private final ISettingsManager properties; private BattleObserver battleObserver; public BattleRecorder(RecordManager recordmanager, ISettingsManager properties) { this.recordmanager = recordmanager; this.properties = properties; } public void attachRecorder(BattleEventDispatcher battleEventDispatcher) { if (battleObserver != null) { battleObserver.dispose(); } battleObserver = new BattleObserver(battleEventDispatcher); } public void detachRecorder() { if (battleObserver != null) { battleObserver.dispose(); } } private class BattleObserver extends BattleAdaptor { private final BattleEventDispatcher dispatcher; private int currentTurn; private int currentRound; public BattleObserver(BattleEventDispatcher dispatcher) { this.dispatcher = dispatcher; dispatcher.addListener(this); } public void dispose() { dispatcher.removeListener(this); recordmanager.cleanupStreams(); } @Override public void onBattleStarted(BattleStartedEvent event) { recordmanager.cleanupStreams(); recordmanager.createRecordInfo(event.getBattleRules(), event.getRobotsCount()); currentRound = 0; currentTurn = 0; } @Override public void onBattleFinished(BattleFinishedEvent event) { recordmanager.cleanupStreams(); } @Override public void onBattleCompleted(BattleCompletedEvent event) { recordmanager.updateRecordInfoResults(Arrays.asList(event.getIndexedResults())); if (properties.getOptionsCommonEnableAutoRecording()) { writeAutoRecord(event); } } @Override public void onRoundStarted(RoundStartedEvent event) { currentRound = event.getRound(); currentTurn = 0; recordmanager.writeTurn(event.getStartSnapshot(), currentRound, currentTurn); } @Override public void onTurnEnded(TurnEndedEvent event) { currentTurn = event.getTurnSnapshot().getTurn(); recordmanager.writeTurn(event.getTurnSnapshot(), currentRound, currentTurn); } private void writeAutoRecord(BattleCompletedEvent event) { try { final BattleResults[] results = event.getIndexedResults(); StringBuilder name = new StringBuilder(); name.append(FileUtil.getBattlesDir().getCanonicalPath()); name.append(File.separator); Calendar calendar = Calendar.getInstance(); name.append(dateFormat.format(calendar.getTime())); name.append('-'); for (BattleResults r : results) { name.append(r.getTeamLeaderName()); name.append('-'); } name.setLength(name.length() - 1); if (properties.getOptionsCommonAutoRecordingXML()) { name.append(".xml.zip"); recordmanager.saveRecord(name.toString(), BattleRecordFormat.XML_ZIP, new SerializableOptions(true)); } else { name.append(".zip.br"); recordmanager.saveRecord(name.toString(), BattleRecordFormat.BINARY_ZIP, new SerializableOptions(true)); } } catch (IOException e) { Logger.logError(e); } } } }