/******************************************************************************* * Copyright (c) 2003, 2010 Albert P�rez and RoboRumble 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: * Albert P�rez * - Initial API and implementation * Flemming N. Larsen * - Ported to Java 5 * - Minor cleanup and optimizations * - Removed unused imports * - Replaced the robocode.util.Utils.copy() method with FileTransfer.copy() * - Properties are now read using PropertiesUtil.getProperties() * - Catch of entire Exception has been reduced to catch of IOException when * only this exception is ever thrown * - Added missing close() to streams *******************************************************************************/ package net.sf.robocode.roborumble.netengine; import net.sf.robocode.roborumble.battlesengine.CompetitionsSelector; import static net.sf.robocode.roborumble.util.PropertiesUtil.getProperties; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.Properties; import java.util.Vector; /** * Class used for uploading results to a server. * Controlled by properties files. * * @author Albert P�rez (original) * @author Flemming N. Larsen (contributor) */ public class ResultsUpload { private final String client; private final String resultsfile; private final String resultsurl; private final String tempdir; private String game; private final String user; private final String sizesfile; private final String minibots; private final String microbots; private final String nanobots; private final CompetitionsSelector size; private final String battlesnumfile; private final String priority; private final String teams; private final String melee; public ResultsUpload(String propertiesfile, String clientVersion) { // Read parameters Properties parameters = getProperties(propertiesfile); resultsfile = parameters.getProperty("OUTPUT", ""); resultsurl = parameters.getProperty("RESULTSURL", ""); tempdir = parameters.getProperty("TEMP", ""); user = parameters.getProperty("USER", ""); game = propertiesfile; String botsrepository = parameters.getProperty("BOTSREP", ""); while (game.indexOf("/") != -1) { game = game.substring(game.indexOf("/") + 1); } game = game.substring(0, game.indexOf(".")); sizesfile = parameters.getProperty("CODESIZEFILE", ""); minibots = parameters.getProperty("MINIBOTS", ""); microbots = parameters.getProperty("MICROBOTS", ""); nanobots = parameters.getProperty("NANOBOTS", ""); battlesnumfile = parameters.getProperty("BATTLESNUMFILE", ""); priority = parameters.getProperty("PRIORITYBATTLESFILE", ""); client = clientVersion; teams = parameters.getProperty("TEAMS", "NOT"); melee = parameters.getProperty("MELEE", "NOT"); // Open competitions selector size = new CompetitionsSelector(sizesfile, botsrepository); } public void uploadResults() { boolean errorsfound = false; // Read the results file Vector<String> results = new Vector<String>(); String match = ""; String bot1 = ""; String bot2; int status = 0; BufferedReader br = null; try { FileReader fr = new FileReader(resultsfile); br = new BufferedReader(fr); String record; while ((record = br.readLine()) != null) { if (record.indexOf(game) != -1) { match = record; status = 0; } else if (status == 0) { bot1 = record; status = 1; } else if (status == 1) { bot2 = record; results.add(match); results.add(bot1); results.add(bot2); } } } catch (IOException e) { System.out.println("Can't open result file for upload"); return; } finally { if (br != null) { try { br.close(); } catch (IOException ignored) {} } } // Open the temp file to put the unuploaded results PrintStream outtxt; try { outtxt = new PrintStream(new BufferedOutputStream(new FileOutputStream(tempdir + "results.txt")), false); } catch (IOException e) { System.out.println("Not able to open output file ... Aborting"); System.out.println(e); return; } // Open the file to put the battles number for each participant PrintStream battlesnum; try { battlesnum = new PrintStream(new BufferedOutputStream(new FileOutputStream(battlesnumfile)), false); } catch (IOException e) { System.out.println("Not able to open battles number file ... Aborting"); System.out.println(e); outtxt.close(); return; } // Open the file to put the battles which have priority PrintStream prioritybattles; try { prioritybattles = new PrintStream(new BufferedOutputStream(new FileOutputStream(priority)), false); } catch (IOException e) { System.out.println("Not able to open priorities file ... Aborting"); System.out.println(e); outtxt.close(); battlesnum.close(); return; } // Post the results for (int i = 0; i < results.size() / 3; i++) { // Create the parameters String String[] header = results.get(i * 3).split(","); String[] first = results.get(i * 3 + 1).split(","); String[] second = results.get(i * 3 + 2).split(","); // find the match mode String matchtype = "GENERAL"; if (header.length >= 6) { matchtype = header[5]; } // if the match mode was general, then send the results to all competitions (assuming codesize is used). // if its not, then send results only to smaller size competitions final String commonData = "&version=1" + "&client=" + client + "&teams=" + teams + "&melee=" + melee + "&rounds=" + header[1] + "&field=" + header[2] + "&user=" + user + "&time=" + header[4] + "&fname=" + first[0] + "&fscore=" + first[1] + "&fbulletd=" + first[2] + "&fsurvival=" + first[3] + "&sname=" + second[0] + "&sscore=" + second[1] + "&sbulletd=" + second[2] + "&ssurvival=" + second[3]; String data = "game=" + game + commonData; if (matchtype.equals("GENERAL") || matchtype.equals("SERVER")) { errorsfound = errorsfound | senddata(game, data, outtxt, true, results, i, battlesnum, prioritybattles); } if (sizesfile.length() != 0) { // upload also related competitions if (minibots.length() != 0 && !matchtype.equals("NANO") && !matchtype.equals("MICRO") && size.checkCompetitorsForSize(first[0], second[0], 1500)) { data = "game=" + minibots + commonData; errorsfound = errorsfound | senddata(minibots, data, outtxt, false, results, i, battlesnum, null); } if (microbots.length() != 0 && !matchtype.equals("NANO") && size.checkCompetitorsForSize(first[0], second[0], 750)) { data = "game=" + microbots + commonData; errorsfound = errorsfound | senddata(microbots, data, outtxt, false, results, i, battlesnum, null); } if (nanobots.length() != 0 && size.checkCompetitorsForSize(first[0], second[0], 250)) { data = "game=" + nanobots + commonData; errorsfound = errorsfound | senddata(nanobots, data, outtxt, false, results, i, battlesnum, null); } } } // close files outtxt.close(); battlesnum.close(); prioritybattles.close(); // delete results file File r = new File(resultsfile); boolean b = r.delete(); if (!b) { System.out.println("Unable to delete results file."); } // copy temp file into results file if there was some error if (errorsfound) { if (!FileTransfer.copy(tempdir + "results.txt", resultsfile)) { System.out.println("Error when copying results errors file."); } } } private void saverror(PrintStream outtxt, String match, String bot1, String bot2, boolean saveonerror) { if (saveonerror) { outtxt.println(match); outtxt.println(bot1); outtxt.println(bot2); } System.out.println("Unable to upload results " + match + " " + bot1 + " " + bot2); } private boolean senddata(String game, String data, PrintStream outtxt, boolean saveonerror, Vector<String> results, int i, PrintStream battlesnum, PrintStream prioritybattles) { boolean errorsfound = false; PrintWriter wr = null; BufferedReader rd = null; try { // Send data URL url = new URL(resultsurl); URLConnection conn = url.openConnection(); conn.setDoOutput(true); wr = new PrintWriter(new OutputStreamWriter(conn.getOutputStream())); wr.println(data); wr.flush(); // Get the response rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; boolean ok = false; while ((line = rd.readLine()) != null) { if (line.indexOf("OK") != -1) { ok = true; System.out.println(line); } else if (line.indexOf("<") != -1 && line.indexOf(">") != -1) { // System.out.println(line); // Save the number of battles for the bots into battlesnum !!!!!!!!!!!!! String bot1 = results.get(i * 3 + 1); bot1 = bot1.substring(0, bot1.indexOf(",")); String bot2 = results.get(i * 3 + 2); bot2 = bot2.substring(0, bot2.indexOf(",")); line = line.replaceAll("<", ""); line = line.replaceAll(">", ""); String[] b = line.split(" "); if (b.length == 2) { battlesnum.println(game + "," + bot1 + "," + b[0]); battlesnum.println(game + "," + bot2 + "," + b[1]); } } else if (line.indexOf("[") != -1 && line.indexOf("]") != -1) { line = line.substring(1); line = line.substring(0, line.length() - 1); String[] items = line.split(","); String bot1 = items[0].substring(0, items[0].lastIndexOf("_")) + " " + items[0].substring(items[0].lastIndexOf("_") + 1); String bot2 = items[1].substring(0, items[1].lastIndexOf("_")) + " " + items[1].substring(items[1].lastIndexOf("_") + 1); String battle = bot1 + "," + bot2 + "," + "SERVER"; if (prioritybattles != null) { prioritybattles.println(battle); } } else { System.out.println(line); } } if (!ok) { saverror(outtxt, results.get(i * 3), results.get(i * 3 + 1), results.get(i * 3 + 2), saveonerror); if (saveonerror) { errorsfound = true; } } } catch (IOException e) { System.out.println(e); if (saveonerror) { errorsfound = true; } saverror(outtxt, results.get(i * 3), results.get(i * 3 + 1), results.get(i * 3 + 2), saveonerror); } finally { if (wr != null) { wr.close(); } if (rd != null) { try { rd.close(); } catch (IOException ignored) {} } } return errorsfound; } }