Open Source Repository

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



org/springframework/remoting/rmi/RmiBasedExporter.java
/*
 * Copyright 2002-2008 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.rmi;

import java.lang.reflect.InvocationTargetException;
import java.rmi.Remote;

import org.springframework.remoting.support.RemoteInvocation;
import org.springframework.remoting.support.RemoteInvocationBasedExporter;

/**
 * Convenient superclass for RMI-based remote exporters. Provides a facility
 * to automatically wrap a given plain Java service object with an
 * RmiInvocationWrapper, exposing the {@link RmiInvocationHandler} remote interface.
 *
 <p>Using the RMI invoker mechanism, RMI communication operates at the {@link RmiInvocationHandler}
 * level, sharing a common invoker stub for any number of services. Service interfaces are <i>not</i>
 * required to extend <code>java.rmi.Remote</code> or declare <code>java.rmi.RemoteException</code>
 * on all service methods. However, in and out parameters still have to be serializable.
 *
 @author Juergen Hoeller
 @since 1.2.5
 @see RmiServiceExporter
 @see JndiRmiServiceExporter
 */
public abstract class RmiBasedExporter extends RemoteInvocationBasedExporter {

  /**
   * Determine the object to export: either the service object itself
   * or a RmiInvocationWrapper in case of a non-RMI service object.
   @return the RMI object to export
   @see #setService
   @see #setServiceInterface
   */
  protected Remote getObjectToExport() {
    // determine remote object
    if (getService() instanceof Remote &&
        (getServiceInterface() == null || Remote.class.isAssignableFrom(getServiceInterface()))) {
      // conventional RMI service
      return (RemotegetService();
    }
    else {
      // RMI invoker
      if (logger.isDebugEnabled()) {
        logger.debug("RMI service [" + getService() "] is an RMI invoker");
      }
      return new RmiInvocationWrapper(getProxyForService()this);
    }
  }

  /**
   * Redefined here to be visible to RmiInvocationWrapper.
   * Simply delegates to the corresponding superclass method.
   */
  @Override
  protected Object invoke(RemoteInvocation invocation, Object targetObject)
      throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {

    return super.invoke(invocation, targetObject);
  }

}