From do-not-reply at jboss.org Wed Feb 1 13:54:14 2012 Content-Type: multipart/mixed; boundary="===============1929040017050162998==" MIME-Version: 1.0 From: do-not-reply at jboss.org To: gatein-commits at lists.jboss.org Subject: [gatein-commits] gatein SVN: r8347 - in portal/trunk/webui/core/src: test/java/org/exoplatform/webui/test/validator and 1 other directory. Date: Wed, 01 Feb 2012 13:54:14 -0500 Message-ID: <201202011854.q11IsEnc029355@svn01.web.mwc.hst.phx2.redhat.com> --===============1929040017050162998== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Author: chris.laprun(a)jboss.com Date: 2012-02-01 13:54:13 -0500 (Wed, 01 Feb 2012) New Revision: 8347 Modified: portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/validat= or/UserConfigurableUsernameValidator.java portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/validat= or/UsernameValidator.java portal/trunk/webui/core/src/test/java/org/exoplatform/webui/test/validat= or/TestWebuiValidator.java Log: - GTNPORTAL-1673: Made UserConfigurableUsernameValidator more generic so th= at it can load any number of named configurations from gatein.conf.dir/conf= iguration.properties. A validation is activated by creating a validator wit= h the associated name. Documentation upcoming. Modified: portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/= validator/UserConfigurableUsernameValidator.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/valida= tor/UserConfigurableUsernameValidator.java 2012-02-01 15:28:25 UTC (rev 834= 6) +++ portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/valida= tor/UserConfigurableUsernameValidator.java 2012-02-01 18:54:13 UTC (rev 834= 7) @@ -33,31 +33,109 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; import java.util.regex.Pattern; = /** @author Chris Laprun */ @Serialized -public class UserConfigurableUsernameValidator extends UsernameValidator +public class UserConfigurableUsernameValidator extends MultipleConditionsV= alidator { - private static ValidatorConfiguration configuration =3D new ValidatorCo= nfiguration(); + protected static Log log =3D ExoLogger.getLogger(UserConfigurableUserna= meValidator.class); = + public static final String USERNAME =3D "username"; + public static final String GROUPMEMBERSHIP =3D "groupmembership"; + public static final String DEFAULT_LOCALIZATION_KEY =3D "ExpressionVali= dator.msg.value-invalid"; + public static final String GROUP_MEMBERSHIP_VALIDATION_REGEX =3D "^\\p{= L}[\\p{L}\\d._\\-\\s*,\\s*]+$"; + public static final String GROUP_MEMBERSHIP_LOCALIZATION_KEY =3D "UIGro= upMembershipForm.msg.Invalid-char"; + + private static Map configurations =3D n= ew HashMap(3); + + public static final String KEY_PREFIX =3D "gatein.validators."; + + static + { + String gateinConfDir =3D System.getProperty("gatein.conf.dir"); + File conf =3D new File(gateinConfDir, "configuration.properties"); + if (conf.exists()) + { + try + { + Properties properties =3D new Properties(); + properties.load(new FileInputStream(conf)); + int length =3D KEY_PREFIX.length(); + for (Object objectKey : properties.keySet()) + { + String key =3D (String)objectKey; + if (key.startsWith(KEY_PREFIX)) + { + // extract property key + String propertyKey =3D key.substring(length, key.indexOf= ('.', length)); + if(!configurations.containsKey(propertyKey)) + { + configurations.put(propertyKey, new ValidatorConfigur= ation(propertyKey, properties)); + } + } + } + } + catch (IOException e) + { + log.info(e.getLocalizedMessage()); + log.debug(e); + } + } + } + + private final String validatorName; + private final String localizationKey; + // needed by @Serialized public UserConfigurableUsernameValidator() { + this(USERNAME, DEFAULT_LOCALIZATION_KEY); + } + + public UserConfigurableUsernameValidator(String validatorName, String m= essageLocalizationKey) + { this.exceptionOnMissingMandatory =3D true; this.trimValue =3D true; + localizationKey =3D messageLocalizationKey !=3D null ? messageLocali= zationKey : DEFAULT_LOCALIZATION_KEY; + this.validatorName =3D validatorName !=3D null ? validatorName : USE= RNAME; } = + public UserConfigurableUsernameValidator(String validatorName) + { + this(validatorName, DEFAULT_LOCALIZATION_KEY); + } + @Override protected void validate(String value, String label, CompoundApplication= Message messages, UIFormInput uiInput) { - if (configuration.defaultConfig) + ValidatorConfiguration configuration =3D configurations.get(validato= rName); + + if (configuration =3D=3D null) { - super.validate(value, label, messages, uiInput); + // we don't have a user-configured validator for this validator n= ame + + if (USERNAME.equals(validatorName)) + { + // if the validator name is USERNAME constant, we have a usern= ame to validate with the original, non-configured behavior + UsernameValidator.validate(value, label, messages, UsernameVal= idator.DEFAULT_MIN_LENGTH, UsernameValidator.DEFAULT_MAX_LENGTH); + } + else + { + // else, we assume that we need to validate a group membership= , replicating original behavior + if (!Pattern.matches(GROUP_MEMBERSHIP_VALIDATION_REGEX, value)) + { + messages.addMessage(localizationKey, new Object[]{label}); + } + } } else { + // otherwise, use the user-provided configuration + if (value.length() < configuration.minLength || value.length() > = configuration.maxLength) { messages.addMessage("StringLengthValidator.msg.length-invalid"= , new Object[]{label, configuration.minLength.toString(), configuration.max= Length.toString()}); @@ -65,48 +143,33 @@ = if (!Pattern.matches(configuration.pattern, value)) { - messages.addMessage("ExpressionValidator.msg.value-invalid", n= ew Object[]{label, configuration.formatMessage}); + messages.addMessage(localizationKey, new Object[]{label, confi= guration.formatMessage}); } } } = private static class ValidatorConfiguration { - protected static Log log =3D ExoLogger.getLogger("username-validator= "); private Integer minLength; private Integer maxLength; private String pattern; private String formatMessage; - private boolean defaultConfig =3D true; = - private ValidatorConfiguration() + private ValidatorConfiguration(String propertyKey, Properties proper= ties) { - String gateinConfDir =3D System.getProperty("gatein.conf.dir"); - File conf =3D new File(gateinConfDir, "username-validator.propert= ies"); + // used to assign backward compatible default values + boolean isUser =3D USERNAME.equals(propertyKey); + String prefixedKey =3D KEY_PREFIX + propertyKey; = - minLength =3D DEFAULT_MIN_LENGTH; - maxLength =3D DEFAULT_MAX_LENGTH; - pattern =3D Utils.USER_NAME_VALIDATOR_REGEX; - formatMessage =3D pattern; + String property =3D properties.getProperty(prefixedKey + ".min.le= ngth"); + minLength =3D property !=3D null ? Integer.valueOf(property) : (i= sUser ? UsernameValidator.DEFAULT_MIN_LENGTH : 0); = - if (conf.exists()) - { - try - { - Properties properties =3D new Properties(); - properties.load(new FileInputStream(conf)); - minLength =3D Integer.valueOf(properties.getProperty("minLe= ngth", String.valueOf(DEFAULT_MIN_LENGTH))); - maxLength =3D Integer.valueOf(properties.getProperty("maxLe= ngth", String.valueOf(DEFAULT_MAX_LENGTH))); - pattern =3D properties.getProperty("regexp", Utils.USER_NAM= E_VALIDATOR_REGEX); - formatMessage =3D properties.getProperty("formatMessage", f= ormatMessage); - defaultConfig =3D false; - } - catch (IOException e) - { - log.info(e.getLocalizedMessage()); - log.debug(e); - } - } + property =3D properties.getProperty(prefixedKey + ".max.length"); + maxLength =3D property !=3D null ? Integer.valueOf(property) : (i= sUser ? UsernameValidator.DEFAULT_MAX_LENGTH : Integer.MAX_VALUE); + + pattern =3D properties.getProperty(prefixedKey + ".regexp", Utils= .USER_NAME_VALIDATOR_REGEX); + formatMessage =3D properties.getProperty(prefixedKey + ".format.m= essage", pattern); } + } } Modified: portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/= validator/UsernameValidator.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/valida= tor/UsernameValidator.java 2012-02-01 15:28:25 UTC (rev 8346) +++ portal/trunk/webui/core/src/main/java/org/exoplatform/webui/form/valida= tor/UsernameValidator.java 2012-02-01 18:54:13 UTC (rev 8347) @@ -49,6 +49,11 @@ = protected void validate(String value, String label, CompoundApplication= Message messages, UIFormInput uiInput) { + validate(value, label, messages, min, max); + } + + static void validate(String value, String label, CompoundApplicationMes= sage messages, Integer min, Integer max) + { char[] buff =3D value.toCharArray(); if (buff.length < min || buff.length > max) { @@ -93,7 +98,7 @@ } } = - private boolean isSymbol(char c) + private static boolean isSymbol(char c) { return c =3D=3D '_' || c =3D=3D '.'; } Modified: portal/trunk/webui/core/src/test/java/org/exoplatform/webui/test/= validator/TestWebuiValidator.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- portal/trunk/webui/core/src/test/java/org/exoplatform/webui/test/valida= tor/TestWebuiValidator.java 2012-02-01 15:28:25 UTC (rev 8346) +++ portal/trunk/webui/core/src/test/java/org/exoplatform/webui/test/valida= tor/TestWebuiValidator.java 2012-02-01 18:54:13 UTC (rev 8347) @@ -31,6 +31,7 @@ import org.exoplatform.webui.form.validator.ResourceValidator; import org.exoplatform.webui.form.validator.SpecialCharacterValidator; import org.exoplatform.webui.form.validator.URLValidator; +import org.exoplatform.webui.form.validator.UserConfigurableUsernameValida= tor; import org.exoplatform.webui.form.validator.UsernameValidator; import org.exoplatform.webui.form.validator.Validator; = @@ -93,6 +94,14 @@ public void testUsernameValidator() { Validator validator =3D new UsernameValidator(3, 30); + validateUsernames(validator); + + validator =3D new UserConfigurableUsernameValidator(UserConfigurable= UsernameValidator.USERNAME); + validateUsernames(validator); + } + + private void validateUsernames(Validator validator) + { assertTrue(expected(validator, "root.gtn")); assertTrue(expected(validator, "root_gtn")); assertTrue(expected(validator, "root_gtn.01")); --===============1929040017050162998==--