/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* Portions Copyright Apache Software Foundation.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package org.apache.naming;
import javax.naming.Context;
import javax.management.NotificationBroadcasterSupport;
import javax.management.ObjectName;
import javax.management.MBeanServer;
import javax.management.MBeanRegistration;
import javax.management.AttributeChangeNotification;
import javax.management.Notification;
/**
* Implementation of the NamingService JMX MBean.
*
* @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
* @version $Revision: 1.4 $
*/
public final class NamingService
extends NotificationBroadcasterSupport
implements NamingServiceMBean, MBeanRegistration {
// ----------------------------------------------------- Instance Variables
/**
* Status of the Slide domain.
*/
private int state = STOPPED;
/**
* Notification sequence number.
*/
private long sequenceNumber = 0;
/**
* Old URL packages value.
*/
private String oldUrlValue = "";
/**
* Old initial context value.
*/
private String oldIcValue = "";
// ---------------------------------------------- MBeanRegistration Methods
public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception {
return new ObjectName(OBJECT_NAME);
}
public void postRegister(Boolean registrationDone) {
if (!registrationDone.booleanValue())
destroy();
}
public void preDeregister()
throws Exception {
}
public void postDeregister() {
destroy();
}
// ----------------------------------------------------- SlideMBean Methods
/**
* Retruns the Catalina component name.
*/
public String getName() {
return NAME;
}
/**
* Returns the state.
*/
public int getState() {
return state;
}
/**
* Returns a String representation of the state.
*/
public String getStateString() {
return states[state];
}
/**
* Start the servlet container.
*/
public void start()
throws Exception {
Notification notification = null;
if (state != STOPPED)
return;
state = STARTING;
// Notifying the MBEan server that we're starting
notification = new AttributeChangeNotification
(this, sequenceNumber++, System.currentTimeMillis(),
"Starting " + NAME, "State", "java.lang.Integer",
Integer.valueOf(STOPPED), Integer.valueOf(STARTING));
sendNotification(notification);
try {
String value = "org.apache.naming";
String oldValue = System.getProperty(Context.URL_PKG_PREFIXES);
if (oldValue != null) {
oldUrlValue = oldValue;
value = oldValue + ":" + value;
}
System.setProperty(Context.URL_PKG_PREFIXES, value);
oldValue = System.getProperty(Context.INITIAL_CONTEXT_FACTORY);
if (oldValue != null) {
oldIcValue = oldValue;
} else {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
Constants.Package
+ ".java.javaURLContextFactory");
}
} catch (Throwable t) {
state = STOPPED;
notification = new AttributeChangeNotification
(this, sequenceNumber++, System.currentTimeMillis(),
"Stopped " + NAME, "State", "java.lang.Integer",
Integer.valueOf(STARTING), Integer.valueOf(STOPPED));
sendNotification(notification);
}
state = STARTED;
notification = new AttributeChangeNotification
(this, sequenceNumber++, System.currentTimeMillis(),
"Started " + NAME, "State", "java.lang.Integer",
Integer.valueOf(STARTING), Integer.valueOf(STARTED));
sendNotification(notification);
}
/**
* Stop the servlet container.
*/
public void stop() {
Notification notification = null;
if (state != STARTED)
return;
state = STOPPING;
notification = new AttributeChangeNotification
(this, sequenceNumber++, System.currentTimeMillis(),
"Stopping " + NAME, "State", "java.lang.Integer",
Integer.valueOf(STARTED), Integer.valueOf(STOPPING));
sendNotification(notification);
try {
System.setProperty(Context.URL_PKG_PREFIXES, oldUrlValue);
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, oldIcValue);
} catch (Throwable t) {
// FIXME
t.printStackTrace();
}
state = STOPPED;
notification = new AttributeChangeNotification
(this, sequenceNumber++, System.currentTimeMillis(),
"Stopped " + NAME, "State", "java.lang.Integer",
Integer.valueOf(STOPPING), Integer.valueOf(STOPPED));
sendNotification(notification);
}
/**
* Destroy servlet container (if any is running).
*/
public void destroy() {
if (getState() != STOPPED)
stop();
}
}
|