package org.trianacode.shiwaall.handler;
import hu.sztaki.lpds.exceptions.FileImTeaPotException;
import hu.sztaki.lpds.jsdl_lib.Parser;
import org.ggf.schemas.jsdl._2005._11.jsdl.JobDefinitionType;
import org.shiwa.desktop.data.description.handler.TransferSignature;
import org.shiwa.desktop.data.description.workflow.Author;
import org.shiwa.desktop.data.transfer.FGITaskHandler;
import org.shiwa.desktop.data.transfer.FGIWorkflowEngineHandler;
import org.shiwa.desktop.data.transfer.IWIRTaskHandler;
import org.shiwa.fgi.iwir.*;
import org.shiwa.fgi.iwir.Task;
import org.trianacode.TrianaInstance;
import org.trianacode.config.Locations;
import org.trianacode.enactment.io.IoConfiguration;
import org.trianacode.enactment.io.IoHandler;
import org.trianacode.enactment.io.IoMapping;
import org.trianacode.enactment.io.IoType;
import org.trianacode.shiwaall.extras.FileBuilder;
import org.trianacode.shiwaall.iwir.execute.Executable;
import org.trianacode.shiwaall.iwir.execute.ExecutableNode;
import org.trianacode.shiwaall.iwir.importer.utils.ExportIwir;
import org.trianacode.taskgraph.*;
import org.trianacode.taskgraph.ser.Base64;
import org.trianacode.taskgraph.ser.DocumentHandler;
import org.trianacode.taskgraph.ser.TrianaObjectInputStream;
import org.trianacode.taskgraph.ser.XMLWriter;
import org.trianacode.taskgraph.tool.Tool;
import javax.xml.bind.JAXBException;
import java.io.*;
import java.net.URISyntaxException;
import java.util.*;
// TODO: Auto-generated Javadoc
/**
* Created by IntelliJ IDEA.
* User: Ian Harvey
* Date: 15/12/2011
* Time: 14:26
* To change this template use File | Settings | File Templates.
*/
public class TrianaIWIRHandler implements FGIWorkflowEngineHandler {
private static final String TRIANA_RUN_SCRIPT = "unzip-triana.sh";
/** The iwir. */
private IWIR iwir;
/** The image input stream. */
private InputStream imageInputStream;
/** The jsdls. */
private Map<String, FGITaskHandler> jsdls = null;
private TaskGraph taskgraph = null;
private HashMap<org.trianacode.taskgraph.Task, AbstractTask> taskHashMap = null;
//For internal testing
/**
* Instantiates a new triana iwir handler.
*/
private TrianaIWIRHandler(){}
/**
* Instantiates a new triana iwir handler.
*
* @param taskGraph the task graph
* @param trianaImage the triana image
*/
public TrianaIWIRHandler(TaskGraph taskGraph, InputStream trianaImage) {
try {
init(taskGraph);
this.taskgraph = taskGraph;
this.imageInputStream = getImageInputStream(trianaImage);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Gets the image input stream.
*
* @param trianaImage the triana image
* @return the image input stream
*/
private InputStream getImageInputStream(InputStream trianaImage){
InputStream image;
try{
// if dot isn't in default unix location, use the triana image.
File file = new File("/usr/local/bin/dot");
if(file.exists()){
File imageFile = iwir.getImage(file.getAbsolutePath(), "png", "");
// System.out.println("dot image " + imageFile.getAbsolutePath());
image = new FileInputStream(imageFile);
} else{
System.out.println("/usr/local/bin/dot not found");
throw new FileNotFoundException();
}
} catch (Exception e){
e.printStackTrace();
image = trianaImage;
}
return image;
}
/**
* Inits the IWIR Exporter, creates the IWIR from the taskgraph, and prepares JSDLs
*
* @param taskGraph the task graph
* @throws IOException Signals that an I/O exception has occurred.
*/
private void init(TaskGraph taskGraph) throws IOException {
ExportIwir exportIwir = new ExportIwir();
BlockScope blockscope = exportIwir.taskGraphToBlockScope(taskGraph);
taskHashMap = exportIwir.getTaskHashMap();
iwir = new IWIR(taskGraph.getToolName());
iwir.setTask(blockscope);
System.out.println(iwir.asXMLString());
// try {
// prepareJSDLs(iwir);
// } catch (JAXBException e) {
// e.printStackTrace();
// jsdls = null;
// }
}
/**
* The main method.
*
* @param args the arguments
* @throws IOException Signals that an I/O exception has occurred.
* @throws JAXBException the jAXB exception
* @throws FileImTeaPotException the file im tea pot exception
*/
public static void main(String[] args) throws IOException, JAXBException, FileImTeaPotException, TaskGraphException {
TrianaIWIRHandler trianaIWIRHandler = new TrianaIWIRHandler();
File file = new File("triana-app/dist/input_0");
// Object obj = new TrianaPixelMap(new ImageIcon("output.gif").getImage());
// trianaIWIRHandler.serial(obj, new FileOutputStream(file));
System.out.println(file.getAbsolutePath());
Serializable o = trianaIWIRHandler.unserial(new FileInputStream(file));
System.out.println(o.getClass().getCanonicalName());
}
private Serializable unserial(FileInputStream fileInputStream) throws TaskGraphException {
try {
byte[] bytes = Base64.decode(readAsString(fileInputStream));
ObjectInputStream in = new TrianaObjectInputStream(new ByteArrayInputStream(bytes));
return (Serializable) in.readObject();
}
catch (Exception e) {
e.printStackTrace();
throw new TaskGraphException(e);
}
}
public String readAsString(InputStream in) throws TaskGraphException {
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] bytes = new byte[8192];
int c;
while ((c = in.read(bytes)) != -1) {
bout.write(bytes, 0, c);
}
bout.flush();
bout.close();
return new String(bout.toByteArray());
} catch (IOException e) {
throw new TaskGraphException(e);
}
}
private void serial(Object serializable, OutputStream sink) throws TaskGraphException {
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream marshall = new ObjectOutputStream(bout);
marshall.writeObject(serializable);
String ret = Base64.encode(bout.toByteArray());
sink.write(ret.getBytes("UTF-8"));
marshall.close();
bout.close();
} catch (IOException e) {
throw new TaskGraphException(e);
}
}
/**
* An attempt to find the triana jars and libraries to add to a tasktype
* @return
*/
private ArrayList<File> findTrianaFiles() {
ArrayList<File> files = new ArrayList<File>();
File dist = null;
if(Locations.isJarred()){
try {
File jarFile = new File( TrianaInstance.class.getProtectionDomain()
.getCodeSource().getLocation().toURI());
System.out.println("triana jar : " + jarFile.getAbsolutePath());
// File trianaJar = new File(Locations.runHome().getAbsolutePath());
dist = new File(jarFile.getParent());
} catch (URISyntaxException e) {
e.printStackTrace();
}
} else {
File trianaFolder = new File(Locations.getHomeProper());
if(trianaFolder.exists() && trianaFolder.isDirectory()){
File trianaApp = new File(trianaFolder, "triana-app");
if(trianaApp.exists() && trianaApp.isDirectory()){
dist = new File(trianaApp, "dist");
// File trianaJar = new File(dist, TRIANA_JAR_NAME);
// if(trianaJar.exists()){
// files.add(trianaJar);
// trianaRootFolder = new File(trianaJar.getParent());
// }
}
}
}
if(dist != null && dist.exists() && dist.isDirectory()){
File untarTriana = new File(dist, "unzip-triana.sh");
if(untarTriana.exists() && untarTriana.isFile()){
files.add(untarTriana);
}
File disttar = new File(dist, "dist-tar");
if(disttar.exists() && disttar.isDirectory()){
File disttarFile = new File(disttar, "disttar.tar.bz2");
files.add(disttarFile);
}
} else {
return null;
}
// File singleFolderTrianaScript = new File(trianaRootFolder, TRIANA_RUN_SCRIPT);
// if(singleFolderTrianaScript.exists()){
// files.add(singleFolderTrianaScript);
// }
//
// File libFolder = new File(trianaRootFolder, "lib");
// if(libFolder.exists() && libFolder.isDirectory()){
//// files.add(trianaRootFolder);
// for(File lib : libFolder.listFiles()){
// File libWithParent = new File(libFolder, lib.getName());
// files.add(libWithParent);
// }
// }
// HashSet<File> taskFiles = new HashSet<File>();
// for(org.trianacode.taskgraph.Task task : TaskGraphUtils.getAllTasksRecursive(taskgraph, false)){
//
// JavaProxy javaProxy = (JavaProxy) task.getProxy();
// Class unitClass = javaProxy.getUnit().getClass();
//
// File clazzFile = null;
// try {
// clazzFile = new File( unitClass.getProtectionDomain()
// .getCodeSource().getLocation().toURI());
// } catch (URISyntaxException e) {
// e.printStackTrace();
// }
// if(clazzFile != null) {
// if(clazzFile.isFile()){
//
// System.out.println("task " + task.getToolName() +
// " tool " + task.getClass().getCanonicalName() +
// "triana toolbox jar : " + clazzFile.getAbsolutePath());
// taskFiles.add(clazzFile);
// } else {
// //TODO iterate through and grab all sub-folders/files and flatten
// }
// }
// files.addAll(taskFiles);
// System.out.println(Locations.getHomeProper()
// + "\n" + Locations.isJarred() + "\n" + Locations.runHome().getAbsolutePath() + "\n"
// );
// }
for (File file : files){
System.out.println(file.getAbsolutePath() + " " + file.exists() + "\n");
}
return files;
}
/**
* Prepare jsdls.
*
* @param iwir the iwir
* @throws JAXBException the jAXB exception
* @throws IOException Signals that an I/O exception has occurred.
*/
private void prepareJSDLs(IWIR iwir) throws JAXBException, IOException {
try {
jsdls = new HashMap<String, FGITaskHandler>();
ArrayList<File> trianaFiles = findTrianaFiles();
Set<String> tasktypes = iwir.getAtomicTaskTypes();
System.out.println(tasktypes);
for(String tasktype : tasktypes){
//for each tasktype, sort through the atomic tasks and create a jsdl for each
//TODO this is wrong, as need to check for similar signatures.
for(Task task : iwir.getAtomicTasks()){
if(task.getTasktype().equals(tasktype)){
HashSet<File> tasksFiles = new HashSet<File>();
Executable exec = null;
org.trianacode.taskgraph.Task trianaTask = getTaskForAtomicTask(task);
if (trianaTask.isParameterName(Executable.EXECUTABLE)) {
exec = (Executable) trianaTask.getParameter(Executable.EXECUTABLE);
File dir = exec.getWorkingDir();
if(dir.exists() && dir.isDirectory()) {
tasksFiles.addAll(exec.getWorkingDirFileWhichAreNotInputsOrOutputs());
}
} else {
tasksFiles.addAll(trianaFiles);
}
TaskGraph taskGraph = null;
taskGraph = TaskGraphManager.createTaskGraph();
taskGraph.setToolName(trianaTask.getToolName() + ".graph");
TaskGraphUtils.createTasks(new Tool[]{trianaTask}, taskGraph, false);
TaskLayoutUtils.resolveGroupNodes(taskGraph);
File taskFile = new File(taskGraph.getQualifiedToolName() + ".xml");
XMLWriter xmlWriter = new XMLWriter(new FileWriter(taskFile));
xmlWriter.writeComponent(taskGraph);
System.out.println("Wrote " + taskFile.getAbsolutePath());
tasksFiles.add(taskFile);
File ioConfig = createIOConfig(taskGraph);
tasksFiles.add(ioConfig);
String jobName = "triana.sh";
String executableFileName = TRIANA_RUN_SCRIPT;
String arguments = "-n -w " + taskFile.getName() + " -d " + ioConfig.getName();
if(exec != null){
arguments = exec.getArgsAsString();
executableFileName = exec.getPrimaryExec();
jobName = exec.getTaskName();
}
// TaskTypeToolDescriptor taskTypeToolDescriptor;
// if( (taskTypeToolDescriptor = TaskTypeRepo.getDescriptorFromType(tasktype)) != null){
// if((executable = taskTypeToolDescriptor.getExecutable()) != null){
// Collections.addAll(tasksFiles, executable.getWorkingDir().listFiles());
// }
// } else {
// }
IWIRTaskHandler iwirTaskHandler = new IWIRTaskHandler(task);
iwirTaskHandler.setFiles(tasksFiles);
Parser parser = new Parser();
JobDefinitionType jobDefinitionType = parser.readJSDLFromString(
createJSDLString(task, tasksFiles, jobName, executableFileName, arguments));
String jsdlXML = parser.getJSDLXML(jobDefinitionType);
System.out.println("\n\n" + jsdlXML);
File jsdlFile = new File(tasktype + ".jdsl");
new FileBuilder(jsdlFile.getAbsolutePath(), jsdlXML);
System.out.println("Created jsdl at " + jsdlFile.getAbsolutePath());
iwirTaskHandler.setDefinitionFile(jsdlFile);
jsdls.put(tasktype, iwirTaskHandler);
}
}
}
System.out.println(jsdls.keySet());
} catch (TaskGraphException e) {
e.printStackTrace();
jsdls = null;
}
}
private File createIOConfig(TaskGraph taskgraph) throws IOException {
ArrayList<IoMapping> inputMappings = new ArrayList<IoMapping>();
Node[] inputPorts = taskgraph.getDataInputNodes();
for (Node inputPort : inputPorts) {
boolean reference;
String type = "string";
String[] inputTypes = taskgraph.getDataInputTypes(inputPort.getAbsoluteNodeIndex());
if(inputTypes == null){
inputTypes = taskgraph.getDataInputTypes();
}
//TODO figure out references and types
if (Arrays.asList(inputTypes).contains("java.lang.String")) {
type = "string";
reference = false;
} else {
type = "java64";
reference = true;
}
// System.out.println("\n" +
// " to port " + inputPort.getName() +
// " portNumber " + inputPort.getAbsoluteNodeIndex() +
// " reference " + reference
// );
IoMapping ioMapping = new IoMapping(
new IoType("input_" + inputPort.getAbsoluteNodeIndex()
, type, reference),
"" + inputPort.getAbsoluteNodeIndex());
inputMappings.add(ioMapping);
}
Node[] outputNodes = taskgraph.getDataOutputNodes();
List<IoMapping> outputMappings = new ArrayList<IoMapping>();
for (Node outputNode : outputNodes) {
boolean reference;
String type = "string";
String[] outputTypes = taskgraph.getDataOutputTypes(outputNode.getAbsoluteNodeIndex());
if(outputTypes == null){
outputTypes = taskgraph.getDataOutputTypes();
}
//TODO figure out references and types
if (Arrays.asList(outputTypes).contains("java.lang.String")) {
type = "string";
reference = true;
} else {
type = "java64";
reference = true;
}
System.out.println("\n" +
" to port " + outputNode.getName() +
" portNumber " + outputNode.getAbsoluteNodeIndex() +
" reference " + reference
);
IoMapping ioMapping = new IoMapping(
new IoType("output_" + outputNode.getAbsoluteNodeIndex()
, type, reference),
"" + outputNode.getAbsoluteNodeIndex());
outputMappings.add(ioMapping);
}
IoConfiguration conf = new IoConfiguration(taskgraph.getQualifiedToolName(), "0.1", inputMappings, outputMappings);
DocumentHandler documentHandler = new DocumentHandler();
new IoHandler().serialize(documentHandler, conf);
File tempConfFile = File.createTempFile(conf.getToolName() + ".io_conf", ".dat");
documentHandler.output(new FileWriter(tempConfFile), true);
return tempConfFile;
}
private org.trianacode.taskgraph.Task getTaskForAtomicTask(Task task) {
for(org.trianacode.taskgraph.Task trianaTask : taskHashMap.keySet()){
AbstractTask atomicTask = taskHashMap.get(trianaTask);
// System.out.println("Comparing " + atomicTask.getUniqueId() +
// " with " + task.getUniqueId());
if(atomicTask.getUniqueId().equals(task.getUniqueId())){
return trianaTask;
}
}
return null;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.WorkflowEngineHandler#getEngineName(java.util.Set)
*/
@Override
public String getEngineName(Set<String> strings) {
return "Triana";
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.WorkflowEngineHandler#getEngineVersion()
*/
@Override
public String getEngineVersion() {
return "4.0";
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.WorkflowEngineHandler#getWorkflowLanguage(java.util.Set)
*/
@Override
public String getWorkflowLanguage(Set<String> strings) {
return "IWIR";
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getSignature()
*/
@Override
public TransferSignature getSignature() {
TransferSignature signature = new TransferSignature();
signature.setName(iwir.getWfname());
for (AbstractDataPort i : iwir.getTask().getAllInputPorts()) {
signature.addInput(i.getName(), i.getType().toString());
}
for (AbstractDataPort j : iwir.getTask().getAllOutputPorts()) {
signature.addInput(j.getName(), j.getType().toString());
}
return signature;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getDefinition()
*/
@Override
public InputStream getDefinition() {
try {
return new ByteArrayInputStream(iwir.asXMLString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getDefinitionName()
*/
@Override
public String getDefinitionName() {
return iwir.getWfname();
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.WorkflowEngineHandler#getDisplayImage()
*/
@Override
public InputStream getDisplayImage() {
return imageInputStream;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.WorkflowEngineHandler#getDisplayImageName()
*/
@Override
public String getDisplayImageName() {
return iwir.getWfname() + "-image.jpg";
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getAuthors()
*/
@Override
public List<Author> getAuthors() {
return null;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getDescription()
*/
@Override
public String getDescription() {
return null;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.TaskHandler#getVersion()
*/
@Override
public String getVersion() {
return null;
}
/* (non-Javadoc)
* @see org.shiwa.desktop.data.transfer.FGIWorkflowEngineHandler#getTaskHandlers()
*/
@Override
public Map<String, FGITaskHandler> getTaskHandlers() {
try {
prepareJSDLs(iwir);
} catch (Exception e) {
e.printStackTrace();
jsdls = null;
}
return jsdls;
}
private String createJSDLString(Task task, HashSet<File> files, String jobName, String executableFileName, String arguments){
StringBuilder jsdlBuilder = new StringBuilder();
jsdlBuilder.append(HEADER);
jsdlBuilder.append(createJobIdentification(jobName));
jsdlBuilder.append(createApplication(task.getTasktype(), executableFileName, arguments));
jsdlBuilder.append(RESOURCES);
jsdlBuilder.append(createAllInputDataStaging(task));
for(File file : files){
jsdlBuilder.append(createInputDataStaging(null, file.getName()));
}
jsdlBuilder.append(createAllOutputDataStaging(task));
jsdlBuilder.append(FOOTER);
return jsdlBuilder.toString();
}
private static String HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<JobDefinition xmlns=\"http://schemas.ggf.org/jsdl/2005/11/jsdl\" " +
"xmlns:ns2=\"http://schemas.ggf.org/jsdl/2005/11/jsdl-posix\" " +
"xmlns:ns3=\"extension.dci\" xmlns:ns4=\"uri:MBSchedulingDescriptionLanguage\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://schemas.ggf.org/jsdl/2005/11/jsdl\">\n" +
" <JobDescription>\n";
private String createJobIdentification(String jobName){
return " <JobIdentification>\n" +
" <JobName>" + jobName + "</JobName>\n" +
" <JobAnnotation>_PLACEHOLDER_JOBANNOTATION_</JobAnnotation>\n" +
" </JobIdentification>\n";
}
private String createApplication(String applicationName, String executableFileName, String arguments){
return " <Application>\n" +
" <ApplicationName>" + applicationName +"</ApplicationName>\n" +
" <ns2:POSIXApplication_Type>\n" +
" <ns2:Executable>" + executableFileName +"</ns2:Executable>\n" +
" <ns2:Argument>" + arguments + "</ns2:Argument>\n" +
" <ns2:Output>stdout.log</ns2:Output>\n" +
" <ns2:Error>stderr.log</ns2:Error>\n" +
" <ns2:UserName>_PLACEHOLDER_USERNAME_</ns2:UserName>\n" +
" <ns2:GroupName>_PLACEHOLDER_GROUP_</ns2:GroupName>\n" +
" </ns2:POSIXApplication_Type>\n" +
" </Application>\n";
}
private static String RESOURCES = " <Resources>\n" +
" <CandidateHosts>\n" +
" <HostName>_PLACEHOLDER_HOSTNAME_</HostName>\n" +
" <OperatingSystem>\n" +
" <OperatingSystemType>\n" +
" <OperatingSystemName>LINUX</OperatingSystemName>\n" +
" </OperatingSystemType>\n" +
" </OperatingSystem>" +
" </CandidateHosts>\n" +
" </Resources>\n";
private String createAllInputDataStaging(Task task){
StringBuilder inputDataStagings = new StringBuilder();
org.trianacode.taskgraph.Task trianaTask = getTaskForAtomicTask(task);
if (trianaTask.isParameterName(Executable.EXECUTABLE)) {
Executable exec = (Executable) trianaTask.getParameter(Executable.EXECUTABLE);
for(ExecutableNode executableNode : exec.getInputNodes()) {
executableNode.getFilename();
}
} else {
List<InputPort> inputPorts = task.getInputPorts();
for(int in = 0; in < inputPorts.size(); in++){
InputPort inputPort = inputPorts.get(in);
String portName = inputPort.getName();
String filename = "input_" + in;
inputDataStagings.append(createInputDataStaging(portName, filename));
}
}
return inputDataStagings.toString();
}
private String createInputDataStaging(String inputPortName, String inputFileName){
StringBuilder dataStaging = new StringBuilder();
dataStaging.append(" <DataStaging");
if(inputPortName != null){
dataStaging.append(" name=\"" + inputPortName +"\"");
}
dataStaging.append(">\n" +
" <FileName>" + inputFileName +"</FileName>\n" +
" <CreationFlag>overwrite</CreationFlag>\n" +
" <DeleteOnTermination>true</DeleteOnTermination>\n" +
" <Source>\n" +
" <URI>_PLACEHOLDER_SOURCEFILESERVER_</URI>\n" +
" </Source>\n" +
" </DataStaging>\n");
return dataStaging.toString();
}
private String createAllOutputDataStaging(Task task){
StringBuilder allOutputDataStagings = new StringBuilder();
List<OutputPort> outputPorts = task.getOutputPorts();
for(int out = 0; out < outputPorts.size(); out++){
OutputPort outputPort = outputPorts.get(out);
String portName = outputPort.getName();
String filename = "output_" + out;
// try {
// parser.AddOutputDataStaging(filename, Parser.PLACEHOLDER_TARGETURI);
// } catch (FileImTeaPotException e) {
// System.out.println("teapot error with " + filename);
// e.printStackTrace();
// }
// parser.ModifyDatastagingName(filename, portName);
allOutputDataStagings.append(createOutputDataStaging(portName, filename));
}
return allOutputDataStagings.toString();
}
private String createOutputDataStaging(String outputPortName, String outputFileName){
return "<DataStaging name=\"" + outputPortName + "\">\n" +
" <FileName>" + outputFileName + "</FileName>\n" +
" <CreationFlag>overwrite</CreationFlag>\n" +
" <DeleteOnTermination>true</DeleteOnTermination>\n" +
" <Target>\n" +
" <URI>_PLACEHOLDER_TARGETFILESERVER_</URI>\n" +
" </Target>\n" +
" </DataStaging>";
}
private static String FOOTER = " </JobDescription>\n" +
" <ns4:SDL_Type>\n" +
" <ns4:Constraints>\n" +
" <ns4:Middleware>\n" +
" <ns4:DCIName>_PLACEHOLDER_DCINAME_</ns4:DCIName>\n" +
" <ns4:MyProxy/>\n" +
" <ns4:ManagedResource>_PLACEHOLDER_RESOURCE_</ns4:ManagedResource>\n" +
" </ns4:Middleware>\n" +
" <ns4:Budget>0</ns4:Budget>\n" +
" </ns4:Constraints>\n" +
" </ns4:SDL_Type>\n" +
" <ns3:extension_type>\n" +
" <ns3:wfiservice>_PLACEHOLDER_STATUSSERVICE_</ns3:wfiservice>\n" +
" <ns3:proxyservice>_PLACEHOLDER_CREDENTIALPROVIDER_</ns3:proxyservice>\n" +
" </ns3:extension_type>\n" +
"</JobDefinition>";
/** The horrible jsd lhack. */
private static String horribleJSDLhack = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<JobDefinition xmlns=\"http://schemas.ggf.org/jsdl/2005/11/jsdl\" xmlns:ns2=\"http://schemas.ggf.org/jsdl/2005/11/jsdl-posix\" xmlns:ns3=\"extension.dci\" xmlns:ns4=\"uri:MBSchedulingDescriptionLanguage\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://schemas.ggf.org/jsdl/2005/11/jsdl\">\n" +
" <JobDescription>\n" +
" <JobIdentification>\n" +
" <JobName></JobName>\n" +
" <JobAnnotation>_PLACEHOLDER_JOBANNOTATION_</JobAnnotation>\n" +
" </JobIdentification>\n" +
" <Application>\n" +
" <ApplicationName></ApplicationName>\n" +
" <ns2:POSIXApplication_Type>\n" +
" <ns2:Executable></ns2:Executable>\n" +
" <ns2:Argument>-n -w</ns2:Argument>\n" +
" <ns2:Output>stdout.log</ns2:Output>\n" +
" <ns2:Error>stderr.log</ns2:Error>\n" +
" <ns2:UserName>_PLACEHOLDER_USERNAME_</ns2:UserName>\n" +
" <ns2:GroupName>_PLACEHOLDER_GROUP_</ns2:GroupName>\n" +
" </ns2:POSIXApplication_Type>\n" +
" </Application>\n" +
" <Resources>\n" +
" <CandidateHosts>\n" +
" <HostName>_PLACEHOLDER_HOSTNAME_</HostName>\n" +
" <OperatingSystem>\n" +
" <OperatingSystemType>\n" +
" <OperatingSystemName>LINUX</OperatingSystemName>\n" +
" </OperatingSystemType>\n" +
" </OperatingSystem>" +
" </CandidateHosts>\n" +
" </Resources>\n" +
" <DataStaging>\n" +
" <FileName>mirror.sh</FileName>\n" +
" <CreationFlag>overwrite</CreationFlag>\n" +
" <DeleteOnTermination>true</DeleteOnTermination>\n" +
" <Source>\n" +
" <URI>_PLACEHOLDER_SOURCEFILESERVER_</URI>\n" +
" </Source>\n" +
" </DataStaging>\n" +
" <DataStaging>\n" +
" <FileName>triana.jar</FileName>\n" +
" <CreationFlag>overwrite</CreationFlag>\n" +
" <DeleteOnTermination>true</DeleteOnTermination>\n" +
" <Source>\n" +
" <URI>_PLACEHOLDER_SOURCEFILESERVER_</URI>\n" +
" </Source>\n" +
" </DataStaging>\n" +
" </JobDescription>\n" +
" <ns4:SDL_Type>\n" +
" <ns4:Constraints>\n" +
" <ns4:Middleware>\n" +
" <ns4:DCIName>_PLACEHOLDER_DCINAME_</ns4:DCIName>\n" +
" <ns4:MyProxy/>\n" +
" <ns4:ManagedResource>_PLACEHOLDER_RESOURCE_</ns4:ManagedResource>\n" +
" </ns4:Middleware>\n" +
" <ns4:Budget>0</ns4:Budget>\n" +
" </ns4:Constraints>\n" +
" </ns4:SDL_Type>\n" +
" <ns3:extension_type>\n" +
" <ns3:wfiservice>_PLACEHOLDER_STATUSSERVICE_</ns3:wfiservice>\n" +
" <ns3:proxyservice>_PLACEHOLDER_CREDENTIALPROVIDER_</ns3:proxyservice>\n" +
" </ns3:extension_type>\n" +
"</JobDefinition>";
}