class SNMPDispatcher implements NotificationDispatcher {

  @Override
  public TargetConfigurationResult validateTargetConfig(Map<String, Object> properties) {
    Map<String, String> stringValuesConfig = new HashMap<>(properties.size());
    for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) {
      stringValuesConfig.put(propertyEntry.getKey(), propertyEntry.getValue().toString());
    }
    try {

      for (String property : getSetOfDefaultNeededPropertyNames()) {
        getDispatchProperty(stringValuesConfig, property);
      }

      SnmpVersion snmpVersion = getSnmpVersion(stringValuesConfig);
      switch (snmpVersion) {
        case SNMPv3:
          getDispatchProperty(stringValuesConfig, SECURITY_USERNAME_PROPERTY);
          TrapSecurity securityLevel = getSecurityLevel(stringValuesConfig);
          switch (securityLevel) {
            case AUTH_PRIV:
              getDispatchProperty(stringValuesConfig, SECURITY_PRIV_PASSPHRASE_PROPERTY);
              getDispatchProperty(stringValuesConfig, SECURITY_AUTH_PASSPHRASE_PROPERTY);
              break;
            case AUTH_NOPRIV:
              getDispatchProperty(stringValuesConfig, SECURITY_AUTH_PASSPHRASE_PROPERTY);
              break;
          }
          break;
        case SNMPv2c:
        case SNMPv1:
          getDispatchProperty(stringValuesConfig, COMMUNITY_PROPERTY);
          break;
      }
    } catch (InvalidSnmpConfigurationException ex) {
      return TargetConfigurationResult.invalid(ex.getMessage());
    }
    return TargetConfigurationResult.valid();
  }

  public  SNMPDispatcher(Snmp snmp);
  public  SNMPDispatcher();
  public  SNMPDispatcher(Integer port);

}