Package org.olat.user.propertyhandlers

Source Code of org.olat.user.propertyhandlers.DatePropertyHandler

/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS,
* <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) 2007 frentix GmbH, Switzerland<br>
* <p>
*/
package org.olat.user.propertyhandlers;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.olat.core.gui.components.form.ValidationError;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.FormUIFactory;
import org.olat.core.gui.components.form.flexible.elements.DateChooser;
import org.olat.core.gui.formelements.DateElement;
import org.olat.core.gui.formelements.FormElement;
import org.olat.core.id.User;
import org.olat.core.logging.Tracing;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.ValidationStatus;
import org.olat.core.util.i18n.I18nModule;
import org.olat.user.AbstractUserPropertyHandler;
import org.olat.user.UserManager;

/**
* <h3>Description:</h3>
* The DatePropertyHandler offers the functionality of a date. It can be used to store
* something like a birth date.
* <p>
* Initial Date: 26.07.2007 <br>
*
* @author Florian Gnaegi, frentix GmbH, http://www.frentix.com
*/
public class DatePropertyHandler extends AbstractUserPropertyHandler {
 
  /**
   * Format internal values as yyyyMMdd string e.g. "19751210".
   * So it is possible to use the less, greater and equal operators. 
   */
  private static final DateFormat INTERNAL_DATE_FORMATTER = new SimpleDateFormat("yyyyMMdd", Locale.GERMAN);

 
  /**
   * @Override
   * @see org.olat.user.AbstractUserPropertyHandler#getUserProperty(org.olat.core.id.User, java.util.Locale)
   */
  @Override
  public String getUserProperty(User user, Locale locale) {
    Date date = decode(getInternalValue(user));
    if (date == null) return null;
    if (locale == null) locale = I18nModule.getDefaultLocale();
    return Formatter.getInstance(locale).formatDate(date);
  }

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#updateUserFromFormElement(org.olat.core.id.User, org.olat.core.gui.formelements.FormElement)
   */
  public void updateUserFromFormElement(User user, FormElement ui) {
    String internalValue = getStringValue(ui);
    setInternalValue(user, internalValue);
  }
 
  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#updateUserFromFormItem(org.olat.core.id.User, org.olat.core.gui.components.form.flexible.FormItem)
   */
  public void updateUserFromFormItem(User user, FormItem formItem) {
    String internalValue = getStringValue(formItem);
    setInternalValue(user, internalValue);
  }

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#getStringValue(org.olat.core.gui.formelements.FormElement)
   */
  public String getStringValue(FormElement ui) {
    Date date = ((DateElement) ui).getDate();
    return encode(date);
 

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#getStringValue(org.olat.core.gui.components.form.flexible.FormItem)
   */
  public String getStringValue(FormItem formItem) {
    Date date = ((org.olat.core.gui.components.form.flexible.elements.DateChooser) formItem).getDate();
    return encode(date);
  }
 
  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#getStringValue(java.lang.String, java.util.Locale)
   */
  public String getStringValue(String displayValue, Locale locale) {
    if (StringHelper.containsNonWhitespace(displayValue)) {
      DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
      df.setLenient(false);
      try {
        Date date = df.parse(displayValue.trim());
        return encode(date);
      } catch (ParseException e) {
        // catch but do nothing, return null in the end
      }
    }
    return null;
  }

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#getFormElement(java.util.Locale, org.olat.core.id.User, java.lang.String, boolean)
   */
  public FormElement getFormElement(Locale locale, User user, String usageIdentifyer, boolean isAdministrativeUser) {
    // default is no element
    UserManager um = UserManager.getInstance();
    DateElement ui = null;
    ui = new DateElement(i18nFormElementLabelKey(), locale);
    updateFormElementFromUser(ui, user);
    if ( ! um.isUserViewReadOnly(usageIdentifyer, this) || isAdministrativeUser) {
      ui.setExample(Formatter.getInstance(locale).formatDate(new Date()));
    } else {
      ui.setReadOnly(true);
    }
    if (um.isMandatoryUserProperty(usageIdentifyer, this)) {
      ui.setMandatory(true);
    }
    return ui;
  }
 
  /**
   * 
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#addFormItem(java.util.Locale, org.olat.core.id.User, java.lang.String, boolean, org.olat.core.gui.components.form.flexible.FormItemContainer)
   */
  public FormItem addFormItem(Locale locale, User user, String usageIdentifyer, boolean isAdministrativeUser,  FormItemContainer formItemContainer) {
    org.olat.core.gui.components.form.flexible.elements.DateChooser dateElem = null;
    dateElem = FormUIFactory.getInstance().addDateChooser(getName(), i18nFormElementLabelKey(), getInternalValue(user), formItemContainer);
    dateElem.setItemValidatorProvider(this);
    UserManager um = UserManager.getInstance();
    if ( um.isUserViewReadOnly(usageIdentifyer, this) && ! isAdministrativeUser) {
      dateElem.setEnabled(false);
    }
    if (um.isMandatoryUserProperty(usageIdentifyer, this)) {
      dateElem.setMandatory(true);
    }
   
    dateElem.setExampleKey("form.example.free", new String[] {Formatter.getInstance(locale).formatDate(new Date())});
    return dateElem;
  }

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#updateFormElementFromUser(org.olat.core.gui.formelements.FormElement, org.olat.core.id.User)
   */
  public void updateFormElementFromUser(FormElement ui, User user) {
    Date date = decode(getInternalValue(user));
    ((DateElement) ui).setDate(date);
  }

  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#isValid(org.olat.core.gui.formelements.FormElement)
   */
  public boolean isValid(FormElement ui, Map formContext) {
   
    DateElement uiDate = (DateElement) ui;
   
    if (uiDate.getValue().length() == 0) {
      if (!ui.isMandatory()) return true;
      ui.setErrorKey(i18nFormElementLabelKey()+ ".error.empty");     
      return false;
    }
   
    return uiDate.validDate(i18nFormElementLabelKey()+ ".error");     
  }
 
  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#isValid(org.olat.core.gui.components.form.flexible.FormItem, java.util.Map)
   */
  public boolean isValid(FormItem formItem, Map formContext) {
   
    DateChooser dateElem = (DateChooser) formItem;
   
    if (dateElem.isEmpty()) {
      return !dateElem.isMandatory() || !dateElem.isEmpty("new.form.mandatory");
    }
    List<ValidationStatus> validation = new ArrayList<ValidationStatus>();
    dateElem.validate(validation);
    if (validation.size()==0){
      return true;
    }else{
      // errorkey should be set by dateElem.validate formItem.setErrorKey(i18nFormElementLabelKey()+ ".error", null);   
      return false;     
    }
  }


  /**
   * Helper to encode the date as a String
   * @param date
   * @return
   */
  private String encode(Date date) {
    if (date == null) return null;
    return INTERNAL_DATE_FORMATTER.format(date);
  }

  /**
   * Helper to decode a String value to a date
   * @param value
   * @return
   */
  private Date decode(String value) {
    if ( ! StringHelper.containsNonWhitespace(value)) return null;
    try {
      return INTERNAL_DATE_FORMATTER.parse(value.trim());
    } catch (ParseException e) {
      Tracing.logWarn("Could not parse BirthDayField from database", e, this.getClass());
      return null;
    }
  }
 
  /**
   * @see org.olat.user.propertyhandlers.UserPropertyHandler#isValidValue(java.lang.String, org.olat.core.gui.components.form.ValidationError, java.util.Locale)
   */
  public boolean isValidValue(String value, ValidationError validationError, Locale locale) {
    if (StringHelper.containsNonWhitespace(value)) {
      DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
      df.setLenient(false);
      try {
        df.parse(value.trim());
      } catch (ParseException e) {
        validationError.setErrorKey(i18nFormElementLabelKey()+ ".error");
        return false;
      }
      return true;
    }
    //  null values are ok
    return true;
  }

}
TOP

Related Classes of org.olat.user.propertyhandlers.DatePropertyHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.