List<ComponentProperty> componentProperties = component.getProperties();
Map<String, JavaElementImpl> propertyMembers = javaImpl.getPropertyMembers();
for (ComponentProperty prop : componentProperties) {
JavaElementImpl element = propertyMembers.get(prop.getName());
if (element != null && !(element.getAnchor() instanceof Constructor) && prop.getValue() != null) {
Class propertyJavaType = JavaIntrospectionHelper.getBaseType(element.getType(), element.getGenericType());
ObjectFactory objFactory = propertyValueFactory.createValueFactory(prop, prop.getValue(), propertyJavaType);
factories.put(element, objFactory);
injectionSites.add(element);
}
}
for (Member member : javaImpl.getConversationIDMembers()) {
ObjectFactory<String> factory = new ConversationIDObjectFactory();
if (member instanceof Field) {
JavaElementImpl element = new JavaElementImpl((Field) member);
element.setClassifer(ConversationID.class);
injectionSites.add(element);
factories.put(element, factory);
} else if (member instanceof Method) {
JavaElementImpl element = new JavaElementImpl((Method) member, 0);
element.setName(JavaIntrospectionHelper.toPropertyName(member.getName()));
element.setClassifer(ConversationID.class);
injectionSites.add(element);
factories.put(element, factory);
} else {
throw new InvalidAccessorException(
"Member must be a field or method: " + member.getName());
}
}
if (!javaImpl.getCallbackMembers().isEmpty()) {
Map<String, List<RuntimeWire>> callbackWires = new HashMap<String, List<RuntimeWire>>();
for (ComponentService service : component.getServices()) {
RuntimeComponentReference callbackReference = (RuntimeComponentReference)service.getCallbackReference();
if (callbackReference != null) {
List<RuntimeWire> wires = callbackReference.getRuntimeWires();
if (!wires.isEmpty()) {
callbackWires.put(wires.get(0).getSource().getInterfaceContract().getInterface().toString(), wires);
}
}
}
for (Map.Entry<String, Collection<JavaElementImpl>> entry : javaImpl.getCallbackMembers()
.entrySet()) {
List<RuntimeWire> wires = callbackWires.get(entry.getKey());
if (wires == null) {
// this can happen when there are no client wires to a
// component that has a callback
continue;
}
for(JavaElementImpl element : entry.getValue()) {
ObjectFactory<?> factory = new CallbackWireObjectFactory(element.getType(), proxyFactory, wires);
if (!(element.getAnchor() instanceof Constructor)) {
injectionSites.add(element);
}
factories.put(element, factory);
}
}