gt: 		if (value == null || value.length() == 0)
context: /******************************************************************************
   * Copyright (C) 2009 Low Heng Sin                                            *
   * Copyright (C) 2009 Idalica Corporation                                     *
   * This program is free software; you can redistribute it and/or modify it    *
   * under the terms version 2 of the GNU General Public License as published   *
   * by the Free Software Foundation. This program is distributed in the hope   *
   * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
   * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.           *
   * See the GNU General Public License for more details.                       *
   * You should have received a copy of the GNU General Public License along    *
   * with this program; if not, write to the Free Software Foundation, Inc.,    *
   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.                     *
   *****************************************************************************/
  package org.adempiere.webui.util;
  
  import java.io.Serializable;
  import java.util.Properties;
  import java.util.logging.Logger;
  
  import org.compiere.model.I_AD_Preference;
  import org.compiere.model.MPreference;
  import org.compiere.model.Query;
  import org.compiere.util.Env;
  import org.compiere.util.Language;
  
  /**
   *
   * @author hengsin
   * @author Teo Sarca, www.arhipac.ro
   *			<li>FR [ 2694043 ] Query. first/firstOnly usage best practice
   */
  public final class UserPreference implements Serializable {
  	
  	private static final long serialVersionUID = -5334572174003341079L;
  	/** Language			*/
  	public static final String 	P_LANGUAGE = 		"Language";
  	private static final String DEFAULT_LANGUAGE = 	Language.getName
  		(System.getProperty("user.language") + "_" + System.getProperty("user.country"));
  	/** Role */
  	public static final String P_ROLE = "Role";
  	private static final String DEFAULT_ROLE = "";
  	/** Client Name */
  	public static final String P_CLIENT = "Client";
  	private static final String DEFAULT_CLIENT = "";
  	/** Org Name */
  	public static final String P_ORG = "Organization";
  	private static final String DEFAULT_ORG = "";
  	/** Warehouse Name */
  	public static final String P_WAREHOUSE = "Warehouse";
  	private static final String DEFAULT_WAREHOUSE = "";
  
  	/** Auto Commit */
  	public static final String P_AUTO_COMMIT = "AutoCommit";
  	private static final String DEFAULT_AUTO_COMMIT = "Y";
  
  	/** Language Name Context **/
  	public static final String LANGUAGE_NAME = "#LanguageName";
  
  	/** window tab placement **/
  	public static final String P_WINDOW_TAB_PLACEMENT = "WindowTabPlacement";
  	public static final String DEFAULT_WINDOW_TAB_PLACEMENT = "Left";
  
  	/** window tab collapsible **/
  	public static final String P_WINDOW_TAB_COLLAPSIBLE = "WindowTabCollapsible";
  	public static final String DEFAULT_WINDOW_TAB_COLLAPSIBLE = "N";
  
  	/** Auto New **/
  	public static final String P_AUTO_NEW = "AutoNew";
  	public static final String DEFAULT_AUTO_NEW = "Y";
  	
  	/** Menu Collapsed **/
  	public static final String P_MENU_COLLAPSED = "MenuCollapsed";
  	public static final String DEFAULT_MENU_COLLAPSED = "N";
  
  	/** Ini Properties */
  	private static final String[] PROPERTIES = new String[] {
  		P_LANGUAGE,
  		P_ROLE,
  		P_CLIENT,
  		P_ORG,
  		P_WAREHOUSE,
  		P_AUTO_COMMIT,
  		P_AUTO_NEW,
  		P_WINDOW_TAB_PLACEMENT,
  		P_WINDOW_TAB_COLLAPSIBLE,
  		P_MENU_COLLAPSED};
  	/** Ini Property Values */
  	private static final String[] VALUES = new String[] {
  		DEFAULT_LANGUAGE,
  		DEFAULT_ROLE,
  		DEFAULT_CLIENT,
  		DEFAULT_ORG,
  		DEFAULT_WAREHOUSE,
  		DEFAULT_AUTO_COMMIT,
  		DEFAULT_AUTO_NEW,
  		DEFAULT_WINDOW_TAB_PLACEMENT,
  		DEFAULT_WINDOW_TAB_COLLAPSIBLE,
  		DEFAULT_MENU_COLLAPSED};
  
  	/** Container for Properties */
  	private Properties props = new Properties();
  
  	private int m_AD_User_ID;
  
  	/** Logger */
  	@SuppressWarnings("unused")
  	private static Logger log = Logger.getLogger(UserPreference.class.getName());
  
  	/**
  	 * save user preference
  	 */
  	public void savePreference() {
  		if (m_AD_User_ID > 0) {
  			Query query = new Query(Env.getCtx(), I_AD_Preference.Table_Name, "AD_User_ID = ? AND Attribute = ? AND AD_Window_ID Is NULL", null);
  			for (int i = 0; i < PROPERTIES.length; i++) {
  				String attribute = PROPERTIES[i];
  				String value = props.getProperty(attribute);
  
  				MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly();
  				if (preference == null) {
  					preference = new MUserPreference(Env.getCtx(), 0, null);
  					preference.setAD_User_ID(m_AD_User_ID);
  					preference.setAttribute(attribute);
  				} else {
  					if (preference.getAD_Client_ID() > 0 || preference.getAD_Org_ID() > 0) {
  						preference = new MUserPreference(Env.getCtx(), preference.getAD_Preference_ID(), null);
  					}
  				}
  				preference.setValue(value);
  				preference.saveEx();
  			}
  		}
  	}
  
  	/**
  	 * load user preference
  	 * @param AD_User_ID
  	 */
  	public void loadPreference(int AD_User_ID) {
  		if (AD_User_ID > 0) {
  			m_AD_User_ID = AD_User_ID;
  			props = new Properties();
  
  			Query query = new Query(Env.getCtx(), I_AD_Preference.Table_Name, "AD_User_ID = ? AND Attribute = ? AND AD_Window_ID Is NULL", null);
  
  			for (int i = 0; i < PROPERTIES.length; i++) {
  				String attribute = PROPERTIES[i];
  				String value = VALUES[i];
  
  				MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly();
  				if (preference != null) {
  					value = preference.getValue();
  				}
  
  				props.setProperty(attribute, value);
  			}
  		}
  	}
  
  	/**
  	 * delete all user preference
  	 */
  	public void deletePreference() {
  		if (m_AD_User_ID > 0) {
  			props = new Properties();
  
  			Query query = new Query(Env.getCtx(), I_AD_Preference.Table_Name, "AD_User_ID = ? AND Attribute = ? AND AD_Window_ID Is NULL", null);
  			for (int i = 0; i < PROPERTIES.length; i++) {
  				String attribute = PROPERTIES[i];
  
  				MPreference preference = query.setParameters(new Object[]{m_AD_User_ID, attribute}).firstOnly();
  				if (preference != null) {
  					preference.deleteEx(true);
  				}
  			}
  		}
  	}
  
  	/***************************************************************************
  	 * Set Property
  	 *
  	 * @param key
  	 *            Key
  	 * @param value
  	 *            Value
  	 */
  	public void setProperty(String key, String value) {
  		if (props == null)
  			props = new Properties();
  		if (value == null)
  			props.setProperty(key, "");
  		else
  			props.setProperty(key, value);
  	} // setProperty
  
  	/**
  	 * Set Property
  	 *
  	 * @param key
  	 *            Key
  	 * @param value
  	 *            Value
  	 */
  	public void setProperty(String key, boolean value) {
  		setProperty(key, value ? "Y" : "N");
  	} // setProperty
  
  	/**
  	 * Set Property
  	 *
  	 * @param key
  	 *            Key
  	 * @param value
  	 *            Value
  	 */
  	public void setProperty(String key, int value) {
  		setProperty(key, String.valueOf(value));
  	} // setProperty
  
  	/**
  	 * Get Propery
  	 *
  	 * @param key
  	 *            Key
  	 * @return Value
  	 */
  	public String getProperty(String key) {
  		if (key == null)
  			return "";
  
  		String value = props.getProperty(key, "");
  