package bots.prologbot.prologsystem;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import org.apache.commons.io.FileUtils;
import bots.prologbot.PrologBot;
public class YapPrologSystem implements PrologSystem {
private final static String n = System.getProperty("line.separator");
private static String file_dir_str = "./data/prologbot/";
static {
File file = new File("/dev/shm/");
if (file.exists()) {
file_dir_str = "/dev/shm/";
try {
FileUtils.copyFileToDirectory(new File("./data/prologbot/bk-yap.pl"), file);
} catch (IOException e) {
e.printStackTrace();
file_dir_str = "./data/prologbot/";
}
}
}
private final static File directory = new File(file_dir_str);
private final PrologBot bot;
public YapPrologSystem(PrologBot bot) {
this.bot = bot;
}
/* (non-Javadoc)
* @see bots.prologbot.prologsystem.PrologSystem#updateBotProlog(java.lang.String)
*/
@Override
public synchronized void updateBotProlog(String prolog) {
File file = new File(directory, bot.getName() + ".pl");
StringWriter out = new StringWriter();
out.write("% Generated by server" + n);
out.write(":- include(bk-yap)." + n);
out.write(":- include(state)." + n);
out.write("" + n);
out.write("% Generated by client" + n);
out.write(prolog);
writeToFile(file, out.toString());
}
private void writeToFile(File file, String prolog) {
try {
FileWriter out2 = new FileWriter(file);
BufferedWriter out = new BufferedWriter(out2);
out.write(prolog);
out.close();
out2.close();
} catch (IOException e) {
e.printStackTrace();
System.err.println("Could not write prolog code.");
System.exit(-1);
}
}
/* (non-Javadoc)
* @see bots.prologbot.prologsystem.PrologSystem#updateState(java.lang.String)
*/
@Override
public synchronized void updateState(String state) {
writeToFile(new File(directory, "state.pl"), state);
}
/* (non-Javadoc)
* @see bots.prologbot.prologsystem.PrologSystem#executeQuery()
*/
@Override
public synchronized String executeQuery() {
try {
ProcessBuilder pb = new ProcessBuilder("yap", "-l", bot.getName() + ".pl", "-g", "evaluate", "-q");
pb.directory(directory);
Process p = pb.start();
int exitValue = p.waitFor();
if (exitValue != 0) {
throw new IllegalStateException();
}
InputStreamReader in = new InputStreamReader(p.getInputStream());
BufferedReader result = new BufferedReader(in);
String output = result.readLine();
result.close();
in.close();
return output;
} catch (IOException e) {
e.printStackTrace();
System.err.println("Could not query Prolog.");
System.exit(-1);
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("Could not query Prolog.");
System.exit(-1);
}
return null;
}
}