You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by an...@apache.org on 2007/10/24 06:11:05 UTC

svn commit: r587773 - in /tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/form/validator/Email.java test/org/apache/tapestry/form/validator/TestEmail.java

Author: andyhot
Date: Tue Oct 23 21:11:04 2007
New Revision: 587773

URL: http://svn.apache.org/viewvc?rev=587773&view=rev
Log:
TAPESTRY-1857: Fix email perf. problems on long invalid input + tests that cover this. Email pattern after dojo, includes TLD validation.

Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/validator/Email.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/validator/TestEmail.java

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/validator/Email.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/validator/Email.java?rev=587773&r1=587772&r2=587773&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/validator/Email.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/validator/Email.java Tue Oct 23 21:11:04 2007
@@ -36,8 +36,20 @@
  */
 public class Email extends BaseValidator
 {
-    public static final String PATTERN = "^[A-Za-z0-9]+([-_\\.]*[A-Za-z0-9]+)*@[A-Za-z0-9]+([-_\\.]*[A-Za-z0-9]+)*(\\.[_A-Za-z]{2,6})$";
-    
+    public static final String TLD_PATTERN = "arpa|aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|"
+            + "org|pro|travel|xxx|jobs|mobi|post|"
+            + "ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|"
+            + "bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|"
+            + "ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|"
+            + "gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|"
+            + "la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|"
+            + "my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|"
+            + "re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|"
+            + "tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw";
+    public static final String DOMAIN_PATTERN = "([0-9a-z]([-0-9a-z]{0,61}[0-9a-z])?\\.)+" + "(" + TLD_PATTERN + ")";
+    public static final String USERNAME_PATTERN = "([\\\\da-z]+[-._+&'])*[\\\\da-z]+";
+    public static final String PATTERN = "^(?i)"+ USERNAME_PATTERN + "@" + "(" + DOMAIN_PATTERN + ")$";
+                
     // TODO: Possible thread safety issue if the validator
     // is shared across threads, because the matcher
     // will be too.

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/validator/TestEmail.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/validator/TestEmail.java?rev=587773&r1=587772&r2=587773&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/validator/TestEmail.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/validator/TestEmail.java Tue Oct 23 21:11:04 2007
@@ -26,6 +26,7 @@
 import org.apache.tapestry.valid.ValidationStrings;
 import org.apache.tapestry.valid.ValidatorException;
 import org.testng.annotations.Test;
+import org.testng.annotations.DataProvider;
 
 /**
  * Tests for {@link org.apache.tapestry.form.validator.Email}.
@@ -36,33 +37,21 @@
 @Test
 public class TestEmail extends BaseValidatorTestCase
 {
-    public void test_OK() throws Exception
+    @Test(dataProvider = "validEmails", timeOut = 1000)
+    public void test_OK(String email) throws Exception
     {
         IFormComponent field = newField();
         ValidationMessages messages = newMessages();
 
         replay();
 
-        new Email().validate(field, messages, "hlship@apache.org");
+        new Email().validate(field, messages, email);
 
         verify();
     }
 
-    public void test_Ok_Single_Character() throws Exception
-    {
-        IFormComponent field = newField();
-        ValidationMessages messages = newMessages();
-
-        replay();
-        
-        Email email = new Email();
-        email.validate(field, messages, "j@apache.org");
-        email.validate(field, messages, "jkuhnert@a.org");
-
-        verify();
-    }
-    
-    public void test_Fail()
+    @Test(dataProvider = "invalidEmails", timeOut = 1000)
+    public void test_Fail(String email)
     {
         IFormComponent field = newField("My Email");
         ValidationMessages messages = newMessages(
@@ -76,7 +65,7 @@
 
         try
         {
-            new Email().validate(field, messages, "fred");
+            new Email().validate(field, messages, email);
             unreachable();
         }
         catch (ValidatorException ex)
@@ -173,5 +162,28 @@
         assertEquals("{\"constraints\":{\"barney\":[[tapestry.form.validation.isEmailAddress,false,true]]},"
                 + "\"barney\":{\"constraints\":[\"custom message\"]}}",
                 json.toString());
+    }
+
+    @DataProvider(name="validEmails")
+    protected Object[][] getValidEmails() {
+        return new Object[][] {
+                {"hlship@apache.org"},
+                {"j@apache.org"},
+                {"jkuhnert@a.org"},
+                {"J@A.oRg"},
+                {"foo@example-bar.domain.com"},
+                {"FOO@EXample-bAr.domain.com"},
+        };
+    }
+
+    @DataProvider(name="invalidEmails")
+    protected Object[][] getInvalidEmails() {
+        return new Object[][] {
+                {"fred"},
+                {"foooooooooooooooooooooo"},
+                {"foooooooooooooooooooooooooooo"},
+                {"LASKFODSKFO@$#)DJMZCV)TQKALAD"},
+                {""},
+        };
     }
 }