@@ -22,6 +22,7 @@ import services._
2222
2323import scala .collection .mutable .ListBuffer
2424import scala .concurrent .Future
25+ import scala .util .parsing .json .JSONObject
2526
2627
2728/**
@@ -585,6 +586,81 @@ class Extractions @Inject()(
585586 }
586587 }
587588
589+ def submitFilesToExtractor (ds_id : UUID , file_ids : String )= PermissionAction (Permission .EditDataset , Some (ResourceRef (ResourceRef .dataset,
590+ ds_id)))(parse.json) { implicit request =>
591+ current.plugin[RabbitmqPlugin ] match {
592+ case Some (p) => {
593+ var results = Map [String , String ]()
594+ files.get(file_ids.split(" ," ).map(fid => UUID (fid)).toList).found.foreach(fi => {
595+ createFileSubmission(request, fi) match {
596+ case Some (jobid) => results += (fi.id.stringify -> jobid.stringify)
597+ case None => Logger .error(" File not submitted: " + fi.id)
598+ }
599+ })
600+ Ok (Json .obj(" status" -> " success" , " jobs" -> results))
601+ }
602+ case None =>
603+ Ok (Json .obj(" status" -> " error" , " msg" -> " RabbitmqPlugin disabled" ))
604+ }
605+ }
606+
607+ private def createFileSubmission (request : UserRequest [JsValue ], file : File ): Option [UUID ] = {
608+ current.plugin[RabbitmqPlugin ] match {
609+ case Some (p) => {
610+ val id = file.id
611+ val fileType = file.contentType
612+ val idAndFlags = " "
613+
614+ // check that the file is ready for processing
615+ if (file.status.equals(models.FileStatus .PROCESSED .toString)) {
616+ // parameters for execution
617+ val parameters = (request.body \ " parameters" ).asOpt[JsObject ].getOrElse(JsObject (Seq .empty[(String , JsValue )]))
618+
619+ // Log request
620+ val clientIP = request.remoteAddress
621+ val serverIP = request.host
622+ dtsrequests.insertRequest(serverIP, clientIP, file.filename, id, fileType, file.length, file.uploadDate)
623+
624+ val extra = Map (" filename" -> file.filename,
625+ " parameters" -> parameters,
626+ " action" -> " manual-submission" )
627+ val showPreviews = file.showPreviews
628+
629+ val newFlags = if (showPreviews.equals(" FileLevel" ))
630+ idAndFlags + " +filelevelshowpreviews"
631+ else if (showPreviews.equals(" None" ))
632+ idAndFlags + " +nopreviews"
633+ else
634+ idAndFlags
635+
636+ val originalId = if (! file.isIntermediate) {
637+ file.id.toString()
638+ } else {
639+ idAndFlags
640+ }
641+
642+ var datasetId : UUID = null
643+ // search datasets containning this file, either directly under dataset or indirectly.
644+ val datasetslists : List [Dataset ] = datasets.findByFileIdAllContain(file.id)
645+ // Note, we assume only at most one dataset will contain a given file.
646+ if (0 != datasetslists.length) {
647+ datasetId = datasetslists.head.id
648+ }
649+ // if extractor_id is not specified default to execution of all extractors matching mime type
650+ (request.body \ " extractor" ).asOpt[String ] match {
651+ case Some (extractorId) => p.submitFileManually(new UUID (originalId), file, Utils .baseUrl(request), extractorId, extra,
652+ datasetId, newFlags, request.apiKey, request.user)
653+ case None => p.fileCreated(file, None , Utils .baseUrl(request), request.apiKey)
654+ }
655+ } else None
656+ }
657+ case None => {
658+ Logger .error(" RabbitMQ disabled." )
659+ None
660+ }
661+ }
662+ }
663+
588664 def submitDatasetToExtractor (ds_id : UUID ) = PermissionAction (Permission .EditDataset , Some (ResourceRef (ResourceRef .dataset,
589665 ds_id)))(parse.json) { implicit request =>
590666 Logger .debug(s " Submitting dataset for extraction with body $request.body " )
0 commit comments