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 <[email protected]> Authored: Wed May 17 18:34:06 2017 +0200 Committer: Aled Sage <[email protected]> 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); + } } /**
