package rocks.inspectit.server.instrumentation.config.applier;
import rocks.inspectit.shared.all.instrumentation.classcache.ClassType;
import rocks.inspectit.shared.all.instrumentation.classcache.MethodType;
import rocks.inspectit.shared.all.instrumentation.config.impl.AgentConfig;
import rocks.inspectit.shared.all.instrumentation.config.impl.MethodInstrumentationConfig;
import rocks.inspectit.shared.all.instrumentation.config.impl.MethodSensorTypeConfig;
import rocks.inspectit.shared.all.instrumentation.config.impl.SensorInstrumentationPoint;
import rocks.inspectit.shared.cs.ci.Environment;
import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.MethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.sensor.method.IMethodSensorConfig;
import rocks.inspectit.shared.cs.cmr.service.IRegistrationService;
/**
* Applier for the {@link MethodSensorAssignment}.
*
* @author Ivan Senic
*
*/
public class MethodSensorInstrumentationApplier extends AbstractSensorInstrumentationApplier {
/**
* Method sensor assignment to work with.
*/
private final MethodSensorAssignment methodSensorAssignment;
/**
* Default constructor.
*
* @param methodSensorAssignment
* {@link MethodSensorAssignment} that defines instrumentation configuration.
* @param environment
* Environment belonging to the assignment.
* @param registrationService
* Registration service needed for registration of the IDs.
*/
public MethodSensorInstrumentationApplier(MethodSensorAssignment methodSensorAssignment, Environment environment, IRegistrationService registrationService) {
super(environment, registrationService);
this.methodSensorAssignment = methodSensorAssignment;
}
/**
* {@inheritDoc}
*/
@Override
public AbstractClassSensorAssignment<?> getSensorAssignment() {
return methodSensorAssignment;
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matches(ClassType classType) {
return getClassSensorAssignmentFilter().matches(methodSensorAssignment, classType, false);
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matches(MethodType methodType) {
return getMethodSensorAssignmentFilter().matches(methodSensorAssignment, methodType);
}
/**
* {@inheritDoc}
*/
@Override
protected void applyAssignment(AgentConfig agentConfiguration, MethodType methodType, MethodInstrumentationConfig methodInstrumentationConfig) {
SensorInstrumentationPoint sensorInstrumentationPoint = getOrCreateSensorInstrumentationPoint(agentConfiguration, methodType, methodInstrumentationConfig);
applyAssignment(agentConfiguration, sensorInstrumentationPoint);
}
/**
* {@inheritDoc}
*/
protected void applyAssignment(AgentConfig agentConfiguration, SensorInstrumentationPoint sensorInstrumentationPoint) {
// first deal with sensor id
MethodSensorTypeConfig methodSensorTypeConfig = getSensorTypeConfigFromConfiguration(agentConfiguration, environment, methodSensorAssignment);
long sensorId = methodSensorTypeConfig.getId();
// set to rsc
sensorInstrumentationPoint.addSensorId(sensorId, methodSensorTypeConfig.getPriority());
// add all settings
sensorInstrumentationPoint.addSettings(methodSensorAssignment.getSettings());
}
/**
* Finds the proper sensor id from the agent configuration and the environment used for the
* {@link MethodSensorAssignment}.
*
* @param agentConfiguration
* {@link AgentConfig}
* @param environment
* {@link Environment}
* @param assignment
* {@link MethodSensorAssignment}
* @return {@link MethodSensorTypeConfig} for the given assignment.
*/
private MethodSensorTypeConfig getSensorTypeConfigFromConfiguration(AgentConfig agentConfiguration, Environment environment, MethodSensorAssignment assignment) {
IMethodSensorConfig methodSensorConfig = environment.getMethodSensorTypeConfig(assignment.getSensorConfigClass());
return agentConfiguration.getMethodSensorTypeConfig(methodSensorConfig.getClassName());
}
}