package org.stagemonitor.tracing.ejb; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import org.stagemonitor.core.util.ClassUtils; import org.stagemonitor.tracing.AbstractMonitorRequestsTransformer; import javax.ejb.Remote; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static org.stagemonitor.tracing.ejb.IsDeclaredInRemoteClassElementMatcher.overridesMethodFromRemoteAnnotationValue; import static org.stagemonitor.tracing.ejb.RemoteInterfaceElementMatcher.implementsInterfaceWhichIsAnnotatedWithRemote; import static org.stagemonitor.tracing.ejb.RemoteInterfaceMethodMatcher.overridesMethodFromInterfaceWhichIsAnnotatedWithRemote; /** * This class is responsible for detecting EJB remote calls * <p/> * It detects classes that are either annotated with @{@link Remote} or implement an interface which is annotated with @{@link Remote} */ public class RemoteEjbMonitorTransformer extends AbstractMonitorRequestsTransformer { @Override protected ElementMatcher.Junction<TypeDescription> getNarrowTypesMatcher() { return isAnnotatedWith(Remote.class).or(implementsInterfaceWhichIsAnnotatedWithRemote()); } @Override protected ElementMatcher.Junction<MethodDescription> getExtraMethodElementMatcher() { return isPublic().and( overridesMethodFromRemoteAnnotationValue() .or(overridesMethodFromInterfaceWhichIsAnnotatedWithRemote()) ); } @Override public boolean isActive() { return ClassUtils.isPresent("javax.ejb.Remote"); } }