in taverna-wsdl-activity-ui/src/main/java/org/apache/taverna/activities/wsdl/actions/AddXMLSplitterEdit.java [87:290]
public Workflow doEdit() throws EditException {
if (applied) {
throw new EditException("Edit has already been applied!");
}
Activity splitter = null;
Configuration splitterConfiguration = null;
String sourcePortName = "";
Processor sourceProcessor = null;
String sinkPortName = "";
Processor sinkProcessor = null;
Processor activityProcessor = null;
List<ProcessorBinding> processorBindingsToActivity = scufl2Tools
.processorBindingsToActivity(activity);
for (ProcessorBinding processorBinding : processorBindingsToActivity) {
activityProcessor = processorBinding.getBoundProcessor();
break;
}
if (activityProcessor == null) {
throw new EditException("Cannot find the processor that the activity belongs to");
}
String displayName = portName;
if (portName.equals("parameters")) {
displayName = isInput ? "input" : "output";
}
String processorName = activityProcessor.getName();
String candidateName;
if (displayName.startsWith(processorName)) {
// No need to make GetRequest_GetRequestResponse
candidateName = displayName;
} else {
// Combine with processor name
String displayProcessorName;
if (activity.getType().equals(INPUT_SPLITTER_TYPE)
|| activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
// For splitters on splitters - avoid adding up blah_bluh_blih_more_stuff
String[] processorNameSplit = processorName.replace("_input", "")
.replace("_output", "").split("_");
displayProcessorName = processorNameSplit[processorNameSplit.length - 1];
} else {
displayProcessorName = activityProcessor.getName();
}
candidateName = displayProcessorName + "_" + displayName;
}
Processor splitterProcessor = new Processor();
splitterProcessor.setName(candidateName);
CrossProduct crossProduct = new CrossProduct();
crossProduct.setParent(splitterProcessor.getIterationStrategyStack());
ProcessorBinding processorBinding = new ProcessorBinding();
processorBinding.setBoundProcessor(splitterProcessor);
try {
if (activity.getType().equals(INPUT_SPLITTER_TYPE)) {
if (!isInput) {
throw new EditException(
"Can only add an input splitter to another input splitter");
}
if (typeDescriptor instanceof ArrayTypeDescriptor
&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
}
Element element = XMLSplitterSerialisationHelper
.typeDescriptorToExtensionXML(typeDescriptor);
// String wrappedType = new XMLOutputter().outputString(element);
splitter = new Activity();
splitter.setType(INPUT_SPLITTER_TYPE);
splitterConfiguration = new Configuration();
splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
splitterConfiguration.setConfigures(splitter);
// ((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
splitterConfiguration.setJson(bean);
XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
processorBinding);
} else if (activity.getType().equals(OUTPUT_SPLITTER_TYPE)) {
if (isInput) {
throw new EditException(
"Can only add an output splitter to another output splitter");
}
if (typeDescriptor instanceof ArrayTypeDescriptor
&& !((ArrayTypeDescriptor) typeDescriptor).isWrapped()) {
typeDescriptor = ((ArrayTypeDescriptor) typeDescriptor).getElementType();
}
Element element = XMLSplitterSerialisationHelper
.typeDescriptorToExtensionXML(typeDescriptor);
// String wrappedType = new XMLOutputter().outputString(element);
splitter = new Activity();
splitter.setType(OUTPUT_SPLITTER_TYPE);
splitterConfiguration = new Configuration();
splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
splitterConfiguration.setConfigures(splitter);
// ((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
splitterConfiguration.setJson(bean);
XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
processorBinding);
} else if (activity.getType().equals(WSDLServiceDescription.ACTIVITY_TYPE)) {
if (isInput) {
Element element = XMLSplitterSerialisationHelper
.typeDescriptorToExtensionXML(typeDescriptor);
// String wrappedType = new XMLOutputter().outputString(element);
splitter = new Activity();
splitter.setType(WSDLServiceDescription.INPUT_SPLITTER_TYPE);
splitterConfiguration = new Configuration();
splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
splitterConfiguration.setConfigures(splitter);
// ((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForInput(element);
splitterConfiguration.setJson(bean);
XMLSplitterPortBuilder.addPortsForInput(element, splitter, splitterProcessor,
processorBinding);
} else {
Element element = XMLSplitterSerialisationHelper
.typeDescriptorToExtensionXML(typeDescriptor);
// String wrappedType = new XMLOutputter().outputString(element);
splitter = new Activity();
splitter.setType(WSDLServiceDescription.OUTPUT_SPLITTER_TYPE);
splitterConfiguration = new Configuration();
splitterConfiguration.setType(SPLITTER_CONFIG_TYPE);
splitterConfiguration.setConfigures(splitter);
// ((ObjectNode) splitterConfiguration.getJson()).put("wrappedType", wrappedType);
JsonNode bean = XMLSplitterConfigurationBeanBuilder.buildBeanForOutput(element);
splitterConfiguration.setJson(bean);
XMLSplitterPortBuilder.addPortsForOutput(element, splitter, splitterProcessor,
processorBinding);
}
} else {
throw new EditException(
"The activity type is not suitable for adding xml processing processors");
}
} catch (Exception e) {
throw new EditException(
"An error occured whilst tyring to add an XMLSplitter to the activity:"
+ activity, e);
}
if (isInput) {
sourcePortName = "output";
sinkPortName = portName;
sinkProcessor = activityProcessor;
sourceProcessor = splitterProcessor;
} else {
sourcePortName = portName;
sinkPortName = "input";
sinkProcessor = splitterProcessor;
sourceProcessor = activityProcessor;
}
processorBinding.setBoundActivity(splitter);
List<Edit<?>> editList = new ArrayList<Edit<?>>();
editList.add(new AddChildEdit<Profile>(profile, splitter));
editList.add(new AddChildEdit<Profile>(profile, splitterConfiguration));
editList.add(new AddChildEdit<Profile>(profile, processorBinding));
editList.add(new AddProcessorEdit(workflow, splitterProcessor));
compoundEdit1 = new CompoundEdit(editList);
compoundEdit1.doEdit();
List<Edit<?>> linkUpEditList = new ArrayList<Edit<?>>();
OutputProcessorPort source = sourceProcessor.getOutputPorts().getByName(sourcePortName);
InputProcessorPort sink = sinkProcessor.getInputPorts().getByName(sinkPortName);
if (source == null)
throw new EditException("Unable to find the source port when linking up "
+ sourcePortName + " to " + sinkPortName);
if (sink == null)
throw new EditException("Unable to find the sink port when linking up "
+ sourcePortName + " to " + sinkPortName);
DataLink dataLink = new DataLink();
dataLink.setReceivesFrom(source);
dataLink.setSendsTo(sink);
linkUpEditList.add(new AddDataLinkEdit(workflow, dataLink));
linkUpEdit = new CompoundEdit(linkUpEditList);
linkUpEdit.doEdit();
applied = true;
return workflow;
}