/* * RHQ Management Platform * Copyright (C) 2005-2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.auth.prefs; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.util.StringUtil; import org.rhq.enterprise.server.util.LookupUtil; public abstract class SubjectPreferencesBase { protected final Log log = LogFactory.getLog(SubjectPreferencesBase.class); /** delimiter for preferences that are multi-valued and stringified */ protected static final String PREF_LIST_DELIM = ","; protected static final String PREF_ITEM_DELIM = "|"; protected static final String PREF_ITEM_DELIM_REGEX = "\\|"; private int subjectId; public SubjectPreferencesBase(Subject subject) { this.subjectId = subject.getId(); } /** * Get the value of a preference as a boolean. * @param key the preference to get * @return the boolean value of 'key', or if key is null, returns the * 'ifNull' value. */ protected boolean getBooleanPref(String key) { String val = getPreference(key); return Boolean.valueOf(val).booleanValue(); } /** * Get the value of a preference as a boolean. * @param key the preference to get * @param ifNull if the pref is undefined, return this value instead * @return the boolean value of 'key', or if key is null, returns the * 'ifNull' value. */ protected boolean getBooleanPref(String key, boolean ifNull) { String val; try { val = getPreference(key); } catch (IllegalArgumentException e) { return ifNull; } return Boolean.valueOf(val).booleanValue(); } /** * Get the value of a preference as an int. * @param key the preference to get * @return the int value of 'key' */ protected int getIntPref(String key) { String val = getPreference(key); return Integer.parseInt(val); } /** * Get the value of a preference as an int. * @param key the preference to get * @param ifNull if the pref is null, return this value instead * @return the int value of 'key', or if key is null, returns the * 'ifNull' value. */ protected int getIntPref(String key, int ifNull) { String val; try { val = getPreference(key); if ("".equals(val)) { return ifNull; } } catch (IllegalArgumentException e) { return ifNull; } return Integer.parseInt(val); } /** * Get the value of a preference as an long. * @param key the preference to get * @return the long value of 'key' */ protected Long getLongPref(String key) { String val = getPreference(key); return Long.parseLong(val); } protected String getPreference(String key) throws IllegalArgumentException { PropertySimple prop = LookupUtil.getSubjectPreferencesCache().getUserProperty(subjectId, key); if (prop == null) { if (this.subjectId == 0) { return ""; // this is probably an LDAP user that needs to register first } throw new IllegalArgumentException("preference '" + key + "' requested is not valid"); } String value = prop.getStringValue(); // null values are often the default for many props; let the caller determine whether this is an error if (value != null) { value = value.trim(); } log.trace("Getting " + key + "[" + value + "]"); return value; } @SuppressWarnings("unchecked") public <T> T getPreference(String key, T defaultValue) { T result; try { String preferenceValue = getPreference(key); Class<T> type = (Class<T>) String.class; if (defaultValue != null) { type = (Class<T>) defaultValue.getClass(); } if (type == String.class) { result = (T) preferenceValue; // cast string to self-type } else { if (type == Boolean.class) { if (preferenceValue.equalsIgnoreCase("on") || preferenceValue.equalsIgnoreCase("yes") || preferenceValue.equalsIgnoreCase("true")) { preferenceValue = "true"; // flexible support for boolean translations from forms } else { preferenceValue = "false"; } } try { Method m = type.getMethod("valueOf", String.class); result = (T) m.invoke(null, preferenceValue); // static method } catch (Exception e) { throw new IllegalArgumentException("No support for automatic conversion of preferences of type " + type); } } } catch (IllegalArgumentException iae) { result = defaultValue; } return result; } /** * Break the named preference into tokens delimited by <code>PREF_LIST_DELIM</code>. * * @param key the name of the preference * @return <code>List</code> of <code>String</code> tokens */ public List<String> getPreferenceAsList(String key) { return getPreferenceAsList(key, PREF_LIST_DELIM); } /** * Tokenize the named preference into a List of Strings. If no such preference exists, or the preference is null, * an empty List will be returned. * * @param delimiter the delimiter to break it up by * @param key the name of the preference * @return <code>List</code> of <code>String</code> tokens */ public List<String> getPreferenceAsList(String key, String delimiter) { String pref = null; try { pref = getPreference(key); } catch (IllegalArgumentException e) { log.debug("A user preference named '" + key + "' does not exist."); } return (pref != null) ? StringUtil.explode(pref, delimiter) : new ArrayList<String>(); } protected List<Integer> getPreferenceAsIntegerList(String key, String delimiter) { try { List<String> values = getPreferenceAsList(key, delimiter); List<Integer> result = new ArrayList<Integer>(values.size()); for (String value : values) { String trimmed = value.trim(); if (trimmed.length() > 0) { result.add(Integer.valueOf(trimmed)); } } return result; } catch (Exception e) { return new ArrayList<Integer>(); } } protected void setPreference(String key, List<?> values) throws IllegalArgumentException { setPreference(key, values, PREF_LIST_DELIM); } protected void setPreference(String key, List<?> values, String delim) throws IllegalArgumentException { String stringified = StringUtil.listToString(values, delim); setPreference(key, stringified); } public void setPreference(String key, Object value) throws IllegalArgumentException { String val; if (value == null) { val = ""; } else if (value instanceof String) { val = (String) value; } else { val = value.toString(); } LookupUtil.getSubjectPreferencesCache().setUserProperty(subjectId, key, val); } protected void unsetPreference(String key) { LookupUtil.getSubjectPreferencesCache().unsetUserProperty(subjectId, key); } }