You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2019/12/04 22:22:45 UTC

[aries-cdi] branch master updated: ARIES-1956 Add the concept of implicit extensions

This is an automated email from the ASF dual-hosted git repository.

rotty3000 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-cdi.git


The following commit(s) were added to refs/heads/master by this push:
     new 16db78d  ARIES-1956 Add the concept of implicit extensions
     new 6296af0  Merge pull request #19 from rotty3000/ARIES-1956
16db78d is described below

commit 16db78d9945d80d3b7484aef08c988b65beb9b0c
Author: Raymond Augé <ro...@apache.org>
AuthorDate: Wed Dec 4 16:44:21 2019 -0500

    ARIES-1956 Add the concept of implicit extensions
    
    Signed-off-by: Raymond Augé <ro...@apache.org>
---
 .../internal/container/ExtensionPhase.java         | 26 ++++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
index 401139b..bb96c21 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
@@ -14,7 +14,7 @@
 
 package org.apache.aries.cdi.container.internal.container;
 
-import static org.apache.aries.cdi.container.internal.util.Filters.*;
+import static org.apache.aries.cdi.container.internal.util.Filters.asFilter;
 
 import java.util.Iterator;
 import java.util.List;
@@ -33,6 +33,7 @@ import org.apache.aries.cdi.container.internal.util.SRs;
 import org.apache.aries.cdi.container.internal.util.Syncro;
 import org.apache.aries.cdi.container.internal.util.Throw;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
@@ -128,13 +129,13 @@ public class ExtensionPhase extends Phase {
 
 		StringBuilder sb = new StringBuilder("(&(objectClass=" + Extension.class.getName() + ")");
 
-		if (templates.size() > 1) sb.append("(|");
+		sb.append("(|");
 
 		for (ExtensionTemplateDTO tmpl : templates) {
 			sb.append(tmpl.serviceFilter);
 		}
 
-		if (templates.size() > 1) sb.append(")");
+		sb.append("(aries.cdi.extension.mode=implicit))");
 
 		sb.append(")");
 
@@ -156,6 +157,8 @@ public class ExtensionPhase extends Phase {
 		(e1, e2) -> e1.serviceReference.compareTo(e2.serviceReference)
 	);
 
+	private final Filter implicitFilter = asFilter("(aries.cdi.extension.mode=implicit)");
+
 	private class ExtensionPhaseCustomizer implements ServiceTrackerCustomizer<Extension, ExtendedExtensionDTO> {
 
 		@Override
@@ -168,7 +171,15 @@ public class ExtensionPhase extends Phase {
 				t -> (ExtendedExtensionTemplateDTO)t
 			).filter(
 				t -> t.filter.match(reference)
-			).findFirst().get();
+			).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
@@ -203,7 +214,7 @@ public class ExtensionPhase extends Phase {
 			next.ifPresent(
 				next -> submit(next.closeOp(), next::close).then(
 					s -> {
-						if (snapshots().size() == extensionTemplates().size()) {
+						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));
@@ -238,7 +249,8 @@ public class ExtensionPhase extends Phase {
 
 			containerState.bundleContext().ungetService(reference);
 
-			if (!snapshots().removeIf(snap -> ((ExtendedExtensionDTO)snap).serviceReference.equals(reference))) {
+			if (!snapshots().removeIf(snap ->
+					((ExtendedExtensionDTO)snap).serviceReference.equals(reference))) {
 				return;
 			}
 
@@ -258,7 +270,7 @@ public class ExtensionPhase extends Phase {
 				next -> {
 					Promise<Boolean> result = submit(next.closeOp(), next::close).then(
 						s -> {
-							if (snapshots().size() == extensionTemplates().size()) {
+							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 {} on {}", reference, bundle(), f));