package er.directtoweb.components.strings; import org.apache.log4j.Logger; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WORequest; import com.webobjects.eocontrol.EOEnterpriseObject; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSValidation; import er.directtoweb.components.ERDCustomEditComponent; import er.extensions.appserver.ERXWOContext; import er.extensions.validation.ERXValidationFactory; /** * Provides a "confirm password" service. Can * only be used in conjunction with {$link ERDEditPassword}, because * the original password value is grabbed from the <code>context.mutableUserInfo</code>. * As all the names in a displayPropertyRepetition must be distinct, you must provide a * dummy name for this component to show. The corresponding rules for a key named <code>passwordConfirmation</code> have already been set up. * @binding object the object to edit * @binding length the length of the text field * @d2wKey length the length of the text field * * @author ak on Sun Aug 17 2003 */ public class ERDEditPasswordConfirmation extends ERDCustomEditComponent { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; /** logging support */ private static final Logger log = Logger.getLogger(ERDEditPasswordConfirmation.class); public int length; /** * Public constructor * @param context the context */ public ERDEditPasswordConfirmation(WOContext context) { super(context); } public void fail(String errorCode) { if(log.isDebugEnabled()) log.debug("fail:<object:" + object() + "; key:" + key() + "; password: " + password() + "; code:" + errorCode + ";>"); validationFailedWithException(ERXValidationFactory.defaultFactory().createException(object(), key(), password(), errorCode), password(), key() + "," + passwordPropertyKey()); } public String passwordPropertyKey() { String passwordPropertyKey = null; NSDictionary userInfo = (NSDictionary) ERXWOContext.contextDictionary().objectForKey("ERDEditPassword"); if(userInfo != null) { passwordPropertyKey = (String) userInfo.valueForKey(ERDEditPassword.passwordPropertyKey); } if(passwordPropertyKey == null) { throw new IllegalStateException("Can't find the passwordPropertyKey. There needs to be a ERDEditPassword component on this page and its 'passwordConfirmationValidates' needs to be true for this component to work."); } return passwordPropertyKey; } @Override public Object objectKeyPathValue() { return passwordPropertyKey() == null || object() == null ? null : object().valueForKeyPath(passwordPropertyKey()); } public String password() { String password = null; NSDictionary userInfo = (NSDictionary) ERXWOContext.contextDictionary().objectForKey("ERDEditPassword"); if(userInfo != null) { password = (String) userInfo.objectForKey("ERDEditPassword." + passwordPropertyKey() + ".value"); } return password; } protected String _passwordConfirm; public String passwordConfirm() { /*if(_passwordConfirm == null) { _passwordConfirm = (String)valueForBinding("passwordConfirm"); }*/ return _passwordConfirm; } public void setPasswordConfirm(String value) { _passwordConfirm = value; } @Override public void setObject(EOEnterpriseObject newObject) { if (newObject!=object()) { _passwordConfirm = null; } super.setObject(newObject); } protected void checkPasswords() { String password = password(); String passwordPropertyKey = passwordPropertyKey(); String passwordConfirm = passwordConfirm(); if (password==null || password.equals("") || passwordConfirm==null || passwordConfirm.equals("")) { // one or both is null or empty if (objectKeyPathValue() == null) { fail("PasswordsFillBothFieldsException"); } else { // if we already have a value, then they need to both be null||empty if (!(password==null || password.equals("")) && (passwordConfirm==null || passwordConfirm.equals(""))) { fail("PasswordsFillBothFieldsException"); } } } else { // they are both non-null if(!password.equals(passwordConfirm)) { fail("PasswordsDontMatchException"); } else { try { object().validateTakeValueForKeyPath(password, passwordPropertyKey); } catch(NSValidation.ValidationException ex) { validationFailedWithException(ex, password, passwordPropertyKey); } } } } @Override public void takeValuesFromRequest(WORequest r, WOContext c) { super.takeValuesFromRequest(r,c); if (c.wasFormSubmitted()) { checkPasswords(); } } @Override public void reset() { ERXWOContext.contextDictionary().removeObjectForKey("ERDEditPassword"); super.reset(); } }