Java tutorial
//Copyright 2007-2009 David Yu dyuproject@gmail.com //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //package com.dyuproject.util.validate; /** * A string input validator for IPs and domains. * * @author David Yu * @created Jan 10, 2009 */ public final class IPDomainValidator { public static final int INVALID = 0; public static final int PLAIN = 1; public static final int ALPHANUMERIC = 2; public static final int HYPHENATED = 3; public static final int MIXED = 4; public static final int IP = 5; /** * Returns 0 if the char array {@code part} is invalid. */ public static int tokenValidate(char[] part, int start, int len) { int digitCount = 0, lastHyphen = -1; for (int i = 0; i < len; i++) { char c = part[start++]; if (Character.isDigit(c)) digitCount++; else if (!Character.isLetter(c)) { if (c == '-') { if (i < len - 1) { if (lastHyphen + 1 == i || lastHyphen - 1 == i) { // invalid placement of hyphens (succeeding, prefix) return INVALID; } lastHyphen = i; } else { // invalid placement of hyphens (suffix) return INVALID; } } else return INVALID; } } if (digitCount == len) return IP; if (digitCount == 0) return lastHyphen == -1 ? PLAIN : HYPHENATED; return lastHyphen == -1 ? ALPHANUMERIC : MIXED; } /** * Returns the index of the char {@code c} from the char array {@code ch}. */ public static int indexOf(char[] ch, char c, int start) { for (int i = start; i < ch.length; i++) { if (ch[i] == c) return i; } return -1; } /** * Returns the index (starting from the last) of the char {@code c} from the * array of characters {@code ch}. */ public static int lastIndexOf(char[] ch, char c, int start) { for (int i = start; i-- > 0;) { if (ch[i] == c) return i; } return -1; } /** * Returns 0 if the string {@code domain} is invalid. */ public static int validate(String domain, int start, int end) { char[] ch = new char[end - start]; domain.getChars(start, end, ch, 0); return validate(ch); } /** * Returns 0 if the string {@code domain} is invalid. */ public static int validate(String domain) { return validate(domain.toCharArray()); } /** * Returns 0 if the char array {@code domain} is invalid. */ public static int validate(char[] domain) { return validate(domain, 0, domain.length); } /** * Returns 0 if the char array {@code domain} is invalid. */ public static int validate(char[] domain, int start, int end) { boolean mixed = false, hyphenated = false, alphanumeric = false; int tokens = 0, digitTokens = 0, extLen = 0; for (int i = end; i > 0;) { int idx = lastIndexOf(domain, '.', i - 1); int l = i - idx - 1; int check = tokenValidate(domain, idx + 1, l); i = idx; switch (check) { case INVALID: return INVALID; case PLAIN: if (tokens == 0) { if (l == 1) return INVALID; extLen = l; } break; case ALPHANUMERIC: if (tokens == 0) { // invalid domain extension (alphanumeric) return INVALID; } alphanumeric = true; break; case HYPHENATED: if (tokens == 0) { // invalid domain extension (alphanumeric) return INVALID; } hyphenated = true; break; case MIXED: if (tokens == 0) { // invalid domain extension (alphanumeric) return INVALID; } mixed = true; break; case IP: if (tokens == 0 && l > 3) { // invalid domain extension (max of 3) return INVALID; } alphanumeric = true; digitTokens++; break; } // if exceeds maximum chars for a domain if (l > 63) return INVALID; tokens++; } if (tokens == digitTokens) return tokens > 4 ? INVALID : IP; if (extLen == 0 || tokens == 1) return INVALID; if (mixed) return MIXED; if (hyphenated) return HYPHENATED; return alphanumeric ? ALPHANUMERIC : PLAIN; } /** * Checks whether the string {@code domain} is valid. */ public static boolean isValid(String domain) { return validate(domain) != INVALID; } /** * Checks whether the char array {@code domain} is valid. */ public static boolean isValid(char[] domain) { return validate(domain) != INVALID; } /** * Checks whether the string {@code domain} is valid. */ public static boolean isValid(String domain, int start, int end) { return validate(domain, start, end) != INVALID; } /** * Checks whether the char array {@code domain} is valid. */ public static boolean isValid(char[] domain, int start, int end) { return validate(domain, start, end) != INVALID; } } /* //Copyright 2007-2009 David Yu dyuproject@gmail.com //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. package com.dyuproject.util.validate; import junit.framework.TestCase; // * @author David Yu // * @created Jan 10, 2009 public class IPDomainValidatorTest extends TestCase { public void test1() { assertTrue(IPDomainValidator.validate("c.org")==IPDomainValidator.PLAIN); assertTrue(IPDomainValidator.validate("c.ph")==IPDomainValidator.PLAIN); assertTrue(IPDomainValidator.validate("123c.com")==IPDomainValidator.ALPHANUMERIC); assertTrue(IPDomainValidator.validate("c.museum")==IPDomainValidator.PLAIN); assertTrue(IPDomainValidator.validate("10.com")==IPDomainValidator.ALPHANUMERIC); assertTrue(IPDomainValidator.validate("c-b.com")==IPDomainValidator.HYPHENATED); assertTrue(IPDomainValidator.validate("192.168.1.1")==IPDomainValidator.IP); assertTrue(IPDomainValidator.validate("255.255.255.255")==IPDomainValidator.IP); String s = "asd1-fc.com"; assertTrue(IPDomainValidator.validate(s, 1, s.length()-1)==IPDomainValidator.MIXED); assertTrue(IPDomainValidator.validate(s.toCharArray(), 1, s.length()-1)==IPDomainValidator.MIXED); String longDomain = "123456789012345678901234567890123456789012345678901234567890123.com"; assertTrue(IPDomainValidator.validate(longDomain)==IPDomainValidator.ALPHANUMERIC); assertTrue(IPDomainValidator.validate("c.o1")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c.d")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c.d-g")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c.-dg")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c.dg-")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c.d--g")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c--b.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c-.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("-c.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("cb-.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("-cb.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("c_b.org")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("192.168.1a.1")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("192.1-9.12.1")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("255.255.255.255.1")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate(longDomain+"4")==IPDomainValidator.INVALID); assertTrue(IPDomainValidator.validate("localhost")==IPDomainValidator.INVALID); } } */