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