package org.trianacode.shiwaall.converter;
import org.apache.commons.lang.ArrayUtils;
import org.trianacode.enactment.AddonUtils;
import org.trianacode.enactment.Exec;
import org.trianacode.enactment.addon.ConversionAddon;
import org.trianacode.enactment.io.IoConfiguration;
import org.trianacode.enactment.io.IoHandler;
import org.trianacode.enactment.io.IoMapping;
import org.trianacode.gui.action.ActionDisplayOptions;
import org.trianacode.gui.hci.ApplicationFrame;
import org.trianacode.gui.hci.GUIEnv;
import org.trianacode.shiwaall.dax.FileUnit;
import org.trianacode.shiwaall.extras.DaxUtils;
import org.trianacode.taskgraph.*;
import org.trianacode.taskgraph.imp.TaskFactoryImp;
import org.trianacode.taskgraph.imp.TaskImp;
import org.trianacode.taskgraph.proxy.ProxyInstantiationException;
import org.trianacode.taskgraph.ser.XMLWriter;
import org.trianacode.taskgraph.service.ClientException;
import org.trianacode.taskgraph.tool.Tool;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.*;
import java.util.ArrayList;
// TODO: Auto-generated Javadoc
/**
* Created by IntelliJ IDEA.
* User: Ian Harvey
* Date: 28/10/2011
* Time: 15:35
* To change this template use File | Settings | File Templates.
*/
public class ConvertWorkflowToDax extends AbstractAction implements ActionDisplayOptions, ConversionAddon {
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return getServiceName();
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.CLIaddon#getUsageString()
*/
@Override
public String getUsageString() {
return "";
}
/**
* Instantiates a new convert workflow to dax.
*/
public ConvertWorkflowToDax() {
this(DISPLAY_BOTH);
}
/**
* Instantiates a new convert workflow to dax.
*
* @param displayOption the display option
*/
public ConvertWorkflowToDax(int displayOption) {
putValue(SHORT_DESCRIPTION, "Convert");
putValue(NAME, "Convert to Dax");
if ((displayOption == DISPLAY_ICON) || (displayOption == DISPLAY_BOTH)) {
putValue(SMALL_ICON, GUIEnv.getIcon("cog.png"));
}
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent actionEvent) {
final ApplicationFrame frame = GUIEnv.getApplicationFrame();
final TaskGraph tg = frame.getSelectedTaskgraph();
if (tg == null || tg.getTasks(false).length == 0) {
JOptionPane.showMessageDialog(frame, "No taskgraph selected," +
" or currently selected taskgraph has no tasks");
} else {
convert(tg, "untitledDax.xml", null);
}
}
/**
* Convert.
*
* @param tg the tg
* @param daxFilePath the dax file path
* @param configFile the config file
*/
public void convert(final TaskGraph tg, final String daxFilePath, final File configFile) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
DaxifyTaskGraph converter = new DaxifyTaskGraph();
TaskGraph daxifiedTaskGraph = converter.convert(tg);
// CommandLinePegasus.initTaskgraph(daxifiedTaskGraph, daxFilePath, false);
GUIEnv.getApplicationFrame().addParentTaskGraphPanel((TaskGraph) daxifiedTaskGraph);
try {
GUIEnv.getApplicationFrame().getSelectedTrianaClient().run();
} catch (ClientException e) {
e.printStackTrace();
}
int errorNumber = runDaxCreatorWorkflow(daxifiedTaskGraph, configFile);
System.out.println(errorNumber);
} catch (Exception e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(runnable);
thread.run();
}
/**
* Run dax creator workflow.
*
* @param daxifiedTaskGraph the daxified task graph
* @param configFile the config file
* @return the int
* @throws IOException Signals that an I/O exception has occurred.
* @throws TaskGraphException the task graph exception
*/
private int runDaxCreatorWorkflow(Tool daxifiedTaskGraph, File configFile) throws IOException, TaskGraphException {
addInputsToDaxifiedTaskGraph((TaskGraph) daxifiedTaskGraph, configFile);
File file = saveTaskGraph((TaskGraph) daxifiedTaskGraph, daxifiedTaskGraph.getToolName());
ArrayList<String> optionsStrings = new ArrayList<String>();
optionsStrings.add("-n");
optionsStrings.add("-w");
optionsStrings.add(file.getAbsolutePath());
if (daxifiedTaskGraph.getDataInputNodeCount() > 0) {
configFile = DaxUtils.createDummyIOConfigFile((TaskGraph) daxifiedTaskGraph);
optionsStrings.add("-d");
optionsStrings.add(configFile.getAbsolutePath());
}
String[] args = new String[optionsStrings.size()];
for (int i = 0; i < optionsStrings.size(); i++) {
args[i] = optionsStrings.get(i);
}
System.out.println(ArrayUtils.toString(args));
int errorNumber = Exec.exec(args);
return errorNumber;
}
/**
* Adds the inputs to daxified task graph.
*
* @param daxifiedTaskGraph the daxified task graph
* @param conf the conf
* @throws IOException Signals that an I/O exception has occurred.
* @throws TaskGraphException the task graph exception
*/
private void addInputsToDaxifiedTaskGraph(TaskGraph daxifiedTaskGraph, File conf) throws IOException, TaskGraphException {
if (conf == null || !conf.exists()) {
} else {
IoHandler handler = new IoHandler();
IoConfiguration ioc = handler.deserialize(new FileInputStream(conf));
for (IoMapping mapping : ioc.getInputs()) {
System.out.println(mapping.getNodeName() + " has data "
+ mapping.getIoType().getType()
+ " : "
+ mapping.getIoType().getValue()
+ " reference : "
+ mapping.getIoType().isReference()
);
}
Node[] inputTaskNodes = new Node[daxifiedTaskGraph.getDataInputNodeCount()];
for (int i = 0; i < daxifiedTaskGraph.getDataInputNodeCount(); i++) {
Node taskgraphNode = daxifiedTaskGraph.getDataInputNode(i);
System.out.println(taskgraphNode.getNodeIndex() +
" " + taskgraphNode.getName() +
" " + taskgraphNode.getTopLevelNode().getName() +
" " + taskgraphNode.getBottomLevelNode().getName()
);
IoMapping mapping = ioc.getInputs().get(i);
if (!mapping.getIoType().isReference()) {
Node taskNode = taskgraphNode.getTopLevelNode();
inputTaskNodes[i] = taskNode;
}
}
for (int j = 0; j < inputTaskNodes.length; j++) {
if (j <= ioc.getInputs().size()) {
Node taskNode = inputTaskNodes[j];
taskNode.disconnect();
Task task = addFileUnit(null,
taskNode,
taskNode.getTask().getParent()
);
if (task != null) {
String url = ioc.getInputs().get(j).getIoType().getValue();
task.setParameter(FileUnit.FILE_URL, url);
task.setParameter(FileUnit.PHYSICAL_FILE, true);
System.out.println(task.getParameter(FileUnit.FILE_URL));
}
}
}
}
}
/**
* Adds the file unit.
*
* @param sendnode the sendnode
* @param recnode the recnode
* @param clone the clone
* @return the task
* @throws CableException the cable exception
*/
private Task addFileUnit(Node sendnode, Node recnode, TaskGraph clone) throws CableException {
Task fileTask = null;
Task task = null;
try {
fileTask = new TaskImp(
AddonUtils.makeTool(FileUnit.class, "" + Math.random() * 100, clone.getProperties()),
new TaskFactoryImp(),
false
);
task = clone.createTask(fileTask, false);
if (sendnode != null) {
Node inNode = task.addDataInputNode();
clone.connect(sendnode, inNode);
}
Node outNode = task.addDataOutputNode();
clone.connect(outNode, recnode);
} catch (TaskException e) {
e.printStackTrace();
} catch (ProxyInstantiationException e) {
e.printStackTrace();
}
return task;
}
/**
* Save task graph.
*
* @param daxifiedTaskGraph the daxified task graph
* @param tempFilePath the temp file path
* @return the file
*/
private File saveTaskGraph(TaskGraph daxifiedTaskGraph, String tempFilePath) {
File file = null;
try {
file = File.createTempFile(tempFilePath, ".txt");
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file));
XMLWriter writer = new XMLWriter(fileWriter);
writer.writeComponent(daxifiedTaskGraph);
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.ConversionAddon#toolToWorkflow(org.trianacode.taskgraph.tool.Tool)
*/
@Override
public Object toolToWorkflow(Tool tool) {
return null;
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.ConversionAddon#workflowToTool(java.lang.Object)
*/
@Override
public Tool workflowToTool(Object workflowObject) {
return null;
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.ConversionAddon#processWorkflow(org.trianacode.taskgraph.tool.Tool)
*/
@Override
public Tool processWorkflow(Tool workflow) {
return null;
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.ConversionAddon#toolToWorkflowFile(org.trianacode.taskgraph.tool.Tool, java.io.File, java.lang.String)
*/
@Override
public File toolToWorkflowFile(Tool tool, File configFile, String filePath) throws Exception {
// CommandLinePegasus.initTaskgraph((TaskGraph) tool, filePath, false);
runDaxCreatorWorkflow(tool, configFile);
return new File(filePath);
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.ConversionAddon#toolToWorkflowFileInputStream(org.trianacode.taskgraph.tool.Tool)
*/
@Override
public InputStream toolToWorkflowFileInputStream(Tool tool) {
try {
return new FileInputStream(toolToWorkflowFile(tool, null, File.createTempFile("tmp", "tmp").getAbsolutePath()));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.CLIaddon#getServiceName()
*/
@Override
public String getServiceName() {
return "Pegasus Dax";
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.CLIaddon#getLongOption()
*/
@Override
public String getLongOption() {
return "convert-dax";
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.CLIaddon#getShortOption()
*/
@Override
public String getShortOption() {
return "dax";
}
/* (non-Javadoc)
* @see org.trianacode.enactment.addon.CLIaddon#getDescription()
*/
@Override
public String getDescription() {
return "Converts a taskgraph formed of DaxFiles and DaxJobs to a Pegasus .dax file";
}
}