package rocks.inspectit.shared.cs.ci.factory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import javax.annotation.PostConstruct;
import javax.xml.bind.annotation.XmlTransient;
import org.springframework.stereotype.Component;
import rocks.inspectit.shared.cs.ci.Environment;
import rocks.inspectit.shared.cs.ci.assignment.impl.SpecialMethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.sensor.method.special.impl.ClassLoadingDelegationSensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.method.special.impl.MBeanServerInterceptorSensorConfig;
/**
* Factory that can return appropriate {@link SpecialMethodSensorAssignment}s based on the
* {@link Environment} properties.
*
* @author Ivan Senic
*
*/
@Component
@XmlTransient
public class SpecialMethodSensorAssignmentFactory {
/**
* Assignments for the class loading delegation.
*/
private Collection<SpecialMethodSensorAssignment> classLoadingDelegationAssignments;
/**
* Assignment for the MBean server factory.
*/
private Collection<SpecialMethodSensorAssignment> mbeanServerFactoryAssignments;
/**
* Private as factory.
*/
protected SpecialMethodSensorAssignmentFactory() {
}
/**
* Returns all special assignments that should be active for the given {@link Environment}.
*
* @param environment
* {@link Environment} holding the properties.
* @return Returns all functional assignments that should be active for the given
* {@link Environment}.
*/
public Collection<SpecialMethodSensorAssignment> getSpecialAssignments(Environment environment) {
if (!environment.isClassLoadingDelegation() && !isJmxSensorActive(environment)) {
return Collections.emptyList();
}
Collection<SpecialMethodSensorAssignment> assignments = new ArrayList<>(0);
if (environment.isClassLoadingDelegation()) {
assignments.addAll(classLoadingDelegationAssignments);
}
if (isJmxSensorActive(environment)) {
assignments.addAll(mbeanServerFactoryAssignments);
}
return assignments;
}
/**
* Checks if Jmx sensor is active on the environment.
*
* @param environment
* {@link Environment}
* @return <code>true</code> if jmx sensor is not <code>null</code> in environment and it's
* active
*/
private boolean isJmxSensorActive(Environment environment) {
return (null != environment.getJmxSensorConfig()) && environment.getJmxSensorConfig().isActive();
}
/**
* Initializes the assignments.
*/
@PostConstruct
void init() {
// init all assignments
// class loading delegation
SpecialMethodSensorAssignment cldDirect = new SpecialMethodSensorAssignment(ClassLoadingDelegationSensorConfig.INSTANCE);
cldDirect.setClassName("java.lang.ClassLoader");
cldDirect.setMethodName("loadClass");
cldDirect.setParameters(Collections.singletonList("java.lang.String"));
cldDirect.setPublicModifier(true);
SpecialMethodSensorAssignment cldSuperclass = new SpecialMethodSensorAssignment(ClassLoadingDelegationSensorConfig.INSTANCE);
cldSuperclass.setClassName("java.lang.ClassLoader");
cldSuperclass.setMethodName("loadClass");
cldSuperclass.setParameters(Collections.singletonList("java.lang.String"));
cldSuperclass.setPublicModifier(true);
cldSuperclass.setSuperclass(true);
classLoadingDelegationAssignments = Arrays.asList(cldDirect, cldSuperclass);
// mbean server
SpecialMethodSensorAssignment msbAdd = new SpecialMethodSensorAssignment(MBeanServerInterceptorSensorConfig.INSTANCE);
msbAdd.setClassName("javax.management.MBeanServerFactory");
msbAdd.setMethodName("addMBeanServer");
msbAdd.setParameters(Collections.singletonList("javax.management.MBeanServer"));
msbAdd.setPrivateModifier(true);
SpecialMethodSensorAssignment msbRemove = new SpecialMethodSensorAssignment(MBeanServerInterceptorSensorConfig.INSTANCE);
msbRemove.setClassName("javax.management.MBeanServerFactory");
msbRemove.setMethodName("removeMBeanServer");
msbRemove.setParameters(Collections.singletonList("javax.management.MBeanServer"));
msbRemove.setPrivateModifier(true);
mbeanServerFactoryAssignments = Arrays.asList(msbAdd, msbRemove);
}
}