View Javadoc

1   /*
2    * Copyright 2000-2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.jetspeed.util;
17  
18  import org.apache.oro.text.perl.*;
19  //import java.util.regex.*;
20  
21  import java.net.*;
22  import org.apache.commons.lang.StringUtils;
23  
24  /***
25   * <P>Data Validation functions using Regex</P>
26   *
27   * @author <a href="mailto:ben.woodward@bbc.co.uk">Ben Woodward</a>
28   * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
29   * @version $Id: ValidationHelper.java,v 1.4 2004/02/23 03:23:42 jford Exp $
30   */
31  public class ValidationHelper
32  {
33      //static string bigEmailRegex = new String("[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)*@[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)*|(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[^()<>@,;:\".//////[//]//x80-//xff//000-//010//012-//037]*(?:(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[^()<>@,;:\".//////[//]//x80-//xff//000-//010//012-//037]*)*<[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:@[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)*(?:,[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*@[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)*)*:[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)?(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|\"[^//////x80-//xff//n//015\"]*(?:////[^//x80-//xff][^//////x80-//xff//n//015\"]*)*\")[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*)*@[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?://.[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*//)[//040//t]*)*(?:[^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff]+(?![^(//040)<>@,;:\".//////[//]//000-//037//x80-//xff])|//[(?:[^//////x80-//xff//n//015//[//]]|////[^//x80-//xff])*//])[//040//t]*(?://([^//////x80-//xff//n//015()]*(?:(?:////[^//x80-//xff]|//([^//////x80-//xff//n//015()]*(?:////[^//x80-//xff][^//////x80-//xff//n//015()]*)*//))[^//////x80-//xff//n//015()]*)*\)[\040\t]*)*)*>)");
34      //static string emailRegex = new String("/^(([^//-][//w//-]*?//.?){1,})[^-](//@{1})([^//-][//w+//.//-])[^//2]{1,}[^//-]$/");
35      /***
36       * Tests that the input string contains only alpha numeric or white spaces
37       * <P>
38       * @param evalString The string that is to be evaluated
39       * @param required indicates whether the field is required or not
40       * @return True if the input is alpha numeric, false otherwise.
41       **/
42      public static boolean isAlphaNumeric(String evalString, boolean required)
43      {
44          if (StringUtils.isEmpty(evalString))
45          {
46              if (true == required)
47              {
48                  return false;
49              }
50              return true;
51          }
52          Perl5Util util = new Perl5Util();
53          return util.match("/^[//w//s]+$/", evalString);
54      }
55  
56      public static boolean isAlphaNumeric(String evalString, boolean required, int maxLength)
57      {
58          if (isTooLong(evalString, maxLength))
59          {
60              return false;
61          }
62          return isAlphaNumeric(evalString, required);
63      }
64  
65      public static boolean isLooseAlphaNumeric(String evalString, boolean required)
66      {
67          if (StringUtils.isEmpty(evalString))
68          {
69              if (true == required)
70              {
71                  return false;
72              }
73              return true;
74          }
75          Perl5Util util = new Perl5Util();
76          return util.match("/^[//w//s//.//,/////-//(//)//+]+$/", evalString);
77      }
78  
79      public static boolean isLooseAlphaNumeric(String evalString, boolean required, int maxLength)
80      {
81          if (isTooLong(evalString, maxLength))
82          {
83              return false;
84          }
85          return isLooseAlphaNumeric(evalString, required);
86      }
87          
88      /***
89       * Tests that the input string contains only numeric
90       * <P>
91       * @param evalString The string that is to be evaluated
92       * @return True if the input is numeric, false otherwise.
93       **/
94      public static boolean isDecimal(String evalString, boolean required)
95      {
96          if (StringUtils.isEmpty(evalString))
97          {
98              if (true == required)
99              {
100                 return false;
101             }
102             return true;
103         }
104         Perl5Util util = new Perl5Util();
105         return util.match("/^(//d+//.)?//d+$/", evalString);
106     }
107     
108     public static boolean isDecimal(String evalString, boolean required, int maxLength)
109     {
110         if (isTooLong(evalString, maxLength))
111         {
112             return false;
113         }
114         return isDecimal(evalString, required);
115     }
116 
117     /***
118      * Tests that the input string contains only an integer
119      * <P>
120      * @param evalString The string that is to be evaluated
121      * @return True if the input is numeric, false otherwise.
122      **/
123     public static boolean isInteger (String evalString, boolean required)
124     {
125         if (StringUtils.isEmpty(evalString))
126         {
127             if (true == required)
128             {
129                 return false;
130             }
131             return true;
132         }
133         Perl5Util util = new Perl5Util();
134         return util.match("/^//d+$/", evalString);
135     }
136     
137     public static boolean isInteger(String evalString, boolean required, int maxLength)
138     {
139         if (isTooLong(evalString, maxLength))
140         {
141             return false;
142         }
143         return isInteger(evalString, required);
144     }
145 
146     /***
147      * Tests that the input string contains a valid email addess
148      * <P>
149      * @param evalString The string that is to be evaluated
150      * @return True if the input is a valid email address.
151      **/
152     public static boolean isEmailAddress(String evalString, boolean required)
153     {
154         if (StringUtils.isEmpty(evalString))
155         {
156             if (true == required)
157             {
158                 return false;
159             }
160             return true;
161         }
162         Perl5Util util = new Perl5Util();
163         return util.match("/^(?://w[//w-]*//.)*//w[//w-]*@(?://w[//w-]*//.)+//w[//w-]*$/", evalString);
164     }
165     
166     public static boolean isEmailAddress(String evalString, boolean required, int maxLength)
167     {
168         if (isTooLong(evalString, maxLength))
169         {
170             return false;
171         }
172         return isEmailAddress(evalString, required);
173     }
174     
175     /***
176      * Tests that the input string contains a valid URL
177      * <P>
178      * @param evalString The string that is to be evaluated
179      * @return True if the input is a valid URL.
180      **/
181     public static boolean isURL(String evalString, boolean required)
182     {
183         try
184         {
185             if (StringUtils.isEmpty(evalString))
186             {
187                 if (true == required)
188                 {
189                     return false;
190                 }
191                 return true;
192             }
193             
194             URL url = new URL(evalString);
195 
196             /*
197             Perl5Util util = new Perl5Util();
198             System.out.println("looking at " +evalString);
199             return util.match("/^[//w%?-_~]$/", evalString);
200              */
201             //Object content = url.getContent();
202             //System.out.println("url contains :["+content+"]");
203             return true;
204         }
205         catch (Exception e)
206         {
207             System.err.println(evalString+" is not a valid URL: "+ e);
208             return false;
209         }
210     }
211 
212     public static boolean isURL(String evalString, boolean required, int maxLength)
213     {
214         if (isTooLong(evalString, maxLength))
215         {
216             return false;
217         }
218         return isURL(evalString, required);
219     }
220 
221     public static boolean isValidIdentifier(String folderName)
222     {
223         boolean valid = true;
224 
225         char[] chars = folderName.toCharArray();
226         for (int ix = 0; ix < chars.length; ix++)
227         {
228             if (!Character.isJavaIdentifierPart(chars[ix]))
229             {
230                 valid = false; 
231                 break;
232             }
233         }
234         return valid;
235     }
236 
237     public static boolean isTooLong(String evalString, int maxLength)
238     {
239         if (null != evalString)
240         {
241             return (evalString.length() > maxLength);
242         }
243         return false;
244     }
245 
246 }
247