}
if (node.getOutputPorts().size() != 1) {
throw new GraphException("Number of out ports in WS node " + node.getName() + "is invalid:"
+ node.getOutputPorts().size());
}
DataPort outputPort = node.getOutputPort(0);
WSComponent component = node.getComponent();
String inputPartName = component.getInputPartName();
String inputTypeName = component.getInputTypeName();
XmlElement complexType = extensions.addElement(scuflNS, "complextype");
complexType.addAttribute("optional", "false");
complexType.addAttribute("unbounded", "false");
complexType.addAttribute("typename", inputTypeName);
String spliterName = inputPartName;
complexType.addAttribute("name", spliterName);
complexType.addAttribute("qname", inputName.toString());
XmlElement element = complexType.addElement(scuflNS, "elements");
for (DataPort port : inputPorts) {
if ("http://www.w3.org/2001/XMLSchema".equals(port.getType().getNamespaceURI())) {
XmlElement baseType = element.addElement(scuflNS, "basetype");
baseType.addAttribute("optional", "false");
baseType.addAttribute("unbounded", "false");
baseType.addAttribute("typename", port.getType().getLocalPart());
baseType.addAttribute("name", port.getName());
baseType.addAttribute("qname", inputTypeName + ">" + port.getName());
}
// all the sources are written here
// the links from input nodes to the spiters are done here
// links from the from node output splitter to the this service's
// inputsplitter is done here
if (port.getFromNode() instanceof InputNode) {
XmlElement source = builder.newFragment(scuflNS, "source");
source.addAttribute("name", port.getFromNode().getID());
if (!sourceExist(port.getFromNode().getID())) {
this.sources.put(port.getFromNode().getID(), source);
}
XmlElement link = builder.newFragment(scuflNS, "link");
link.addAttribute("source", port.getFromNode().getID());
link.addAttribute("sink", getValidName(node) + "InputMessagePartXML:" + port.getName());
this.links.add(link);
} else if (port.getFromNode() instanceof WSNode) {
XmlElement link = builder.newFragment(scuflNS, "link");
if (port.getFromNode().getOutputPorts().size() != 1) {
throw new GraphException("Number of out ports in from WS node " + port.getFromNode().getName()
+ "is invalid:" + node.getOutputPorts().size());
}
link.addAttribute("source", getValidName((WSNode) port.getFromNode()) + "OutputMessagePartXML:"
+ port.getFromNode().getOutputPort(0).getName());
link.addAttribute("sink", getValidName(node) + "InputMessagePartXML:" + port.getName());
this.links.add(link);
} else {
throw new GraphException("Unhandled from node type:" + port.getFromNode() + " for node"
+ node.getName());
}
}
// link from the spliter to the service
XmlElement link = builder.newFragment(scuflNS, "link");
link.addAttribute("source", getValidName(node) + "InputMessagePartXML:output");
link.addAttribute("sink", getValidName(node) + ":" + spliterName);
this.links.add(link);
// link from service out to the ouput spliter
link = builder.newFragment(scuflNS, "link");
link.addAttribute("source", getValidName(node) + ":" + node.getComponent().getOutputPartName());
link.addAttribute("sink", getValidName(node) + "OutputMessagePartXML:input");
this.links.add(link);
// /outspiltor
XmlElement outProcessor = scufl.addElement(scuflNS, "processor");
outProcessor.addAttribute("name", getValidName(node) + "OutputMessagePartXML");
XmlElement outLocal = outProcessor.addElement(scuflNS, "local");
outLocal.addChild(0, "org.embl.ebi.escience.scuflworkers.java.XMLOutputSplitter");
XmlElement outExtensions = outLocal.addElement(scuflNS, "extensions");
XmlElement outComplextype = outExtensions.addElement(scuflNS, "complextype");
outComplextype.addAttribute("optional", "false");
outComplextype.addAttribute("unbounded", "false");
outComplextype.addAttribute("typename", component.getOutputTypeName());
outComplextype.addAttribute("name", component.getOutputPartName());
QName outputName = getOutputElementName(node);
if (null == outputName) {
throw new GraphException("No Valid output type found for WS Node" + node.getName());
}
outComplextype.addAttribute("qname", outputName.toString());
XmlElement elements = outComplextype.addElement(scuflNS, "elements");
XmlElement outBaseType = elements.addElement(scuflNS, "basetype");
outBaseType.addAttribute("optional", "false");
outBaseType.addAttribute("unbounded", "false");
outBaseType.addAttribute("typename", outputPort.getType().getLocalPart());
String Z = component.getOutputPort(0).getName();
outBaseType.addAttribute("name", Z);
outBaseType.addAttribute("qname", component.getOutputTypeName() + ">" + Z);
List<DataPort> outputPorts = node.getOutputPorts();
for (DataPort port : outputPorts) {
List<Node> toNodes = port.getToNodes();
for (Node toNode : toNodes) {
if (toNode instanceof OutputNode) {
if ("http://www.w3.org/2001/XMLSchema".equals(port.getType().getNamespaceURI())) {
XmlElement sink = builder.newFragment(scuflNS, "sink");
sink.addAttribute("name", toNode.getID());
sinks.add(sink);
link = builder.newFragment(scuflNS, "link");
link.addAttribute("source", getValidName(node) + "OutputMessagePartXML:" + outputPort.getName());
link.addAttribute("sink", toNode.getID());
this.links.add(link);
}
}
}