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.SpecialInstrumentationPoint; import rocks.inspectit.shared.cs.ci.Environment; import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment; import rocks.inspectit.shared.cs.ci.assignment.impl.SpecialMethodSensorAssignment; import rocks.inspectit.shared.cs.ci.sensor.method.IMethodSensorConfig; import rocks.inspectit.shared.cs.cmr.service.IRegistrationService; /** * {@link AbstractSensorInstrumentationApplier} for the special assignments. * * @author Ivan Senic * */ public class SpecialInstrumentationApplier extends AbstractSensorInstrumentationApplier { /** * {@link SpecialMethodSensorAssignment} to use. */ private final SpecialMethodSensorAssignment functionalAssignment; /** * Default constructor. * * @param functionalAssignment * {@link SpecialMethodSensorAssignment} to use. * @param environment * Environment belonging to the assignment. * @param registrationService * Registration service needed for registration of the IDs. */ public SpecialInstrumentationApplier(SpecialMethodSensorAssignment functionalAssignment, Environment environment, IRegistrationService registrationService) { super(environment, registrationService); this.functionalAssignment = functionalAssignment; } /** * {@inheritDoc} */ @Override public AbstractClassSensorAssignment<?> getSensorAssignment() { return functionalAssignment; } /** * {@inheritDoc} */ @Override protected boolean matches(ClassType classType) { return getClassSensorAssignmentFilter().matches(functionalAssignment, classType, false); } /** * {@inheritDoc} * <p> * We only support method instrumentation with special assignments for now. No constructors of * any kind. */ @Override protected boolean matches(MethodType methodType) { return MethodType.Character.METHOD.equals(methodType.getMethodCharacter()) && getMethodSensorAssignmentFilter().matches(functionalAssignment, methodType); } /** * {@inheritDoc} */ @Override protected void applyAssignment(AgentConfig agentConfiguration, MethodType methodType, MethodInstrumentationConfig methodInstrumentationConfig) { SpecialInstrumentationPoint specialInstrumentationPoint = getOrCreateSpecialInstrumentationPoint(agentConfiguration, methodType, methodInstrumentationConfig); MethodSensorTypeConfig methodSensorTypeConfig = getSensorTypeConfigFromConfiguration(agentConfiguration); long sensorId = methodSensorTypeConfig.getId(); specialInstrumentationPoint.setSensorId(sensorId); specialInstrumentationPoint.setSubstitutionDescriptor(functionalAssignment.getSpecialMethodSensorConfig().getSubstitutionDescriptor()); } /** * Finds the proper sensor id from the agent configuration used for the * {@link SpecialMethodSensorAssignment}. * * @param agentConfiguration * {@link AgentConfig} * @return {@link MethodSensorTypeConfig} for the given assignment. */ private MethodSensorTypeConfig getSensorTypeConfigFromConfiguration(AgentConfig agentConfiguration) { IMethodSensorConfig methodSensorConfig = functionalAssignment.getSpecialMethodSensorConfig(); return agentConfiguration.getSpecialMethodSensorTypeConfig(methodSensorConfig.getClassName()); } }