private void registerService()

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);
		}
	}