blob: fc1cdc9ca1d5056f487dd4a7055d78c9a3087a42 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.geode.management.internal.beans;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.management.Notification;
import javax.management.ObjectName;
import org.apache.geode.LogWriter;
import org.apache.geode.annotations.internal.MakeNotStatic;
import org.apache.geode.distributed.internal.DistributionManager;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.management.CacheServerMXBean;
import org.apache.geode.management.GatewayReceiverMXBean;
import org.apache.geode.management.GatewaySenderMXBean;
import org.apache.geode.management.LockServiceMXBean;
import org.apache.geode.management.MemberMXBean;
import org.apache.geode.management.RegionMXBean;
import org.apache.geode.management.internal.FederationComponent;
import org.apache.geode.management.internal.ProxyListener;
import org.apache.geode.management.internal.SystemManagementService;
/**
* This class is responsible for creating Aggregate MBeans at GemFire layer. It acts as a
* ProxyListener and add/remove/update the corresponding MBean aggregates accordingly.
*
*
*/
public class MBeanAggregator implements ProxyListener {
@MakeNotStatic
private static final List<Class> distributedMBeanList = new ArrayList<>();
/**
* Log writer
*/
protected LogWriter logger;
/**
* Static list of MBeans which are currently supported for aggregation
*/
static {
distributedMBeanList.add(RegionMXBean.class);
distributedMBeanList.add(MemberMXBean.class);
distributedMBeanList.add(LockServiceMXBean.class);
distributedMBeanList.add(CacheServerMXBean.class);
distributedMBeanList.add(GatewayReceiverMXBean.class);
distributedMBeanList.add(GatewaySenderMXBean.class);
}
/**
* private instance of SystemManagementService
*/
private SystemManagementService service;
/**
* Region aggregate handler
*/
private RegionHandler regionHandler;
/**
* Member level aggregate handler
*/
private MemberHandler memberHandler;
/**
* Lock service aggregate handler.
*/
private LockServiceHandler lockServiceHandler;
/**
* Cache server aggregate Handler
*/
private CacheServerHandler cacheServerHandler;
/**
* Gateway receiver handler
*/
private GatewayReceiverHandler gatewayReceiverHandler;
/**
* Gateway sender handler
*/
private GatewaySenderHandler gatewaySenderHandler;
private DistributedSystemBridge distributedSystemBridge;
/**
* Public constructor.
*
*/
public MBeanAggregator(DistributedSystemBridge distributedSystemBridge) {
this.regionHandler = new RegionHandler();
this.memberHandler = new MemberHandler();
this.lockServiceHandler = new LockServiceHandler();
this.cacheServerHandler = new CacheServerHandler();
this.gatewayReceiverHandler = new GatewayReceiverHandler();
this.gatewaySenderHandler = new GatewaySenderHandler();
this.logger = InternalDistributedSystem.getLogger();
this.distributedSystemBridge = distributedSystemBridge;
}
/**
*
* @param interfaceClass class of the proxy interface
* @return appropriate handler instance to handle the proxy addition or removal
*/
private AggregateHandler getHandler(Class interfaceClass) {
if (interfaceClass.equals(RegionMXBean.class)) {
return regionHandler;
} else if (interfaceClass.equals(MemberMXBean.class)) {
return memberHandler;
} else if (interfaceClass.equals(LockServiceMXBean.class)) {
return lockServiceHandler;
} else if (interfaceClass.equals(CacheServerMXBean.class)) {
return cacheServerHandler;
} else if (interfaceClass.equals(GatewayReceiverMXBean.class)) {
return gatewayReceiverHandler;
} else if (interfaceClass.equals(GatewaySenderMXBean.class)) {
return gatewaySenderHandler;
}
return null;
}
@Override
public void afterCreateProxy(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
if (!distributedMBeanList.contains(interfaceClass)) {
return;
}
AggregateHandler handler = getHandler(interfaceClass);
handler.handleProxyAddition(objectName, interfaceClass, proxyObject, newVal);
}
@Override
public void afterRemoveProxy(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
if (!distributedMBeanList.contains(interfaceClass)) {
return;
}
AggregateHandler handler = getHandler(interfaceClass);
handler.handleProxyRemoval(objectName, interfaceClass, proxyObject, oldVal);
}
@Override
public void afterUpdateProxy(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
if (!distributedMBeanList.contains(interfaceClass)) {
return;
}
AggregateHandler handler = getHandler(interfaceClass);
handler.handleProxyUpdate(objectName, interfaceClass, proxyObject, newVal, oldVal);
}
@Override
public void afterPseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
if (!distributedMBeanList.contains(interfaceClass)) {
return;
}
AggregateHandler handler = getHandler(interfaceClass);
handler.handlePseudoCreateProxy(objectName, interfaceClass, proxyObject, newVal);
}
/**
* Handler class for CacheServer MBeans only to provide data to Distributed System MBean As of
* today there wont be any Distributed counterpart of Cache Server MBean
*
*
*/
private class CacheServerHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
CacheServerMXBean serverProxy = (CacheServerMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addServerToSystem(objectName, serverProxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object obj,
FederationComponent oldVal) {
CacheServerMXBean serverProxy = (CacheServerMXBean) interfaceClass.cast(obj);
distributedSystemBridge.removeServerFromSystem(objectName, serverProxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
distributedSystemBridge.updateCacheServer(objectName, newVal, oldVal);
}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
}
}
/**
* Handler class for GatewayReceiverHandler MBeans only to provide data to Distributed System
* MBean As of today there wont be any Distributed counterpart of GatewayReceiverHandler MBean
*
*
*/
private class GatewayReceiverHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
GatewayReceiverMXBean proxy = (GatewayReceiverMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addGatewayReceiverToSystem(objectName, proxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
GatewayReceiverMXBean proxy = (GatewayReceiverMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.removeGatewayReceiverFromSystem(objectName, proxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
distributedSystemBridge.updateGatewayReceiver(objectName, newVal, oldVal);
}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
}
}
/**
* Handler class for GatewayReceiverHandler MBeans only to provide data to Distributed System
* MBean As of today there wont be any Distributed counterpart of GatewayReceiverHandler MBean
*
*
*/
private class GatewaySenderHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
GatewaySenderMXBean proxy = (GatewaySenderMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addGatewaySenderToSystem(objectName, proxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
GatewaySenderMXBean proxy = (GatewaySenderMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.removeGatewaySenderFromSystem(objectName, proxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
distributedSystemBridge.updateGatewaySender(objectName, newVal, oldVal);
}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
}
}
/**
* Handler class for DistributedRegion
*
*
*/
private class RegionHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
RegionMXBean regionProxy = (RegionMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addRegion(objectName, regionProxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
RegionMXBean regionProxy = (RegionMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.removeRegion(objectName, regionProxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
distributedSystemBridge.updateRegion(objectName, oldVal, newVal);
}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
}
}
/**
* Handler class for Distributed System
*
*
*/
private class MemberHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
MemberMXBean memberProxy = (MemberMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addMemberToSystem(objectName, memberProxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
MemberMXBean memberProxy = (MemberMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.removeMemberFromSystem(objectName, memberProxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {
distributedSystemBridge.updateMember(objectName, newVal, oldVal);
}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
distributedSystemBridge.updateMember(objectName, newVal, null);
}
}
/**
* Handler class for Distributed Lock Service
*
*
*/
private class LockServiceHandler implements AggregateHandler {
@Override
public void handleProxyAddition(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal) {
LockServiceMXBean lockServiceProxy = (LockServiceMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.addLockService(objectName, lockServiceProxy, newVal);
}
@Override
public void handleProxyRemoval(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent oldVal) {
LockServiceMXBean lockServiceProxy = (LockServiceMXBean) interfaceClass.cast(proxyObject);
distributedSystemBridge.removeLockService(objectName, lockServiceProxy, oldVal);
}
@Override
public void handleProxyUpdate(ObjectName objectName, Class interfaceClass, Object proxyObject,
FederationComponent newVal, FederationComponent oldVal) {}
@Override
public void handlePseudoCreateProxy(ObjectName objectName, Class interfaceClass,
Object proxyObject, FederationComponent newVal) {
}
}
@Override
public void memberDeparted(DistributionManager distributionManager, InternalDistributedMember id,
boolean crashed) {
distributedSystemBridge.memberDeparted(id, crashed);
}
@Override
public void memberJoined(DistributionManager distributionManager, InternalDistributedMember id) {
distributedSystemBridge.memberJoined(id);
}
@Override
public void quorumLost(DistributionManager distributionManager,
Set<InternalDistributedMember> failures, List<InternalDistributedMember> remaining) {}
@Override
public void memberSuspect(DistributionManager distributionManager, InternalDistributedMember id,
InternalDistributedMember whoSuspected, String reason) {
distributedSystemBridge.memberSuspect(id, whoSuspected);
}
@Override
public void handleNotification(Notification notification) {
distributedSystemBridge.sendSystemLevelNotification(notification);
}
}