001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.remoting.support;
018:
019: import java.io.Serializable;
020: import java.lang.reflect.InvocationTargetException;
021:
022: /**
023: * Encapsulates a remote invocation result, holding a result value or an exception.
024: * Used for HTTP-based serialization invokers.
025: *
026: * <p>This is an SPI class, typically not used directly by applications.
027: * Can be subclassed for additional invocation parameters.
028: *
029: * @author Juergen Hoeller
030: * @since 1.1
031: * @see RemoteInvocation
032: */
033: public class RemoteInvocationResult implements Serializable {
034:
035: /** Use serialVersionUID from Spring 1.1 for interoperability */
036: private static final long serialVersionUID = 2138555143707773549L;
037:
038: private Object value;
039:
040: private Throwable exception;
041:
042: /**
043: * Create a new RemoteInvocationResult for the given result value.
044: * @param value the result value returned by a successful invocation
045: * of the target method
046: */
047: public RemoteInvocationResult(Object value) {
048: this .value = value;
049: }
050:
051: /**
052: * Create a new RemoteInvocationResult for the given exception.
053: * @param exception the exception thrown by an unsuccessful invocation
054: * of the target method
055: */
056: public RemoteInvocationResult(Throwable exception) {
057: this .exception = exception;
058: }
059:
060: /**
061: * Return the result value returned by a successful invocation
062: * of the target method, if any.
063: * @see #hasException
064: */
065: public Object getValue() {
066: return this .value;
067: }
068:
069: /**
070: * Return the exception thrown by an unsuccessful invocation
071: * of the target method, if any.
072: * @see #hasException
073: */
074: public Throwable getException() {
075: return this .exception;
076: }
077:
078: /**
079: * Return whether this invocation result holds an exception.
080: * If this returns <code>false</code>, the result value applies
081: * (even if <code>null</code>).
082: * @see #getValue
083: * @see #getException
084: */
085: public boolean hasException() {
086: return (this .exception != null);
087: }
088:
089: /**
090: * Return whether this invocation result holds an InvocationTargetException,
091: * thrown by an invocation of the target method itself.
092: * @see #hasException()
093: */
094: public boolean hasInvocationTargetException() {
095: return (this .exception instanceof InvocationTargetException);
096: }
097:
098: /**
099: * Recreate the invocation result, either returning the result value
100: * in case of a successful invocation of the target method, or
101: * rethrowing the exception thrown by the target method.
102: * @return the result value, if any
103: * @throws Throwable the exception, if any
104: */
105: public Object recreate() throws Throwable {
106: if (this .exception != null) {
107: Throwable exToThrow = this .exception;
108: if (this .exception instanceof InvocationTargetException) {
109: exToThrow = ((InvocationTargetException) this.exception)
110: .getTargetException();
111: }
112: RemoteInvocationUtils
113: .fillInClientStackTraceIfPossible(exToThrow);
114: throw exToThrow;
115: } else {
116: return this.value;
117: }
118: }
119:
120: }
|