001    package org.apache.myfaces.tobago.validator;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import org.apache.myfaces.tobago.apt.annotation.Validator;
021    import org.apache.myfaces.tobago.util.MessageUtils;
022    
023    import javax.faces.application.FacesMessage;
024    import javax.faces.component.EditableValueHolder;
025    import javax.faces.component.UIComponent;
026    import javax.faces.context.FacesContext;
027    import javax.faces.validator.LengthValidator;
028    import javax.faces.validator.ValidatorException;
029    
030    /*
031     * Date: Oct 16, 2006
032     * Time: 11:58:47 PM
033     */
034    /**
035     * <p><strong>SubmittedLengthValidator</strong> is a {@link Validator} that checks
036     * the number of characters in the submitted value of the
037     * associated component.
038     */
039    
040    @Validator(id = SubmittedValueLengthValidator.VALIDATOR_ID)
041    public class SubmittedValueLengthValidator extends LengthValidator {
042      public static final String VALIDATOR_ID = "org.apache.myfaces.tobago.SubmittedValueLength";
043    
044      private Integer minimum;
045      private Integer maximum;
046    
047      public SubmittedValueLengthValidator() {
048      }
049    
050      public SubmittedValueLengthValidator(int maximum) {
051        setMaximum(maximum);
052      }
053    
054      public SubmittedValueLengthValidator(int maximum, int minimum) {
055        setMaximum(maximum);
056        setMinimum(minimum);
057      }
058    
059      public int getMinimum() {
060        return minimum != null ? minimum : 0;
061      }
062    
063      public void setMinimum(int minimum) {
064        if (minimum > 0) {
065          this.minimum = minimum;
066        }
067      }
068    
069      public int getMaximum() {
070        return maximum != null ? maximum : 0;
071      }
072    
073      public void setMaximum(int maximum) {
074        if (maximum > 0) {
075          this.maximum = maximum;
076        }
077      }
078    
079      public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
080        if (value != null && uiComponent instanceof EditableValueHolder) {
081          String submittedValue = ((EditableValueHolder) uiComponent).getSubmittedValue().toString();
082          if (maximum != null && submittedValue.length() > maximum) {
083            Object[] args = {maximum, uiComponent.getId()};
084            FacesMessage facesMessage = MessageUtils.getMessage(facesContext,
085                facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR, MAXIMUM_MESSAGE_ID, args);
086            throw new ValidatorException(facesMessage);
087          }
088          if (minimum != null && submittedValue.length() < minimum) {
089            Object[] args = {minimum, uiComponent.getId()};
090            FacesMessage facesMessage = MessageUtils.getMessage(facesContext,
091                facesContext.getViewRoot().getLocale(), FacesMessage.SEVERITY_ERROR, MINIMUM_MESSAGE_ID, args);
092            throw new ValidatorException(facesMessage);
093          }
094        }
095      }
096    
097      public Object saveState(FacesContext context) {
098        Object[] values = new Object[2];
099        values[0] = maximum;
100        values[1] = minimum;
101        return values;
102      }
103    
104      public void restoreState(FacesContext context, Object state) {
105        Object[] values = (Object[]) state;
106        maximum = (Integer) values[0];
107        minimum = (Integer) values[1];
108      }
109    
110      public boolean equals(Object o) {
111        if (this == o) {
112          return true;
113        }
114        if (o == null || getClass() != o.getClass()) {
115          return false;
116        }
117        if (!super.equals(o)) {
118          return false;
119        }
120    
121        SubmittedValueLengthValidator validator = (SubmittedValueLengthValidator) o;
122    
123        if (maximum != null ? !maximum.equals(validator.maximum) : validator.maximum != null) {
124          return false;
125        }
126        if (minimum != null ? !minimum.equals(validator.minimum) : validator.minimum != null) {
127          return false;
128        }
129    
130        return true;
131      }
132    
133      public int hashCode() {
134        int result;
135        result = (minimum != null ? minimum.hashCode() : 0);
136        result = 31 * result + (maximum != null ? maximum.hashCode() : 0);
137        return result;
138      }
139    }