コード例 #1
0
ファイル: DataSourceImpl.java プロジェクト: ka2ush19e/embulk
 @Override
 public DataSourceImpl getNestedOrSetEmpty(String attrName) {
   JsonNode json = data.get(attrName);
   if (json == null) {
     json = data.objectNode();
     data.set(attrName, json);
   } else if (!json.isObject()) {
     throw new ConfigException("Attribute " + attrName + " must be an object");
   }
   return newInstance(model, (ObjectNode) json);
 }
  @Ignore("Integration test")
  @Before
  public void setUp() throws Exception {
    activity = new WSDLActivity(null);
    configBean = JSON_NODE_FACTORY.objectNode();
    operationConfigBean = configBean.objectNode();
    configBean.put("operation", operationConfigBean);
    operationConfigBean.put("name", "run_eInfo");
    operationConfigBean.put("wsdl", wsdlLocation);
    activity.configure(configBean);
    edits = new EditsImpl();

    dataflow = (DataflowImpl) edits.createDataflow();
    Processor p = edits.createProcessor("run_eInfo");
    edits.getDefaultDispatchStackEdit(p).doEdit();
    edits.getAddActivityEdit(p, activity).doEdit();
    edits.getMapProcessorPortsForActivityEdit(p).doEdit();
    edits.getAddProcessorEdit(dataflow, p).doEdit();
  }
  @Override
  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;
  }