/* _ServantActivatorStub.java --
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package org.omg.PortableServer;

import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ObjectHelper;
import org.omg.CORBA.portable.ApplicationException;
import org.omg.CORBA.portable.Delegate;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.ObjectImpl;
import org.omg.CORBA.portable.OutputStream;
import org.omg.CORBA.portable.RemarshalException;

import java.io.Serializable;

/**
 * <p>This ServantActivator stub is an optional base for the
 * servant activators. This stub cannot accept remote invocations, as
 * methods in {@link ServantActivatorOperations} take POA as one of parameters.
 * Both JDK 1.5 API and OMG specifies that POA is a local object that must not
 * be transferred to the remote invocation target.
 * </p><p>
 * You do not need to derive your servant activator from this stub,
 * it is enough to implement the {@link ServantActivator} interface.
 * But you may choose to do this if you need the functional
 * {@link #_ids()} method or want to keep default behavior during
 * the incarnation or etherialization.
 * </p>
 * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
 */
public class _ServantActivatorStub
  extends ObjectImpl
  implements ServantActivator, Serializable
{
  /**
   * Use serialVersionUID (v1.4) for interoperability.
   */
  private static final long serialVersionUID = -685959979577281419L;

  /**
   * This the purpose of this field is undocumented up till 1.5 java API
   * inclusive.
   */
  public static final Class _opsClass = ServantActivatorOperations.class;

  /**
   * Return the array of repository ids for this object.
   *
   * @return { "IDL:omg.org/PortableServer/ServantActivator:2.3",
   *           "IDL:omg.org/PortableServer/ServantManager:1.0" }, always.
   */
  public String[] _ids()
  {
    return new String[]
           {
             "IDL:omg.org/PortableServer/ServantActivator:2.3",
             "IDL:omg.org/PortableServer/ServantManager:1.0"
           };
  }

  /**
   * It is your responsibility to handle the incarnation event and
   * supply the servant. Override this method if using the class.
   * The default method instructs POA that the servant cannot be
   * provided by activator. The OBJ_ADAPTER exception will be
   * thrown by POA, unless the servant is provided as one of the
   * parameters in the activation method.
   *
   * @see ServantActivatorOperations#incarnate
   *
   * @specnote in GNU Classpath, returning null means that the
   * activator does not supply the servant.
   *
   * @throws ForwardRequest
   */
  public Servant incarnate(byte[] Object_id, POA poa)
                    throws ForwardRequest
  {
    return null;
  }

  /**
   * It is your responsibility to handle the etherialization event.
   * Override this method if using the class. The default method
   * does nothing.
   *
   * @see ServantActivatorOperations#incarnate
   */
  public void etherealize(byte[] Object_id, POA poa, Servant servant,
                          boolean cleanup, boolean remaining
                         )
  {
  }
}