@Override
  public void validate(final PipeParameterValidator validator) throws Exception {
    // TODO: upgrade this logic after "1 in 2" logic is supported
    validator.validate(
        args -> (boolean) args[0] || (boolean) args[1] || (boolean) args[2] || (boolean) args[3],
        String.format(
            "One of '%s', '%s', '%s' and '%s' must be specified",
            SINK_OPC_DA_CLSID_KEY,
            CONNECTOR_OPC_DA_CLSID_KEY,
            SINK_OPC_DA_PROGID_KEY,
            CONNECTOR_OPC_DA_PROGID_KEY),
        validator.getParameters().hasAttribute(SINK_OPC_DA_CLSID_KEY),
        validator.getParameters().hasAttribute(CONNECTOR_OPC_DA_CLSID_KEY),
        validator.getParameters().hasAttribute(SINK_OPC_DA_PROGID_KEY),
        validator.getParameters().hasAttribute(CONNECTOR_OPC_DA_PROGID_KEY));

    if (!System.getProperty("os.name").toLowerCase().startsWith("windows")) {
      throw new PipeParameterNotValidException("opc-da-sink must run on windows system.");
    }
  }
Send data in IoTDB based on Opc Da protocol, using JNA. All data are converted into tablets, and
then push the newest value to the <b>local COM</b> server in another process.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/opcda/OpcDaConnector.java