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));

Reply via email to