in taverna-scufl2-t2flow/src/main/java/org/apache/taverna/scufl2/translator/t2flow/defaultactivities/RshellActivityParser.java [82:214]
public Configuration parseConfiguration(T2FlowParser t2FlowParser,
ConfigBean configBean, ParserState parserState) throws ReaderException {
RShellConfig rshellConfig = unmarshallConfig(t2FlowParser, configBean,
"xstream", RShellConfig.class);
Configuration configuration = new Configuration();
configuration.setParent(parserState.getCurrentProfile());
ObjectNode json = (ObjectNode) configuration.getJson();
configuration.setType(ACTIVITY_URI.resolve("#Config"));
// Basic properties
String script = rshellConfig.getScript();
json.put("script", script);
// if (rshellConfig.getRVersion() != null) {
// json.put("rVersion", rshellConfig.getRVersion());
// }
// Connection
ObjectNode connection = json.objectNode();
json.put("connection", connection);
RShellConnection conn = rshellConfig.getConnectionSettings();
connection.put("hostname", conn.getHost());
json.put("port", conn.getPort());
// ignored - Taverna 2.3+ uses credential manager
// connection.put("username", conn.getUsername());
// connection.put("password", conn.getPassword());
connection.put("keepSessionAlive", conn.isKeepSessionAlive());
// ignoooooored - we won't support the legacy ones anymore
// if (rshellConfig.getConnectionSettings().isNewRVersion() == null || !
// rshellConfig.getConnectionSettings().isNewRVersion()) {
// connection.put("legacy", true);
// }
// Activity ports
Activity activity = parserState.getCurrentActivity();
activity.getInputPorts().clear();
activity.getOutputPorts().clear();
for (ActivityPortDefinitionBean portBean : rshellConfig
.getInputs()
.getNetSfTavernaT2WorkflowmodelProcessorActivityConfigActivityInputPortDefinitionBean())
parseAndAddInputPortDefinition(portBean, configuration, activity);
for (ActivityPortDefinitionBean portBean : rshellConfig
.getOutputs()
.getNetSfTavernaT2WorkflowmodelProcessorActivityConfigActivityOutputPortDefinitionBean())
parseAndAddOutputPortDefinition(portBean, configuration, activity);
RShellSymanticType inputSymanticTypes = rshellConfig
.getInputSymanticTypes();
List<String> foundInputTypes = new ArrayList<>();
ArrayNode inputPorts = json.arrayNode();
json.put("inputTypes", inputPorts);
for (RShellPortSymanticTypeBean symanticType : inputSymanticTypes
.getNetSfTavernaT2ActivitiesRshellRShellPortSymanticTypeBean()) {
ObjectNode port = json.objectNode();
port.put("port", symanticType.getName());
String dataType = symanticType.getSymanticType().getValue();
String reference = symanticType.getSymanticType().getReference();
if (reference != null) {
Matcher matcher = strangeXpath.matcher(reference);
if (matcher == null || !matcher.matches())
throw new ReaderException(
"Unhandled xstream xpath expression: " + reference);
String position = matcher.group(3);
if (position == null)
position = "1";
dataType = foundInputTypes.get(Integer.parseInt(position) - 1);
}
foundInputTypes.add(dataType);
// Even if it's null - so the index is correct
if (dataType != null)
port.put("dataType", dataType);
}
/*
* FIXME: Avoid this repetition. Would require a fair bit of parser
* state...
*/
RShellSymanticType outputSymanticTypes = rshellConfig
.getOutputSymanticTypes();
List<String> foundOutputTypes = new ArrayList<>();
ArrayNode outputPorts = json.arrayNode();
json.put("outputTypes", outputPorts);
for (RShellPortSymanticTypeBean symanticType : outputSymanticTypes
.getNetSfTavernaT2ActivitiesRshellRShellPortSymanticTypeBean()) {
ObjectNode port = json.objectNode();
port.put("port", symanticType.getName());
String dataType = symanticType.getSymanticType().getValue();
String reference = symanticType.getSymanticType().getReference();
if (reference != null) {
/*
* A lovely artifact of xstream 'efficiency' - Xpath
* backpointers to previous elements. luckily we are here
* restricted within this specific config bean.
*
* Example:
* ../../net.sf.taverna.t2.activities.rshell.RShellPortSymanticTypeBean[3]/symanticType
* ../../../inputSymanticTypes/net.sf.taverna.t2.activities.rshell.RShellPortSymanticTypeBean[2]/symanticType
*/
Matcher matcher = strangeXpath.matcher(reference);
if (matcher == null || !matcher.matches())
throw new ReaderException(
"Unhandled xstream xpath expression: " + reference);
boolean isInputSymantic = matcher.group(1) != null;
String position = matcher.group(3);
if (position == null)
position = "1";
if (isInputSymantic)
dataType = foundInputTypes
.get(Integer.parseInt(position) - 1);
else
dataType = foundOutputTypes
.get(Integer.parseInt(position) - 1);
}
foundOutputTypes.add(dataType);
// Even if it's null - so the index is correct
if (dataType != null)
port.put("dataType", dataType);
}
return configuration;
}