/*
* Copyright (C) 2006-2011 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.optimizer.simulator;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
* This class is to provide a jar file which the dakota script will run.
* Here the values from dakota and rce are linked.
* @author Sascha Zur
*/
public class DakotaResponse {
private final int standardPort = 10000;
private final int bufferSize = 200;
/**
* This methods does the handshake with rce.
*
* @param path :
* @param data :
* @param fw :
* @throws IOException :
*/
public void respond(String path, String data, BufferedWriter fw) throws IOException {
String ip = "127.0.0.1"; // localhost
fw.append("Reading port ... \r\n");
fw.flush();
int port = readPort(path, fw);
fw.append("done: " + port + "\r\n");
fw.append("Open Connection ... \r\n");
fw.flush();
Socket socket = new Socket(ip, port); // verbindet sich mit Server
fw.append("done.\r\n");
fw.flush();
fw.append("Writing message for:" + path + "/" + data + " ...");
writeMessagetoDakota(socket, path + "&&" + data + "\r\n");
fw.append("done.\r\n");
fw.flush();
fw.append("blocking for answer ... ");
fw.flush();
blockUntilMessageArrives(socket);
fw.append("done. \r\n Closing Socket");
fw.flush();
socket.close();
}
private int readPort(String path, BufferedWriter fw) throws IOException {
fw.flush();
File portfile = null;
try {
File f = null;
fw.append("Path : " + path);
if (path.contains(".inworkdir")){
f = new File(path.substring(0, path.lastIndexOf(File.separator)));
} else {
f = new File(path.substring(0, path.indexOf("workdir")));
}
fw.append("F : " + f.getAbsolutePath());
for (File subFile : f.listFiles()){
fw.append(subFile.getAbsolutePath());
if (subFile.getName().endsWith(".port")){
portfile = subFile;
}
}
} catch (NullPointerException e){
fw.append(e.getMessage());
fw.flush();
}
BufferedReader fr;
fw.flush();
try {
fw.flush();
fr = new BufferedReader(new FileReader(portfile));
String firstLine = fr.readLine();
fw.flush();
return Integer.valueOf(firstLine);
} catch (FileNotFoundException e) {
fw.append(e.getMessage());
fr = null;
} catch (IOException e) {
fw.append(e.getMessage());
return standardPort;
}
fw.flush();
return standardPort;
}
private void writeMessagetoDakota(java.net.Socket socket, String nachricht) throws IOException {
PrintWriter printWriter =
new PrintWriter(
new OutputStreamWriter(
socket.getOutputStream()));
printWriter.print(nachricht);
printWriter.flush();
}
private void blockUntilMessageArrives(java.net.Socket socket) throws IOException {
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
char[] buffer = new char[bufferSize];
bufferedReader.read(buffer, 0, bufferSize); // blockiert bis Nachricht empfangen
}
/**
* Main.
* @param args : Program arguments
*/
public static void main(String[] args) {
try {
BufferedWriter fw = new BufferedWriter(new FileWriter(new File("LOGGER")));
fw.append("My arguments: " + args[0] + " " + args[1]);
DakotaResponse client = new DakotaResponse();
try {
client.respond(args[0], args[1], fw);
fw.flush();
fw.close();
} catch (IOException e) {
fw.append(e.toString());
fw.append(e.getCause().toString());
fw.append(e.getMessage());
fw.flush();
fw.close();
}
} catch (IOException e) {
System.err.println(e);
}
}
}