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; } }