You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/03/01 15:05:00 UTC

[isis] branch master updated: ISIS-1841 allow eventbus plugins to be automatically installed

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 30cfa00  ISIS-1841 allow eventbus plugins to be automatically installed
30cfa00 is described below

commit 30cfa0020f5e109621bb3521a3297892a8056082
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 1 16:04:57 2018 +0100

    ISIS-1841 allow eventbus plugins to be automatically installed
    
    by setting
    org.apache.isis.applib.services.eventbus.EventBusImplementation
    to 'auto' or 'plugin', while retaining previous behavior
---
 .../isis/applib/internal/context/_Plugin.java      | 19 +++++++++++++++++-
 .../isis/applib/internal/discover/_Discover.java   | 23 +++++++++++-----------
 .../swagger/internal/ValuePropertyFactory.java     |  2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |  2 +-
 ...applib.services.eventbus.EventBusImplementation |  1 +
 ...applib.services.eventbus.EventBusImplementation |  1 +
 .../services/eventbus/EventBusServiceDefault.java  | 22 +++++++++++++++++----
 7 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
index 5f9a043..a18c5f7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
@@ -22,6 +22,8 @@ package org.apache.isis.applib.internal.context;
 import java.util.Objects;
 import java.util.ServiceLoader;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 import org.apache.isis.applib.internal.collections._Sets;
 
@@ -56,7 +58,7 @@ public final class _Plugin {
 	 * @param service
 	 * @return non null
 	 */
-	public static <S> Set<S> load(Class<S> service){
+	public static <S> Set<S> loadAll(Class<S> service){
 		Objects.requireNonNull(service);
 
 		ServiceLoader<S> loader = ServiceLoader.load(service, _Context.getDefaultClassLoader());
@@ -64,4 +66,19 @@ public final class _Plugin {
 		return _Sets.unmodifiable(loader);   
 	}
 	
+	public static <S> S getOrElse(Class<S> service, Function<Set<S>, S> onAmbiguity, Supplier<S> onNotFound){
+	
+		final Set<S> plugins = loadAll(service);
+		
+		if(plugins.isEmpty()) {
+			return onNotFound.get();
+		}
+		
+		if(plugins.size()>1) {
+			return onAmbiguity.apply(plugins);
+		}
+		
+		return plugins.iterator().next();
+	}
+	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
index 19730b0..c602c1c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
@@ -20,7 +20,6 @@
 package org.apache.isis.applib.internal.discover;
 
 import java.util.List;
-import java.util.Set;
 
 import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.applib.internal.context._Plugin;
@@ -68,18 +67,18 @@ public final class _Discover {
 	}
 
 	private static ClassDiscoveryPlugin loadPluginsPickAny() {
-		final Set<ClassDiscoveryPlugin> plugins = _Plugin.load(ClassDiscoveryPlugin.class);
 		
-		if(plugins.isEmpty()) {
-			return ClassDiscoveryPlugin.nop();
-		}
-		
-		if(plugins.size()>1) {
-			final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
-			LOG.warn("you have more than one ClassDiscoveryPlugin on your class path, just picking one");
-		}
-		
-		return plugins.iterator().next();
+		return _Plugin.getOrElse(ClassDiscoveryPlugin.class, 
+				ambiguosPlugins->{
+					final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
+					LOG.warn("You have more than one ClassDiscoveryPlugin on your class path, just picking one!");
+					return ambiguosPlugins.iterator().next();
+				}, 
+				()->{
+					final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
+					LOG.error("You have no ClassDiscoveryPlugin on your class path!");
+					return ClassDiscoveryPlugin.nop();
+				});
 	}
 	
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
index e76fd93..f260eed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
@@ -137,7 +137,7 @@ public class ValuePropertyFactory {
     // -- HELPER
     
     private static ValuePropertyCollector discoverValueProperties() {
-	    final Set<ValuePropertyPlugin> plugins = _Plugin.load(ValuePropertyPlugin.class);
+	    final Set<ValuePropertyPlugin> plugins = _Plugin.loadAll(ValuePropertyPlugin.class);
 	    final ValuePropertyCollector collector = ValuePropertyPlugin.collector();
 	    plugins.forEach(plugin->{
 	    	plugin.plugin(collector);
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 57f3760..88ae176 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -437,7 +437,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
     // -- HELPER
     
     private static FactoryCollector discoverFactories() {
-	    final Set<ProgrammingModelPlugin> plugins = _Plugin.load(ProgrammingModelPlugin.class);
+	    final Set<ProgrammingModelPlugin> plugins = _Plugin.loadAll(ProgrammingModelPlugin.class);
 	    final FactoryCollector collector = ProgrammingModelPlugin.collector();
 	    plugins.forEach(plugin->{
 	    	plugin.plugin(collector);
diff --git a/core/plugins/eventbus-axon/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation b/core/plugins/eventbus-axon/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation
new file mode 100644
index 0000000..4a07d72
--- /dev/null
+++ b/core/plugins/eventbus-axon/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation
@@ -0,0 +1 @@
+org.apache.isis.core.runtime.services.eventbus.adapter.EventBusImplementationForAxonSimple
\ No newline at end of file
diff --git a/core/plugins/eventbus-guava/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation b/core/plugins/eventbus-guava/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation
new file mode 100644
index 0000000..1aaefda
--- /dev/null
+++ b/core/plugins/eventbus-guava/src/main/resources/META-INF/services/org.apache.isis.applib.services.eventbus.EventBusImplementation
@@ -0,0 +1 @@
+org.apache.isis.core.runtime.services.eventbus.adapter.EventBusImplementationForGuava
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
index a7e662a..848e964 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
@@ -23,6 +23,7 @@ import javax.enterprise.context.RequestScoped;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.internal.context._Plugin;
 import org.apache.isis.applib.services.eventbus.EventBusImplementation;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -124,13 +125,26 @@ public abstract class EventBusServiceDefault extends EventBusService {
     }
 
     private EventBusImplementation instantiateEventBus() {
+    	
     	String fqImplementationName = implementation;
-        if("guava".equals(implementation)) {
+    	
+    	if( "plugin".equalsIgnoreCase(implementation) || "auto".equalsIgnoreCase(implementation) ) {
+    		
+    		return _Plugin.getOrElse(EventBusImplementation.class, 
+        			ambiguousPlugins->{
+        				throw new NonRecoverableException(
+        		                "Ambiguity: Could not instantiate event bus implementation '" + implementation + "'");
+        			}, ()->{
+        				throw new NonRecoverableException(
+        		                "Missing Plugin: Could not instantiate event bus implementation '" + implementation + "'");
+        			});
+    		
+    	} else if("guava".equalsIgnoreCase(implementation)) {
             // legacy of return new EventBusImplementationForGuava();
-        	fqImplementationName = "org.apache.isis.core.runtime.services.eventbus.EventBusImplementationForGuava";
-        } else if("axon".equals(implementation)) {
+        	fqImplementationName = "org.apache.isis.core.runtime.services.eventbus.adapter.EventBusImplementationForGuava";
+        } else if("axon".equalsIgnoreCase(implementation)) {
         	// legacy of return new EventBusImplementationForAxonSimple();
-        	fqImplementationName = "org.apache.isis.core.runtime.services.eventbus.EventBusImplementationForAxonSimple";
+        	fqImplementationName = "org.apache.isis.core.runtime.services.eventbus.adapter.EventBusImplementationForAxonSimple";
         }
 
         final Class<?> aClass = ClassUtil.forName(fqImplementationName);

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.