public ExtendedExtensionDTO addingService()

in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java [163:236]


		public ExtendedExtensionDTO addingService(ServiceReference<Extension> reference) {
			if (!Perms.hasExtensionServicePermission(containerState.bundleContext())) {
				return null;
			}

			ExtendedExtensionTemplateDTO template = extensionTemplates().stream().map(
				t -> (ExtendedExtensionTemplateDTO)t
			).filter(
				t -> t.filter.match(reference)
			).findFirst().orElseGet(() -> {
				if (implicitFilter.match(reference)) {
					ExtendedExtensionTemplateDTO implicitTemplate = new ExtendedExtensionTemplateDTO();
					implicitTemplate.filter = asFilter("(&(aries.cdi.extension.mode=implicit)(service.id=%s))", reference.getProperty(Constants.SERVICE_ID));
					implicitTemplate.serviceFilter = implicitTemplate.filter.toString();
					return implicitTemplate;
				}
				return null;
			});

			ExtendedExtensionDTO snapshot = snapshots().stream().map(
				s -> (ExtendedExtensionDTO)s
			).filter(
				s -> s.template == template
			).findFirst().orElse(null);

			if (snapshot != null) {
				if (reference.compareTo(snapshot.serviceReference) <= 0) {
					return null;
				}

				if (snapshots().remove(snapshot)) {
					_references.add(snapshot);
					snapshot.extension = null;
					containerState.bundleContext().ungetService(snapshot.serviceReference);
				}
			}

			ExtendedExtensionDTO extensionDTO = new ExtendedExtensionDTO();

			BundleContext bc = containerState.bundleContext();

			extensionDTO.extension = bc.getServiceObjects(reference);
			extensionDTO.service = SRs.from(reference);
			extensionDTO.serviceReference = reference;
			extensionDTO.template = template;

			snapshots().add(extensionDTO);
			containerState.incrementChangeCount();

			next.ifPresent(
				next -> submit(next.closeOp(), next::close).then(
					s -> {
						if (extensionTemplates().stream().allMatch(tmpl -> snapshots().stream().anyMatch(ext -> ext.template == tmpl))) {
							return submit(next.openOp(), next::open).onFailure(
								f -> {
									_log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f));

									error(f);
								}
							);
						}

						return s;
					},
					f -> {
						_log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));

						error(f.getFailure());
					}
				)
			);

			return extensionDTO;
		}