You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/05/22 08:22:16 UTC

[3/4] brooklyn-server git commit: BROOKLYN-449: Effector method invoke don’t use Groovy

BROOKLYN-449: Effector method invoke don’t use Groovy


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/896a1739
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/896a1739
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/896a1739

Branch: refs/heads/master
Commit: 896a1739b833b6a57c30446ed79ba9eac046773f
Parents: 3984417
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 17 18:34:06 2017 +0200
Committer: Aled Sage <al...@gmail.com>
Committed: Fri May 19 15:01:48 2017 +0100

----------------------------------------------------------------------
 .../internal/AbstractManagementContext.java     | 24 ++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/896a1739/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
index c009437..d43e192 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
@@ -21,8 +21,10 @@ package org.apache.brooklyn.core.mgmt.internal;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.brooklyn.core.catalog.internal.CatalogUtils.newClassLoadingContextForCatalogItems;
 
+import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -75,8 +77,9 @@ import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.task.BasicExecutionContext;
 import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.groovy.GroovyJavaMethods;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
+import org.apache.brooklyn.util.javalang.Reflections;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -276,11 +279,28 @@ public abstract class AbstractManagementContext implements ManagementContextInte
         return runAtEntity(entity, eff, parameters);
     }
     
+    @SuppressWarnings("unchecked")
     protected <T> T invokeEffectorMethodLocal(Entity entity, Effector<T> eff, Map<String, ?> args) {
         assert isManagedLocally(entity) : "cannot invoke effector method at "+this+" because it is not managed here";
         totalEffectorInvocationCount.incrementAndGet();
         Object[] transformedArgs = EffectorUtils.prepareArgsForEffector(eff, args);
-        return GroovyJavaMethods.invokeMethodOnMetaClass(entity, eff.getName(), transformedArgs);
+        
+        try {
+            Maybe<Object> result = Reflections.invokeMethodFromArgs(entity, eff.getName(), Arrays.asList(transformedArgs));
+            if (result.isPresent()) {
+                return (T) result.get();
+            } else {
+                throw new IllegalStateException("Unable to invoke entity effector method "+eff.getName()+" on "+entity+" - not found matching args");
+            }
+            
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            // Note that if we do any "nicer" error, such as:
+            //     throw Exceptions.propagate("Unable to invoke entity effector method "+eff.getName()+" on "+entity, e)
+            // then EffectorBasicTest.testInvokeEffectorErrorCollapsedNicely fails because its call to:
+            //     Exceptions.collapseTextInContext
+            // does not unwrap this text.
+            throw Exceptions.propagate(e);
+        }
     }
 
     /**