}
}
@Override
public void renderProvider(final InjectableInstance injectableInstance) {
final InjectionContext injectionContext = injectableInstance.getInjectionContext();
if (!injectionContext.isTypeInjectable(producerMember.getDeclaringClass())) {
injectionContext.getInjector(producerMember.getDeclaringClass()).addRenderingHook(
new RenderingHook() {
@Override
public void onRender(final InjectableInstance instance) {
renderProvider(injectableInstance);
}
}
);
return;
}
if (creationalCallbackRendered) {
return;
}
creationalCallbackRendered = true;
final MetaClass beanProviderMC = parameterizedAs(AsyncBeanProvider.class,
typeParametersOf(injectedType));
final MetaClass creationCallbackMC = parameterizedAs(CreationalCallback.class,
typeParametersOf(injectedType));
final BlockBuilder<AnonymousClassStructureBuilder> statements = ObjectBuilder.newInstanceOf(beanProviderMC)
.extend()
.publicOverridesMethod("getInstance",
Parameter.finalOf(creationCallbackMC, "callback"),
Parameter.finalOf(AsyncCreationalContext.class, "pContext")
);
injectionContext.getProcessingContext().pushBlockBuilder(statements);
statements
._(Stmt.declareFinalVariable("async", AsyncBeanContext.class, Stmt.newObject(AsyncBeanContext.class)));
if (producerMember instanceof MetaMethod) {
final MetaMethod producerMethod = (MetaMethod) producerMember;
for (final MetaParameter metaParameter : producerMethod.getParameters()) {
final Injector inj = injectionContext.getQualifiedInjector(metaParameter.getType(), metaParameter.getAnnotations());
final MetaClass concreteInjectedType = inj.getConcreteInjectedType();
final String varName = InjectUtil.getVarNameFromType(concreteInjectedType, metaParameter);
final MetaClass depCreationCallbackMC = parameterizedAs(CreationalCallback.class,
typeParametersOf(concreteInjectedType));
final ObjectBuilder callback = Stmt.newObject(depCreationCallbackMC)
.extend().publicOverridesMethod("callback", Parameter.finalOf(concreteInjectedType, "beanValue"))
.append(Stmt.loadVariable("async").invoke("finish", Refs.get("this"), Refs.get("beanValue")))
.finish().finish();
statements.append(Stmt.declareFinalVariable(varName, depCreationCallbackMC, callback));
statements.append(Stmt.loadVariable("async").invoke("wait", Refs.get(varName)));
}
}
final String producerBeanCBVar = InjectUtil.getVarNameFromType(producerMember.getDeclaringClass(), injectableInstance);
final MetaClass callbackMC = parameterizedAs(CreationalCallback.class, typeParametersOf(producerMember.getDeclaringClass()));
final BlockBuilder<AnonymousClassStructureBuilder> blockBuilder = Stmt.create().newObject(callbackMC)
.extend()
.publicOverridesMethod("callback", Parameter.finalOf(producerMember.getDeclaringClass(), "bean"));
doBindings(blockBuilder, injectionContext, Refs.get("bean"));
final Statement producerCreationalCallback = blockBuilder.finish().finish();
statements.append(Stmt.loadVariable("async").invoke("runOnFinish", Stmt.newObject(Runnable.class)
.extend().publicOverridesMethod("run")
.append(Stmt.declareFinalVariable(producerBeanCBVar, callbackMC, producerCreationalCallback))
.append(AsyncInjectUtil.getInjectorOrProxy(injectionContext, injectableInstance,
producerMember.getDeclaringClass(), producerInjectableInstance.getQualifyingMetadata())
).finish().finish()
));
statements.append(Stmt.loadVariable("async").invoke("finish"));
final Statement producerBeanProvider = statements.finish().finish();
injectionContext.getProcessingContext().getBootstrapBuilder()
.privateField(creationalCallbackVarName, beanProviderMC).modifiers(Modifier.Final)
.initializesWith(producerBeanProvider).finish();
registerWithBeanManager(injectionContext, null);
injectionContext.getProcessingContext().popBlockBuilder();
}