/* =========================================================== * TradeManager : An application to trade strategies for the Java(tm) platform * =========================================================== * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Project Info: org.trade * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Oracle, Inc. * in the United States and other countries.] * * (C) Copyright 2011-2011, by Simon Allen and Contributors. * * Original Author: Simon Allen; * Contributor(s): -; * * Changes * ------- * */ package org.trade.core.validator; import org.trade.core.exception.ExceptionMessage; import org.trade.core.message.IMessageFactory; import org.trade.core.message.MessageContextFactory; import org.trade.core.message.MessageFactory; /** */ public class StringValidator implements Validator { // Use these to indicate sets of valid characters public final static int NONE = 0; public final static int DIGITS = 1; public final static int SPACES = 2; public final static int LETTERS = 4; public final static int PUNCTUATION = 8; public final static int ANY = 16; public final static int ALPHANUMERIC = DIGITS + SPACES + LETTERS; public final static int ALPHA = LETTERS + SPACES; private IMessageFactory m_messageFactory; private int m_minLength; private int m_maxLength; private int m_permittedCharacterSet; private boolean m_isMandatory; private String m_additionalPermittedCharacters; /** * Constructor for StringValidator. * * @param messageFactory * IMessageFactory * @param maxLength * int * @param permittedCharacterSet * int * @param additionalPermittedCharacters * String * @param isMandatory * boolean */ public StringValidator(IMessageFactory messageFactory, int maxLength, int permittedCharacterSet, String additionalPermittedCharacters, boolean isMandatory) { m_messageFactory = messageFactory; m_maxLength = maxLength; m_permittedCharacterSet = permittedCharacterSet; m_isMandatory = isMandatory; m_additionalPermittedCharacters = additionalPermittedCharacters; } /** * Constructor for StringValidator. * * @param messageFactory * IMessageFactory * @param minLength * int * @param maxLength * int * @param permittedCharacterSet * int * @param additionalPermittedCharacters * String * @param isMandatory * boolean */ public StringValidator(IMessageFactory messageFactory, int minLength, int maxLength, int permittedCharacterSet, String additionalPermittedCharacters, boolean isMandatory) { this(messageFactory, maxLength, permittedCharacterSet, additionalPermittedCharacters, isMandatory); m_minLength = minLength; } /** * Constructor for StringValidator. * * @param messageFactory * IMessageFactory * @param minLength * int * @param maxLength * int * @param permittedCharacterSet * int * @param isMandatory * boolean */ public StringValidator(IMessageFactory messageFactory, int minLength, int maxLength, int permittedCharacterSet, boolean isMandatory) { this(messageFactory, maxLength, permittedCharacterSet, null, isMandatory); m_minLength = minLength; } /** * Constructor for StringValidator. * * @param messageFactory * IMessageFactory * @param maxLength * int * @param permittedCharacterSet * int * @param isMandatory * boolean */ public StringValidator(IMessageFactory messageFactory, int maxLength, int permittedCharacterSet, boolean isMandatory) { this(messageFactory, maxLength, permittedCharacterSet, null, isMandatory); } /** * Method getMessageFactory. * * @return IMessageFactory */ protected IMessageFactory getMessageFactory() { if (null == m_messageFactory) { m_messageFactory = MessageFactory.SYSTEM_ERROR; } return m_messageFactory; } /** * Method isMandatory. * * @return boolean */ public boolean isMandatory() { return (m_isMandatory); } /** * Method isValid. * * @param value * Object * @param invalidValue * String * @param expectedFormat * String * @param receiver * ExceptionMessageListener * @return boolean * @see org.trade.core.validator.Validator#isValid(Object, String, String, * ExceptionMessageListener) */ public boolean isValid(Object value, String invalidValue, String expectedFormat, ExceptionMessageListener receiver) { if (null == receiver) { receiver = new ExceptionMessageListener() { public void addExceptionMessage(ExceptionMessage e) { } }; } boolean valid = true; if (null == value) { value = ""; } if (0 == ((String) value).length()) // Optional/mandatory check { if (m_isMandatory) { valid = false; receiver.addExceptionMessage( getMessageFactory().create(MessageContextFactory.MANDATORY_VALUE_NOT_PROVIDED.create())); } } else if (((String) value).length() > m_maxLength) // Max length check { valid = false; receiver.addExceptionMessage(getMessageFactory().create(MessageContextFactory.MAX_LENGTH_EXCEEDED .create(MessageContextFactory.MAX_LENGTH.create(new Integer(m_maxLength))))); } else if (((String) value).length() < m_minLength) // Min length check { valid = false; receiver.addExceptionMessage(getMessageFactory().create(MessageContextFactory.MIN_LENGTH_FAILED .create(MessageContextFactory.MIN_LENGTH.create(new Integer(m_minLength))))); } else // 0 < length < max length so check valid characters { String invalidCharacters = checkForInvalidCharacters(((String) value), m_permittedCharacterSet, m_additionalPermittedCharacters); if (null != invalidCharacters) { valid = false; receiver.addExceptionMessage( getMessageFactory().create(MessageContextFactory.CONTAINS_INVALID_CHARACTERS .create(MessageContextFactory.INVALID_CHARACTERS.create(invalidCharacters)))); } } return valid; } /** * Checks a string for invalid characters. Any invalid characters will be * returned. * * * @param toStrip * String * @param whatToKeep * int * @param whatElseToKeep * String * @return String A list of each invalid character; null if all characters * are permitted. */ public static String checkForInvalidCharacters(String toStrip, int whatToKeep, String whatElseToKeep) { if ((null == toStrip) || (toStrip.length() == 0)) { return null; } String invalidChars = ""; int toStripLength = toStrip.length(); for (int i = 0; i < toStripLength; i++) { if ((!isValidChar(toStrip.charAt(i), whatToKeep)) && (!isValidChar(toStrip.charAt(i), whatElseToKeep))) { if (invalidChars.indexOf(toStrip.charAt(i)) == -1) { invalidChars = invalidChars + toStrip.substring(i, i + 1); } } } if ("".equals(invalidChars)) { return null; } else { return invalidChars; } } /** * Method isValidChar. * * @param toCheck * char * @param whatToKeep * int * @return boolean */ protected static boolean isValidChar(char toCheck, int whatToKeep) { if ((whatToKeep & ANY) > 0) { return true; } boolean spaces = ((whatToKeep & SPACES) > 0); if (toCheck == ' ') { return spaces; } boolean digits = ((whatToKeep & DIGITS) > 0); if ((toCheck >= '0') && (toCheck <= '9')) { return digits; } boolean letters = ((whatToKeep & LETTERS) > 0); if (((toCheck >= 'a') && (toCheck <= 'z')) || ((toCheck >= 'A') && (toCheck <= 'Z'))) { return letters; } boolean punctuation = ((whatToKeep & PUNCTUATION) > 0); if (punctuation) { return isValidChar(toCheck, "`~!@#$%^&*()-_=+\\|]}[{;:,<.>/?\"\'"); } else { return false; } } /** * Method isValidChar. * * @param toCheck * char * @param whatToKeep * String * @return boolean */ protected static boolean isValidChar(char toCheck, String whatToKeep) { if (null != whatToKeep) { int whatToKeepLength = whatToKeep.length(); for (int i = 0; i < whatToKeepLength; i++) { if (whatToKeep.charAt(i) == toCheck) { return true; } } } return false; } /** * Method stripSpecificChars. * * @param toStrip * String * @param whatToStrip * String * @return String */ public static String stripSpecificChars(String toStrip, String whatToStrip) { if ((null == toStrip) || (toStrip.length() == 0)) { return toStrip; } StringBuffer bufferedResult = new StringBuffer(""); int toStripLength = toStrip.length(); for (int i = 0; i < toStripLength; i++) { // if the character is valid where the valid chars come from // toStrip, // then the character is of of the chars the need to be stripped if (!isValidChar(toStrip.charAt(i), whatToStrip)) { bufferedResult.append(toStrip.substring(i, i + 1)); } } return bufferedResult.toString(); } }