Log in Help
Print
HomegatepluginsParser_SUPPLEprolog-implsswisrcshefnlpsuppleprolog 〉 SWIProlog.java
 
package shef.nlp.supple.prolog;

import java.io.File;
import java.io.IOException;

import gate.creole.ExecutionException;

import gate.util.ProcessManager;

/**
 * Prolog wrapper for SUPPLE running on SWI Prolog (http://www.swi-prolog.org).
 */
public class SWIProlog extends Prolog
{
  private File parserFile = null;
  
  /**
   * ProcessManager to handle running external SWI processes.
   */
  private ProcessManager processManager = new ProcessManager();

  /**
   * Initialise this Prolog wrapper, passing the path to the saved state.
   *
   * @return <code>true</code> if the supplied file exists, <code>false</code>
   * otherwise.
   */
  public boolean init(File f)
  {
    parserFile = f;

    return (parserFile != null && parserFile.exists());
  }

  /**
   * Run the parser, taking input from and sending output to the specified
   * temporary files.
   *
   * @param in temporary file containing input for the parser
   * @param out temporary file to receive output from the parser
   * @param debugMode should we write debugging information to the console?
   */
  public void parse(File in, File out, boolean debugMode)
                  throws ExecutionException {
    boolean windows = false;
    if(System.getProperty("os.name").toLowerCase().startsWith("windows"))
    {
      windows = true;
    }

    String[] commandArgs;
    commandArgs = new String[7];

    // find the prolog executable.  The default value varies by platform
    if(windows) {
      commandArgs[0] = System.getProperty("supple.swi.executable", "plcon.exe");
    }
    else {
      commandArgs[0] = System.getProperty("supple.swi.executable", "swipl");
    }

    commandArgs[1] = "-x";
    commandArgs[2] = parserFile.getAbsolutePath();
    commandArgs[3] = "--";

    // add command arguments
    commandArgs[4] = "-o";
    commandArgs[5] = out.getAbsolutePath();
    commandArgs[6] = in.getAbsolutePath();

    if(debugMode) {
      System.err.println("Executing SWI prolog with the command line:");
      System.err.println();
      for(int i = 0; i < commandArgs.length; i++) {
        System.err.println(commandArgs[i]);
      }
      System.err.println();
    }

    try {
      int exitCode = processManager.runProcess(commandArgs, debugMode);

      if(exitCode != 0) {
        String message = null;
        if(debugMode) {
          throw new ExecutionException("SWI Prolog exit code: " + exitCode);
        }
        else {
          throw new ExecutionException("SWI Prolog exited with error code "
              + exitCode + ".  Rerun with debug = true to see the console "
              + "output, which may help show the reasons for this error.");
        }
      }
    }
    catch(IOException e) {
      ExecutionException ee = new ExecutionException("I/O error executing "
          + commandArgs[0] + ".  If this is not the correct name for SWI "
          + "prolog on your machine, please set the supple.swi.executable "
          + "system property (see the user guide).");
      ee.initCause(e);
      throw ee;
    }
  }
}