JAL-2890 added cipres .jar and example file
authorkjvdheide <kjvanderheide@dundee.ac.uk>
Mon, 22 Jan 2018 13:54:39 +0000 (13:54 +0000)
committerkjvdheide <kjvanderheide@dundee.ac.uk>
Mon, 22 Jan 2018 13:54:39 +0000 (13:54 +0000)
.classpath
lib/cipres_rest_client-jar-with-dependencies.jar [new file with mode: 0644]
lib/cipres_rest_client-javadoc.jar [new file with mode: 0644]
src/jalview/ext/cipres/CipresExample.java [new file with mode: 0644]

index d704f10..b8feaf5 100644 (file)
        <classpathentry kind="lib" path="lib/jfreesvg-2.1.jar"/>
        <classpathentry kind="lib" path="lib/quaqua-filechooser-only-8.0.jar"/>
        <classpathentry kind="lib" path="lib/htsjdk-1.133.jar"/>
+       <classpathentry kind="lib" path="lib/cipres_rest_client-jar-with-dependencies.jar">
+               <attributes>
+                       <attribute name="javadoc_location" value="jar:platform:/resource/Jalview%20development/lib/cipres_rest_client-javadoc.jar!/"/>
+               </attributes>
+       </classpathentry>
        <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin"/>
        <classpathentry kind="lib" path="lib/xml-apis.jar"/>
        <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
