in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java [486:562]
private void registerService(
ExtendedComponentInstanceDTO componentInstance,
ExtendedActivationTemplateDTO activationTemplate,
BeanManager bm) {
ServiceScope scope = activationTemplate.scope;
if (activationTemplate.cdiScope == ApplicationScoped.class) {
scope = ServiceScope.SINGLETON;
}
final Context context = bm.getContext(activationTemplate.cdiScope);
final Bean<Object> bean = (Bean<Object>)bm.resolve(
bm.getBeans(activationTemplate.declaringClass, Any.Literal.INSTANCE));
final Producer producer = createProducer(activationTemplate.producer, bean, bm);
Object serviceObject;
if (scope == ServiceScope.PROTOTYPE) {
serviceObject = new PrototypeServiceFactory<Object>() {
@Override
public Object getService(Bundle bundle, ServiceRegistration<Object> registration) {
CreationalContext<Object> cc = bm.createCreationalContext(bean);
if (producer != null) {
return producer.produce(cc);
}
return context.get(bean, cc);
}
@Override
public void ungetService(Bundle bundle, ServiceRegistration<Object> registration, Object service) {
}
};
}
else if (scope == ServiceScope.BUNDLE) {
serviceObject = new ServiceFactory<Object>() {
@Override
public Object getService(Bundle bundle, ServiceRegistration<Object> registration) {
CreationalContext<Object> cc = bm.createCreationalContext(bean);
if (producer != null) {
return producer.produce(cc);
}
return context.get(bean, cc);
}
@Override
public void ungetService(Bundle bundle, ServiceRegistration<Object> registration, Object service) {
}
};
}
else {
CreationalContext<Object> cc = bm.createCreationalContext(bean);
if (producer != null) {
serviceObject = producer.produce(cc);
}
else {
serviceObject = context.get(bean, cc);
}
}
Objects.requireNonNull(serviceObject, "The service object is somehow null on " + this);
Dictionary<String, Object> properties = new Hashtable<>(
componentInstance.componentProperties(activationTemplate.properties));
ServiceRegistration<?> serviceRegistration = registerService(
activationTemplate.serviceClasses,
serviceObject, properties);
if (serviceRegistration != null) {
ExtendedActivationDTO activationDTO = new ExtendedActivationDTO();
activationDTO.errors = new CopyOnWriteArrayList<>();
activationDTO.service = SRs.from(serviceRegistration.getReference());
activationDTO.template = activationTemplate;
componentInstance.activations.add(activationDTO);
}
}