You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by si...@apache.org on 2012/01/06 23:34:34 UTC
svn commit: r1228467 - in /incubator/bval/trunk/bval-extras/src:
main/java/org/apache/bval/extras/constraints/
test/java/org/apache/bval/extras/constraints/
Author: simonetripodi
Date: Fri Jan 6 22:34:34 2012
New Revision: 1228467
URL: http://svn.apache.org/viewvc?rev=1228467&view=rev
Log:
first checkin of DomainValidator - partially imported from commons-validator
Added:
incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java (with props)
incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java (with props)
incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java (with props)
Added: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java?rev=1228467&view=auto
==============================================================================
--- incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java (added)
+++ incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java Fri Jan 6 22:34:34 2012
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.bval.extras.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * <p>
+ * --
+ * TODO - This class is NOT part of the bean_validation spec and might disappear
+ * as soon as a final version of the specification contains a similar functionality.
+ * --
+ * </p>
+ * Description: annotation to validate a java.io.File is a directory<br/>
+ */
+@Documented
+@Constraint( validatedBy = DomainValidator.class )
+@Target( { FIELD, ANNOTATION_TYPE, PARAMETER } )
+@Retention( RUNTIME )
+public @interface Domain {
+
+ Class<?>[] groups() default {};
+
+ String message() default "{org.apache.bval.extras.constraints.Domain.message}";
+
+ Class<? extends Payload>[] payload() default {};
+
+ boolean allowLocal() default false;
+
+}
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/Domain.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java?rev=1228467&view=auto
==============================================================================
--- incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java (added)
+++ incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java Fri Jan 6 22:34:34 2012
@@ -0,0 +1,463 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.bval.extras.constraints;
+
+import static java.util.Arrays.asList;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * <p><b>Domain name</b> validation routines.</p>
+ *
+ * <p>
+ * This validator provides methods for validating Internet domain names
+ * and top-level domains.
+ * </p>
+ *
+ * <p>Domain names are evaluated according
+ * to the standards <a href="http://www.ietf.org/rfc/rfc1034.txt">RFC1034</a>,
+ * section 3, and <a href="http://www.ietf.org/rfc/rfc1123.txt">RFC1123</a>,
+ * section 2.1. No accomodation is provided for the specialized needs of
+ * other applications; if the domain name has been URL-encoded, for example,
+ * validation will fail even though the equivalent plaintext version of the
+ * same name would have passed.
+ * </p>
+ *
+ * <p>
+ * Validation is also provided for top-level domains (TLDs) as defined and
+ * maintained by the Internet Assigned Numbers Authority (IANA):
+ * </p>
+ *
+ * <ul>
+ * <li>{@link #isValidInfrastructureTld} - validates infrastructure TLDs
+ * (<code>.arpa</code>, etc.)</li>
+ * <li>{@link #isValidGenericTld} - validates generic TLDs
+ * (<code>.com, .org</code>, etc.)</li>
+ * <li>{@link #isValidCountryCodeTld} - validates country code TLDs
+ * (<code>.us, .uk, .cn</code>, etc.)</li>
+ * </ul>
+ *
+ * <p>
+ * (<b>NOTE</b>: This class does not provide IP address lookup for domain names or
+ * methods to ensure that a given domain name matches a specific IP; see
+ * {@link java.net.InetAddress} for that functionality.)
+ * </p>
+ */
+public class DomainValidator implements ConstraintValidator<Domain, String> {
+
+ private boolean allowLocal;
+
+ // Regular expression strings for hostnames (derived from RFC2396 and RFC 1123)
+ private static final Pattern DOMAIN_LABEL = Pattern.compile("\\p{Alnum}(?>[\\p{Alnum}-]*\\p{Alnum})*");
+
+ private static final Pattern DOMAIN_NAME_REGEX = Pattern.compile("^(?:"
+ + DOMAIN_LABEL.pattern()
+ + "\\.)+(\\p{Alpha}{2,})$");
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isValid(String domain, ConstraintValidatorContext context) {
+ Matcher matcher = DOMAIN_NAME_REGEX.matcher(domain);
+ if (matcher.matches()) {
+ domain = matcher.group(1);
+ return isValidTld(domain);
+ } else if (allowLocal && DOMAIN_LABEL.matcher(domain).matches()) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if the specified <code>String</code> matches any
+ * IANA-defined top-level domain. Leading dots are ignored if present.
+ * The search is case-sensitive.
+ *
+ * @param tld the parameter to check for TLD status
+ * @return true if the parameter is a TLD
+ */
+ boolean isValidTld(String tld) {
+ if (allowLocal && isValidLocalTld(tld)) {
+ return true;
+ }
+
+ tld = chompLeadingDot(tld).toLowerCase();
+ return isValidInfrastructureTld(tld)
+ || isValidGenericTld(tld)
+ || isValidCountryCodeTld(tld);
+ }
+
+ /**
+ * Returns true if the specified <code>String</code> matches any
+ * IANA-defined infrastructure top-level domain. Leading dots are
+ * ignored if present. The search is case-sensitive.
+ *
+ * @param iTld the parameter to check for infrastructure TLD status
+ * @return true if the parameter is an infrastructure TLD
+ */
+ static boolean isValidInfrastructureTld(String iTld) {
+ return INFRASTRUCTURE_TLDS.contains(iTld);
+ }
+
+ /**
+ * Returns true if the specified <code>String</code> matches any
+ * IANA-defined generic top-level domain. Leading dots are ignored
+ * if present. The search is case-sensitive.
+ *
+ * @param gTld the parameter to check for generic TLD status
+ * @return true if the parameter is a generic TLD
+ */
+ static boolean isValidGenericTld(String gTld) {
+ return GENERIC_TLDS.contains(gTld);
+ }
+
+ /**
+ * Returns true if the specified <code>String</code> matches any
+ * IANA-defined country code top-level domain. Leading dots are
+ * ignored if present. The search is case-sensitive.
+ *
+ * @param ccTld the parameter to check for country code TLD status
+ * @return true if the parameter is a country code TLD
+ */
+ static boolean isValidCountryCodeTld(String ccTld) {
+ return COUNTRY_CODE_TLDS.contains(ccTld);
+ }
+
+ /**
+ * Returns true if the specified <code>String</code> matches any
+ * widely used "local" domains (localhost or localdomain). Leading dots are
+ * ignored if present. The search is case-sensitive.
+ *
+ * @param iTld the parameter to check for local TLD status
+ * @return true if the parameter is an local TLD
+ */
+ static boolean isValidLocalTld(String iTld) {
+ return LOCAL_TLDS.contains(iTld);
+ }
+
+ private static String chompLeadingDot(String str) {
+ if (str.startsWith(".")) {
+ return str.substring(1);
+ }
+ return str;
+ }
+
+ // ---------------------------------------------
+ // ----- TLDs defined by IANA
+ // ----- Authoritative and comprehensive list at:
+ // ----- http://data.iana.org/TLD/tlds-alpha-by-domain.txt
+
+ private static final List<String> INFRASTRUCTURE_TLDS = asList(
+ "arpa", // internet infrastructure
+ "root" // diagnostic marker for non-truncated root zone
+ );
+
+ private static final List<String> GENERIC_TLDS = asList(
+ "aero", // air transport industry
+ "asia", // Pan-Asia/Asia Pacific
+ "biz", // businesses
+ "cat", // Catalan linguistic/cultural community
+ "com", // commercial enterprises
+ "coop", // cooperative associations
+ "info", // informational sites
+ "jobs", // Human Resource managers
+ "mobi", // mobile products and services
+ "museum", // museums, surprisingly enough
+ "name", // individuals' sites
+ "net", // internet support infrastructure/business
+ "org", // noncommercial organizations
+ "pro", // credentialed professionals and entities
+ "tel", // contact data for businesses and individuals
+ "travel", // entities in the travel industry
+ "gov", // United States Government
+ "edu", // accredited postsecondary US education entities
+ "mil", // United States Military
+ "int" // organizations established by international treaty
+ );
+
+ private static final List<String> COUNTRY_CODE_TLDS = asList(
+ "ac", // Ascension Island
+ "ad", // Andorra
+ "ae", // United Arab Emirates
+ "af", // Afghanistan
+ "ag", // Antigua and Barbuda
+ "ai", // Anguilla
+ "al", // Albania
+ "am", // Armenia
+ "an", // Netherlands Antilles
+ "ao", // Angola
+ "aq", // Antarctica
+ "ar", // Argentina
+ "as", // American Samoa
+ "at", // Austria
+ "au", // Australia (includes Ashmore and Cartier Islands and Coral Sea Islands)
+ "aw", // Aruba
+ "ax", // Ã
land
+ "az", // Azerbaijan
+ "ba", // Bosnia and Herzegovina
+ "bb", // Barbados
+ "bd", // Bangladesh
+ "be", // Belgium
+ "bf", // Burkina Faso
+ "bg", // Bulgaria
+ "bh", // Bahrain
+ "bi", // Burundi
+ "bj", // Benin
+ "bm", // Bermuda
+ "bn", // Brunei Darussalam
+ "bo", // Bolivia
+ "br", // Brazil
+ "bs", // Bahamas
+ "bt", // Bhutan
+ "bv", // Bouvet Island
+ "bw", // Botswana
+ "by", // Belarus
+ "bz", // Belize
+ "ca", // Canada
+ "cc", // Cocos (Keeling) Islands
+ "cd", // Democratic Republic of the Congo (formerly Zaire)
+ "cf", // Central African Republic
+ "cg", // Republic of the Congo
+ "ch", // Switzerland
+ "ci", // Côte d'Ivoire
+ "ck", // Cook Islands
+ "cl", // Chile
+ "cm", // Cameroon
+ "cn", // China, mainland
+ "co", // Colombia
+ "cr", // Costa Rica
+ "cu", // Cuba
+ "cv", // Cape Verde
+ "cx", // Christmas Island
+ "cy", // Cyprus
+ "cz", // Czech Republic
+ "de", // Germany
+ "dj", // Djibouti
+ "dk", // Denmark
+ "dm", // Dominica
+ "do", // Dominican Republic
+ "dz", // Algeria
+ "ec", // Ecuador
+ "ee", // Estonia
+ "eg", // Egypt
+ "er", // Eritrea
+ "es", // Spain
+ "et", // Ethiopia
+ "eu", // European Union
+ "fi", // Finland
+ "fj", // Fiji
+ "fk", // Falkland Islands
+ "fm", // Federated States of Micronesia
+ "fo", // Faroe Islands
+ "fr", // France
+ "ga", // Gabon
+ "gb", // Great Britain (United Kingdom)
+ "gd", // Grenada
+ "ge", // Georgia
+ "gf", // French Guiana
+ "gg", // Guernsey
+ "gh", // Ghana
+ "gi", // Gibraltar
+ "gl", // Greenland
+ "gm", // The Gambia
+ "gn", // Guinea
+ "gp", // Guadeloupe
+ "gq", // Equatorial Guinea
+ "gr", // Greece
+ "gs", // South Georgia and the South Sandwich Islands
+ "gt", // Guatemala
+ "gu", // Guam
+ "gw", // Guinea-Bissau
+ "gy", // Guyana
+ "hk", // Hong Kong
+ "hm", // Heard Island and McDonald Islands
+ "hn", // Honduras
+ "hr", // Croatia (Hrvatska)
+ "ht", // Haiti
+ "hu", // Hungary
+ "id", // Indonesia
+ "ie", // Ireland (Ãire)
+ "il", // Israel
+ "im", // Isle of Man
+ "in", // India
+ "io", // British Indian Ocean Territory
+ "iq", // Iraq
+ "ir", // Iran
+ "is", // Iceland
+ "it", // Italy
+ "je", // Jersey
+ "jm", // Jamaica
+ "jo", // Jordan
+ "jp", // Japan
+ "ke", // Kenya
+ "kg", // Kyrgyzstan
+ "kh", // Cambodia (Khmer)
+ "ki", // Kiribati
+ "km", // Comoros
+ "kn", // Saint Kitts and Nevis
+ "kp", // North Korea
+ "kr", // South Korea
+ "kw", // Kuwait
+ "ky", // Cayman Islands
+ "kz", // Kazakhstan
+ "la", // Laos (currently being marketed as the official domain for Los Angeles)
+ "lb", // Lebanon
+ "lc", // Saint Lucia
+ "li", // Liechtenstein
+ "lk", // Sri Lanka
+ "lr", // Liberia
+ "ls", // Lesotho
+ "lt", // Lithuania
+ "lu", // Luxembourg
+ "lv", // Latvia
+ "ly", // Libya
+ "ma", // Morocco
+ "mc", // Monaco
+ "md", // Moldova
+ "me", // Montenegro
+ "mg", // Madagascar
+ "mh", // Marshall Islands
+ "mk", // Republic of Macedonia
+ "ml", // Mali
+ "mm", // Myanmar
+ "mn", // Mongolia
+ "mo", // Macau
+ "mp", // Northern Mariana Islands
+ "mq", // Martinique
+ "mr", // Mauritania
+ "ms", // Montserrat
+ "mt", // Malta
+ "mu", // Mauritius
+ "mv", // Maldives
+ "mw", // Malawi
+ "mx", // Mexico
+ "my", // Malaysia
+ "mz", // Mozambique
+ "na", // Namibia
+ "nc", // New Caledonia
+ "ne", // Niger
+ "nf", // Norfolk Island
+ "ng", // Nigeria
+ "ni", // Nicaragua
+ "nl", // Netherlands
+ "no", // Norway
+ "np", // Nepal
+ "nr", // Nauru
+ "nu", // Niue
+ "nz", // New Zealand
+ "om", // Oman
+ "pa", // Panama
+ "pe", // Peru
+ "pf", // French Polynesia With Clipperton Island
+ "pg", // Papua New Guinea
+ "ph", // Philippines
+ "pk", // Pakistan
+ "pl", // Poland
+ "pm", // Saint-Pierre and Miquelon
+ "pn", // Pitcairn Islands
+ "pr", // Puerto Rico
+ "ps", // Palestinian territories (PA-controlled West Bank and Gaza Strip)
+ "pt", // Portugal
+ "pw", // Palau
+ "py", // Paraguay
+ "qa", // Qatar
+ "re", // Réunion
+ "ro", // Romania
+ "rs", // Serbia
+ "ru", // Russia
+ "rw", // Rwanda
+ "sa", // Saudi Arabia
+ "sb", // Solomon Islands
+ "sc", // Seychelles
+ "sd", // Sudan
+ "se", // Sweden
+ "sg", // Singapore
+ "sh", // Saint Helena
+ "si", // Slovenia
+ "sj", // Svalbard and Jan Mayen Islands Not in use (Norwegian dependencies; see .no)
+ "sk", // Slovakia
+ "sl", // Sierra Leone
+ "sm", // San Marino
+ "sn", // Senegal
+ "so", // Somalia
+ "sr", // Suriname
+ "st", // São Tomé and PrÃncipe
+ "su", // Soviet Union (deprecated)
+ "sv", // El Salvador
+ "sy", // Syria
+ "sz", // Swaziland
+ "tc", // Turks and Caicos Islands
+ "td", // Chad
+ "tf", // French Southern and Antarctic Lands
+ "tg", // Togo
+ "th", // Thailand
+ "tj", // Tajikistan
+ "tk", // Tokelau
+ "tl", // East Timor (deprecated old code)
+ "tm", // Turkmenistan
+ "tn", // Tunisia
+ "to", // Tonga
+ "tp", // East Timor
+ "tr", // Turkey
+ "tt", // Trinidad and Tobago
+ "tv", // Tuvalu
+ "tw", // Taiwan, Republic of China
+ "tz", // Tanzania
+ "ua", // Ukraine
+ "ug", // Uganda
+ "uk", // United Kingdom
+ "um", // United States Minor Outlying Islands
+ "us", // United States of America
+ "uy", // Uruguay
+ "uz", // Uzbekistan
+ "va", // Vatican City State
+ "vc", // Saint Vincent and the Grenadines
+ "ve", // Venezuela
+ "vg", // British Virgin Islands
+ "vi", // U.S. Virgin Islands
+ "vn", // Vietnam
+ "vu", // Vanuatu
+ "wf", // Wallis and Futuna
+ "ws", // Samoa (formerly Western Samoa)
+ "ye", // Yemen
+ "yt", // Mayotte
+ "yu", // Serbia and Montenegro (originally Yugoslavia)
+ "za", // South Africa
+ "zm", // Zambia
+ "zw" // Zimbabwe
+ );
+
+ private static final List<String> LOCAL_TLDS = asList(
+ "localhost", // RFC2606 defined
+ "localdomain" // Also widely used as localhost.localdomain
+ );
+
+ /**
+ * {@inheritDoc}
+ */
+ public void initialize(Domain domain) {
+ allowLocal = domain.allowLocal();
+ }
+
+}
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/bval/trunk/bval-extras/src/main/java/org/apache/bval/extras/constraints/DomainValidator.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java
URL: http://svn.apache.org/viewvc/incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java?rev=1228467&view=auto
==============================================================================
--- incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java (added)
+++ incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java Fri Jan 6 22:34:34 2012
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.bval.extras.constraints;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.annotation.Annotation;
+
+import javax.validation.Payload;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for the DomainValidator.
+ */
+public class DomainValidatorTest {
+
+ private DomainValidator validator;
+
+ @Before
+ public void setUp() {
+ validator = new DomainValidator();
+ }
+
+ @Test
+ public void testValidDomains() {
+ assertTrue("apache.org should validate", validator.isValid("apache.org", null));
+ assertTrue("www.google.com should validate", validator.isValid("www.google.com", null));
+
+ assertTrue("test-domain.com should validate", validator.isValid("test-domain.com", null));
+ assertTrue("test---domain.com should validate", validator.isValid("test---domain.com", null));
+ assertTrue("test-d-o-m-ain.com should validate", validator.isValid("test-d-o-m-ain.com", null));
+ assertTrue("two-letter domain label should validate", validator.isValid("as.uk", null));
+
+ assertTrue("case-insensitive ApAchE.Org should validate", validator.isValid("ApAchE.Org", null));
+
+ assertTrue("single-character domain label should validate", validator.isValid("z.com", null));
+
+ assertTrue("i.have.an-example.domain.name should validate", validator.isValid("i.have.an-example.domain.name", null));
+ }
+
+ @Test
+ public void testInvalidDomains() {
+ assertFalse("bare TLD .org shouldn't validate", validator.isValid(".org", null));
+ assertFalse("domain name with spaces shouldn't validate", validator.isValid(" apache.org ", null));
+ assertFalse("domain name containing spaces shouldn't validate", validator.isValid("apa che.org", null));
+ assertFalse("domain name starting with dash shouldn't validate", validator.isValid("-testdomain.name", null));
+ assertFalse("domain name ending with dash shouldn't validate", validator.isValid("testdomain-.name", null));
+ assertFalse("domain name starting with multiple dashes shouldn't validate", validator.isValid("---c.com", null));
+ assertFalse("domain name ending with multiple dashes shouldn't validate", validator.isValid("c--.com", null));
+ assertFalse("domain name with invalid TLD shouldn't validate", validator.isValid("apache.rog", null));
+
+ assertFalse("URL shouldn't validate", validator.isValid("http://www.apache.org", null));
+ assertFalse("Empty string shouldn't validate as domain name", validator.isValid(" ", null));
+ }
+
+ @Test
+ public void testTopLevelDomains() {
+ // infrastructure TLDs
+ assertTrue(".arpa should validate as iTLD", DomainValidator.isValidInfrastructureTld("arpa"));
+ assertFalse(".com shouldn't validate as iTLD", DomainValidator.isValidInfrastructureTld("com"));
+
+ // generic TLDs
+ assertTrue(".name should validate as gTLD", DomainValidator.isValidGenericTld("name"));
+ assertFalse(".us shouldn't validate as gTLD", DomainValidator.isValidGenericTld("us"));
+
+ // country code TLDs
+ assertTrue(".uk should validate as ccTLD", DomainValidator.isValidCountryCodeTld("uk"));
+ assertFalse(".org shouldn't validate as ccTLD", DomainValidator.isValidCountryCodeTld("org"));
+
+ // case-insensitive
+ assertTrue(".COM should validate as TLD", validator.isValidTld("COM"));
+ assertTrue(".BiZ should validate as TLD", validator.isValidTld("BiZ"));
+
+ // corner cases
+ assertFalse("invalid TLD shouldn't validate", validator.isValid("nope", null));
+ assertFalse("empty string shouldn't validate as TLD", validator.isValid("", null));
+ }
+
+ @Test
+ public void testAllowLocal() {
+ DomainValidator noLocal = new DomainValidator();
+ DomainValidator allowLocal = new DomainValidator();
+ allowLocal.initialize( new Domain()
+ {
+
+ public Class<? extends Annotation> annotationType() {
+ // not needed
+ return null;
+ }
+
+ public Class<? extends Payload>[] payload() {
+ // not needed
+ return null;
+ }
+
+ public String message() {
+ // not needed
+ return null;
+ }
+
+ public Class<?>[] groups() {
+ // not needed
+ return null;
+ }
+
+ public boolean allowLocal() {
+ // enable the local
+ return true;
+ }
+ });
+
+ // Default won't allow local
+ assertFalse("localhost.localdomain should validate", noLocal.isValid("localhost.localdomain", null));
+ assertFalse("localhost should validate", noLocal.isValid("localhost", null));
+
+ // But it may be requested
+ assertTrue("localhost.localdomain should validate", allowLocal.isValid("localhost.localdomain", null));
+ assertTrue("localhost should validate", allowLocal.isValid("localhost", null));
+ assertTrue("hostname should validate", allowLocal.isValid("hostname", null));
+ assertTrue("machinename should validate", allowLocal.isValid("machinename", null));
+
+ // Check the localhost one with a few others
+ assertTrue("apache.org should validate", allowLocal.isValid("apache.org", null));
+ assertFalse("domain name with spaces shouldn't validate", allowLocal.isValid(" apache.org ", null));
+ }
+
+ @Test
+ public void testIDN() {
+ assertTrue("b\u00fccher.ch in IDN should validate", validator.isValid("www.xn--bcher-kva.ch", null));
+ }
+
+}
Propchange: incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/bval/trunk/bval-extras/src/test/java/org/apache/bval/extras/constraints/DomainValidatorTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain