import java.net.*;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
import javax.xml.rpc.encoding.XMLType;
import java.io.*;
import iotools.*;

/********************************************************
 * 
 *******************************************************/

public class TerMine
{
  private static String wsdlURL;
  private static URL url;
  private static String targetNamespace;
  private static String   serviceName;
  private static String      portName;
  private static String operationName;
  private static QName    serviceQN;
  private static QName       portQN;
  private static QName  operationQN;

  private static ServiceFactory serviceFactory;
  private static Service service;

  // --------------------------------------------------------------------

  public TerMine() throws Exception
  {
    String wsdlURL = "http://www.nactem.ac.uk/software/termine/webservice/termine.wsdl";
    URL url = new URL(wsdlURL);
    targetNamespace = "urn:termine";
      serviceName = "termine";
         portName = "termine_porttype";
    operationName = "analyze";
      serviceQN   = new QName(targetNamespace, serviceName);
         portQN   = new QName(targetNamespace, portName);
    operationQN   = new QName(targetNamespace, operationName);

    serviceFactory = ServiceFactory.newInstance();
    service = serviceFactory.createService(url, serviceQN);
  }

  // --------------------------------------------------------------------

  public Object C_value(String src, String input_format, String output_format, String stoplist, String filter) throws Exception
  {
    Call call = (Call) service.createCall();
    call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "");
    call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped");
    call.setTargetEndpointAddress("http://www.nactem.ac.uk:9000/termine");

    call.setPortTypeName(portQN);
    call.setOperationName(operationQN);

    call.removeAllParameters();
    call.addParameter("src",           XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter("input_format",  XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter("output_format", XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter("stoplist",      XMLType.XSD_STRING, ParameterMode.IN);
    call.addParameter("filter",        XMLType.XSD_STRING, ParameterMode.IN);

    Object[] inParams = new Object[] {src, input_format, output_format, stoplist, filter};

    return call.invoke(inParams);
  }

  // --------------------------------------------------------------------

  public static boolean tooBig(String file_name)
  {
    File file      = new File(file_name);
    long file_size = file.length();
    double MB      = 1024 * 1024;
    int quota      = 2;

    if (file_size > quota * MB)
    {
      System.out.println("file: " + file_name);
      System.out.println("size: " + Long.toHexString(Math.round(file_size / MB)) + "MB");
      System.out.println("The file size exceeds the " + quota + "MB quota.");
      System.out.println("Please submit a batch request at: http://www.nactem.ac.uk/batch.php");

      return true;
    }
    else return false;
  }

  // --------------------------------------------------------------------

  public static void webDemo(String file_url, String file_name)
  {
    // --- step 1: start creating a few objects needed for download
    java.net.URL   u;
    InputStream    is = null;
    BufferedReader dis;
    String         s;

    int sec = 60;

    try
    {
      u  = new java.net.URL("http://www.nactem.ac.uk/software/termine/cgi-bin/termine_cvalue.cgi?type=url&url=" + file_url);

      System.out.println("Wait a minute...");
      Thread.currentThread().sleep(sec * 1000);

      is = u.openStream();  // --- throws an IOException
      dis = new BufferedReader(new InputStreamReader(is));
      FileWriter file_out = new FileWriter(file_name);
      while ( (s = dis.readLine()) != null ) file_out.write(s + "\n");
      file_out.close();
    }
    catch (MalformedURLException mue)
    {
      System.out.println("Ouch - a MalformedURLException happened.");
      mue.printStackTrace();
      System.exit(1);
    } 
    catch (InterruptedException e) {e.printStackTrace();}
    catch (IOException ioe)
    {
      System.out.println("Oops - an IOException happened.");
      ioe.printStackTrace();
      System.exit(1);
    }
    finally
    {
      // --- close the InputStream
      try {is.close();}
      catch (IOException ioe)
      {
        // --- just going to ignore this one
      }
    }
  }

  // --------------------------------------------------------------------

  public static void webDemoText(String file_html, String file_text) throws Exception
  {
    boolean out = false;

    EasyReader file_in = new EasyReader(file_html);
    FileWriter file_out = new FileWriter(file_text);

    while (!file_in.eof())
    {
      String line = file_in.readString();

      if (out)
      {
        file_out.write(line + "\n");

        if (line.indexOf("</div>") >= 0)
        {
          file_in.close();
          file_out.close();
          return;
        }
      }
      else
      {
        if (line.indexOf("<div id=\"textview\">") >= 0)
        {
          file_out.write(line + "\n");
          out = true;
        }
      }
    }

    file_in.close();
    file_out.close();
    return;
  }

  // --------------------------------------------------------------------

  public static void webDemoTerms(String file_html, String file_terms) throws Exception
  {
    boolean out = false;

    EasyReader file_in = new EasyReader(file_html);
    FileWriter file_out = new FileWriter(file_terms);

    while (!file_in.eof())
    {
      String line = file_in.readString();

      if (out)
      {
        if (line.indexOf("g_shortforms[") >= 0)
        {
          file_in.close();
          file_out.close();
          return;
        }
        else if (line.indexOf("g_term_list[") >= 0)
        {
          int b, e;

          b = line.indexOf("\"") + 1;
          e = line.indexOf("\"", b);
          String term = line.substring(b, e);

          b = e+3;
          e = line.indexOf(",", b);
          String C_val = line.substring(b, e);

          file_out.write(term + "\t" + C_val + "\n");
        }
      }
      else
      {
        if (line.indexOf("var g_shortforms = new Array();") >= 0) out = true;
      }
    }

    file_in.close();
    file_out.close();
    return;
  }

  // --------------------------------------------------------------------

}
