Open Source Repository

Home /spring/spring-context-3.0.5 | Repository Home



org/springframework/remoting/support/RemoteInvocationResult.java
/*
 * Copyright 2002-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.remoting.support;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;

/**
 * Encapsulates a remote invocation result, holding a result value or an exception.
 * Used for HTTP-based serialization invokers.
 *
 <p>This is an SPI class, typically not used directly by applications.
 * Can be subclassed for additional invocation parameters.
 *
 @author Juergen Hoeller
 @since 1.1
 @see RemoteInvocation
 */
public class RemoteInvocationResult implements Serializable {

  /** Use serialVersionUID from Spring 1.1 for interoperability */
  private static final long serialVersionUID = 2138555143707773549L;


  private Object value;

  private Throwable exception;


  /**
   * Create a new RemoteInvocationResult for the given result value.
   @param value the result value returned by a successful invocation
   * of the target method
   */
  public RemoteInvocationResult(Object value) {
    this.value = value;
  }

  /**
   * Create a new RemoteInvocationResult for the given exception.
   @param exception the exception thrown by an unsuccessful invocation
   * of the target method
   */
  public RemoteInvocationResult(Throwable exception) {
    this.exception = exception;
  }


  /**
   * Return the result value returned by a successful invocation
   * of the target method, if any.
   @see #hasException
   */
  public Object getValue() {
    return this.value;
  }

  /**
   * Return the exception thrown by an unsuccessful invocation
   * of the target method, if any.
   @see #hasException
   */
  public Throwable getException() {
    return this.exception;
  }

  /**
   * Return whether this invocation result holds an exception.
   * If this returns <code>false</code>, the result value applies
   * (even if <code>null</code>).
   @see #getValue
   @see #getException
   */
  public boolean hasException() {
    return (this.exception != null);
  }

  /**
   * Return whether this invocation result holds an InvocationTargetException,
   * thrown by an invocation of the target method itself.
   @see #hasException()
   */
  public boolean hasInvocationTargetException() {
    return (this.exception instanceof InvocationTargetException);
  }


  /**
   * Recreate the invocation result, either returning the result value
   * in case of a successful invocation of the target method, or
   * rethrowing the exception thrown by the target method.
   @return the result value, if any
   @throws Throwable the exception, if any
   */
  public Object recreate() throws Throwable {
    if (this.exception != null) {
      Throwable exToThrow = this.exception;
      if (this.exception instanceof InvocationTargetException) {
        exToThrow = ((InvocationTargetExceptionthis.exception).getTargetException();
      }
      RemoteInvocationUtils.fillInClientStackTraceIfPossible(exToThrow);
      throw exToThrow;
    }
    else {
      return this.value;
    }
  }

}