1 55 package org.lateralnz.common.util; 56 57 import java.util.StringTokenizer ; 58 59 65 public final class EmailUtils implements Constants { 66 private static final String INVALID_CHARS = " <>()[]\\,;:\"@ "; 67 68 private EmailUtils() { 69 } 70 71 76 public static final boolean isValidEmail(String email) { 77 int pos = email.indexOf('@'); 78 if (pos <= 0 || pos == email.length()-1) { 79 return false; 80 } 81 else { 82 String localpart = email.substring(0,pos); 83 String domain = email.substring(pos+1); 84 85 if (!isValidLocalPart(localpart)) { 86 return false; 87 } 88 else { 89 return isValidDomain(domain); 90 } 91 } 92 } 93 94 private static final boolean isValidLocalPart(String localpart) { 95 if (localpart == null || localpart.length() < 1) { 96 return false; 97 } 98 else { 99 if (localpart.startsWith(DOT) || localpart.endsWith(DOT)) { 100 return false; 101 } 102 else { 103 StringTokenizer st = new StringTokenizer (localpart, DOT); 104 while (st.hasMoreTokens()) { 105 if (!isValidString(st.nextToken())) { 106 return false; 107 } 108 } 109 return true; 110 } 111 } 112 } 113 114 private static final boolean isValidDomain(String domain) { 115 if (domain.startsWith(DOT) || domain.endsWith(DOT)) { 116 return false; 117 } 118 else { 119 StringTokenizer st = new StringTokenizer (domain,DOT); 120 while (st.hasMoreTokens()) { 121 String token = st.nextToken(); 122 if (token.startsWith(SQ_LEFT_BRACKET)) { 124 while (!token.endsWith(SQ_RIGHT_BRACKET) && st.hasMoreTokens()) { 125 token += DOT + st.nextToken(); 126 } 127 128 if (!isValidDotNum(token)) { 129 return false; 130 } 131 } 132 else if (!isValidName(token) && !isValidNumber(token)) { 133 return false; 134 } 135 } 136 137 return true; 138 } 139 } 140 141 private static final boolean isValidName(String name) { 142 int len = name.length(); 143 if (len == 0) { 144 return false; 145 } 146 147 char start = name.charAt(0); 148 char end = name.charAt(len-1); 149 150 if (!isValidAlpha(start)) { 151 return false; 152 } 153 else if (!isValidAlpha(end) && !isValidDigit(end)) { 154 return false; 155 } 156 else { 157 for (int i = 1; i < name.length()-1; i++) { 158 char c = name.charAt(i); 159 if (!isValidAlpha(c) && !isValidDigit(c) && c != '-') { 160 return false; 161 } 162 } 163 } 164 return true; 165 } 166 167 private static final boolean isValidNumber(String number) { 168 int len = number.length(); 169 if (!number.startsWith(HASH) || len <= 1) { 170 return false; 171 } 172 else { 173 for (int i = 1; i < len; i++) { 174 if (!isValidDigit(number.charAt(i))) { 175 return false; 176 } 177 } 178 return true; 179 } 180 } 181 182 private static final boolean isValidDotNum(String dotnum) { 183 int len = dotnum.length(); 184 185 if (len <= 2 || dotnum.charAt(0) != '[' || dotnum.charAt(len-1) != ']') { 186 return false; 187 } 188 else { 189 StringTokenizer st = new StringTokenizer (dotnum, DOT); 190 191 while (st.hasMoreTokens()) { 192 String s = st.nextToken(); 193 194 if (s.length() > 3) { 195 return false; 196 } 197 else { 198 for (int i = 0; i < s.length(); i++) { 199 if (!isValidDigit(s.charAt(i))) { 200 return false; 201 } 202 } 203 } 204 } 205 return true; 206 } 207 } 208 209 private static final boolean isValidString(String s) { 210 for (int i = 0; i < s.length(); i++) { 211 char c = s.charAt(i); 212 if (c == '\\') { 213 i++; 214 c = s.charAt(i); 215 if (c < 0 || c > 127) { 216 return false; 217 } 218 } 219 else { 220 if (c < 32 || c > 126 || INVALID_CHARS.indexOf(c) >= 0) { 221 return false; 222 } 223 } 224 } 225 return true; 226 } 227 228 private static final boolean isValidAlpha(char c) { 229 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); 230 } 231 232 private static final boolean isValidDigit(char c) { 233 return (c >= '0' && c <= '9'); 234 } 235 236 237 } | Popular Tags |