Component component = (Component) modelObject;
Class implClass;
Scope scope;
// Get the component implementation
Implementation componentImplementation = component.getImplementation();
if (componentImplementation instanceof SystemImplementation
&& component.getContextFactory() == null) {
// The component is a system component, implemented by a Java class
SystemImplementation implementation = (SystemImplementation) componentImplementation;
if (componentImplementation.getComponentType().getServices() == null
|| componentImplementation.getComponentType().getServices().size() < 1) {
BuilderConfigException e = new BuilderConfigException("No service configured on component type");
e.setIdentifier(component.getName());
throw e;
}
implClass = implementation.getImplementationClass();
Scope previous = null;
scope = Scope.MODULE;
List<Service> services = component.getImplementation().getComponentType().getServices();
for (Service service : services) {
// calculate and validate the scope of the component; ensure that all service scopes are the same unless
// a scope is stateless
Scope current = service.getServiceContract().getScope();
if (previous != null && current != null && current != previous
&& (current != Scope.INSTANCE && previous != Scope.INSTANCE)) {
BuilderException e = new BuilderConfigException("Incompatible scopes specified for services on component");
e.setIdentifier(component.getName());
throw e;
}
if (current != null && current != Scope.MODULE) {
scope = current;
}
}
} else if (componentImplementation instanceof Composite) {
implClass = ((Composite) componentImplementation).getImplementationClass();
if (implClass == null) {
// FIXME this is a hack
if (((Module) componentImplementation).getName().startsWith("org.apache.tuscany.core.system"))
{
// The component is a system module component, fix the implementation class to our implementation
// of system module component context
implClass = SystemCompositeContextImpl.class;
} else if (componentImplementation instanceof SystemModule) {
implClass = SystemCompositeContextImpl.class;
} else {
// The component is an app module component, fix the implementation class to our implementation
// of app module component context
//FIXME this should be extensible, i.e. the model should specify the impl class of the module
implClass = CompositeContextImpl.class;
}
//END hack
}
scope = Scope.AGGREGATE;
} else {
return;
}
Set<Field> fields;
Set<Method> methods;
SystemContextFactory contextFactory;
try {
fields = JavaIntrospectionHelper.getAllFields(implClass);
methods = JavaIntrospectionHelper.getAllUniqueMethods(implClass);
String name = component.getName();
if (componentImplementation instanceof Module) {
Module module = (Module) componentImplementation;
contextFactory = new SystemContextFactory(name, module, JavaIntrospectionHelper.getDefaultConstructor(implClass), scope);
} else {
contextFactory = new SystemContextFactory(name, JavaIntrospectionHelper.getDefaultConstructor(implClass), scope);
}
//ContextObjectFactory contextObjectFactory = new ContextObjectFactory(contextFactory);
List<Injector> injectors = new ArrayList<Injector>();
// handle properties
List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties();
if (configuredProperties != null) {
for (ConfiguredProperty property : configuredProperties) {
Injector injector = createPropertyInjector(property, fields, methods);
injectors.add(injector);
}
}
// FIXME do not inject references on an application module yet
if (implClass != CompositeContextImpl.class) {
// handle references
List<ConfiguredReference> configuredReferences = component.getConfiguredReferences();
if (configuredReferences != null) {
for (ConfiguredReference reference : configuredReferences) {
Injector injector = createReferenceInjector(reference, fields, methods, contextFactory);
injectors.add(injector);
}
}
}
List<Object> elements = componentImplementation.getComponentType().getExtensibilityElements();
for (Object element : elements) {
if (element instanceof InitInvokerExtensibilityElement) {
InitInvokerExtensibilityElement invokerElement = (InitInvokerExtensibilityElement) element;
EventInvoker<Object> initInvoker = invokerElement.getEventInvoker();
boolean eagerInit = invokerElement.isEager();