/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.jmx; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * A Listener that wraps a {@link JavaManagementServerBean}. Please look at its documentation for * the appropriate system properties to set. <br> * <br> * The ports are configured via <context-param> elements in the web.xml<br> * The <code>org.apereo.portal.servlet.JavaManagementServerListener.portOne</code> context-param is * <b>required</b>. The <code>org.apereo.portal.servlet.JavaManagementServerListener.portTwo</code> * context-param is optional, if not specified portTwo is calculated as portOne + 1. <br> * <br> * If a failure to start or stop the JMX server should cause the listener to throw an exception set * the context-param <code>org.apereo.portal.servlet.JavaManagementServerListener.failOnException * </code> to true. */ public class JavaManagementServerListener implements ServletContextListener { //Init-parameters public static final String JMX_RMI_HOST = "org.apereo.portal.servlet.JavaManagementServerListener.host"; public static final String JMX_RMI_PORT_1 = "org.apereo.portal.servlet.JavaManagementServerListener.portOne"; public static final String JMX_RMI_PORT_2 = "org.apereo.portal.servlet.JavaManagementServerListener.portTwo"; public static final String FAIL_ON_EXCEPTION = "org.apereo.portal.servlet.JavaManagementServerListener.failOnException"; private static final String LOGGER_NAME = JavaManagementServerListener.class.getName(); private JavaManagementServerBean javaManagementServerBean; private Log logger; /** * Inits and/or returns already initialized logger. <br> * You have to use this method in order to use the logger,<br> * you should not call the private variable directly.<br> * This was done because Tomcat may instantiate all listeners before calling contextInitialized * on any listener.<br> * Note that there is no synchronization here on purpose. The object returned by getLog for a * logger name is<br> * idempotent and getLog itself is thread safe. Eventually all <br> * threads will see an instance level logger variable and calls to getLog will stop. * * @return the log for this class */ protected Log getLogger() { Log l = this.logger; if (l == null) { l = LogFactory.getLog(LOGGER_NAME); this.logger = l; } return l; } /** * @see * javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) */ public void contextInitialized(ServletContextEvent event) { final ServletContext servletContext = event.getServletContext(); //Create the bean this.javaManagementServerBean = new JavaManagementServerBean(); //Get the failOnException option final String failOnExceptionStr = servletContext.getInitParameter(FAIL_ON_EXCEPTION); boolean failOnException = Boolean.parseBoolean(failOnExceptionStr); this.javaManagementServerBean.setFailOnException(failOnException); final String host = servletContext.getInitParameter(JMX_RMI_HOST); this.javaManagementServerBean.setHost(host); //Get the base rmi port from the init parameters final String portOneStr = servletContext.getInitParameter(JMX_RMI_PORT_1); try { final int portOne = Integer.parseInt(portOneStr); this.javaManagementServerBean.setPortOne(portOne); } catch (NumberFormatException nfe) { getLogger() .warn( "init-parameter '" + JMX_RMI_PORT_1 + "' is required and must contain a number. '" + portOneStr + "' is not a valid number.", nfe); } //Get the second rmi port from the init parameters final String portTwoStr = servletContext.getInitParameter(JMX_RMI_PORT_2); try { final int portTwo = Integer.parseInt(portTwoStr); this.javaManagementServerBean.setPortTwo(portTwo); } catch (NumberFormatException nfe) { getLogger() .debug( "Failed to convert init-parameter '" + JMX_RMI_PORT_2 + "' with value '" + portTwoStr + "' to a number, defaulting portTwo to portOne + 1", nfe); } this.javaManagementServerBean.startServer(); } /** * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) */ public void contextDestroyed(ServletContextEvent event) { this.javaManagementServerBean.stopServer(); this.javaManagementServerBean = null; } }