@Override
  public void setValue(Object newValue) throws ReadOnlyException, ConversionException {
    if (isReadOnly()) {
      throw new ReadOnlyException();
    }

    // If invalid values are not allowed, the value must be checked
    if (!isInvalidAllowed()) {
      final Collection<Validator> v = getValidators();
      if (v != null) {
        for (Validator validator : v) {
          validator.validate(newValue);
        }
      }
    }

    Type current = convertValue(wrapped.getValue());
    Type prevCache = cache;
    cache = convertValue(newValue);
    processNewCacheValue();
    if (differ(current, cache)) {
      modified = true;
      if (isWriteThrough()) {
        commit();
      }
    } else {
      modified = false;
    }
    if (differ(prevCache, cache)) {
      fireValueChange();
    }
  }
 /** @see com.vaadin.data.Validatable#isValid() */
 @Override
 public boolean isValid() {
   if (validators != null) {
     for (Validator validator : validators) {
       if (!validator.isValid(this.getValue())) {
         return false;
       }
     }
   }
   return true;
 }
 /** @see com.vaadin.data.Validatable#validate() */
 @Override
 public void validate() throws InvalidValueException {
   LinkedList<InvalidValueException> errors = null;
   if (validators != null) {
     for (Validator validator : validators) {
       try {
         validator.validate(this.getValue());
       } catch (InvalidValueException e) {
         if (errors == null) {
           errors = new LinkedList<InvalidValueException>();
         }
         errors.add(e);
       }
     }
   }
   if (errors != null) {
     throw new InvalidValueException(null, errors.toArray(new InvalidValueException[0]));
   }
 }
 public boolean isValid(Object value) {
   return validator.isValid(converter.parse((FIELD_DATA_TYPE) value));
 }
 public void validate(Object value) throws InvalidValueException {
   validator.validate(converter.parse((FIELD_DATA_TYPE) value));
 }