PhysicalOperationDefinition operation = chain.getPhysicalOperation(); Method method = MethodUtils.findMethod(sourceDefinition, targetDefinition, operation, implementationClass, loader, classLoaderRegistry); ServiceInvoker invoker = reflectionFactory.createServiceInvoker(method); InvokerInterceptor interceptor; if (sourceDefinition instanceof PojoSourceDefinition && targetDefinition.getClassLoaderId().equals(sourceDefinition.getClassLoaderId())) {
public void attach(PhysicalWireSource source, JavaWireTarget target, Wire wire) { URI targetName = UriHelper.getDefragmentedName(target.getUri()); Component component = manager.getComponent(targetName); if (component == null) { throw new Fabric3Exception("Target not found: " + targetName); } JavaComponent javaComponent = (JavaComponent) component; Class<?> implementationClass = javaComponent.getImplementationClass(); ClassLoader loader = target.getClassLoader(); // attach the invoker interceptor to forward invocation chains for (InvocationChain chain : wire.getInvocationChains()) { PhysicalOperation operation = chain.getPhysicalOperation(); Method method = MethodUtils.findMethod(source, target, operation, implementationClass, loader); ServiceInvoker invoker = reflectionFactory.createServiceInvoker(method); InvokerInterceptor interceptor; if (source instanceof PojoWireSource && target.getClassLoader().equals(source.getClassLoader())) { // if the source is Java and target classloaders are equal, do not set the TCCL interceptor = new InvokerInterceptor(invoker, javaComponent); } else { // If the source and target classloaders are not equal, configure the interceptor to set the TCCL to the target classloader // when dispatching to a target instance. This guarantees when application code executes, it does so with the TCCL set to the // target component's classloader. interceptor = new InvokerInterceptor(invoker, javaComponent, loader); } chain.addInterceptor(interceptor); } }