Talk:RoboRumble/Development

From Robowiki
Jump to navigation Jump to search

Background Uploader

Test N°1:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class UploaderMain {

	String clientVersion = "1";
	
	long maxTry = 10;
	
	public static void main(String args[]){
		
		String infoFilePath = "./roborumble/roborumble.txt";
		
		if (args.length != 0)
			if (args.length == 1)
				infoFilePath = args[0];
			else{
				System.out.println("Usage: java UploaderMain [option]\nOption: Path to roborumble settings file");
				return;
			}
		
		File test = new File(infoFilePath);
		if ( !test.exists() ){
			
		}
		
		new UploaderMain(infoFilePath);
	}
	
	public UploaderMain(String infoFilePath){
		
//		read info from file
		ArrayList<String> allInfo = read( infoFilePath );
//		extact info
		String[] info = findInfo(allInfo);
		
		if ((info == null) || (info.length != 2)){
			logErr("Roborumble settings file invalid");
			return;
		}
		
//		set info
		String uploadServerUrl = info[0];
		String battleFilePath = info[1];
		
//		read battle from file
		ArrayList<String> battles = read( battleFilePath );
		
		if (battles == null){
			logErr("Battle files format invalid");
			return;
		}
		
//		now delete the battles
		File battleFileOld = new File(battleFilePath);
		if (!battleFileOld.delete())
			throw new IllegalArgumentException("Delete: deletion failed");
		
//		prepare data to be uploaded (only 1vs1 supported)
		battles = prepareToUpload1VS1(battles);
		
		ArrayList<String> battlesNotSend;
		long countTry = 10;
		while ((battles.size() > 0) || (countTry > maxTry)){
			battlesNotSend = new ArrayList<String>();
			for (String battle : battles){
				if ( !sendBattle(battle, uploadServerUrl) )
					battlesNotSend.add(battle);
			}
			battles = battlesNotSend; 
		}
	}

	private String[] findInfo(ArrayList<String> allInfo) {
		/*
		 * FIND INFO:
		 * at [0]: uploadServerUrl - RESULTSURL=
		 * at [1]: battleFilePath - OUTPUT=
		 */
		String[] info = new String[2];
		info[0] = null;
		info[1] = null;
		
		for (String ris : allInfo){
			if (ris.indexOf("RESULTSURL=") >= 0){
				logOut(ris.substring(ris.indexOf("=")+1));
				info[0] = ris.substring(ris.indexOf("=")+1);
			}
			if (ris.indexOf("OUTPUT=") >= 0){
				logOut(ris.substring(ris.indexOf("=")+1));
				info[1] = ris.substring(ris.indexOf("=")+1);
			}	
		}
		
		if ((info[0] != null)&&(info[1] != null))
			return info;
		
		return null;
	}

	private ArrayList<String> prepareToUpload1VS1(ArrayList<String> battles) {
		
		ArrayList<String> preparedBattles = new ArrayList<String>();
		
		String[] parametres = new String[6];
		String preparingBattle;
		
		for(int i = 0; i < battles.size(); i++){
			
			//extrapolate battlefield information
			parametres = battles.get(i).split(",");
			
			if ( parametres.length != 6 ){
				logErr( "invalid battlefield: "+battles.get(i) );
				continue;
			}
				
			
//			preparing string to upload
			preparingBattle = new String();
			preparingBattle += "version="+clientVersion;
			preparingBattle += "&game="+parametres[0];
			preparingBattle += "&rounds="+parametres[1];
			preparingBattle += "&field="+parametres[2];
			preparingBattle += "&user="+parametres[3];
			preparingBattle += "&time="+parametres[4];


				
//			extrapolate robot 1
			i++;
			parametres = battles.get(i).split(",");
				
//			if invalid information
			if ( parametres.length != 4 ){
				logErr( "invalid robot: "+battles.get(i) );
				continue;
			}
				
//			preparing string to upload
			preparingBattle += "&fname="+parametres[0];
			preparingBattle += "&fscore="+parametres[1];
			preparingBattle += "&fbulletd="+parametres[2];
			preparingBattle += "&fsurvival="+parametres[3];

//			extrapolate robot 2
			i++;
			parametres = battles.get(i).split(",");
				
//			if invalid information
			if ( parametres.length != 4 ){
				logErr( "invalid robot: "+battles.get(i) );
				continue;
			}
				
//			preparing string to upload
			preparingBattle += "&sname="+parametres[0];
			preparingBattle += "&sscore="+parametres[1];
			preparingBattle += "&sbulletd="+parametres[2];
			preparingBattle += "&ssurvival="+parametres[3];
			preparedBattles.add(preparingBattle);
		}
		
		return preparedBattles;
	}
	
	private boolean sendBattle(String battle, String uploadServerURL){
//		crea l'URL e la connessione HTTP con la servlet
		try{
			
			URL url = new URL(uploadServerURL);
			HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
			httpURLConnection.setRequestMethod( "POST" ) ;
			httpURLConnection.connect() ;
			

			OutputStreamWriter dataOutputStream = new OutputStreamWriter(httpURLConnection.getOutputStream());
			dataOutputStream.write( battle );
			dataOutputStream.flush();
			dataOutputStream.close();
			
			BufferedReader dataInputStream = new BufferedReader( new InputStreamReader( httpURLConnection.getInputStream() ) );
			String response = new String();
			while(true){
				response = dataInputStream.readLine();
				if ( response == null )
					break;
				logOut("risposta: "+response);
			}
			dataInputStream.close();
			
		}catch(Exception e){
			logErr("error: "+e);
		}
		return false;
	}

	private void logOut(String string) {
		log(string, "./log/outUploader");
	}
	
	private void logErr(String string) {
		log(string, "./log/errUploader");
	}

	private void log(String string, String fileName) {
		FileOutputStream file;
		try {
			file = new FileOutputStream(fileName);
			PrintStream output = new PrintStream(file);
			output.println(string);
			output.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private ArrayList<String> read( String filePath ) {
		
		try{
			
			ArrayList<String> battles = new ArrayList<String>();
			FileReader battleFile = new FileReader( filePath );
			BufferedReader battleReader = new BufferedReader(battleFile);
			String battle = null;
			while(true){
				battle = battleReader.readLine();
				if (battle==null)
					break;
				battles.add(battle);
			}
			battleReader.close();
			
			return battles;
			
		}catch(Exception e){
			System.out.println("Error: "+e);
			return null;
		}
	}
}

thank to Rednaxela for code formatting --lestofante 21:16, 4 December 2008 (UTC)