/* * NOTE: This copyright does *not* cover user programs that use HQ * program services by normal system calls through the application * program interfaces provided as part of the Hyperic Plug-in Development * Kit or the Hyperic Client Development Kit - this is merely considered * normal use of the program, and does *not* fall under the heading of * "derived work". * * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc. * This file is part of HQ. * * HQ 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.hyperic.hq.ui; import java.io.InputStream; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.common.shared.ProductProperties; import org.hyperic.util.config.ConfigResponse; /** * A class that loads the application properties file (found at * <code>/WEB-INF/classes/hq.properties</code>) and configures the * web application. All properties in the file are exposed as servlet * context attributes. * */ public class Configurator implements ServletContextListener { private final Log log; public Configurator() { log = LogFactory.getLog(Configurator.class.getName()); } protected String getPreferenceFile() { return Constants.PROPS_USER_PREFS; } protected String getRoleDashboardPreferenceFile(){ return ""; } protected String getUserDashboardPreferenceFile(){ return "/WEB-INF/classes/DefaultUserDashboardPreferences.properties"; } /** * Respond to the <em>context initialized</em> container event by * loading the application properties file and the portals * definition file. * */ public void contextInitialized(ServletContextEvent sce) { ServletContext ctx = sce.getServletContext(); loadConfig(ctx); loadPreferences(ctx); loadTablePreferences(ctx); loadBuildNumber(ctx); } /** * Respond to the <em>context destroyed</em> container event by * doing nothing. * */ public void contextDestroyed(ServletContextEvent sce) { } /** * Load the application properties file (found at * <code>/WEB-INF/classes/hq.properties</code>) and configure * the web application. All properties in the file are exposed as * servlet context attributes. * */ public void loadConfig(ServletContext ctx) { Properties props = null; try { props = loadProperties(ctx, Constants.PROPS_FILE_NAME); } catch (Exception e) { error("unable to load application properties file [" + Constants.PROPS_FILE_NAME + "]", e); return; } if (props == null) { debug("application properties file [" + Constants.PROPS_FILE_NAME + "] does not exist"); return; } Enumeration names = props.propertyNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); if (name.startsWith(Constants.SYSTEM_VARIABLE_PATH)) { System.setProperty(name,props.getProperty(name)); } else { ctx.setAttribute(name, props.getProperty(name)); } } debug("loaded application configuration [" + Constants.PROPS_FILE_NAME + "]"); } private void debug (String msg) { if (log.isDebugEnabled()) { log.debug(msg); } } private void error (String msg, Exception e) { if (log.isErrorEnabled()) { log.error(msg, e); } } private void loadPreferences(ServletContext ctx){ ConfigResponse userPrefs = new ConfigResponse(); ConfigResponse userDashPrefs = new ConfigResponse(); ConfigResponse roleDashPrefs = new ConfigResponse(); try{ // Load User Preferences Properties userProps = loadProperties(ctx, getPreferenceFile()); Enumeration keys = userProps.keys(); while (keys.hasMoreElements()){ String key = (String) keys.nextElement(); userPrefs.setValue( key, userProps.getProperty(key) ); } ctx.setAttribute(Constants.DEF_USER_PREFS, userPrefs); // Load User Dashboard Preferences Properties userDashProps = loadProperties(ctx, getUserDashboardPreferenceFile()); keys = userDashProps.keys(); while(keys.hasMoreElements()){ String key = (String) keys.nextElement(); userDashPrefs.setValue(key, userDashProps.getProperty(key)); } ctx.setAttribute(Constants.DEF_USER_DASH_PREFS, userDashPrefs); // Load Role Dashboard Preferences Properties roleDashProps; try { roleDashProps = loadProperties(ctx, getRoleDashboardPreferenceFile()); } catch (Exception e) { roleDashProps = null; } if (roleDashProps != null) { keys = roleDashProps.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); roleDashPrefs.setValue(key, roleDashProps.getProperty(key)); } } ctx.setAttribute(Constants.DEF_ROLE_DASH_PREFS, roleDashPrefs); } catch (Exception e) { error("loading table properties file " + Constants.PROPS_TAGLIB + "failed: ", e); } } private void loadTablePreferences(ServletContext ctx){ try{ Properties tableProps = loadProperties(ctx, Constants.PROPS_TAGLIB); ctx.setAttribute(Constants.PROPS_TAGLIB_NAME, tableProps ); } catch (Exception e) { error("loading table properties file " + Constants.PROPS_TAGLIB + "failed: ", e); } } /** * Load the specified properties file and return the properties. * * @param ctx the <code>ServletContext</code> * @param filename the fully qualifed name of the properties file * @exception Exception if a problem occurs while loading the file */ private Properties loadProperties(ServletContext ctx, String filename) throws Exception { Properties props = new Properties(); InputStream is = ctx.getResourceAsStream(filename); if (is != null) { props.load(is); is.close(); } return props; } private void loadBuildNumber(ServletContext ctx){ final String SNAPSHOT_IDENTIFIER = "BUILD-SNAPSHOT"; final String BUILD_DATE_FORMAT_OUTPUT = "yyyy-MM-dd"; final String BUILD_DATE_FORMAT_INPUT = "MMM dd, yyyy"; try { String version = ProductProperties.getVersion(); if (version.contains(SNAPSHOT_IDENTIFIER)) { try { // Get build date, format into Date object... String date = ProductProperties.getBuildDate(); DateFormat format = new SimpleDateFormat(BUILD_DATE_FORMAT_INPUT); Date buildDate = format.parse(date); // Take date object and format into different format for // display... format = new SimpleDateFormat(BUILD_DATE_FORMAT_OUTPUT); version += "-" + format.format(buildDate); } catch (ParseException e) { // Couldn't parse the date, so we fall back to using just // the version string... log.info("Couldn't parse the build date for display", e); } } ctx.setAttribute(Constants.APP_VERSION, version); ctx.setAttribute(Constants.APP_BUILD, ProductProperties.getBuildNumber()); } catch (Exception e) { error("Unable to load product version", e); } } }