From b7dca7564f78d231297a4d8be3fbea90cd572a14 Mon Sep 17 00:00:00 2001 From: kjvdheide Date: Fri, 19 Jan 2018 16:19:27 +0000 Subject: [PATCH] JAL-2890 proper .jar this time and copied cipres' example class --- lib/cipres_rest_client-jar-with-dependencies.jar | Bin 3359129 -> 3386297 bytes src/jalview/ext/cipres/CipresExample.java | 461 ++++++++++++++++++++++ 2 files changed, 461 insertions(+) create mode 100644 src/jalview/ext/cipres/CipresExample.java diff --git a/lib/cipres_rest_client-jar-with-dependencies.jar b/lib/cipres_rest_client-jar-with-dependencies.jar index 832bd9a2584d23c5ad43a1354e28351725290bcb..32b4b31117a8d4df9bf86e5c9be22787c45bff41 100644 GIT binary patch delta 28784 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 F{vT3!0M-Bi delta 1651 zcmY+EXH?T?6o(VS2nj1B5Wc0;H%YLs}r%1PZnS0n=Bi6lIlv zMUX0rlc6j@KtyYyF{lItB?TNsRH%w&XcUSar}m!n+;i@S`#bl3dD@2i(T7D6v>MwF zqliO&D7>IZji!JT<|TJV@^+27Xe~{n-e^`hZjZKbY!RhkNps$<3I_LUKWjfWj@#!Z{(~A~ zPQQ{oB{Ytva*N|_QbbDVn6Y&knVA_K=EP3fZ+NIGs8Z?MnwW4XeWrTwJ8>muQ#<8MhMZXm(mf<#wt=8-2N^ zpB#>^6?&!UL2PT2-4ScoS2Dr9w9hB@`Ox%Y`8Ow|<;lI4<&KXMa@IF?77U&bn0T8Q zlYbl)t6<$CZVvA8U^*OSn8}Er8vZ`QF~}k+POW>l)k#(LYgu))di}6*k(gwC(J7vZ zO$?uu6Z)6<&9^mlE!SSJmyz=uq6UkeaU=Crg`{p`=#0*CS=@`eC4o#%OUKq$Od`5A zXKj`j?k>I>4vlB)E@}1a&N%4Pe&@*zot=ut>Jnb#&-k0M0(QpmesStqdQD(C_d80y z4e_f9-|>BxHMQcwbnw;fIxTC3@?EXv9zqWFP~>ExgHxdN>fVl<&fv+5>li@uEDm|brqU#UIlmEthI1b3gvAc z78mo2-|vjt8Xr4zWMB4ew}uzhU88UObw^sByZ9*9?%xnq6Y*^vWx&Sk%jsqg(q6bPw;C1ws$B4eusg_t@ZeNt8@5WE={Gw53$@Aq`O$}a1+Gs{ zZm0C(#aRUV{xbJRHiiD)+DY8|ZoIpg2}@R=>&DcG-NCMXp_|4lnHS$ONyDj^)7S5r z3glE@c;72C2;DsULPBJTHb^tC6-fpwXG)~G{ov^>_UnteI&{tt`OQ-W4gG43!W2wZ z?Nw?(d&Zfs76j8xmHOprtme1@!{yCMM)JPk%GbWR?!77K1?uW&R()fGfn5>vv(ha# z>pjEX4Ptlr%$kW_CM>)5sEF<>HJ{r%HRS!gXM}jSNqJLRNLF@uQ)5Ku!*?Zh09^dP>*t?CHu(Nac7Gh*Mawqt_|3qb#db;hQ6Wx=4j65C?ac16cX)OGVH^9yd zDUe({b;}i4bqOx53yNA`ar49Gwp^b(Dea7&@$|m=WEu6ZF0m-wij-b0xp0wVC5#~9 z6|;stpYKyMntsL}k;r@7Bh88ro)4d2czdv(!o7F;B~FYca>9qV1WW|tcB7edBXhhQ z{?}dxFQ=_X?YVgqA|J$7*fQ!C=eJEd`(+&KC`r70Jo$$F-ErU4OnegGlkJCAAYuMB zHSqsS+5a?E6tb(7@xk4BWu=T299D2#!Kt;Z6sQsu@B*ahEHK3EpfiwQ8iRtUA7T&@ z*;$}w`hSU{P);8OpU6G?(Skm*bc}(+ee^l|9MHu?+y9qIMr0)noG#l>N%=zz1xLZf MXe**j8H|rp!T + * 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. + *

+ * 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. + *

+ */ +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 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> vParams = new HashMap<>(); + HashMap inputParams = new HashMap<>(); + HashMap 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 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 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 handleList = new ArrayList<>(handles.length); + for (String handle : handles) + { + handleList.add(handle.trim()); + } + // Collection jobList = + // adminClient.getMultipleJobStatus(handleList); + Collection 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 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; + } + +} + -- 1.7.10.2