this.parm = null;
}
@SuppressWarnings({"unchecked"})
public boolean doTask(InjectionContext ctx) {
IOCProcessingContext processingContext = ctx.getProcessingContext();
InjectableInstance injectableInstance = getInjectableInstance(ctx);
QualifyingMetadata qualifyingMetadata = processingContext.getQualifyingMetadataFactory()
.createFrom(injectableInstance.getQualifiers());
Statement val;
ctx.allowProxyCapture();
switch (taskType) {
case Type:
ctx.getQualifiedInjector(type, qualifyingMetadata);
break;
case PrivateField: {
try {
val = InjectUtil.getInjectorOrProxy(ctx, getInjectableInstance(ctx), field.getType(), qualifyingMetadata);
}
catch (InjectionFailure e) {
throw UnsatisfiedDependenciesException.createWithSingleFieldFailure(field, field.getDeclaringClass(),
field.getType(), e.getMessage());
}
catch (UnproxyableClassException e) {
String err = "your object graph may have cyclical dependencies and the cycle could not be proxied. use of the @Dependent scope and @New qualifier may not " +
"produce properly initalized objects for: " + getInjector().getInjectedType().getFullyQualifiedName() + "\n" +
"\t Offending node: " + toString() + "\n" +
"\t Note : this issue can be resolved by making "
+ e.getUnproxyableClass().getFullyQualifiedName() + " proxyable. Introduce a default no-arg constructor and make sure the class is non-final.";
throw UnsatisfiedDependenciesException.createWithSingleFieldFailure(field, field.getDeclaringClass(),
field.getType(), err);
}
final Statement fieldAccessStmt;
if (field.isStatic()) {
throw new InjectionFailure("attempt to inject bean into a static field: "
+ field.getDeclaringClass().getFullyQualifiedName() + "." + field.getName());
}
else {
fieldAccessStmt = Stmt.invokeStatic(processingContext.getBootstrapClass(),
getPrivateFieldInjectorName(field), Refs.get(injector.getVarName()), val);
}
processingContext.append(fieldAccessStmt);
ctx.addExposedField(field, PrivateAccessType.Write);
break;
}
case Field:
try {
val = InjectUtil.getInjectorOrProxy(ctx, getInjectableInstance(ctx), field.getType(), qualifyingMetadata);
}
catch (UnproxyableClassException e) {
return false;
}
processingContext.append(
Stmt.loadVariable(injector.getVarName()).loadField(field.getName()).assignValue(val)
);
break;
case PrivateMethod: {
for (MetaParameter parm : method.getParameters()) {
ctx.getProcessingContext().handleDiscoveryOfType(
new InjectableInstance(null, TaskType.Parameter, null, method, null, parm.getType(), parm, injector, ctx));
}
Statement[] stmts = InjectUtil.resolveInjectionDependencies(method.getParameters(), ctx, method);
Statement[] parms;
parms = new Statement[stmts.length + 1];
parms[0] = Refs.get(injector.getVarName());
System.arraycopy(stmts, 0, parms, 1, stmts.length);
injectableInstance.getInjectionContext().addExposedMethod(method);
processingContext.append(
Stmt.invokeStatic(processingContext.getBootstrapClass(), getPrivateMethodName(method),
parms)
);
break;
}
case Method:
for (MetaParameter parm : method.getParameters()) {
ctx.getProcessingContext().handleDiscoveryOfType(
new InjectableInstance(null, TaskType.Parameter, null, method, null, parm.getType(), parm, injector, ctx));
}
processingContext.append(
Stmt.loadVariable(injector.getVarName()).invoke(method,
InjectUtil.resolveInjectionDependencies(method.getParameters(), ctx, method))
);
break;