Mega Code Archive
A string input validator for IPs and domains
//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; i0;)
{
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);
}
}
*/