This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-validator.git
The following commit(s) were added to refs/heads/master by this push: new ee24cdd VALIDATOR-474 - DomainValidator local overrides ee24cdd is described below commit ee24cdd2981961c6678fa49595e7a04faa02270c Author: Sebb <s...@apache.org> AuthorDate: Fri Jul 31 12:02:54 2020 +0100 VALIDATOR-474 - DomainValidator local overrides --- src/changes/changes.xml | 6 ++- .../validator/routines/DomainValidator.java | 62 +++++++++++++++++++++- .../routines/DomainValidatorStartupTest.java | 19 +++++++ .../validator/routines/DomainValidatorTest.java | 2 + 4 files changed, 86 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7458a04..109c370 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -78,7 +78,8 @@ Apache Commons Validator. * CreditCard validation specification by numeric range - * DomainValidator instances can be created with local overrides + * DomainValidator instances can be created with instance overrides + * DomainValidator supports overrides of LOCAL TLDs IMPORTANT NOTES @@ -99,6 +100,9 @@ Apache Commons Validator. For the current list of dependencies, please see http://commons.apache.org/validator/dependencies.html "> + <action issue="VALIDATOR-474" type="add" dev="sebb"> + DomainValidator should allow local overrides + </action> <action issue="VALIDATOR-473" type="add" dev="sebb"> Allow Email- and UrlValidator to use specified DomainValidator </action> diff --git a/src/main/java/org/apache/commons/validator/routines/DomainValidator.java b/src/main/java/org/apache/commons/validator/routines/DomainValidator.java index 74fbee9..002e0a8 100644 --- a/src/main/java/org/apache/commons/validator/routines/DomainValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/DomainValidator.java @@ -174,6 +174,8 @@ public class DomainValidator implements Serializable { final String[] mycountryCodeTLDsPlus; final String[] mygenericTLDsPlus; final String[] mygenericTLDsMinus; + final String[] mylocalTLDsPlus; + final String[] mylocalTLDsMinus; /* * N.B. It is vital that instances are immutable. * This is because the default instances are shared. @@ -189,6 +191,8 @@ public class DomainValidator implements Serializable { mycountryCodeTLDsPlus = countryCodeTLDsPlus; mygenericTLDsPlus = genericTLDsPlus; mygenericTLDsMinus = genericTLDsMinus; + mylocalTLDsPlus = localTLDsPlus; + mylocalTLDsMinus = localTLDsMinus; } /** @@ -203,6 +207,8 @@ public class DomainValidator implements Serializable { String[] ccPlus = countryCodeTLDsPlus; String[] genMinus = genericTLDsMinus; String[] genPlus = genericTLDsPlus; + String[] localMinus = localTLDsMinus; + String[] localPlus = localTLDsPlus; // apply the instance overrides for(Item item: items) { @@ -229,6 +235,14 @@ public class DomainValidator implements Serializable { genPlus = copy; break; } + case LOCAL_MINUS: { + localMinus = copy; + break; + } + case LOCAL_PLUS: { + localPlus = copy; + break; + } default: break; } @@ -239,6 +253,8 @@ public class DomainValidator implements Serializable { mycountryCodeTLDsPlus = ccPlus; mygenericTLDsMinus = genMinus; mygenericTLDsPlus = genPlus; + mylocalTLDsMinus = localMinus; + mylocalTLDsPlus = localPlus; } /** @@ -353,7 +369,8 @@ public class DomainValidator implements Serializable { */ public boolean isValidLocalTld(String lTld) { final String key = chompLeadingDot(unicodeToASCII(lTld).toLowerCase(Locale.ENGLISH)); - return arrayContains(LOCAL_TLDS, key); + return (arrayContains(LOCAL_TLDS, key) || arrayContains(mylocalTLDsPlus, key)) + && !arrayContains(mylocalTLDsMinus, key); } /** @@ -2008,6 +2025,12 @@ public class DomainValidator implements Serializable { // WARNING: this array MUST be sorted, otherwise it cannot be searched reliably using binary search private static String[] genericTLDsMinus = EMPTY_STRING_ARRAY; + // WARNING: this array MUST be sorted, otherwise it cannot be searched reliably using binary search + private static String[] localTLDsMinus = EMPTY_STRING_ARRAY; + + // WARNING: this array MUST be sorted, otherwise it cannot be searched reliably using binary search + private static String[] localTLDsPlus = EMPTY_STRING_ARRAY; + /** * enum used by {@link DomainValidator#updateTLDOverride(ArrayType, String[])} * to determine which override array to update / fetch @@ -2030,7 +2053,17 @@ public class DomainValidator implements Serializable { /** Get a copy of the infrastructure table */ INFRASTRUCTURE_RO, /** Get a copy of the local table */ - LOCAL_RO + LOCAL_RO, + /** + * Update (or get a copy of) the LOCAL_TLDS_PLUS table containing additional local TLDs + * @since 1.7 + */ + LOCAL_PLUS, + /** + * Update (or get a copy of) the LOCAL_TLDS_MINUS table containing deleted local TLDs + * @since 1.7 + */ + LOCAL_MINUS ; } @@ -2041,6 +2074,11 @@ public class DomainValidator implements Serializable { public static class Item { final ArrayType type; final String[] values; + /** + * + * @param type ArrayType, e.g. GENERIC_PLUS, LOCAL_PLUS + * @param values array of TLDs. Will be lower-cased and sorted + */ public Item(ArrayType type, String[] values) { this.type = type; this.values = values; // no need to copy here @@ -2064,6 +2102,8 @@ public class DomainValidator implements Serializable { * <li>COUNTRY_CODE_PLUS</li> * <li>GENERIC_MINUS</li> * <li>GENERIC_PLUS</li> + * <li>LOCAL_MINUS</li> + * <li>LOCAL_PLUS</li> * </ul> * @param tlds the array of TLDs, must not be null * @throws IllegalStateException if the method is called after getInstance @@ -2093,6 +2133,12 @@ public class DomainValidator implements Serializable { case GENERIC_PLUS: genericTLDsPlus = copy; break; + case LOCAL_MINUS: + localTLDsMinus = copy; + break; + case LOCAL_PLUS: + localTLDsPlus = copy; + break; case COUNTRY_CODE_RO: case GENERIC_RO: case INFRASTRUCTURE_RO: @@ -2125,6 +2171,12 @@ public class DomainValidator implements Serializable { case GENERIC_PLUS: array = genericTLDsPlus; break; + case LOCAL_MINUS: + array = localTLDsMinus; + break; + case LOCAL_PLUS: + array = localTLDsPlus; + break; case GENERIC_RO: array = GENERIC_TLDS; break; @@ -2165,6 +2217,12 @@ public class DomainValidator implements Serializable { case GENERIC_PLUS: array = mygenericTLDsPlus; break; + case LOCAL_MINUS: + array = mylocalTLDsMinus; + break; + case LOCAL_PLUS: + array = mylocalTLDsPlus; + break; default: throw new IllegalArgumentException(UNEXPECTED_ENUM_VALUE + table); } diff --git a/src/test/java/org/apache/commons/validator/routines/DomainValidatorStartupTest.java b/src/test/java/org/apache/commons/validator/routines/DomainValidatorStartupTest.java index 40ceb91..68071b7 100644 --- a/src/test/java/org/apache/commons/validator/routines/DomainValidatorStartupTest.java +++ b/src/test/java/org/apache/commons/validator/routines/DomainValidatorStartupTest.java @@ -158,6 +158,25 @@ public class DomainValidatorStartupTest { } @Test + public void testVALIDATOR_412c() { + DomainValidator validator = DomainValidator.getInstance(true); + assertFalse(validator.isValidLocalTld("local")); + assertFalse(validator.isValid("abc.local")); + assertFalse(validator.isValidLocalTld("pvt")); + assertFalse(validator.isValid("abc.pvt")); + } + + @Test + public void testVALIDATOR_412d() { + DomainValidator.updateTLDOverride(ArrayType.LOCAL_PLUS, new String[]{"local", "pvt"}); + DomainValidator validator = DomainValidator.getInstance(true); + assertTrue(validator.isValidLocalTld("local")); + assertTrue(validator.isValidLocalTld("pvt")); + assertTrue(validator.isValid("abc.local")); + assertTrue(validator.isValid("abc.pvt")); + } + + @Test public void testCannotUpdate() { DomainValidator.updateTLDOverride(ArrayType.GENERIC_PLUS, new String[]{"ch"}); // OK DomainValidator dv = DomainValidator.getInstance(); diff --git a/src/test/java/org/apache/commons/validator/routines/DomainValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/DomainValidatorTest.java index 3c7e53f..2cd9305 100644 --- a/src/test/java/org/apache/commons/validator/routines/DomainValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/DomainValidatorTest.java @@ -307,6 +307,8 @@ public class DomainValidatorTest extends TestCase { assertNotNull(DomainValidator.getTLDEntries(ArrayType.COUNTRY_CODE_PLUS)); assertNotNull(DomainValidator.getTLDEntries(ArrayType.GENERIC_MINUS)); assertNotNull(DomainValidator.getTLDEntries(ArrayType.GENERIC_PLUS)); + assertNotNull(DomainValidator.getTLDEntries(ArrayType.LOCAL_MINUS)); + assertNotNull(DomainValidator.getTLDEntries(ArrayType.LOCAL_PLUS)); assertNotNull(DomainValidator.getTLDEntries(ArrayType.COUNTRY_CODE_RO)); assertNotNull(DomainValidator.getTLDEntries(ArrayType.GENERIC_RO)); assertNotNull(DomainValidator.getTLDEntries(ArrayType.INFRASTRUCTURE_RO));