package org.podcastpedia.web.suggestpodcast; import org.podcastpedia.core.podcasts.PodcastDao; import org.podcastpedia.core.suggestpodcast.SuggestedPodcast; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SuggestPodcastValidator implements Validator{ private static final int MAX_KEYWORDS_LENGTH = 350; private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; public static final String REGEX_COMMA_SEPARATED_WORDS = "^[-\\w\\s]+(?:,[-\\w\\s]+)*$"; @Autowired private PodcastDao podcastDao; public boolean supports(Class<?> clazz) { return SuggestedPodcast.class.isAssignableFrom(clazz); } public void validate(Object target, Errors errors) { SuggestedPodcast suggestedPodcast = (SuggestedPodcast)target; /* validate name */ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name"); /* validate identifier */ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "identifier", "required.identifier"); verifyIdentifier(errors, suggestedPodcast); /* validate feed */ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "feedUrl", "required.feedUrl"); /* validate email*/ if(!isEmailValid(suggestedPodcast.getEmail())){ errors.rejectValue("email", "invalid.required.email"); } /* validate suggested keywords */ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "suggestedTags", "required.keywords"); Pattern pattern = Pattern.compile(REGEX_COMMA_SEPARATED_WORDS, Pattern.UNICODE_CHARACTER_CLASS); Matcher matcher; matcher = pattern.matcher(suggestedPodcast.getSuggestedTags()); if( suggestedPodcast.getSuggestedTags() != null && (!matcher.matches() || suggestedPodcast.getSuggestedTags().length() > MAX_KEYWORDS_LENGTH)) { errors.rejectValue("suggestedTags", "invalid.suggestedTags"); } /* validate category */ if(suggestedPodcast.getCategories() == null){ errors.rejectValue("categories", "required.category"); } /* validate social fan pages */ if(isInvalidFacebookFanPageUrl(suggestedPodcast) ) { errors.rejectValue("facebookPage", "invalid.socialFanPage"); } if(isInvalidTwitterFanPageUrl(suggestedPodcast) ) { errors.rejectValue("twitterPage", "invalid.socialFanPage"); } if(isInvalidGPlusFanPageUrl(suggestedPodcast) ) { errors.rejectValue("gplusPage", "invalid.socialFanPage"); } } private boolean isInvalidTwitterFanPageUrl(SuggestedPodcast suggestedPodcast) { return suggestedPodcast.getTwitterPage()!=null && !suggestedPodcast.getTwitterPage().trim().equals("") && !(suggestedPodcast.getTwitterPage().startsWith("http://www.twitter.com") || suggestedPodcast.getTwitterPage().startsWith("https://www.twitter.com") || suggestedPodcast.getTwitterPage().startsWith("https://twitter.com") || suggestedPodcast.getTwitterPage().startsWith("http://twitter.com")); } private boolean isInvalidFacebookFanPageUrl(SuggestedPodcast suggestedPodcast) { return suggestedPodcast.getFacebookPage()!=null && !suggestedPodcast.getFacebookPage().trim().equals("") && !(suggestedPodcast.getFacebookPage().startsWith("http://www.facebook.com") || suggestedPodcast.getFacebookPage().startsWith("https://www.facebook.com") || suggestedPodcast.getFacebookPage().startsWith("http://facebook.com") || suggestedPodcast.getFacebookPage().startsWith("https://facebook.com")); } private boolean isInvalidGPlusFanPageUrl(SuggestedPodcast suggestedPodcast) { return suggestedPodcast.getGplusPage()!=null && !suggestedPodcast.getGplusPage().trim().equals("") && !(suggestedPodcast.getGplusPage().contains("google.com")); } private void verifyIdentifier(Errors errors, SuggestedPodcast suggestedPodcast) { if(suggestedPodcast.getIdentifier() != null && !suggestedPodcast.getIdentifier().trim().isEmpty()){ Integer podcastId = podcastDao.getPodcastIdForIdentifier(suggestedPodcast.getIdentifier().trim()); if(podcastId != null){ errors.rejectValue("identifier", "used.identifier"); } } } private static boolean isEmailValid(String email){ Pattern pattern = Pattern.compile(EMAIL_PATTERN); Matcher matcher = pattern.matcher(email); return matcher.matches(); } }