package org.trianacode.shiwaall.bundle;
import org.shiwa.desktop.data.description.SHIWABundle;
import org.shiwa.desktop.data.description.bundle.BundleFile;
import org.shiwa.desktop.data.description.core.ExecutionMapping;
import org.shiwa.desktop.data.description.resource.ConfigurationResource;
import org.shiwa.desktop.data.description.resource.ReferableResource;
import org.shiwa.desktop.data.description.workflow.OutputPort;
import org.shiwa.desktop.data.util.DataUtils;
import org.shiwa.desktop.data.util.exception.SHIWADesktopIOException;
import org.trianacode.TrianaInstance;
import org.trianacode.enactment.Exec;
import org.trianacode.enactment.addon.CLIaddon;
import org.trianacode.shiwaall.executionServices.Unbundler;
import org.trianacode.taskgraph.TaskGraph;
import org.trianacode.taskgraph.TaskGraphException;
import org.trianacode.taskgraph.proxy.ProxyInstantiationException;
import org.trianacode.taskgraph.tool.Tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
// TODO: Auto-generated Javadoc
//import org.shiwa.desktop.data.description.core.Configuration;
/**
* Created by IntelliJ IDEA.
* User: Ian Harvey
* Date: 24/02/2012
* Time: 16:59
* To change this template use File | Settings | File Templates.
*/
public class TrianaBundle {
/**
* Execute bundle return file.
*
* @param shiwaBundle the shiwa bundle
* @param trianaArgs the triana args
* @return the file
* @throws SHIWADesktopIOException the sHIWA desktop io exception
*/
public File executeBundleReturnFile(SHIWABundle shiwaBundle, String[] trianaArgs) throws SHIWADesktopIOException {
// WorkflowController workflowController = null;
ShiwaBundleHelper shiwaBundleHelper = new ShiwaBundleHelper(shiwaBundle);
try {
// workflowController = new WorkflowController(shiwaBundle);
// for (Configuration configuration : workflowController.getConfigurations()) {
// if (configuration.getType() == Configuration.ConfigType.ENVIRONMENT_CONFIGURATION) {
// for (ConfigurationResource res : configuration.getResources()) {
//// res.getId()
//// workflowController.getWorkflowImplementation().getDependency()
//// res.getBundleFile().getBytes();
//// res.getReferableResource().
// }
// }
// }
TrianaInstance engine = null;
try {
engine = new TrianaInstance(trianaArgs);
engine.addExtensionClass(CLIaddon.class);
engine.init();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Unbundler unbundler = new Unbundler(shiwaBundleHelper);
File homeFolder = new File(System.getProperty("user.home"));
File runFolder = null;
if (homeFolder.exists()) {
runFolder = new File(homeFolder, getTimeStamp());
runFolder.mkdirs();
}
unbundler.setRuntimeOutputFolder(runFolder);
// shiwaBundleHelper.prepareLibraryDependencies();
Tool tool = null;
String dataLocation = null;
try {
shiwaBundleHelper.prepareEnvironmentDependencies();
tool = unbundler.getTool(engine, shiwaBundle);
dataLocation = unbundler.getConfigFile().getAbsolutePath();
unbundler.serializeOutputs((TaskGraph) tool);
} catch (IOException e) {
e.printStackTrace();
} catch (TaskGraphException e) {
e.printStackTrace();
} catch (ProxyInstantiationException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Exec exec = new Exec(null);
try {
exec.execute(tool, dataLocation);
} catch (Exception e) {
e.printStackTrace();
}
if (engine != null) {
engine.shutdown(-1);
}
ExecutionMapping execConfig = new ExecutionMapping();
ArrayList<ConfigurationResource> configurationResourceArrayList = new ArrayList<ConfigurationResource>();
ArrayList<File> outputs = unbundler.getOutputFiles();
ArrayList<OutputPort> outputPorts = new ArrayList<OutputPort>();
for (ReferableResource resource : shiwaBundleHelper.getWorkflowImplementation().getSignature().getPorts()) {
if (resource instanceof OutputPort) {
outputPorts.add((OutputPort) resource);
}
}
for (int i = 0; i < outputs.size(); i++) {
//TODO check name
ConfigurationResource configurationResource = new ConfigurationResource(outputPorts.get(i));
File outputFile = outputs.get(i);
System.out.println(outputFile.getAbsolutePath());
BundleFile bf = DataUtils.createBundleFile(outputFile, execConfig.getId() + "/");
bf.setType(BundleFile.FileType.DATA_FILE);
execConfig.getBundleFiles().add(bf);
configurationResource.setBundleFile(bf);
configurationResource.setRefType(ConfigurationResource.RefTypes.FILE_REF);
execConfig.addResourceRef(configurationResource);
configurationResourceArrayList.add(configurationResource);
}
execConfig.setResources(configurationResourceArrayList);
shiwaBundleHelper.getWorkflowImplementation().getAggregatedResources().add(execConfig);
File tempBundle = File.createTempFile("bundle", ".tmp");
System.out.println("Output bundle : " + tempBundle.getAbsolutePath());
File bundleFile = DataUtils.bundle(tempBundle, shiwaBundle.getAggregatedResource());
return bundleFile;
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
return null;
}
/**
* Execute bundle.
*
* @param shiwaBundle the shiwa bundle
* @param trianaArgs the triana args
* @return the byte[]
*/
public byte[] executeBundle(SHIWABundle shiwaBundle, String[] trianaArgs) {
try {
return getFileBytes(executeBundleReturnFile(shiwaBundle, trianaArgs));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Execute bundle return bundle.
*
* @param shiwaBundle the shiwa bundle
* @param trianaArgs the triana args
* @return the sHIWA bundle
*/
public SHIWABundle executeBundleReturnBundle(SHIWABundle shiwaBundle, String[] trianaArgs) {
try {
return new SHIWABundle(executeBundleReturnFile(shiwaBundle, trianaArgs));
} catch (SHIWADesktopIOException e) {
e.printStackTrace();
}
return null;
}
/**
* Gets the time stamp.
*
* @return the time stamp
*/
private static String getTimeStamp() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd_HH-mm-ss-SS_z");
return dateFormat.format(new Date());
}
/**
* Gets the file bytes.
*
* @param outfile the outfile
* @return the file bytes
* @throws Exception the exception
*/
public static byte[] getFileBytes(File outfile) throws Exception {
FileInputStream fis = new FileInputStream(outfile);
long length = outfile.length();
if (length > Integer.MAX_VALUE) {
// File is too large
throw new Exception("File too large");
}
// Create the byte array to hold the data
byte[] bytes = new byte[(int) length];
// Read in the bytes
int offset = 0;
int numRead;
while (offset < bytes.length
&& (numRead = fis.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + outfile.getName());
}
// Close the input stream and return bytes
fis.close();
//return bytes;
System.out.println(outfile.getPath());
return bytes;
}
/**
* The main method.
*
* @param args the arguments
* @throws Exception the exception
*/
public static void main(String[] args) throws Exception {
String filePath;
if (args.length > 0) {
filePath = args[0];
} else {
filePath = "C:\\Users\\Dave\\Desktop\\bundle2.zip";
}
File file = new File(filePath);
System.out.println(file.getAbsolutePath());
if (file.exists()) {
SHIWABundle shiwaBundle = new SHIWABundle(file);
byte[] bundleBytes = new TrianaBundle().executeBundle(shiwaBundle, new String[]{});
System.out.println(bundleBytes.length + " sized bundle returned.");
} else {
System.out.println("File not found");
}
// }
}
}