package net.sourceforge.seqware.pipeline.bundle;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import net.sourceforge.seqware.common.util.workflowtools.WorkflowInfo;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* <p>
* BundleInfo class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class BundleInfo {
private ArrayList<WorkflowInfo> workflows = new ArrayList<>();
private File metadata = null;
/**
* <p>
* parseFromFile.
* </p>
*
* @param metadata
* a {@link java.io.File} object.
*/
public void parseFromFile(File metadata) {
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(metadata);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("workflow");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String templatePath = null;
NodeList nodes = eElement.getElementsByTagName("workflow_template");
if (nodes.getLength() > 0) {
templatePath = nodes.item(0).getAttributes().getNamedItem("path").getNodeValue();
}
String classesPath = null;
if (null != eElement.getElementsByTagName("classes").item(0)) {
classesPath = eElement.getElementsByTagName("classes").item(0).getAttributes().getNamedItem("path").getNodeValue();
}
String configPath = eElement.getElementsByTagName("config").item(0).getAttributes().getNamedItem("path").getNodeValue();
String computeReq = eElement.getElementsByTagName("requirements").item(0).getAttributes().getNamedItem("compute")
.getNodeValue();
String memReq = eElement.getElementsByTagName("requirements").item(0).getAttributes().getNamedItem("memory")
.getNodeValue();
String networkReq = eElement.getElementsByTagName("requirements").item(0).getAttributes().getNamedItem("network")
.getNodeValue();
String workflowEngineReq = null;
if (null != eElement.getElementsByTagName("requirements").item(0).getAttributes().getNamedItem("workflow_engine")) {
workflowEngineReq = eElement.getElementsByTagName("requirements").item(0).getAttributes()
.getNamedItem("workflow_engine").getNodeValue();
}
String workflowTypeReq = null;
if (null != eElement.getElementsByTagName("requirements").item(0).getAttributes().getNamedItem("workflow_type")) {
workflowTypeReq = eElement.getElementsByTagName("requirements").item(0).getAttributes()
.getNamedItem("workflow_type").getNodeValue();
}
String workflowClass = null;
if (null != eElement.getElementsByTagName("workflow_class").item(0)) {
workflowClass = eElement.getElementsByTagName("workflow_class").item(0).getAttributes().getNamedItem("path")
.getNodeValue();
}
WorkflowInfo wi = new WorkflowInfo();
wi.setName(eElement.getAttribute("name"));
wi.setVersion(eElement.getAttribute("version"));
wi.setDescription(getTagValue("description", eElement));
wi.setTemplatePath(templatePath);
wi.setConfigPath(configPath);
wi.setComputeReq(computeReq);
wi.setMemReq(memReq);
wi.setNetworkReq(networkReq);
wi.setClassesDir(classesPath);
wi.setBaseDir(eElement.getAttribute("basedir"));
wi.setWorkflowSqwVersion(eElement.getAttribute("seqware_version"));
wi.setWorkflowClass(workflowClass);
wi.setWorkflowEngine(workflowEngineReq);
wi.setWorkflowType(workflowTypeReq);
workflows.add(wi);
this.metadata = metadata;
}
}
} catch (SAXException | IOException | ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public File parsedFrom() {
return metadata;
}
/**
* <p>
* getWorkflowInfo.
* </p>
*
* @return a {@link java.util.ArrayList} object.
*/
public ArrayList<WorkflowInfo> getWorkflowInfo() {
return workflows;
}
/**
* <p>
* Setter for the field <code>workflows</code>.
* </p>
*
* @param workflows
* a {@link java.util.ArrayList} object.
*/
public void setWorkflows(ArrayList<WorkflowInfo> workflows) {
this.workflows = workflows;
}
private static String getTagValue(String sTag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
}
}