package org.glassfish.jersey.server.internal.monitoring.jmx;
import java.util.HashMap;
import java.util.Map;
import org.glassfish.jersey.server.internal.monitoring.MonitoringUtils;
import org.glassfish.jersey.server.model.ResourceMethod;
import org.glassfish.jersey.server.monitoring.ResourceMXBean;
import org.glassfish.jersey.server.monitoring.ResourceMethodStatistics;
import org.glassfish.jersey.server.monitoring.ResourceStatistics;
public class ResourceMxBeanImpl implements ResourceMXBean {
private final String name;
private volatile ExecutionStatisticsDynamicBean methodsExecutionStatisticsBean;
private volatile ExecutionStatisticsDynamicBean requestExecutionStatisticsBean;
private final Map<String, ResourceMethodMXBeanImpl> resourceMethods = new HashMap<>();
private final String resourcePropertyName;
private final boolean uriResource;
private final MBeanExposer mBeanExposer;
public ResourceMxBeanImpl(ResourceStatistics resourceStatistics, String name, boolean uriResource,
MBeanExposer mBeanExposer,
String parentName) {
this.name = name;
this.uriResource = uriResource;
this.mBeanExposer = mBeanExposer;
this.resourcePropertyName = parentName + ",resource=" + MBeanExposer.convertToObjectName(name, uriResource);
mBeanExposer.registerMBean(this, resourcePropertyName);
this.methodsExecutionStatisticsBean = new ExecutionStatisticsDynamicBean(
resourceStatistics.getResourceMethodExecutionStatistics(), mBeanExposer, resourcePropertyName,
MBeanExposer.PROPERTY_EXECUTION_TIMES_METHODS);
this.requestExecutionStatisticsBean = new ExecutionStatisticsDynamicBean(
resourceStatistics.getRequestExecutionStatistics(), mBeanExposer, resourcePropertyName,
MBeanExposer.PROPERTY_EXECUTION_TIMES_REQUESTS);
updateResourceStatistics(resourceStatistics);
}
public void updateResourceStatistics(ResourceStatistics resourceStatistics) {
this.methodsExecutionStatisticsBean.updateExecutionStatistics(resourceStatistics.getResourceMethodExecutionStatistics());
this.requestExecutionStatisticsBean.updateExecutionStatistics(resourceStatistics.getRequestExecutionStatistics());
for (Map.Entry<ResourceMethod, ResourceMethodStatistics> entry
: resourceStatistics.getResourceMethodStatistics().entrySet()) {
final ResourceMethodStatistics methodStats = entry.getValue();
final ResourceMethod method = entry.getKey();
final String methodId = MonitoringUtils.getMethodUniqueId(method);
ResourceMethodMXBeanImpl methodMXBean = this.resourceMethods.get(methodId);
if (methodMXBean == null) {
methodMXBean = new ResourceMethodMXBeanImpl(methodStats, uriResource, mBeanExposer,
resourcePropertyName, methodId);
resourceMethods.put(methodId, methodMXBean);
}
methodMXBean.updateResourceMethodStatistics(methodStats);
}
}
@Override
public String getName() {
return this.name;
}
}