package org.trianacode.enactment; import org.trianacode.TrianaInstance; import org.trianacode.config.Locations; import org.trianacode.config.cl.ArgumentParsingException; import org.trianacode.config.cl.OptionValues; import org.trianacode.config.cl.OptionsHandler; import org.trianacode.config.cl.TrianaOptions; import org.trianacode.enactment.addon.CLIaddon; import org.trianacode.taskgraph.Node; import org.trianacode.taskgraph.TaskGraphException; import org.trianacode.taskgraph.databus.DataBus; import org.trianacode.taskgraph.databus.DataBusInterface; import org.trianacode.taskgraph.databus.DataNotResolvableException; import org.trianacode.taskgraph.databus.packet.WorkflowDataPacket; import org.trianacode.taskgraph.imp.ToolImp; import org.trianacode.taskgraph.proxy.ProxyInstantiationException; import org.trianacode.taskgraph.service.SchedulerException; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; /** * Created by IntelliJ IDEA. * User: Ian Harvey * Date: 10/11/2011 * Time: 18:28 * To change this template use File | Settings | File Templates. */ public class RunUnit { public RunUnit(String[] args) throws TaskGraphException, ClassNotFoundException, InterruptedException, IOException, ProxyInstantiationException, SchedulerException { String os = Locations.os(); String usage = "./triana.sh"; if (os.equals("windows")) { usage = "triana.bat"; } OptionsHandler parser = new OptionsHandler(usage, TrianaOptions.TRIANA_OPTIONS); OptionValues vals = null; try { vals = parser.parse(args); } catch (ArgumentParsingException e) { System.out.println(e.getMessage()); System.out.println(parser.usage()); System.exit(0); } TrianaInstance engine = new TrianaInstance(args); engine.addExtensionClass(CLIaddon.class); engine.init(); Thread.sleep(1000); ArrayList<String> unitArgs = (ArrayList<String>) vals.getOptionValues(TrianaOptions.RUN_UNIT.getShortOpt()); String className = unitArgs.get(0); if(className == null){ return; } String[] splitName = new String[]{ className.substring(0, className.lastIndexOf(".")), className.substring(className.lastIndexOf(".") + 1) }; System.out.println(splitName[0]); System.out.println(splitName[1]); ToolImp tool = AddonUtils.makeTool(splitName[1], splitName[0], "singleUnit", engine.getProperties()); // unitArgs.remove(0); // String[] params = unitArgs.toArray(new String[unitArgs.size()]); List<String> inputFiles = vals.getOptionValues(TrianaOptions.INPUT_FILES.getShortOpt()); tool.setDataInputNodeCount(inputFiles.size()); List<String> outputFiles = null; if (vals.hasOption(TrianaOptions.OUTPUT_FILES.getShortOpt())) { outputFiles = vals.getOptionValues(TrianaOptions.OUTPUT_FILES.getShortOpt()); tool.setDataOutputNodeCount(outputFiles.size()); } if(vals.hasOption(TrianaOptions.UNIT_PROPERTIES.getShortOpt())) { List<String> unitProperties = vals.getOptionValues(TrianaOptions.UNIT_PROPERTIES.getShortOpt()); if(unitProperties.size() > 0){ String propertiesLocation = unitProperties.get(0); File propertiesFile = new File(propertiesLocation); if(propertiesFile.exists()){ Properties properties = new Properties(); properties.loadFromXML(new FileInputStream(propertiesFile)); for(Object property : properties.keySet()){ tool.setParameter((String) property, properties.get(property)); } } } } TrianaRun runner = new TrianaRun(tool); runner.runTaskGraph(); for (int i = 0; i < inputFiles.size(); i++) { Object inputObject; File inputFile = new File(inputFiles.get(i)); if(inputFile.exists()){ try { inputObject = readSerialFile(inputFile); System.out.println("Serialised input : \n" + inputObject); } catch (Exception e) { inputObject = readNonSerialFile(inputFile); System.out.println("Raw text input : \n" + (String)inputObject); } runner.sendInputData(i, inputObject); } else { System.out.println("File " + inputFile.getName() + " not found. Exiting"); return; } } while (!runner.isFinished()) { synchronized (this) { try { wait(100); } catch (InterruptedException e) { } } } Node[] nodes = runner.getTaskGraph().getDataOutputNodes(); for (Node node : nodes) { Object out = runner.receiveOutputData(0); Object o = null; if (out instanceof WorkflowDataPacket) { try { DataBusInterface db = DataBus.getDataBus(((WorkflowDataPacket) out).getProtocol()); o = db.get((WorkflowDataPacket) out); if (outputFiles != null && outputFiles.get(node.getAbsoluteNodeIndex()) != null) { writeSerialFile(o, outputFiles.get(node.getAbsoluteNodeIndex())); } } catch (DataNotResolvableException e) { e.printStackTrace(); } } else { System.out.println("Not a workflowDataPacket"); } System.out.println("Exec.execute output node " + node.getName() + " data : " + o); } runner.dispose(); } private String readNonSerialFile(File inputFile) throws IOException { FileInputStream fileInputStream = new FileInputStream(inputFile); StringBuilder stringBuilder = new StringBuilder(); // byte[] in = new byte[128]; // int length = 0; // while ((length = fileInputStream.read(in)) > 0) { // stringBuilder.append(in.toString()); // } int content; while ((content = fileInputStream.read()) != -1) { // convert to char and display it // System.out.print("char " + (char) content); stringBuilder.append((char)content); } return stringBuilder.toString(); } private static Object readSerialFile(File file) throws IOException, ClassNotFoundException { FileInputStream fileInputStream = new FileInputStream(file); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); Object incomingObject = objectInputStream.readObject(); return incomingObject; } private static File writeSerialFile(Object object, String filePath) throws IOException { File file = new File(filePath); FileOutputStream fileOutputStream = new FileOutputStream(file); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(object); return file; } }