in taverna-wsdl-activity/src/main/java/org/apache/taverna/activities/wsdl/xmlsplitter/XMLOutputSplitterActivity.java [81:162]
public void executeAsynch(final Map<String, T2Reference> data,
final AsynchronousActivityCallback callback) {
callback.requestRun(new Runnable() {
public void run() {
try {
ReferenceService referenceService = callback.getContext()
.getReferenceService();
XMLOutputSplitter splitter = createSplitter();
Map<String, String> inputMap = buildInputMap(data,
referenceService);
Map<String, Object> outputMap = splitter.execute(inputMap);
callback.receiveResult(createOutputData(outputMap,
referenceService), new int[0]);
} catch (Exception e) {
callback.fail("Error in XMLInputSplitterActivity", e);
}
}
private Map<String, T2Reference> createOutputData(
Map<String, Object> outputMap,
ReferenceService referenceService)
throws ReferenceServiceException {
Map<String, T2Reference> result = new HashMap<String, T2Reference>();
for (String outputName : outputMap.keySet()) {
Object output = outputMap.get(outputName);
// TODO check if the output can be anything other than
// String or List
if (output instanceof List) {
result.put(outputName, referenceService.register(
output, 1, true, callback.getContext()));
} else {
result.put(outputName, referenceService.register(
output, 0, true, callback.getContext()));
}
}
return result;
}
private XMLOutputSplitter createSplitter() {
List<String> inputNames = new ArrayList<String>();
List<String> outputTypes = new ArrayList<String>();
List<String> outputNames = new ArrayList<String>();
// FIXME: need to use the definition beans for now to get the
// mimetype. Need to use the actual InputPort once the mimetype
// becomes available again.
if (configBean.has("outputPorts")) {
// for (JsonNode outputPort : configBean.get("outputPorts")) {
for (Iterator<JsonNode> iter = configBean.get("outputPorts").iterator();iter.hasNext();) {
JsonNode outputPort = iter.next();
outputNames.add(outputPort.get("name").textValue());
outputTypes.add(outputPort.get("mimeType").textValue());
}
}
for (InputPort outputPorts : getInputPorts()) {
inputNames.add(outputPorts.getName());
}
return new XMLOutputSplitter(typeDescriptor, outputNames
.toArray(new String[] {}), outputTypes
.toArray(new String[] {}), inputNames
.toArray(new String[] {}));
}
private Map<String, String> buildInputMap(
Map<String, T2Reference> data,
ReferenceService referenceService)
throws ReferenceServiceException {
Map<String, String> result = new HashMap<String, String>();
for (String inputName : data.keySet()) {
T2Reference id = data.get(inputName);
result.put(inputName, (String) referenceService
.renderIdentifier(id, String.class, callback
.getContext()));
}
return result;
}
});
}