/* ObjectImpl.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.CORBA.portable;

import org.omg.CORBA.Context;
import org.omg.CORBA.ContextList;
import org.omg.CORBA.DomainManager;
import org.omg.CORBA.ExceptionList;
import org.omg.CORBA.NVList;
import org.omg.CORBA.NamedValue;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Policy;
import org.omg.CORBA.Request;
import org.omg.CORBA.SetOverrideType;

/**
 * The basic implementation of the CORBA Object. The most of the methods
 * delegate the functionality to the {@link Delegate} that can be replaced
 * by {@link #_set_delegate(Delegate)}.
 *
 * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
 */
public abstract class ObjectImpl
  implements org.omg.CORBA.Object
{
  /**
   * The delegate, responsible for the method implementations.
   */
  transient Delegate delegate;

  /**
    * Create a request to invoke the method of this object, specifying
    * context list and the list of the expected exception.
    *
    * @param context a list of additional properties.
    * @param operation the name of method to be invoked.
    * @param parameters the method parameters.
    * @param returns the container for tge method returned value.
    * @param exceptions the list of the possible exceptions that the method
    * can throw.
    * @param ctx_list the list of the context strings that need to be
    * resolved and send as a context instance.
    *
    * @return the created reaquest.
    */
  public Request _create_request(Context context, String operation,
                                 NVList parameters, NamedValue returns,
                                 ExceptionList exceptions, ContextList ctx_list
                                )
  {
    return delegate.create_request(this, context, operation, parameters,
                                   returns, exceptions, ctx_list
                                  );
  }

  /**
   * Create a request to invoke the method of this object.
   *
   * @param context a list of additional properties.
   * @param operation the name of method to be invoked.
   * @param parameters the method parameters.
   * @param returns the container for tge method returned value.
   *
   * @return the created reaquest.
   */
  public Request _create_request(Context context, String operation,
                                 NVList parameters, NamedValue returns
                                )
  {
    return delegate.create_request(this, context, operation, parameters, returns);
  }

  /**
   * Duplicate the object reference. This does not make much sense for
   * java platform and is just included for the sake of compliance with
   * CORBA APIs.
   *
   * The method may return the object reference itself.
   *
   * @return as a rule, <code>this</code>.
   */
  public org.omg.CORBA.Object _duplicate()
  {
    return delegate.duplicate(this);
  }

  /**
   * Get vendor specific delegate, responsible for the implemented
   * functionality.
   */
  public Delegate _get_delegate()
  {
    return delegate;
  }

  /**
   * Retrieve the domain managers for this object.
   *
   * @return the domain managers.
   */
  public DomainManager[] _get_domain_managers()
  {
    return delegate.get_domain_managers(this);
  }

  /**
   * Get the <code>InterfaceDef</code> for this Object.
   */
  public org.omg.CORBA.Object _get_interface_def()
  {
    return delegate.get_interface_def(this);
  }

  /**
   * Returns the {@link Policy}, applying to this object.
   *
   * @param a_policy_type a type of policy to be obtained.
   * @return a corresponding Policy object.
   *
   * @throws BAD_PARAM if the policy of the given type is not
   * associated with this object, or if it is not supported by this ORB.
   */
  public Policy _get_policy(int type)
  {
    return delegate.get_policy(this, type);
  }

  /**
   * Get the array of interface repository ids, defining this object.
   */
  public abstract String[] _ids();

  /**
   * Get the hashcode this object reference. The same hashcode still
   * does not means that the references are the same. From the other
   * side, two different references may still refer to the same CORBA
   * object. The returned value must not change during the object
   * lifetime.
   *
   * @param maximum the maximal value to return.
   *
   * @return the hashcode.
   */
  public int _hash(int max)
  {
    return delegate.hash(this, max);
  }

  /**
   * Invoke the operation.
   *
   * @param output the stream, containing the written arguments.
   *
   * @return the stream, from where the input parameters could be read.
   *
   * @throws ApplicationException if the application throws an exception,
   * defined as a part of its remote method definition.
   *
   * @throws RemarshalException if reading(remarshalling) fails.
   */
  public InputStream _invoke(OutputStream output)
                      throws org.omg.CORBA.portable.ApplicationException,
                             org.omg.CORBA.portable.RemarshalException
  {
    return delegate.invoke(this, output);
  }

  /**
   * Check if this object can be referenced by the given repository id.
   *
   * @param repositoryIdentifer the repository id.
   *
   * @return true if the passed parameter is a repository id of this
   * CORBA object.
   */
  public boolean _is_a(String idl_id)
  {
    return delegate.is_a(this, idl_id);
  }

  /**
   * Return true if the other object references are equivalent, so far as
   * it is possible to determine this easily.
   *
   * @param other the other object reference.
   *
   * @return true if both references refer the same object, false
   * if they probably can refer different objects. Uses direct
   * comparison if the delegate has not been set.
   */
  public boolean _is_equivalent(org.omg.CORBA.Object other)
  {
    return (delegate == null) ? this == other
           : delegate.is_equivalent(this, other);
  }

  /**
   * Returns true if the object is local.
   *
   * @param self the object to check.
   *
   * @return false, always (following 1.4 specs). Override to get
   * functionality.
   */
  public boolean _is_local()
  {
    return delegate.is_local(this);
  }

  /**
  * Determines if the server object for this reference has already
  * been destroyed.
  *
  * @return true if the object has been destroyed, false otherwise.
  */
  public boolean _non_existent()
  {
    return delegate.non_existent(this);
  }

  /**
   * Provides the reference to ORB.
   *
   * @return the associated ORB.
   */
  public ORB _orb()
  {
    return delegate.orb(this);
  }

  /**
   * Free resoureces, occupied by this reference. The object implementation
   * is not notified, and the other references to the same object are not
   * affected.
   */
  public void _release()
  {
    delegate.release(this);
  }

  /**
   * Release the reply stream back to ORB after finishing reading the data
   * from it.
   *
   * @param input the stream, normally returned by {@link #invoke} or
   * {@link ApplicationException#getInputStream()}, can be null.
   *
   * @throws NO_IMPLEMENT, always (following the 1.4 specification).
   */
  public void _releaseReply(InputStream stream)
  {
    if (delegate != null)
      delegate.releaseReply(this, stream);
  }

  /**
   * Create a request to invoke the method of this CORBA object.
   *
   * @param operation the name of the method to invoke.
   *
   * @return the request.
   */
  public Request _request(String method)
  {
    return delegate.request(this, method);
  }

  /**
   * Create a request to invoke the method of this CORBA object.
   *
   * @param operation the name of the method to invoke.
   * @param response_expected specifies if this is one way message or the
   * response to the message is expected.
   *
   * @return the stream where the method arguments should be written.
   */
  public org.omg.CORBA.portable.OutputStream _request(String method,
                                                      boolean response_expected
                                                     )
  {
    return delegate.request(this, method, response_expected);
  }

  /**
   * This method is always called after invoking the operation on the
   * local servant.
   *
   * The default method returns without action.
   *
   * @param self the object.
   * @param servant the servant.
   */
  public void _servant_postinvoke(ServantObject servant)
  {
    delegate.servant_postinvoke(this, servant);
  }

  /**
   * Returns a servant that should be used for this request.
   * The servant can also be casted to the expected type, calling the
   * required method directly.
   *
   * @param self the object
   * @param operation the operation
   * @param expectedType the expected type of the servant.
   *
   * This implementation always returns null; override for different
   * behavior.
   *
   * @return the servant or null if the servant is not an expected type
   * of the method is not supported, for example, due security reasons.
   */
  public ServantObject _servant_preinvoke(String method, Class expected_type)
  {
    return delegate.servant_preinvoke(this, method, expected_type);
  }

  /**
   * Set the delegate, responsible for the implemented functionality.
   *
   * @param a_delegate a delegate, responsible for the implemented
   * functionality.
   */
  public void _set_delegate(Delegate a_delegate)
  {
    delegate = a_delegate;
  }

  /**
   * Returns a new object with the new policies either replacing or
   * extending the current policies, depending on the second parameter.
   *
   * @param policies the policy additions or replacements.
   * @param how either {@link SetOverrideType#SET_OVERRIDE} to override the
   * current policies of {@link SetOverrideType#ADD_OVERRIDE} to replace
   * them.
   */
  public org.omg.CORBA.Object _set_policy_override(Policy[] policies,
                                                   SetOverrideType set_add
                                                  )
  {
    return delegate.set_policy_override(this, policies, set_add);
  }

  /**
   * Check if this object is equal to another object.
   *
   * @param other the other object to compare.
   *
   * @return true if the objects are equal.
   */
  public boolean equals(java.lang.Object other)
  {
    if (delegate == null)
      return this == other;
    else
      return delegate.equals(this, other);
  }

  /**
   * Return the string representation of the passed object.
   *
   * @return the string representation.
   */
  public String toString()
  {
    return delegate.toString(this);
  }
}