com.proofpoint.event.collector.validation.ValidUriValidator.java Source code

Java tutorial

Introduction

Here is the source code for com.proofpoint.event.collector.validation.ValidUriValidator.java

Source

/*
 * Copyright 2011-2014 Proofpoint, Inc.
 *
 * 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.proofpoint.event.collector.validation;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.net.URI;
import java.util.Arrays;
import java.util.Set;

public class ValidUriValidator implements ConstraintValidator<ValidUri, Iterable<String>> {
    private static final Joiner ERROR_JOINER = Joiner.on(", ");
    private static final String ERROR_SEPARATOR = "; ";

    private static final Function<String, String> TO_LOWER_CASE = new Function<String, String>() {
        @Override
        public String apply(String input) {
            return input.toLowerCase();
        }
    };

    private Set<String> validSchemes;

    @Override
    public void initialize(ValidUri constraintAnnotation) {
        validSchemes = ImmutableSet
                .copyOf(Iterables.transform(Arrays.asList(constraintAnnotation.schemes()), TO_LOWER_CASE));
    }

    @Override
    public boolean isValid(Iterable<String> value, ConstraintValidatorContext context) {
        ImmutableSortedSet.Builder<String> uriWithInvalidSyntaxBuilder = ImmutableSortedSet.naturalOrder();
        ImmutableSortedSet.Builder<String> uriWithInvalidSchemeBuilder = ImmutableSortedSet.naturalOrder();

        for (String uriString : value) {
            URI uri;
            try {
                uri = URI.create(uriString);
            } catch (Exception ignored) {
                uriWithInvalidSyntaxBuilder.add(uriString);
                continue;
            }

            if (validSchemes.isEmpty()) {
                continue;
            }

            String uriScheme = uri.getScheme();

            if (uriScheme == null || !validSchemes.contains(uriScheme.toLowerCase())) {
                uriWithInvalidSchemeBuilder.add(uriString);
                continue;
            }
        }

        StringBuilder messageBuilder = new StringBuilder();
        Set<String> uriWithInvalidSyntax = uriWithInvalidSyntaxBuilder.build();
        Set<String> uriWithInvalidScheme = uriWithInvalidSchemeBuilder.build();

        if (uriWithInvalidSyntax.isEmpty() && uriWithInvalidScheme.isEmpty()) {
            return true;
        }

        messageBuilder.append("Invalid URIs: ");
        String prefix = "";
        if (!uriWithInvalidSyntax.isEmpty()) {
            messageBuilder.append(prefix).append("Invalid syntax: ")
                    .append(ERROR_JOINER.join(uriWithInvalidSyntax));
            prefix = ERROR_SEPARATOR;
        }
        if (!uriWithInvalidScheme.isEmpty()) {
            messageBuilder.append(prefix).append("Invalid scheme: ")
                    .append(ERROR_JOINER.join(uriWithInvalidScheme));
            prefix = ERROR_SEPARATOR;
        }

        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(messageBuilder.toString()).addConstraintViolation();

        return false;
    }
}