001    
002    /*
003     * Copyright (C) 2011 Archie L. Cobbs. All rights reserved.
004     *
005     * $Id: Hostname.java 2 2011-02-05 21:51:43Z archie.cobbs $
006     */
007    
008    package org.dellroad.stuff.validation;
009    
010    import java.lang.annotation.Documented;
011    import java.lang.annotation.ElementType;
012    import java.lang.annotation.Retention;
013    import java.lang.annotation.RetentionPolicy;
014    import java.lang.annotation.Target;
015    
016    import javax.validation.Constraint;
017    import javax.validation.Payload;
018    import javax.validation.ReportAsSingleViolation;
019    import javax.validation.constraints.Pattern;
020    
021    /**
022     * Validation constraint requiring a {@link String} to be a valid DNS hostname (or hostname component).
023     */
024    @Documented
025    @Constraint(validatedBy = {})
026    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
027    @Retention(RetentionPolicy.RUNTIME)
028    @Pattern(regexp = "^(([\\p{Alnum}]([-\\p{Alnum}]*[\\p{Alnum}])?)\\.)*([\\p{Alpha}]([-\\p{Alnum}]*[\\p{Alnum}])?)$")
029    @ReportAsSingleViolation
030    public @interface Hostname {
031    
032        String message() default "Invalid hostname or hostname component";
033    
034        Class<?>[] groups() default {};
035    
036        Class<? extends Payload>[] payload() default {};
037    }
038