1919
2020package org .commonwl .view .cwl ;
2121
22+ import java .io .IOException ;
23+ import java .nio .file .Path ;
24+ import java .util .Date ;
25+
2226import org .apache .jena .query .QueryException ;
27+ import org .commonwl .view .git .GitDetails ;
28+ import org .commonwl .view .git .GitSemaphore ;
29+ import org .commonwl .view .git .GitService ;
2330import org .commonwl .view .researchobject .ROBundleFactory ;
2431import org .commonwl .view .workflow .QueuedWorkflow ;
2532import org .commonwl .view .workflow .QueuedWorkflowRepository ;
2633import org .commonwl .view .workflow .Workflow ;
2734import org .commonwl .view .workflow .WorkflowRepository ;
35+ import org .eclipse .jgit .api .Git ;
2836import org .slf4j .Logger ;
2937import org .slf4j .LoggerFactory ;
3038import org .springframework .beans .factory .annotation .Autowired ;
3139import org .springframework .scheduling .annotation .Async ;
3240import org .springframework .scheduling .annotation .EnableAsync ;
3341import org .springframework .stereotype .Component ;
3442
35- import java .io .File ;
36- import java .io .IOException ;
37- import java .util .Date ;
38-
3943/**
4044 * Replace existing workflow with the one given by cwltool
4145 */
@@ -50,31 +54,38 @@ public class CWLToolRunner {
5054 private final CWLService cwlService ;
5155 private final ROBundleFactory roBundleFactory ;
5256 private final String cwlToolVersion ;
57+ private final GitSemaphore gitSemaphore ;
58+ private final GitService gitService ;
5359
5460 @ Autowired
55- public CWLToolRunner (WorkflowRepository workflowRepository ,
56- QueuedWorkflowRepository queuedWorkflowRepository ,
57- CWLService cwlService ,
58- CWLTool cwlTool ,
59- ROBundleFactory roBundleFactory ) {
61+ public CWLToolRunner (WorkflowRepository workflowRepository , QueuedWorkflowRepository queuedWorkflowRepository ,
62+ CWLService cwlService , CWLTool cwlTool , ROBundleFactory roBundleFactory , GitSemaphore gitSemaphore ,
63+ GitService gitService ) {
6064 this .workflowRepository = workflowRepository ;
6165 this .queuedWorkflowRepository = queuedWorkflowRepository ;
6266 this .cwlService = cwlService ;
6367 this .cwlToolVersion = cwlTool .getVersion ();
6468 this .roBundleFactory = roBundleFactory ;
69+ this .gitSemaphore = gitSemaphore ;
70+ this .gitService = gitService ;
6571 }
6672
6773 @ Async
68- public void createWorkflowFromQueued (QueuedWorkflow queuedWorkflow , File workflowFile )
74+ public void createWorkflowFromQueued (QueuedWorkflow queuedWorkflow )
6975 throws IOException , InterruptedException {
7076
7177 Workflow tempWorkflow = queuedWorkflow .getTempRepresentation ();
72-
78+ GitDetails gitInfo = tempWorkflow .getRetrievedFrom ();
79+ final String repoUrl = gitInfo .getRepoUrl ();
7380 // Parse using cwltool and replace in database
7481 try {
82+ boolean safeToAccess = gitSemaphore .acquire (repoUrl );
83+ Git repo = gitService .getRepository (gitInfo , safeToAccess );
84+ Path localPath = repo .getRepository ().getWorkTree ().toPath ();
85+ Path workflowFile = localPath .resolve (gitInfo .getPath ()).normalize ().toAbsolutePath ();
7586 Workflow newWorkflow = cwlService .parseWorkflowWithCwltool (
7687 tempWorkflow ,
77- workflowFile );
88+ workflowFile . toFile () );
7889
7990 // Success
8091 newWorkflow .setRetrievedFrom (tempWorkflow .getRetrievedFrom ());
@@ -105,6 +116,7 @@ public void createWorkflowFromQueued(QueuedWorkflow queuedWorkflow, File workflo
105116 "error occurred in CWLViewer!\n " +
106117 "Help us by reporting it on Gitter or a Github issue\n " );
107118 } finally {
119+ gitSemaphore .release (repoUrl );
108120 queuedWorkflowRepository .save (queuedWorkflow );
109121 }
110122
0 commit comments