java.lang.Object
com.networknt.org.apache.commons.validator.routines.DomainValidator
All Implemented Interfaces:
Serializable

public class DomainValidator extends Object implements Serializable

Domain name validation routines.

This validator provides methods for validating Internet domain names and top-level domains.

Domain names are evaluated according to the standards RFC1034, section 3, and RFC1123, section 2.1. No accommodation is provided for the specialized needs of other applications; if the domain name has been URL-encoded, for example, validation will fail even though the equivalent plaintext version of the same name would have passed.

Validation is also provided for top-level domains (TLDs) as defined and maintained by the Internet Assigned Numbers Authority (IANA):

(NOTE: This class does not provide IP address lookup for domain names or methods to ensure that a given domain name matches a specific IP; see InetAddress for that functionality.)

Since:
1.4
See Also:
  • Field Details

    • MAX_DOMAIN_LENGTH

      private static final int MAX_DOMAIN_LENGTH
      Maximum allowable length (253) of a domain name
      See Also:
    • EMPTY_STRING_ARRAY

      private static final String[] EMPTY_STRING_ARRAY
    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • DOMAIN_LABEL_REGEX

      private static final String DOMAIN_LABEL_REGEX
      See Also:
    • TOP_LABEL_REGEX

      private static final String TOP_LABEL_REGEX
      See Also:
    • DOMAIN_NAME_REGEX

      private static final String DOMAIN_NAME_REGEX
      The above instances must only be returned via the getInstance() methods. This is to ensure that the override data arrays are properly protected.
      See Also:
    • UNEXPECTED_ENUM_VALUE

      private static final String UNEXPECTED_ENUM_VALUE
      See Also:
    • INFRASTRUCTURE_TLDS

      private static final String[] INFRASTRUCTURE_TLDS
    • GENERIC_TLDS

      private static final String[] GENERIC_TLDS
    • COUNTRY_CODE_TLDS

      private static final String[] COUNTRY_CODE_TLDS
    • LOCAL_TLDS

      private static final String[] LOCAL_TLDS
    • inUse

      private static boolean inUse
    • countryCodeTLDsPlus

      private static String[] countryCodeTLDsPlus
    • genericTLDsPlus

      private static String[] genericTLDsPlus
    • countryCodeTLDsMinus

      private static String[] countryCodeTLDsMinus
    • genericTLDsMinus

      private static String[] genericTLDsMinus
    • localTLDsMinus

      private static String[] localTLDsMinus
    • localTLDsPlus

      private static String[] localTLDsPlus
    • allowLocal

      private final boolean allowLocal
      Whether to allow local overrides.
    • domainRegex

      private final RegexValidator domainRegex
      RegexValidator for matching domains.
    • hostnameRegex

      private final RegexValidator hostnameRegex
      RegexValidator for matching a local hostname
    • myCountryCodeTLDsMinus

      final String[] myCountryCodeTLDsMinus
      Local override.
    • myCountryCodeTLDsPlus

      final String[] myCountryCodeTLDsPlus
      Local override.
    • myGenericTLDsPlus

      final String[] myGenericTLDsPlus
      Local override.
    • myGenericTLDsMinus

      final String[] myGenericTLDsMinus
      Local override.
    • myLocalTLDsPlus

      final String[] myLocalTLDsPlus
      Local override.
    • myLocalTLDsMinus

      final String[] myLocalTLDsMinus
      Local override.
  • Constructor Details

    • DomainValidator

      private DomainValidator(boolean allowLocal)
      Private constructor.
    • DomainValidator

      private DomainValidator(boolean allowLocal, List<DomainValidator.Item> items)
      Private constructor, allowing local overrides
      Since:
      1.7
  • Method Details

    • arrayContains

      private static boolean arrayContains(String[] sortedArray, String key)
      Check if a sorted array contains the specified key
      Parameters:
      sortedArray - the array to search
      key - the key to find
      Returns:
      true if the array contains the key
    • getInstance

      public static DomainValidator getInstance()
      Returns the singleton instance of this validator. It will not consider local addresses as valid.
      Returns:
      the singleton instance of this validator
    • getInstance

      public static DomainValidator getInstance(boolean allowLocal)
      Returns the singleton instance of this validator, with local validation as required.
      Parameters:
      allowLocal - Should local addresses be considered valid?
      Returns:
      the singleton instance of this validator
    • getInstance

      public static DomainValidator getInstance(boolean allowLocal, List<DomainValidator.Item> items)
      Returns a new instance of this validator. The user can provide a list of DomainValidator.Item entries which can be used to override the generic and country code lists. Note that any such entries override values provided by the updateTLDOverride(ArrayType, String[]) method If an entry for a particular type is not provided, then the class override (if any) is retained.
      Parameters:
      allowLocal - Should local addresses be considered valid?
      items - - array of DomainValidator.Item entries
      Returns:
      an instance of this validator
      Since:
      1.7
    • getTLDEntries

      public static String[] getTLDEntries(DomainValidator.ArrayType table)
      Gets a copy of a class level internal array.
      Parameters:
      table - the array type (any of the enum values)
      Returns:
      a copy of the array
      Throws:
      IllegalArgumentException - if the table type is unexpected (should not happen)
      Since:
      1.5.1
    • isOnlyASCII

      private static boolean isOnlyASCII(String input)
    • unicodeToASCII

      static String unicodeToASCII(String input)
      Converts potentially Unicode input to punycode. If conversion fails, returns the original input.
      Parameters:
      input - the string to convert, not null
      Returns:
      converted input, or original input if conversion fails
    • updateTLDOverride

      public static void updateTLDOverride(DomainValidator.ArrayType table, String... tlds)
      Update one of the TLD override arrays. This must only be done at program startup, before any instances are accessed using getInstance.

      For example:

      DomainValidator.updateTLDOverride(ArrayType.GENERIC_PLUS, "apache")

      To clear an override array, provide an empty array.

      Parameters:
      table - the table to update, see DomainValidator.ArrayType Must be one of the following
      • COUNTRY_CODE_MINUS
      • COUNTRY_CODE_PLUS
      • GENERIC_MINUS
      • GENERIC_PLUS
      • LOCAL_MINUS
      • LOCAL_PLUS
      tlds - the array of TLDs, must not be null
      Throws:
      IllegalStateException - if the method is called after getInstance
      IllegalArgumentException - if one of the read-only tables is requested
      Since:
      1.5.0
    • chompLeadingDot

      private String chompLeadingDot(String str)
    • getOverrides

      public String[] getOverrides(DomainValidator.ArrayType table)
      Gets a copy of an instance level internal array.
      Parameters:
      table - the array type (any of the enum values)
      Returns:
      a copy of the array
      Throws:
      IllegalArgumentException - if the table type is unexpected, e.g. GENERIC_RO
      Since:
      1.7
    • isAllowLocal

      public boolean isAllowLocal()
      Does this instance allow local addresses?
      Returns:
      true if local addresses are allowed.
      Since:
      1.7
    • isValid

      public boolean isValid(String domain)
      Returns true if the specified String parses as a valid domain name with a recognized top-level domain. The parsing is case-insensitive.
      Parameters:
      domain - the parameter to check for domain name syntax
      Returns:
      true if the parameter is a valid domain name
    • isValidCountryCodeTld

      public boolean isValidCountryCodeTld(String ccTld)
      Returns true if the specified String matches any IANA-defined country code top-level domain. Leading dots are ignored if present. The search is case-insensitive.
      Parameters:
      ccTld - the parameter to check for country code TLD status, not null
      Returns:
      true if the parameter is a country code TLD
    • isValidDomainSyntax

      final boolean isValidDomainSyntax(String domain)
    • isValidGenericTld

      public boolean isValidGenericTld(String gTld)
      Returns true if the specified String matches any IANA-defined generic top-level domain. Leading dots are ignored if present. The search is case-insensitive.
      Parameters:
      gTld - the parameter to check for generic TLD status, not null
      Returns:
      true if the parameter is a generic TLD
    • isValidInfrastructureTld

      public boolean isValidInfrastructureTld(String iTld)
      Returns true if the specified String matches any IANA-defined infrastructure top-level domain. Leading dots are ignored if present. The search is case-insensitive.
      Parameters:
      iTld - the parameter to check for infrastructure TLD status, not null
      Returns:
      true if the parameter is an infrastructure TLD
    • isValidLocalTld

      public boolean isValidLocalTld(String lTld)
      Returns true if the specified String matches any widely used "local" domains (localhost or localdomain). Leading dots are ignored if present. The search is case-insensitive.
      Parameters:
      lTld - the parameter to check for local TLD status, not null
      Returns:
      true if the parameter is an local TLD
    • isValidTld

      public boolean isValidTld(String tld)
      Returns true if the specified String matches any IANA-defined top-level domain. Leading dots are ignored if present. The search is case-insensitive.

      If allowLocal is true, the TLD is checked using isValidLocalTld(String). The TLD is then checked against isValidInfrastructureTld(String), isValidGenericTld(String) and isValidCountryCodeTld(String)

      Parameters:
      tld - the parameter to check for TLD status, not null
      Returns:
      true if the parameter is a TLD