# HTCondor job submission script generated by Apache Airavata
<%

   def checkCommand = {items, prefix -> for (it in items) if (it.startsWith(prefix)) return it}

   if (executablePath != null && executablePath != "")  out.print 'executable = ' + executablePath + '\n'
   if (inputs != null && inputs.size() > 0)  out.print 'arguments = \"'
   if (inputs != null && inputs.size() > 0) for(input in inputs)  out.print input + ' '
   if (inputs != null && inputs.size() > 0)  out.print '\"\n'
   if (exports != null && exports.size() > 0)  out.print 'environment = '
   if (exports != null && exports.size() > 0) for(com in exports)  out.print com + ';'
   if (exports != null && exports.size() > 0)  out.print '\n'

   if (qualityOfService != null && qualityOfService != "")  out.print 'priority = ' + qualityOfService + '\n'
   if (cpuCount != null && cpuCount != "")  out.print 'request_cpus = ' + cpuCount + '\n'
   if (usedMem != null && usedMem != "")  out.print 'request_memory = ' + usedMem + '\n'
   if (mailAddress != null && mailAddress != "")  out.print 'notification = Always\nnotify_user = ' + mailAddress + '\n'

   if (workingDirectory != null && workingDirectory != "")  out.print 'initialdir = ' + workingDirectory + '\n'
   if (standardOutFile != null && standardOutFile != "")  out.print 'output = ' + standardOutFile + '\n'
   if (standardErrorFile != null && standardErrorFile != "")  out.print 'error = ' + standardErrorFile + '\n'
   out.print 'should_transfer_files = Yes\nwhen_to_transfer_output = ON_EXIT\n'
   if (inputFiles != null && inputFiles.size() > 0) out.print 'transfer_input_files = '
   if (inputFiles != null && inputFiles.size() > 0) for(file in inputFiles) out.print file + ', '
   def preJobInputs = checkCommand(preJobCommands, 'transfer_input_files =')
   if (preJobInputs) out.print preJobInputs.substring(22)

   if (inputFiles != null && inputFiles.size() > 0) out.print '\n'
   if (moduleCommands != null) for(mc in moduleCommands)  out.print mc +'\n'
   if (preJobCommands != null) for(pjc in preJobCommands)  if (!pjc.startsWith("transfer_input_files =")) out.print pjc +'\n'
   out.print 'queue\n'
   if (postJobCommands != null) for(pjc in postJobCommands)  out.print pjc +'\n'
%>
