@Override protected List<Statement> generateDestroyInstanceStatements(final ClassStructureBuilder<?> bodyBlockBuilder, final Injectable injectable, final DependencyGraph graph, final InjectionContext injectionContext) { final List<Statement> destroyInstanceStmts = new ArrayList<>(); final Multimap<DependencyType, Dependency> depsByType = separateByType(injectable.getDependencies()); final Collection<Dependency> producerMemberDeps = depsByType.get(DependencyType.ProducerMember); if (producerMemberDeps.size() != 1) { throw new RuntimeException("A produced type must have exactly 1 producing instance but " + producerMemberDeps.size() + " were found."); } final Collection<Dependency> disposerMethodDeps = depsByType.get(DependencyType.DisposerMethod); if (disposerMethodDeps.size() > 1) { // TODO error message with matching disposer names. throw new RuntimeException(); } else if (disposerMethodDeps.size() == 1) { final DisposerMethodDependency disposerDep = (DisposerMethodDependency) disposerMethodDeps.iterator().next(); final MetaMethod disposer = disposerDep.getDisposerMethod(); controller.ensureMemberExposed(disposer); final Statement invocation = controller.exposedMethodStmt( controller.getReferenceStmt(PRODUCER_INSTANCE, disposer.getDeclaringClass()), disposer, getDisposerParams(disposer, depsByType.get(DependencyType.DisposerParameter), bodyBlockBuilder.getClassDefinition())); destroyInstanceStmts.add(invocation); } return destroyInstanceStmts; }
@Override protected List<Statement> generateInvokePostConstructsStatements(final ClassStructureBuilder<?> bodyBlockBuilder, final Injectable injectable, final DependencyGraph graph, final InjectionContext injectionContext) { final List<Statement> stmts = new ArrayList<>(); final Queue<MetaMethod> postConstructMethods = gatherPostConstructs(injectable); for (final MetaMethod postConstruct : postConstructMethods) { if (postConstruct.isPublic()) { stmts.add(loadVariable("instance").invoke(postConstruct)); } else { controller.ensureMemberExposed(postConstruct); final String accessorName = getPrivateMethodName(postConstruct); stmts.add(invokePrivateAccessorWithNoParams(accessorName)); } } return stmts; }
private void maybeInvokePreDestroys(final Injectable injectable, final List<Statement> destructionStmts, final ClassStructureBuilder<?> bodyBlockBuilder) { final Queue<MetaMethod> preDestroyMethods = gatherPreDestroys(injectable); for (final MetaMethod preDestroy : preDestroyMethods) { if (preDestroy.isPublic()) { destructionStmts.add(loadVariable("instance").invoke(preDestroy)); } else { controller.ensureMemberExposed(preDestroy); final String accessorName = getPrivateMethodName(preDestroy); destructionStmts.add(invokePrivateAccessorWithNoParams(accessorName)); } } }
private List<Statement> methodCreateInstanceStatements(final MetaMethod producingMember, final Injectable producerInjectable, final Injectable producedInjectable, final Collection<Dependency> paramDeps, final ClassStructureBuilder<?> bodyBlockBuilder) { final List<Statement> stmts = new ArrayList<>(); controller.ensureMemberExposed(producingMember); if (!producingMember.isStatic()) { final Statement producerInstanceValue = loadVariable("contextManager").invoke("getInstance", producerInjectable.getFactoryName()); stmts.add(declareVariable(PRODUCER_INSTANCE, producerInjectable.getInjectedType(), producerInstanceValue)); stmts.add(loadVariable(PRODUCER_INSTANCE).assignValue(castTo(producerInjectable.getInjectedType(), invokeStatic(Factory.class, "maybeUnwrapProxy", loadVariable(PRODUCER_INSTANCE))))); } final List<Statement> depScopeRegistrationStmts = new ArrayList<>(); final Statement[] producerParams = generateProducerParams(producingMember, paramDeps, stmts, depScopeRegistrationStmts); final Statement invocation = controller.exposedMethodStmt(loadVariable(PRODUCER_INSTANCE), producingMember, producerParams); stmts.add(declareFinalVariable("instance", producedInjectable.getInjectedType(), invocation)); if (!producingMember.isStatic()) { stmts.add(setProducerInstanceReference()); if (producerInjectable.getWiringElementTypes().contains(WiringElementType.DependentBean)) { stmts.add(loadVariable("this").invoke("registerDependentScopedReference", loadVariable("instance"), loadVariable(PRODUCER_INSTANCE))); } } stmts.addAll(depScopeRegistrationStmts); stmts.add(loadVariable("instance").returnValue()); return stmts; }
private List<Statement> fieldCreateInstanceStatements(final MetaField producingMember, final Injectable producerInjectable, final Injectable producedInjectable, final ClassStructureBuilder<?> bodyBlockBuilder) { final List<Statement> stmts = new ArrayList<>(); controller.ensureMemberExposed(producingMember); if (!producingMember.isStatic()) { final Statement producerInstanceValue = loadVariable("contextManager").invoke("getInstance", producerInjectable.getFactoryName()); stmts.add(declareVariable(PRODUCER_INSTANCE, producerInjectable.getInjectedType(), producerInstanceValue)); stmts.add(loadVariable(PRODUCER_INSTANCE).assignValue(Stmt.castTo(producerInjectable.getInjectedType(), invokeStatic(Factory.class, "maybeUnwrapProxy", loadVariable(PRODUCER_INSTANCE))))); } final Statement invocation = controller.exposedFieldStmt(loadVariable(PRODUCER_INSTANCE), producingMember); stmts.add(declareFinalVariable("instance", producedInjectable.getInjectedType(), invocation)); if (!producingMember.isStatic()) { stmts.add(setProducerInstanceReference()); if (producerInjectable.getWiringElementTypes().contains(WiringElementType.DependentBean)) { stmts.add(loadVariable("this").invoke("registerDependentScopedReference", loadVariable("instance"), loadVariable(PRODUCER_INSTANCE))); } } stmts.add(loadVariable("instance").returnValue()); return stmts; }
final MetaMethod method = (MetaMethod) parm.getDeclaringMember(); controller.ensureMemberExposed(parm);
controller.ensureMemberExposed(decorable.get());
controller.ensureMemberExposed(decorable.get());
@Override public void generateDecorator(final Decorable decorable, final FactoryController controller) { controller.ensureMemberExposed(decorable.get()); Statement instance = decorable.getAccessStatement(); final String name = getTemplateDataFieldName((DataField) decorable.getAnnotation(), decorable.getName());
@Override public void generateDecorator(final Decorable decorable, final FactoryController controller) { controller.ensureMemberExposed(decorable.get()); Statement instance = decorable.getAccessStatement(); final String name = getTemplateDataFieldName((DataField) decorable.getAnnotation(), decorable.getName());