diff --git a/lib/cipres_rest_client-jar-with-dependencies.jar b/lib/cipres_rest_client-jar-with-dependencies.jar
new file mode 100644 (file)
index 0000000..32b4b31
Binary files /dev/null and b/lib/cipres_rest_client-jar-with-dependencies.jar differ
diff --git a/lib/cipres_rest_client-javadoc.jar b/lib/cipres_rest_client-javadoc.jar
new file mode 100644 (file)
index 0000000..98046f2
Binary files /dev/null and b/lib/cipres_rest_client-javadoc.jar differ
diff --git a/src/jalview/ext/cipres/CipresExample.java b/src/jalview/ext/cipres/CipresExample.java
new file mode 100644 (file)
index 0000000..81497ab
--- /dev/null
@@ -0,0 +1,461 @@
+package jalview.ext.cipres;
+
+/**
+ *  Example originally from cipres_java_client (Example.java there)
+ */
+import java.io.Console;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ngbw.directclient.CiApplication;
+import org.ngbw.directclient.CiCipresException;
+import org.ngbw.directclient.CiClient;
+import org.ngbw.directclient.CiJob;
+import org.ngbw.directclient.CiResultFile;
+import org.ngbw.directclient.example.Example;
+import org.ngbw.restdatatypes.ErrorData;
+import org.ngbw.restdatatypes.LimitStatus;
+import org.ngbw.restdatatypes.ParamError;
+import org.ngbw.restdatatypes.StatusData;
+import org.ngbw.restdatatypes.ToolData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Example command line application that shows how to use the CIPRES REST API
+ * Java Client library, i.e. the classes in the org.ngbw.directclient package.
+ * By default the example uses DIRECT authentication, but if invoked with the
+ * "-u" command line argument it switches to UMBRELLA authentication. Username,
+ * password, application name and application ID are read from ~/pycipres.conf
+ * and the information in pycipres.conf must correspond to an application
+ * registered for UMBRELLA auth or DIRECT auth respectively depending on whether
+ * you run the example with or with "-u".
+ * <p>
+ * This example repeatedly prompts the user to submit a job, list the user's
+ * already submitted jobs, retrieve a job's status, download a job's results,
+ * delete a job or quit. The example only submits one type of job: clustalw, run
+ * on the included sequence file. Consult the Users Guide for information about
+ * how to configure different kinds of jobs.
+ * <p>
+ * The gist of using the library is that you instantiate a CIClient object, then
+ * use its methods, and the objects that those methods return. When using direct
+ * auth a single CIClient can be used, but when using UMBRELLA auth, a CIClient
+ * must be instantiated for each end user. A CIClient object should not be used
+ * from multiple threads at the same time.
+ * <p>
+ */
+public class CipresExample
+{
+  @SuppressWarnings("unused")
+  private static final Logger log = LoggerFactory
+          .getLogger(Example.class.getName());
+
+  private static Console console = System.console();
+
+  private static String entry;
+
+  private static CiClient myClient;
+
+  private static String fastaFile;
+
+  private static boolean umbrella = false;
+
+  // For umbrella app's only
+  private static CiClient adminClient;
+
+  public static void main(String[] args) throws Exception
+  {
+    if (console == null)
+    {
+      System.out.println("No console");
+      return;
+    }
+
+    // If true, the example will use umbrella authentication
+    if (args.length > 0 && args[0].equals("-u"))
+    {
+      umbrella = true;
+    }
+
+    // Copy example fasta file from jar to temp file on disk
+    fastaFile = copyResource("ex1.fasta");
+
+    // Get username, password, app name, app id, url from pycipes.conf
+    CiApplication app = CiApplication.getInstance();
+
+    if (umbrella)
+    {
+      myClient = loginUser(app);
+      if (myClient == null)
+      {
+        return;
+      }
+      adminClient = new CiClient(app.getAppKey(), app.getUsername(),
+              app.getPassword(), app.getRestUrl());
+    }
+    else
+    {
+      myClient = new CiClient(app.getAppKey(), app.getUsername(),
+              app.getPassword(), app.getRestUrl());
+    }
+    String command = "";
+    while (!command.equals("q"))
+    {
+      if (umbrella)
+      {
+        System.out.println(
+                "\nEnter s(submit), v(validate), l(list), d(delete), j(job status), r(retrieve results), t(show tools), u(change end user) or q(quit):");
+      }
+      else
+      {
+        System.out.println(
+                "\nEnter s(submit), v(validate), l(list), d(delete), j(job status), r(retrieve results) or t(show tools) or q(quit):");
+      }
+      command = console.readLine();
+      try
+      {
+        if (command.equals("q"))
+        {
+          continue;
+        }
+        if (command.equals("v"))
+        {
+          validateJob();
+        }
+        else if (command.equals("s"))
+        {
+          submitJob();
+        }
+        else if (command.equals("l"))
+        {
+          listJobs();
+        }
+        else if (command.equals("d"))
+        {
+          deleteJob();
+        }
+        else if (command.equals("j"))
+        {
+          jobStatus();
+        }
+        else if (command.equals("r"))
+        {
+          retrieveResults();
+        }
+        else if (umbrella && command.equals("u"))
+        {
+          myClient = loginUser(app);
+          if (myClient == null)
+          {
+            break;
+          }
+        }
+        else if (command.equals("t"))
+        {
+          showTools();
+        }
+        else
+        {
+          System.out.println("invalid response: " + command);
+        }
+      } catch (CiCipresException ce)
+      {
+        ErrorData ed = ce.getErrorData();
+        System.out.println("Cipres error code=" + ed.code + ", message="
+                + ed.displayMessage);
+        if (ed.code == ErrorData.FORM_VALIDATION)
+        {
+          for (ParamError pe : ed.paramError)
+          {
+            System.out.println(pe.param + ": " + pe.error);
+          }
+        }
+        else if (ed.code == ErrorData.USAGE_LIMIT)
+        {
+          LimitStatus ls = ed.limitStatus;
+          System.out.println("Usage Limit Error, type=" + ls.type
+                  + ", ceiling=" + ls.ceiling);
+        }
+      } catch (Exception e)
+      {
+        System.out.println(e.toString());
+      }
+    }
+  }
+
+  private static void showTools() throws CiCipresException
+  {
+    Collection<ToolData> tools = myClient.listTools();
+    System.out.println("");
+    for (ToolData td : tools)
+    {
+      System.out.println(td.toolId + " : " + td.toolName);
+    }
+  }
+
+  private static void validateJob() throws CiCipresException
+  {
+    System.out.println("Sending a canned clustalw job for validation ...");
+    sendCannedJob("fakeName", true);
+  }
+
+  private static void submitJob() throws CiCipresException
+  {
+    System.out.println(
+            "Will submit an example clustalw job.  Enter a name for the job or enter a single 'n' to cancel");
+    entry = console.readLine();
+    if (entry.equals("n"))
+    {
+      return;
+    }
+    sendCannedJob(entry, false);
+  }
+
+  private static void sendCannedJob(String jobName, boolean validateOnly)
+          throws CiCipresException
+  {
+    Map<String, Collection<String>> vParams = new HashMap<>();
+    HashMap<String, String> inputParams = new HashMap<>();
+    HashMap<String, String> metadata = new HashMap<>();
+
+    vParams.put("runtime_", Arrays.asList(".2"));
+    vParams.put("hgapresidues_", Arrays.asList("A", "D"));
+    inputParams.put("infile_", fastaFile);
+
+    // See https://www.phylo.org/restusers/docs/guide.html#UseOptionalMetadata
+    // for list of available
+    // metadata keys.
+    metadata.put("statusEmail", "true");
+    metadata.put("clientJobName", jobName);
+
+    CiJob jobStatus;
+    if (validateOnly)
+    {
+      jobStatus = myClient.validateJob("CLUSTALW", vParams, inputParams,
+              metadata);
+    }
+    else
+    {
+      jobStatus = myClient.submitJob("CLUSTALW", vParams, inputParams,
+              metadata);
+    }
+    jobStatus.show(true);
+  }
+
+  private static void listJobs() throws CiCipresException
+  {
+
+    int count = 0;
+    Collection<CiJob> jobs = myClient.listJobs();
+    for (CiJob job : jobs)
+    {
+      count += 1;
+      System.out.print("\n" + count + ". ");
+      job.show(false);
+    }
+  }
+
+  private static void deleteJob() throws CiCipresException
+  {
+    System.out.println("Enter url of job to delete or n(no, cancel)");
+    entry = console.readLine();
+    if (!entry.startsWith("http"))
+    {
+      return;
+    }
+    CiJob job = myClient.getJob(entry);
+    job.delete();
+  }
+
+  private static void retrieveResults()
+          throws CiCipresException, IOException
+        {
+    boolean finalResults = true;
+    System.out.println("Enter url of job or n(no, cancel)");
+    entry = console.readLine();
+    if (!entry.startsWith("http"))
+    {
+      return;
+    }
+    CiJob job = myClient.getJob(entry);
+    if (job.isDone() == false)
+    {
+      System.out.println(
+              "Job is not finished. Enter y(yes, get working dir contents) or n(no, cancel)");
+      entry = console.readLine();
+      if (entry.equals("n"))
+      {
+        return;
+      }
+      else
+      {
+        finalResults = false;
+      }
+    }
+    Collection<CiResultFile> files = job.listResults(finalResults);
+    int count = 0;
+    for (CiResultFile file : files)
+    {
+      count = count + 1;
+      System.out.println(count + ". " + file.getName() + " ("
+              + file.getLength() + " bytes )");
+    }
+    System.out.println(
+            "Enter name of file to download or a(all) or n(no, cancel)");
+    entry = console.readLine();
+    boolean all = false;
+    if (entry.equals("a"))
+    {
+      all = true;
+    }
+    else if (entry.equals("n"))
+    {
+      return;
+    }
+    File directory = new File(new File("."), job.getJobHandle());
+    if (!directory.exists())
+    {
+      directory.mkdir();
+    }
+    for (CiResultFile file : files)
+    {
+      if (all == true || file.getName().equals(entry))
+      {
+        System.out.println("Downloading " + file.getName() + " to "
+                + directory.getAbsolutePath());
+        file.download(directory);
+      }
+    }
+        }
+
+  private static void jobStatus() throws CiCipresException
+        {
+    if (!umbrella)
+    {
+      System.out.println("Enter jobhandle or n(no, cancel)");
+      entry = console.readLine();
+      if (!entry.startsWith("NGBW"))
+      {
+        return;
+      }
+      CiJob job = myClient.getJobFromHandle(entry);
+      job.show(true);
+    }
+    else
+    {
+      /*
+              This shows how an umbrella app can get status of multiple jobs for multiple users in
+              a single call.  This is the only thing an umbrella app can do with a CiClient (see
+              adminClient below) that is configured without endUserHeaders.  Everything else must
+              be done for a specific end user with a CiClient configured for that user.
+              
+              An Umbrella app could also use the code above (in the !umbrella case) to get status of a 
+              single job, using a CiClient configured for the owner of the job. 
+      
+      */
+      System.out.println(
+              "Enter comma separated list of jobhandles or n(no, cancel)");
+      entry = console.readLine();
+      if (!entry.startsWith("NGBW"))
+      {
+        return;
+      }
+      String[] handles = entry.split(",");
+      ArrayList<String> handleList = new ArrayList<>(handles.length);
+      for (String handle : handles)
+      {
+        handleList.add(handle.trim());
+      }
+      // Collection<StatusData> jobList =
+      // adminClient.getMultipleJobStatus(handleList);
+      Collection<StatusData> jobList = myClient
+              .getMultipleJobStatus(handleList);
+      System.out.println("\n");
+      for (StatusData jobstatus : jobList)
+      {
+        String str = jobstatus.jobHandle + " ";
+        if (jobstatus.terminalStage == true)
+        {
+          if (jobstatus.failed == true)
+          {
+            str += " failed at stage " + jobstatus.jobStage;
+          }
+          else
+          {
+            str += " finished, results at " + jobstatus.resultsUri.url;
+          }
+        }
+        else
+        {
+          str += " is not finished, stage = " + jobstatus.jobStage;
+        }
+        System.out.println(str);
+      }
+    }
+        }
+
+  private static String copyResource(String name) throws IOException
+  {
+    InputStream is;
+
+    is = Example.class.getResourceAsStream("/" + name);
+    File dest = File.createTempFile("Example", ".txt");
+    dest.deleteOnExit();
+
+    CiResultFile.copyInputStreamToFile(is, dest);
+    return dest.getAbsolutePath();
+  }
+
+  private static CiClient loginUser(CiApplication app) throws Exception
+  {
+    Map<String, String> endUserHeaders = new HashMap<>();
+
+    System.out.println(
+            "\nEnter information about the current end user of this application.");
+    System.out.println("Enter username or q(quit)");
+    String username = console.readLine();
+    if (username.equals("q"))
+    {
+      return null;
+    }
+    System.out.println("Enter user's email address or q(quit)");
+    String email = console.readLine();
+    if (email.equals("q"))
+    {
+      return null;
+    }
+    System.out.println("Enter user's institution or q(quit)");
+    String institution = console.readLine();
+    if (institution.equals("q"))
+    {
+      return null;
+    }
+    System.out.println(
+            "Enter user's country code (must be 2 letters, both uppercase) or q(quit)");
+    String country = console.readLine();
+    if (country.equals("q"))
+    {
+      return null;
+    }
+    endUserHeaders.put("cipres-eu", username.trim());
+    endUserHeaders.put("cipres-eu-email", email.trim());
+    endUserHeaders.put("cipres-eu-institution", institution.trim());
+    endUserHeaders.put("cipres-eu-country", country.trim());
+    endUserHeaders.put("cipres-eu-email", email.trim());
+
+    log.debug(
+            "cipres-eu-email is " + endUserHeaders.get("cipres-eu-email"));
+    myClient = new CiClient(app.getAppKey(), app.getAppname(),
+            app.getUsername(), app.getPassword(), app.getRestUrl(),
+            endUserHeaders);
+    return myClient;
+  }
+
+}
+