/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2013 Oracle and/or its affiliates. All rights reserved.
*
* 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_1_1.html
* or packager/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 packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [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 com.sun.enterprise.v3.admin;
import com.sun.enterprise.util.LocalStringManagerImpl;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.*;
import javax.management.*;
import javax.management.loading.ClassLoaderRepository;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.rmi.ssl.SslRMIClientSocketFactory;
/**
This Interceptor wraps the real MBeanServer so that additional interceptor code can be
"turned on" at a later point. However, it must be possible to start the MBeanServer even before
the JVM calls main(). Therefore,
<b>This class must not depend on anything that can't initialize before the JVM calls main()</b>.
<i>This includes things like logging which is not happy being invoked
that early.</i>
<p>
When instantiated at startup, the instance of this class that wraps the real MBeanServer
is termed the "Primary Interceptor". There can only be one such Interceptor for each
*real* MBeanServer. MBeanServer #0 is the Platform MBeanServer, and this class <b>must</b> be
used for GlassFish. Additional MBeanServers can be created if desired.
<p>
This class can also be used to implement an Interceptor which can be set for use by the Primary
Interceptor. Such interceptors are used only for get/setAttribute(s) and invoke(), though
the use of them could be expanded for other methods.
<p>
Note that many methods are declared 'final' for efficiency. If a subclass needs
to override a method, remove 'final'. Until that time, we might as well remain efficient,
since most methods won't be overridden.
*/
public class DynamicInterceptor implements MBeanServer
{
private volatile MBeanServer mDelegateMBeanServer;
private static final HashMap<String, MBeanServerConnection> instanceConnections =
new HashMap<String, MBeanServerConnection>();;
private static final LocalStringManagerImpl localStrings =
new LocalStringManagerImpl(DynamicInterceptor.class);
private static final String SERVER_PREFIX = "amx:pp=/domain/servers";
private static final String CLUSTER_PREFIX = "amx:pp=/domain/clusters";
private static final String CONFIG_PREFIX = "amx:pp=/domain/configs/config[";
private static final String JSR77_PREFIX ="amx:pp=/J2EEDomain";
private static final String MON_PREFIX ="amx:pp=/mon/server-mon[";
public DynamicInterceptor() {
mDelegateMBeanServer = null;
// we must initialize this eagely in order to avoid initializing this at the time of shutdown and failing
// because the modules have been shutdown. See GLASSFISH-18109 for more details.
MbeanService.getInstance();
}
private DynamicInterceptor.ReplicationInfo getTargets( final ObjectName objectName) throws InstanceNotFoundException {
//TODO : Check if we already have a target list for this ObjectName
//create a ReplicationInfo instance
DynamicInterceptor.ReplicationInfo result = new DynamicInterceptor.ReplicationInfo();
// if this is for create Mbean
if(objectName == null) {
result.addInstance("server");
return result;
}
String oName = objectName.toString();
// Initialize the MBeanService and check if we are on DAS
if(MbeanService.getInstance() == null) {
result.addInstance("server");
return result;
}
// Now lets start analysing the Object Name.
if(objectName.getKeyProperty("type") != null &&
(objectName.getKeyProperty("type").equals("Mapper") ||
objectName.getKeyProperty("type").equals("Connector") ||
objectName.getKeyProperty("type").equals("Engine") ||
objectName.getKeyProperty("type").equals("ProtocolHandler") ||
objectName.getKeyProperty("type").equals("Service") ||
objectName.getKeyProperty("type").equals("Host") ||
objectName.getKeyProperty("type").equals("Loader") ||
objectName.getKeyProperty("type").equals("JspMonitor") ||
objectName.getKeyProperty("type").equals("Valve"))) {
result.addInstance("server");
return result;
}
//If its a MBean corresponding to config
if(isConfig(oName)) {
String configName = getName(oName);
if(configName != null && configName.endsWith("-config")) {
String targetName = configName.substring(0, configName.indexOf("-config"));
if( (!"default".equals(targetName)) && (!"server".equals(targetName)) ) {
result.addAllInstances(MbeanService.getInstance().getInstances(configName));
}
} else {
result.addInstance("server");
}
}
// if its a MBean corresponding to a cluster
if(isCluster(oName)) {
String targetName = getName(oName);
if(targetName != null) {
result.addAllInstances(MbeanService.getInstance().getInstances(targetName));
}
}
// if its an MBean corresponding to a server
if(isServer(oName)) {
String targetName = getName(oName);
if(targetName != null) {
result.addInstance(targetName);
if(!("server".equals(targetName)))
result.setTargetIsAnInstance(true);
} else {
result.addInstance("server");
}
}
// If its an MBean corresponding to a JSR77 managed object
if(isJSR77(oName, objectName)) {
if(objectName.getKeyProperty("j2eeType") != null &&
objectName.getKeyProperty("j2eeType").equals("J2EEDomain")) {
result.addInstance("server");
} else if (objectName.getKeyProperty("j2eeType") != null &&
objectName.getKeyProperty("j2eeType").equals("J2EEServer")) {
String targetInstance = objectName.getKeyProperty("name");
if(MbeanService.getInstance().isValidServer(targetInstance)) {
result.addInstance("server");
result.addInstance(targetInstance);
}
} else {
String targetInstance = objectName.getKeyProperty("J2EEServer");
if(MbeanService.getInstance().isValidServer(targetInstance)) {
result.addInstance(targetInstance);
}
}
}
// If its an monitoring MBean
if(isMonitoring(oName)) {
String targetName = getName(oName);
result.addInstance(targetName);
if(!("server".equals(targetName)))
result.setTargetIsAnInstance(true);
}
// If its a generic query
if("amx:*".equals(oName) || "*.*".equals(oName)) {
result.addInstance("server");
result.addAllInstances(MbeanService.getInstance().getAllInstances());
}
if (objectName.getKeyProperty("type")!=null) {
if (objectName.getKeyProperty("type").equals("domain-root") ||
objectName.getKeyProperty("type").equals("domain") ||
objectName.getKeyProperty("type").equals("resources") ||
objectName.getKeyProperty("type").equals("system-applications") ||
objectName.getKeyProperty("type").equals("applications") ||
objectName.getKeyProperty("type").equals("realms") ||
objectName.getKeyProperty("type").equalsIgnoreCase("MBeanServerDelegate")) {
result.addInstance("server");
}
}
if( oName.startsWith("amx-support") || oName.startsWith("jmxremote") ) {
result.addInstance("server");
}
if((MbeanService.getInstance().isDas())) {
result.addInstance("server");
return result;
}
// What abouut JVM
return result;
}
private DynamicInterceptor.ReplicationInfo getInstance(final ObjectName o) throws InstanceNotFoundException {
return getTargets(o);
}
private MBeanServerConnection getInstanceConnection(String instanceName) throws InstanceNotFoundException {
// first check if this is on the same instance as the one in the argument
// In such a case we delegate to the local MBeanServer
if(MbeanService.getInstance().isInstance(instanceName)) {
return getDelegateMBeanServer();
}
// check if this needs a secure connection
if(MbeanService.getInstance().isSecureJMX(instanceName)) {
return getSecureInstanceConnection(instanceName);
}
synchronized (instanceConnections) {
if (!instanceConnections.containsKey(instanceName)) {
try {
String urlStr = "service:jmx:rmi:///jndi/rmi://" +
MbeanService.getInstance().getHost(instanceName) + ":" +
MbeanService.getInstance().getJMXPort(instanceName) + "/jmxrmi";
JMXServiceURL url = new JMXServiceURL(urlStr);
JMXConnector jmxConn = JMXConnectorFactory.connect(url);
MBeanServerConnection conn = jmxConn.getMBeanServerConnection();
instanceConnections.put(instanceName, conn);
} catch(Exception ex) {
throw new InstanceNotFoundException(ex.getLocalizedMessage());
}
}
return instanceConnections.get(instanceName);
}
}
private MBeanServerConnection getSecureInstanceConnection(String instanceName) throws InstanceNotFoundException {
synchronized (instanceConnections) {
if (!instanceConnections.containsKey(instanceName)) {
try {
//
System.out.println("\nInitialize the environment map");
final Map<String,Object> env = new HashMap<String,Object>();
// Provide the SSL/TLS-based RMI Client Socket Factory required
// by the JNDI/RMI Registry Service Provider to communicate with
// the SSL/TLS-protected RMI Registry
SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory();
env.put("com.sun.jndi.rmi.factory.socket", csf);
String urlStr = "service:jmx:rmi:///jndi/rmi://" +
MbeanService.getInstance().getHost(instanceName) + ":" +
MbeanService.getInstance().getJMXPort(instanceName) + "/jmxrmi";
JMXServiceURL url = new JMXServiceURL(urlStr);
JMXConnector jmxConn = JMXConnectorFactory.connect(url, env);
MBeanServerConnection conn = jmxConn.getMBeanServerConnection();
instanceConnections.put(instanceName, conn);
} catch(Exception ex) {
throw new InstanceNotFoundException(ex.getLocalizedMessage());
}
}
return instanceConnections.get(instanceName);
}
}
/**
Get the MBeanServer to which the request can be delegated.
*/
public MBeanServer getDelegateMBeanServer() {
return mDelegateMBeanServer;
}
public void setDelegateMBeanServer(final MBeanServer server) {
mDelegateMBeanServer = server;
}
public Object invoke( final ObjectName objectName, final String operationName,
final Object[] params, final String[] signature)
throws ReflectionException, InstanceNotFoundException, MBeanException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
Object returnValue = null;
try {
for(String svr : result.getInstances()) {
if("server".equals(svr)) {
returnValue = getDelegateMBeanServer().invoke( objectName, operationName, params, signature );
} else {
returnValue = getInstanceConnection(svr).invoke(objectName, operationName, params, signature);
}
}
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
return returnValue;
}
public final Object getAttribute(final ObjectName objectName, final String attributeName)
throws InstanceNotFoundException, AttributeNotFoundException, MBeanException, ReflectionException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
if(!result.isTargetAnInstance())
return getDelegateMBeanServer().getAttribute( objectName, attributeName);
try {
return getInstanceConnection(result.getInstances().get(0)).getAttribute(objectName, attributeName);
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
}
public void setAttribute(final ObjectName objectName, final Attribute attribute) throws
InstanceNotFoundException, AttributeNotFoundException, MBeanException,
ReflectionException, InvalidAttributeValueException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).setAttribute(objectName, attribute);
return;
}
for(String svr : result.getInstances()) {
if("server".equals(svr))
getDelegateMBeanServer().setAttribute( objectName, attribute );
else
getInstanceConnection(svr).setAttribute(objectName, attribute);
}
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
}
public final AttributeList getAttributes(final ObjectName objectName, final String[] attrNames)
throws InstanceNotFoundException, ReflectionException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance())
return getInstanceConnection(result.getInstances().get(0)).getAttributes(objectName, attrNames);
else
return getDelegateMBeanServer().getAttributes( objectName, attrNames );
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
}
public AttributeList setAttributes (final ObjectName objectName, final AttributeList attributeList)
throws InstanceNotFoundException, ReflectionException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
AttributeList ret = null;
try {
if(result.isTargetAnInstance())
return getInstanceConnection(result.getInstances().get(0)).setAttributes(objectName, attributeList);
for(String svr : result.getInstances()) {
if((result.getInstances().get(0).equals("server")))
ret = getDelegateMBeanServer().setAttributes( objectName, attributeList );
else
ret = getInstanceConnection(svr).setAttributes(objectName, attributeList);
}
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
return ret;
}
public final ObjectInstance registerMBean(final Object obj, final ObjectName objectName)
throws NotCompliantMBeanException, MBeanRegistrationException, InstanceAlreadyExistsException {
return getDelegateMBeanServer().registerMBean( obj, objectName );
}
public final void unregisterMBean(final ObjectName objectName)
throws InstanceNotFoundException, MBeanRegistrationException {
// System.out.println("Unregistering MBean :"+objectName.toString());
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).unregisterMBean(objectName);
return;
}
for(String svr : result.getInstances()) {
if("server".equals(svr))
getDelegateMBeanServer().unregisterMBean( objectName );
else
getInstanceConnection(svr).unregisterMBean(objectName);
}
} catch(IOException io) {
throw new MBeanRegistrationException(io);
}
}
public final Integer getMBeanCount() {
return getDelegateMBeanServer().getMBeanCount( );
}
@Override
public final Set queryMBeans( final ObjectName objectName, final QueryExp expr ) {
//if(objectName == null)
// return Collections.EMPTY_SET;
try {
Set returnVal = null;
List<String> instance = getInstance(objectName).getInstances();
for(String ins : instance) {
Set tmp;
if(ins.equals("server"))
tmp = getDelegateMBeanServer().queryMBeans(objectName, expr);
else
tmp = getInstanceConnection(ins).queryMBeans(objectName, expr);
if(returnVal == null)
returnVal = tmp;
else
returnVal.addAll(tmp);
}
return returnVal;
} catch (Exception e) {
return Collections.EMPTY_SET;
}
}
public final MBeanInfo getMBeanInfo( final ObjectName objectName)
throws InstanceNotFoundException, IntrospectionException, ReflectionException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance())
return getInstanceConnection(result.getInstances().get(0)).getMBeanInfo(objectName);
else
return getDelegateMBeanServer().getMBeanInfo( objectName );
} catch (IOException ioex) {
throw new ReflectionException(ioex);
}
}
public final boolean isRegistered( final ObjectName objectName) {
if(objectName == null)
return false;
try {
List<String> instance = getInstance(objectName).getInstances();
for(String instanceName : instance) {
if(instanceName.equals(System.getProperty("com.sun.aas.instanceName"))) {
return getDelegateMBeanServer().isRegistered( objectName );
} else {
continue;
}
}
return false;
/*if((instance.get(0).equals("server")))
return getDelegateMBeanServer().isRegistered( objectName );
return getInstanceConnection(instance.get(0)).isRegistered(objectName); */
} catch (Exception ex) {
return false;
}
}
public final void addNotificationListener( final ObjectName objectName,
final NotificationListener notificationListener,
final NotificationFilter notificationFilter, final Object obj)
throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).addNotificationListener(
objectName, notificationListener, notificationFilter, obj);
return;
}
for(String svr : result.getInstances()) {
if("server".equals(svr))
getDelegateMBeanServer().addNotificationListener(objectName,
notificationListener, notificationFilter, obj);
else
getInstanceConnection(svr).addNotificationListener(objectName, notificationListener,
notificationFilter, obj);
}
} catch(IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final void addNotificationListener(final ObjectName objectName, final ObjectName objectName1,
final NotificationFilter notificationFilter, final Object obj)
throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).addNotificationListener(
objectName, objectName1, notificationFilter, obj);
return;
}
for(String svr : result.getInstances()) {
if("server".equals(svr))
getDelegateMBeanServer().addNotificationListener(objectName,
objectName1, notificationFilter, obj);
else
getInstanceConnection(svr).addNotificationListener(objectName, objectName1,
notificationFilter, obj);
}
} catch(IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final ObjectInstance createMBean( final String str, final ObjectName objectName)
throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
MBeanException, NotCompliantMBeanException {
return createMBean(str, objectName, (Object[]) null, (String[]) null);
}
public final ObjectInstance createMBean( final String str, final ObjectName objectName,
final ObjectName objectName2)
throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException,
NotCompliantMBeanException, InstanceNotFoundException {
return createMBean(str, objectName, objectName2, (Object[]) null, (String[]) null);
}
public final ObjectInstance createMBean( final String str, final ObjectName objectName, final Object[] obj,
final String[] str3)
throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
MBeanException, NotCompliantMBeanException {
try {
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
ObjectInstance ret = null;
if(result.isTargetAnInstance())
return getInstanceConnection(result.getInstances().get(0)).createMBean(str, objectName, obj, str3);
for(String svr : result.getInstances())
if(svr.equals("server"))
ret = getDelegateMBeanServer().createMBean (str, objectName, obj, str3);
else
ret = getInstanceConnection(svr).createMBean(str, objectName, obj, str3);
return ret;
} catch (InstanceNotFoundException ex) {
throw new MBeanException(ex);
} catch (IOException ex) {
throw new MBeanException(ex);
}
}
public final ObjectInstance createMBean ( final String str, final ObjectName objectName,
final ObjectName objectName2, final Object[] obj, final String[] str4)
throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException,
MBeanException, NotCompliantMBeanException, InstanceNotFoundException {
try {
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
ObjectInstance ret = null;
if(result.isTargetAnInstance())
return getInstanceConnection(result.getInstances().get(0)).createMBean(str, objectName,
objectName2, obj, str4);
for(String svr : result.getInstances())
if(svr.equals("server"))
ret = getDelegateMBeanServer().createMBean (str, objectName, objectName2, obj, str4);
else
ret = getInstanceConnection(svr).createMBean(str, objectName, objectName2, obj, str4);
return ret;
} catch (InstanceNotFoundException ex) {
throw new MBeanException(ex);
} catch (IOException ex) {
throw new MBeanException(ex);
}
}
public final ObjectInputStream deserialize (String str, byte[] values)
throws OperationsException, ReflectionException {
return getDelegateMBeanServer().deserialize (str, values);
}
public final ObjectInputStream deserialize( final ObjectName objectName, final byte[] values)
throws InstanceNotFoundException, OperationsException {
return getDelegateMBeanServer().deserialize (objectName, values);
}
public final ObjectInputStream deserialize( final String str, final ObjectName objectName, byte[] values)
throws InstanceNotFoundException, OperationsException, ReflectionException {
return getDelegateMBeanServer().deserialize (str, objectName, values);
}
public final String getDefaultDomain() {
return getDelegateMBeanServer().getDefaultDomain();
}
public final ObjectInstance getObjectInstance(ObjectName objectName) throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
List<String> instance = getInstance(objectName).getInstances();
if(instance.size() != 1)
throw new InstanceNotFoundException(localStrings.getLocalString("interceptor.objectName.wrongservernames",
"This mbean call does not support multiple target instances"));
if((instance.get(0).equals("server")))
return getDelegateMBeanServer().getObjectInstance(objectName);
try {
return getInstanceConnection(instance.get(0)).getObjectInstance(objectName);
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final Object instantiate( final String str) throws ReflectionException, MBeanException {
return getDelegateMBeanServer().instantiate(str);
}
public final Object instantiate( final String str, final ObjectName objectName)
throws ReflectionException, MBeanException, InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
return getDelegateMBeanServer().instantiate(str, objectName);
}
public final Object instantiate( final String str, final Object[] obj, final String[] str2)
throws ReflectionException, MBeanException {
return getDelegateMBeanServer().instantiate(str, obj, str2);
}
public final Object instantiate( final String str, final ObjectName objectName, final Object[] obj,
final String[] str3)
throws ReflectionException, MBeanException, InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
return getDelegateMBeanServer().instantiate(str, objectName, obj, str3);
}
public final boolean isInstanceOf ( final ObjectName objectName, final String str)
throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
List<String> instance = getInstance(objectName).getInstances();
if(instance.size() != 1)
throw new InstanceNotFoundException(localStrings.getLocalString("interceptor.objectName.wrongservernames",
"This mbean call does not support multiple target instances"));
if((instance.get(0).equals("server")))
return getDelegateMBeanServer().isInstanceOf(objectName, str);
try {
return getInstanceConnection(instance.get(0)).isInstanceOf(objectName, str);
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final Set queryNames( final ObjectName objectName, final QueryExp queryExp) {
Set returnVal = null;
//if(objectName == null)
//return Collections.EMPTY_SET;
List<String> instance;
try {
instance = getInstance(objectName).getInstances();
} catch(InstanceNotFoundException e) {
return Collections.EMPTY_SET;
}
for(String ins : instance) {
Set tmp = null;
if(ins.equals("server")) {
tmp = getDelegateMBeanServer().queryNames( objectName, queryExp);
} else {
try {
tmp = getInstanceConnection(ins).queryNames(objectName, queryExp);
} catch(Exception e) {
//Swallowing this intentionally
//Because this can happen only if the instance is down / not responding
}
}
if(tmp != null) {
if(returnVal == null)
returnVal = tmp;
else
returnVal.addAll(tmp);
}
}
if(returnVal == null)
return Collections.EMPTY_SET;
return returnVal;
}
public final void removeNotificationListener(final ObjectName objectName, final ObjectName objectName1)
throws InstanceNotFoundException, ListenerNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).removeNotificationListener(objectName, objectName1);
return;
}
for(String svr : result.getInstances()) {
if(svr.equals("server"))
getDelegateMBeanServer().removeNotificationListener( objectName, objectName1);
else
getInstanceConnection(svr).removeNotificationListener(objectName, objectName1);
}
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final void removeNotificationListener( final ObjectName objectName,
final NotificationListener notificationListener)
throws InstanceNotFoundException, ListenerNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).removeNotificationListener(objectName, notificationListener);
return;
}
for(String svr : result.getInstances()) {
if(svr.equals("server"))
getDelegateMBeanServer().removeNotificationListener( objectName, notificationListener);
else
getInstanceConnection(svr).removeNotificationListener(objectName, notificationListener);
}
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final void removeNotificationListener( final ObjectName objectName,
final NotificationListener notificationListener,
final NotificationFilter notificationFilter, final Object obj)
throws InstanceNotFoundException, ListenerNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).removeNotificationListener(objectName,
notificationListener, notificationFilter, obj);
return;
}
for(String svr : result.getInstances()) {
if(svr.equals("server"))
getDelegateMBeanServer().removeNotificationListener( objectName,
notificationListener,notificationFilter, obj);
else
getInstanceConnection(svr).removeNotificationListener(objectName,
notificationListener, notificationFilter, obj);
}
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
}
}
public final void removeNotificationListener( final ObjectName objectName, final ObjectName objectName1,
final NotificationFilter notificationFilter, final Object obj)
throws InstanceNotFoundException, ListenerNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
DynamicInterceptor.ReplicationInfo result = getInstance(objectName);
try {
if(result.isTargetAnInstance()) {
getInstanceConnection(result.getInstances().get(0)).removeNotificationListener(objectName,
objectName1, notificationFilter, obj);
return;
}
for(String svr : result.getInstances()) {
if(svr.equals("server"))
getDelegateMBeanServer().removeNotificationListener( objectName,
objectName1,notificationFilter, obj);
else
getInstanceConnection(svr).removeNotificationListener(objectName,
objectName1, notificationFilter, obj);
}
} catch (IOException ioex) {
throw new InstanceNotFoundException(ioex.getLocalizedMessage());
} }
public final ClassLoader getClassLoader( final ObjectName objectName) throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
return getDelegateMBeanServer().getClassLoader( objectName );
}
public final ClassLoader getClassLoaderFor( final ObjectName objectName) throws InstanceNotFoundException {
if(objectName == null)
throw new InstanceNotFoundException();
return getDelegateMBeanServer().getClassLoaderFor( objectName );
}
public final ClassLoaderRepository getClassLoaderRepository() {
return getDelegateMBeanServer().getClassLoaderRepository();
}
public final String[] getDomains() {
return getDelegateMBeanServer().getDomains();
}
private boolean isConfig(String oName) {
return oName.startsWith(CONFIG_PREFIX);
}
private boolean isCluster(String oName) {
return oName.startsWith(CLUSTER_PREFIX);
}
private boolean isServer(String oName) {
return oName.startsWith(SERVER_PREFIX);
}
private boolean isJSR77(String oName, ObjectName o) {
if(o.getKeyProperty("j2eeType") !=null) {
return true;
} else if(oName.startsWith(JSR77_PREFIX)) {
return true;
} else {
return false;
}
}
private boolean isMonitoring(String oName) {
return oName.startsWith(MON_PREFIX);
}
private String getName(String oName) {
if(oName.indexOf("[") != -1 ) {
return oName.substring(oName.indexOf("[") + 1, oName.indexOf("]"));
} else {
return null;
}
}
private static class ReplicationInfo {
private boolean instanceTarget = false;
private List<String> instances = new ArrayList<String>();
boolean isTargetAnInstance() { return instanceTarget;}
void setTargetIsAnInstance(boolean b) { instanceTarget = b;}
List<String> getInstances() { return instances;}
void addInstance(String s) {
if(!instances.contains(s)) {
instances.add(s);
}
}
void addAllInstances(List list) {
instances.addAll(list);
}
}
}