/* * (c) Copyright 2009-2010 by Volker Bergmann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, is permitted under the terms of the * GNU General Public License. * * For redistributing this software or a derivative work under a license other * than the GPL-compatible Free Software License as defined by the Free * Software Foundation or approved by OSI, you must first obtain a commercial * license to this software product from Volker Bergmann. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS, * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package org.databene.benerator.primitive; import java.util.HashSet; import java.util.Set; import javax.validation.ConstraintValidatorContext; import org.databene.commons.CollectionUtil; import org.databene.commons.StringUtil; import org.databene.commons.validator.bean.AbstractConstraintValidator; import org.databene.domain.address.Country; /** * Checks if a String contains an 'unlucky' number like 13 in western cultures or 4 in east-asian cultures. * See <a href="http://www.knowledgerush.com/kr/encyclopedia/Unlucky_number/">knowledgerush.com</a>, * <a href="http://vortex-japan.seesaa.net/article/113266312.html">vortex-japan.seesaa.net</a>, * <a href="http://en.wikipedia.org/wiki/Numerology">Wikipedia: Numerology</a> * and <a href="http://en.wikipedia.org/wiki/Numbers_in_Chinese_culture">Wikipedia: Numbers in Chinese culture</a> <br/> * <br/> * Created at 03.07.2009 07:46:20 * @since 0.6.0 * @author Volker Bergmann */ public class UnluckyNumberValidator extends AbstractConstraintValidator<UnluckyNumber, String> { private static final String UNLUCKY_CN = "4,14"; private static final String LUCKY_CN = "2,8,9,13"; private static final String UNLUCKY_JP = "4,9"; private static final String LUCKY_JP = "8"; private static final String UNLUCKY_WESTERN = "13,69,616,666"; private static final String LUCKY_WESTERN = "7"; private static final String UNLUCKY_IT = UNLUCKY_WESTERN + ",17"; private Set<String> luckyNumbers; private Set<String> unluckyNumbers; private boolean luckyNumberRequired; private boolean endOnly; public UnluckyNumberValidator() { this(false); } public UnluckyNumberValidator(boolean luckyNumberRequired) { this.luckyNumberRequired = luckyNumberRequired; this.endOnly = false; Country country = Country.getDefault(); if (Country.CHINA.equals(country)) { luckyNumbers = parseNumberSpec(LUCKY_CN); unluckyNumbers = parseNumberSpec(UNLUCKY_CN); } else if (Country.JAPAN.equals(country)) { luckyNumbers = parseNumberSpec(LUCKY_JP); unluckyNumbers = parseNumberSpec(UNLUCKY_JP); } else if (Country.ITALY.equals(country)) { luckyNumbers = parseNumberSpec(LUCKY_WESTERN); unluckyNumbers = parseNumberSpec(UNLUCKY_IT); } else { luckyNumbers = parseNumberSpec(LUCKY_WESTERN); unluckyNumbers = parseNumberSpec(UNLUCKY_WESTERN); } } public boolean isLuckyNumberRequired() { return luckyNumberRequired; } public void setLuckyNumberRequired(boolean luckyNumberRequired) { this.luckyNumberRequired = luckyNumberRequired; } public void setLuckyNumbers(String... luckyNumbers) { this.luckyNumbers = CollectionUtil.toSet(luckyNumbers); } public void setUnluckyNumbers(String... unluckyNumbers) { this.unluckyNumbers = CollectionUtil.toSet(unluckyNumbers); } @Override public void initialize(UnluckyNumber parameters) { super.initialize(parameters); setLuckyNumberRequired(parameters.luckyNumberRequired()); } public boolean isEndOnly() { return endOnly; } public void setEndOnly(boolean endOnly) { this.endOnly = endOnly; } public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { if (StringUtil.isEmpty(value)) return false; else if (endOnly) return !endsWithUnluckyNumber(value); else if (containsUnluckyNumber(value)) return false; else if (luckyNumberRequired) return containsLuckyNumber(value); else return true; } private boolean containsLuckyNumber(String candidate) { for (String test : luckyNumbers) if (candidate.contains(test)) return true; return false; } private boolean endsWithUnluckyNumber(String candidate) { for (String test : unluckyNumbers) if (candidate.endsWith(test)) return true; return false; } private boolean containsUnluckyNumber(String candidate) { for (String test : unluckyNumbers) if (candidate.contains(test)) return true; return false; } private static Set<String> parseNumberSpec(String spec) { String[] tokens = StringUtil.tokenize(spec, ','); Set<String> set = new HashSet<String>(); for (String token: tokens) set.add(token); return set; } }