/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.api.model; import org.mule.runtime.core.config.i18n.CoreMessages; import java.lang.reflect.Method; /** * Tracks the state of an invocation on a component using an {@link EntryPointResolver} */ public class InvocationResult { public static enum State { /** the resolver performing the invocation knows that it cannot attempt to make the invocation */ NOT_SUPPORTED, /** the invocation was successful */ SUCCESSFUL, /** The invocation was attempted but failed */ FAILED } private String errorMessage; /** the name of the method called for this invocation */ private String methodCalled; /** the result of calling the invocation method */ private Object result; /** the state of this invocation */ private State state; /** The entry-point resolver that created this InvocationResult */ private EntryPointResolver resolver; /** * Will construct an InvocationResult with a given state. The state must be either * {@link org.mule.runtime.core.api.model.InvocationResult.State#NOT_SUPPORTED} if the resolver performing the invocation knows * that it cannot attempt to make the invocation {@link org.mule.runtime.core.api.model.InvocationResult.State#FAILED} If an * invocation attempt is made but fails {@link org.mule.runtime.core.api.model.InvocationResult.State#SUCCESSFUL} If the * invocation was successful * * Typically, this constructor is used when the state is * {@link org.mule.runtime.core.api.model.InvocationResult.State#NOT_SUPPORTED} or * {@link org.mule.runtime.core.api.model.InvocationResult.State#FAILED} * * @param resolver the resolver being used to make the invocation * @param state the state of the result */ public InvocationResult(EntryPointResolver resolver, State state) { this.state = state; this.resolver = resolver; } /** * Creates a result with the result payload set. The state of this result will be * {@link org.mule.runtime.core.api.model.InvocationResult.State#SUCCESSFUL} since only in this state will a result be set. * * @param resolver the resolver being used to make the invocation * @param result the result of a successful invocation * @param method the method invoke by this invocation */ public InvocationResult(EntryPointResolver resolver, Object result, Method method) { this.result = result; this.state = State.SUCCESSFUL; this.methodCalled = method.getName(); this.resolver = resolver; } /** * Returns the name of the method invoked, this property is only set if the state of the invocation is * {@link org.mule.runtime.core.api.model.InvocationResult.State#SUCCESSFUL} * * @return the name of the method invoked */ public String getMethodCalled() { return methodCalled; } /** * The result of this invocation * * @return an object or null if the result did not yield a result or because the state of this invocation result is either * {@link org.mule.runtime.core.api.model.InvocationResult.State#NOT_SUPPORTED} or * {@link org.mule.runtime.core.api.model.InvocationResult.State#FAILED}. */ public Object getResult() { return result; } /** * @return the state of this invocation. Possible values are: * {@link org.mule.runtime.core.api.model.InvocationResult.State#NOT_SUPPORTED} if the resolver performing the * invocation knows that it cannot attempt to make the invocation * {@link org.mule.runtime.core.api.model.InvocationResult.State#FAILED} If an invocation attempt is made but fails * {@link org.mule.runtime.core.api.model.InvocationResult.State#SUCCESSFUL} If the invocation was successful */ public State getState() { return state; } /** * An optional error message can be set if the invocation state is not * {@link org.mule.runtime.core.api.model.InvocationResult.State#SUCCESSFUL} * * @param message the error message */ public void setErrorMessage(String message) { if (state == State.SUCCESSFUL) { throw new IllegalStateException(CoreMessages.invocationSuccessfulCantSetError().toString()); } errorMessage = message; } /** * Returns true if an error message has been set on this result, false otherwise * * @return true if an error message has been set on this result, false otherwise */ public boolean hasError() { return errorMessage != null; } /** * Returns the error message set on this result or null if none has been set * * @return the error message set on this result or null if none has been set */ public String getErrorMessage() { return (errorMessage == null ? null : resolver.getClass().getSimpleName() + ": " + errorMessage); } public void setErrorTooManyMatchingMethods(Object component, Class<?>[] argTypes, String methods) { setErrorMessage(CoreMessages .tooManyAcceptableMethodsOnObjectUsingResolverForTypes(component.getClass().getName(), argTypes, methods).toString()); } public void setErrorNoMatchingMethods(Object component, Class<?>[] args) { setErrorMessage(CoreMessages.noEntryPointFoundWithArgsUsingResolver(component.getClass().getName(), args).toString()); } public void setErrorNoMatchingMethodsCalled(Object component, String methods) { setErrorMessage(CoreMessages.noMatchingMethodsOnObjectCalledUsingResolver(component.getClass().getName(), methods) .toString()); } }