if (wires == null) {
// this can happen when there are no client wires to a
// component that has a callback
continue;
}
JavaElementImpl element = entry.getValue();
Class<?> businessInterface = element.getType();
ObjectFactory<?> factory = null;
if (CallableReference.class.isAssignableFrom(element.getType())) {
businessInterface =
JavaIntrospectionHelper.getBusinessInterface(element.getType(), element.getGenericType());
factory =
new CallbackReferenceObjectFactory(businessInterface, proxyFactory, wires);
} else {
factory = new CallbackWireObjectFactory(businessInterface, proxyFactory, wires);
}
if (!(element.getAnchor() instanceof Constructor)) {
instanceFactoryProvider.getInjectionSites().add(element);
}
instanceFactoryProvider.setObjectFactory(element, factory);
}
}
for (Reference ref : instanceFactoryProvider.getImplementation().getReferences()) {
JavaElementImpl element =
instanceFactoryProvider.getImplementation().getReferenceMembers().get(ref.getName());
if (element != null) {
if (!(element.getAnchor() instanceof Constructor)) {
instanceFactoryProvider.getInjectionSites().add(element);
}
ComponentReference componentReference = null;
List<RuntimeWire> wireList = null;
for (ComponentReference reference : component.getReferences()) {
if (reference.getName().equals(ref.getName())) {
wireList = ((RuntimeComponentReference)reference).getRuntimeWires();
componentReference = reference;
break;
}
}
if (ref.getMultiplicity() == Multiplicity.ONE_N || ref.getMultiplicity() == Multiplicity.ZERO_N) {
List<ObjectFactory<?>> factories = new ArrayList<ObjectFactory<?>>();
Class<?> baseType =
JavaIntrospectionHelper.getBaseType(element.getType(), element.getGenericType());
for (int i = 0; i < wireList.size(); i++) {
ObjectFactory<?> factory = null;
if (CallableReference.class.isAssignableFrom(baseType)) {
Type callableRefType = JavaIntrospectionHelper.getParameterType(element.getGenericType());
// Type businessType = JavaIntrospectionHelper.getParameterType(callableRefType);
Class<?> businessInterface =
JavaIntrospectionHelper.getBusinessInterface(baseType, callableRefType);
factory =
new CallableReferenceObjectFactory(businessInterface, component,
(RuntimeComponentReference)wireList.get(i)
.getSource().getContract(), wireList.get(i)
.getSource().getBinding());
} else {
factory = createObjectFactory(baseType, wireList.get(i));
}
factories.add(factory);
}
instanceFactoryProvider.setObjectFactories(element, factories);
JavaConstructorImpl constructor = instanceFactoryProvider.getImplementation().getConstructor();
for(JavaElementImpl p: constructor.getParameters()){
if(element.getName().equals(p.getName())) {
instanceFactoryProvider.setObjectFactories(p, factories);
}
}
} else {
if (wireList == null && ref.getMultiplicity() == Multiplicity.ONE_ONE) {
throw new IllegalStateException("Required reference is missing: " + ref.getName());
}
if (wireList != null && !wireList.isEmpty()) {
ObjectFactory<?> factory = null;
if (CallableReference.class.isAssignableFrom(element.getType())) {
Class<?> businessInterface =
JavaIntrospectionHelper.getBusinessInterface(element.getType(), element
.getGenericType());
factory =
new CallableReferenceObjectFactory(businessInterface, component,
(RuntimeComponentReference)componentReference, null);
} else {
factory = createObjectFactory(element.getType(), wireList.get(0));
}
instanceFactoryProvider.setObjectFactory(element, factory);
JavaConstructorImpl constructor = instanceFactoryProvider.getImplementation().getConstructor();
for(JavaElementImpl p: constructor.getParameters()){
if(element.getName().equals(p.getName())) {
instanceFactoryProvider.setObjectFactory(p, factory);
}
}
}
}