11package org .labkey .nextflow ;
22
3+ import lombok .Data ;
4+ import lombok .Getter ;
5+ import lombok .Setter ;
36import org .apache .commons .lang3 .StringUtils ;
47import org .apache .logging .log4j .Logger ;
58import org .labkey .api .action .ApiResponse ;
1518import org .labkey .api .pipeline .PipelineJob ;
1619import org .labkey .api .pipeline .PipelineService ;
1720import org .labkey .api .pipeline .PipelineStatusUrls ;
21+ import org .labkey .api .pipeline .browse .PipelinePathForm ;
1822import org .labkey .api .security .AdminConsoleAction ;
1923import org .labkey .api .security .RequiresPermission ;
2024import org .labkey .api .security .permissions .AdminOperationsPermission ;
2125import org .labkey .api .security .permissions .InsertPermission ;
2226import org .labkey .api .security .permissions .ReadPermission ;
2327import org .labkey .api .security .permissions .SiteAdminPermission ;
2428import org .labkey .api .util .Button ;
29+ import org .labkey .api .util .DOM ;
30+ import org .labkey .api .util .FileUtil ;
31+ import org .labkey .api .util .HtmlString ;
2532import org .labkey .api .util .PageFlowUtil ;
33+ import org .labkey .api .util .Path ;
2634import org .labkey .api .util .URLHelper ;
35+ import org .labkey .api .util .element .Select ;
2736import org .labkey .api .util .logging .LogHelper ;
2837import org .labkey .api .view .ActionURL ;
2938import org .labkey .api .view .HtmlView ;
3645import org .springframework .validation .Errors ;
3746import org .springframework .web .servlet .ModelAndView ;
3847
48+ import javax .swing .text .html .FormView ;
49+
50+ import java .io .File ;
51+ import java .nio .file .Paths ;
52+ import java .util .Arrays ;
53+ import java .util .List ;
54+
3955import static org .labkey .api .util .DOM .Attribute .checked ;
56+ import static org .labkey .api .util .DOM .Attribute .hidden ;
4057import static org .labkey .api .util .DOM .Attribute .method ;
4158import static org .labkey .api .util .DOM .Attribute .name ;
4259import static org .labkey .api .util .DOM .Attribute .type ;
4360import static org .labkey .api .util .DOM .Attribute .value ;
4461import static org .labkey .api .util .DOM .DIV ;
4562import static org .labkey .api .util .DOM .INPUT ;
63+ import static org .labkey .api .util .DOM .LI ;
4664import static org .labkey .api .util .DOM .LK .FORM ;
65+ import static org .labkey .api .util .DOM .UL ;
4766import static org .labkey .api .util .DOM .at ;
4867import static org .labkey .nextflow .NextFlowManager .NEXTFLOW_CONFIG ;
4968
@@ -245,11 +264,18 @@ public URLHelper getSuccessURL(EnabledForm o)
245264 }
246265 }
247266
267+ @ Getter @ Setter
268+ public static class AnalyzeForm extends PipelinePathForm
269+ {
270+ private boolean launch = false ;
271+ private String configFile ;
272+ }
273+
248274 @ RequiresPermission (AdminOperationsPermission .class )
249- public class NextFlowRunAction extends FormViewAction <Object >
275+ public class NextFlowRunAction extends FormViewAction <AnalyzeForm >
250276 {
251277 @ Override
252- public void validateCommand (Object o , Errors errors )
278+ public void validateCommand (AnalyzeForm o , Errors errors )
253279 {
254280 if (!NextFlowManager .get ().isEnabled (getContainer ()))
255281 {
@@ -258,26 +284,69 @@ public void validateCommand(Object o, Errors errors)
258284 }
259285
260286 @ Override
261- public ModelAndView getView (Object o , boolean b , BindException errors )
287+ public ModelAndView getView (AnalyzeForm o , boolean b , BindException errors )
262288 {
263- return new HtmlView ("NextFlow Runner" , DIV ("Run NextFlow Pipeline" ,
264- FORM (at (method , "POST" ),
265- new Button .ButtonBuilder ("Start NextFlow" ).submit (true ).build ())));
289+ NextFlowConfiguration config = NextFlowManager .get ().getConfiguration ();
290+ if (config .getNextFlowConfigFilePath () != null )
291+ {
292+ File configDir = new File (config .getNextFlowConfigFilePath ());
293+ if (configDir .isDirectory ())
294+ {
295+ File [] files = configDir .listFiles ();
296+ if (files != null && files .length > 0 )
297+ {
298+ List <File > configFiles = Arrays .asList (files );
299+ return new HtmlView ("NextFlow Runner" , DIV (
300+ FORM (at (method , "POST" ),
301+ INPUT (at (hidden , true , name , "launch" , value , true )),
302+ Arrays .stream (o .getFile ()).map (f -> INPUT (at (hidden , true , name , "file" , value , f ))).toList (),
303+ "Files: " ,
304+ UL (Arrays .stream (o .getFile ()).map (DOM ::LI )),
305+ "Config: " ,
306+ new Select .SelectBuilder ().name ("configFile" ).addOptions (configFiles .stream ().filter (f -> f .isFile () && f .getName ().toLowerCase ().endsWith (".config" )).map (File ::getName ).sorted (String .CASE_INSENSITIVE_ORDER ).toList ()).build (),
307+ new Button .ButtonBuilder ("Start NextFlow" ).submit (true ).build ())));
308+ }
309+ }
310+ }
311+ return new HtmlView (HtmlString .of ("Couldn't find NextFlow config file(s)" ));
266312 }
267313
268314 @ Override
269- public boolean handlePost (Object o , BindException errors ) throws Exception
315+ public boolean handlePost (AnalyzeForm form , BindException errors ) throws Exception
270316 {
271- ViewBackgroundInfo info = getViewBackgroundInfo ();
272- PipeRoot root = PipelineService .get ().findPipelineRoot (info .getContainer ());
273- PipelineJob job = new NextFlowPipelineJob (info , root );
274- PipelineService .get ().queueJob (job );
317+ if (!form .isLaunch ())
318+ {
319+ return false ;
320+ }
321+
322+ NextFlowConfiguration config = NextFlowManager .get ().getConfiguration ();
323+ File configDir = new File (config .getNextFlowConfigFilePath ());
324+ File configFile = FileUtil .appendPath (configDir , Path .parse (form .getConfigFile ()));
325+ if (!configFile .exists ())
326+ {
327+ errors .reject (ERROR_MSG , "Config file does not exist" );
328+ }
329+ else
330+ {
331+ List <File > inputFiles = form .getValidatedFiles (getContainer ());
332+ if (inputFiles .isEmpty ())
333+ {
334+ errors .reject (ERROR_MSG , "No input files" );
335+ }
336+ else
337+ {
338+ ViewBackgroundInfo info = getViewBackgroundInfo ();
339+ PipeRoot root = PipelineService .get ().findPipelineRoot (info .getContainer ());
340+ PipelineJob job = NextFlowPipelineJob .create (info , root , configFile .toPath (), inputFiles .stream ().map (File ::toPath ).toList ());
341+ PipelineService .get ().queueJob (job );
342+ }
343+ }
275344
276345 return !errors .hasErrors ();
277346 }
278347
279348 @ Override
280- public URLHelper getSuccessURL (Object o )
349+ public URLHelper getSuccessURL (AnalyzeForm o )
281350 {
282351 return PageFlowUtil .urlProvider (PipelineStatusUrls .class ).urlBegin (getContainer ());
283352 }
0 commit comments