You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2016/11/16 06:46:44 UTC

[4/4] struts git commit: Optimises validator to reduce number of compiling pattern

Optimises validator to reduce number of compiling pattern


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/931df54a
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/931df54a
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/931df54a

Branch: refs/heads/master
Commit: 931df54ab379bf4eb5a625bf05066b8563c3737b
Parents: eb71d88
Author: Lukasz Lenart <lu...@apache.org>
Authored: Wed Nov 16 07:46:29 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Wed Nov 16 07:46:29 2016 +0100

----------------------------------------------------------------------
 .../validator/validators/URLValidator.java      | 61 ++++++++++++--------
 1 file changed, 38 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/931df54a/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
index 8786c18..f12c286 100644
--- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
+++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java
@@ -17,6 +17,8 @@ package com.opensymphony.xwork2.validator.validators;
 
 import com.opensymphony.xwork2.validator.ValidationException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.regex.Pattern;
 
@@ -42,8 +44,25 @@ import java.util.regex.Pattern;
  */
 public class URLValidator extends FieldValidatorSupport {
 
-    private String urlRegex;
+    private static final Logger LOG = LogManager.getLogger(URLValidator.class);
+
+    public static final String DEFAULT_URL_REGEX = "^(https?|ftp):\\/\\/" +
+            "(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+" +
+            "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+)?" +
+            "@)?(#?" +
+            ")((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" +
+            "[a-z][a-z0-9-]*[a-z0-9]" +
+            "|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
+            "(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" +
+            ")(:\\d+)?" +
+            ")(((\\/{0,1}([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)*" +
+            "(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)" +
+            "?)?)?" +
+            "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?" +
+            "$";
+
     private String urlRegexExpression;
+    private Pattern urlPattern = Pattern.compile(DEFAULT_URL_REGEX, Pattern.CASE_INSENSITIVE);
 
     public void validate(Object object) throws ValidationException {
         String fieldName = getFieldName();
@@ -55,11 +74,26 @@ public class URLValidator extends FieldValidatorSupport {
             return;
         }
 
-        if (!(value.getClass().equals(String.class)) || !Pattern.compile(getUrlRegex(), Pattern.CASE_INSENSITIVE).matcher(String.valueOf(value).trim()).matches()) {
+        String stringValue = String.valueOf(value).trim();
+
+        if (!(value.getClass().equals(String.class)) || !getUrlPattern().matcher(stringValue).matches()) {
             addFieldError(fieldName, object);
         }
     }
 
+    protected Pattern getUrlPattern() {
+        if (StringUtils.isNotEmpty(urlRegexExpression)) {
+            String regex = (String) parse(urlRegexExpression, String.class);
+            if (regex == null) {
+                LOG.warn("Provided URL Regex expression [{}] was evaluated to null! Falling back to default!", urlRegexExpression);
+                urlPattern = Pattern.compile(DEFAULT_URL_REGEX, Pattern.CASE_INSENSITIVE);
+            } else {
+                urlPattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+            }
+        }
+        return urlPattern;
+    }
+
     /**
      * This is used to support client-side validation, it's based on
      * http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a-valid-url
@@ -67,30 +101,11 @@ public class URLValidator extends FieldValidatorSupport {
      * @return regex to validate URLs
      */
     public String getUrlRegex() {
-        if (StringUtils.isNotEmpty(urlRegexExpression)) {
-            return (String) parse(urlRegexExpression, String.class);
-        } else if (StringUtils.isNotEmpty(urlRegex)) {
-            return urlRegex;
-        } else {
-            return "^(https?|ftp):\\/\\/" +
-                    "(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+" +
-                    "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+)?" +
-                    "@)?(#?" +
-                    ")((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" +
-                    "[a-z][a-z0-9-]*[a-z0-9]" +
-                    "|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
-                    "(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" +
-                    ")(:\\d+)?" +
-                    ")(((\\/{0,1}([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)*" +
-                    "(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)" +
-                    "?)?)?" +
-                    "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?" +
-                    "$";
-        }
+        return getUrlPattern().pattern();
     }
 
     public void setUrlRegex(String urlRegex) {
-        this.urlRegex = urlRegex;
+        urlPattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);
     }
 
     public void setUrlRegexExpression(String urlRegexExpression) {