// 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();
contextFactory.setEagerInit(eagerInit);
contextFactory.setInitInvoker(initInvoker);
} else if (element instanceof DestroyInvokerExtensibilityElement) {
DestroyInvokerExtensibilityElement invokerElement = (DestroyInvokerExtensibilityElement) element;
EventInvoker<Object> destroyInvoker = invokerElement.getEventInvoker();
contextFactory.setDestroyInvoker(destroyInvoker);
} else if (element instanceof ComponentNameExtensibilityElement) {
ComponentNameExtensibilityElement nameElement = (ComponentNameExtensibilityElement) element;
injectors.add(nameElement.getEventInvoker(name));
} else if (element instanceof ContextExtensibilityElement) {
ContextExtensibilityElement contextElement = (ContextExtensibilityElement) element;
injectors.add(contextElement.getInjector(contextFactory));
} else if (element instanceof InjectorExtensibilityElement) {
InjectorExtensibilityElement injectorElement = (InjectorExtensibilityElement) element;
injectors.add(injectorElement.getInjector(contextFactory));
} else if (element instanceof SystemInjectorExtensibilityElement) {
SystemInjectorExtensibilityElement injectorElement = (SystemInjectorExtensibilityElement) element;
injectors.add(injectorElement.getInjector(contextFactory));
} else if (element instanceof MonitorExtensibilityElement) {
MonitorExtensibilityElement monitorElement = (MonitorExtensibilityElement) element;
injectors.add(monitorElement.getInjector(monitorFactory));
}
}
contextFactory.setSetters(injectors);
// decorate the logical model
component.setContextFactory(contextFactory);
} catch (BuilderConfigException e) {
e.addContextName(component.getName());
throw e;
} catch (NoSuchMethodException e) {
BuilderConfigException ce = new BuilderConfigException("Class does not have a no-arg constructor", e);
ce.setIdentifier(implClass.getName());
throw ce;
} catch (FactoryInitException e) {
BuilderConfigException ce = new BuilderConfigException("Error building component", e);
ce.addContextName(component.getName());
throw ce;
}
}