in modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java [148:279]
void start() {
if (!instanceFactoryProvider.getImplementation().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 : instanceFactoryProvider.getImplementation()
.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()) {
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)) {
if(element.getElementType() == ElementType.FIELD) {
Field field = (Field)element.getAnchor();
if(Modifier.isPublic(field.getModifiers())) {
instanceFactoryProvider.getInjectionSites().add(element);
} else if(field.getAnnotation(org.osoa.sca.annotations.Reference.class) != null) {
instanceFactoryProvider.getInjectionSites().add(element);
}
} else {
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);
}
}
}
}
}
}
// We need to set the PropertyValueFactory on the ComponentContextImpl
// so the ComponentContext can "de-marshal" the property type to a value
// when the getProperty() method is called
ComponentContextImpl ccImpl = (ComponentContextImpl)component.getComponentContext();
ccImpl.setPropertyValueFactory(propertyValueFactory);
//setUpPolicyHandlers();
this.instanceFactory = instanceFactoryProvider.createFactory();
}