/* DynAnyOperations.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.DynamicAny;

import org.omg.CORBA.Any;
import org.omg.CORBA.TypeCode;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;

import java.io.Serializable;

/**
 * Defines the operations, applicable to {@link DynAny}.
 *
 * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
 */
public interface DynAnyOperations
{
  /**
   * Initialises the value of this DynAny with the value, stored inside the
   * passed DynAny, making a shallow copy.
   *
   * @param from the DynAny to copy from.
   * @throws TypeMismatch if the source DynAny is invalid.
   */
  void assign(DynAny from)
       throws TypeMismatch;

  /**
   * Fully clones the content of this Any, returning a deep copy.
   */
  DynAny copy();

  /**
   * Returns the focused component of this DynAny. The DynAny has the internal
   * pointer (reference) that can point to one of its components. The returned
   * DynAny can be used to get or set the value of the focused component. If the
   * DynAny holds a primitive type with no components, this implementation
   * returns <code>null</code>.
   *
   * @throws TypeMismatch if called on DynAny that cannot have active
   * components, like {@link DynEnum}.
   */
  DynAny current_component()
                    throws TypeMismatch;

  /**
   * Destroys this DynAny, freeing the used resources. In java, resources are
   * freed by the garbage collectors, so this method typically returns without
   * action.
   */
  void destroy();

  /**
   * Makes a DynAny from the {@link Any}. The passed {@link Any} becomes the
   * enclosed instance of this DynAny, allowing to change/traverse the
   * {@link Any} fields by the {@link DynAny} methods.
   *
   * @throws TypeMismatch if the type of this DynAny differs from the type of
   * the passed Any. The DynAny cannot be reused with the enclosed type
   * different from that it was initially created.
   * @throws InvalidValue if the value, stored in the passed parameter, is
   * otherwise invalid.
   */
  void from_any(Any an_any)
         throws TypeMismatch, InvalidValue;

  /**
   * This method is used when the wrapped Any contains an instance of another
   * Any itself. The method returns this second enclosed Any.
   *
   * @throws TypeMismatch if the typecode of the accessed Any is not the same as
   * the typecode of this DynAny.
   */
  Any get_any()
       throws TypeMismatch, InvalidValue;

  /**
   * Extract the boolean value that is expected to be stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  boolean get_boolean()
               throws TypeMismatch, InvalidValue;

  /**
   * Extract the char value that is expected to be stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  char get_char()
         throws TypeMismatch, InvalidValue;

  /**
   * Extract the <code>double</code> value that is expected to be stored in
   * this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  double get_double()
             throws TypeMismatch, InvalidValue;

  /**
   * Extract the <code>float</code> value that is expected to be stored in
   * this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  float get_float()
           throws TypeMismatch, InvalidValue;

  /**
   * Extract the int (CORBA long) value that is expected to be stored in this
   * DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  int get_long()
        throws TypeMismatch, InvalidValue;

  /**
   * Extract the long (CORBA long long) value that is expected to be stored in
   * this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  long get_longlong()
             throws TypeMismatch, InvalidValue;

  /**
   * Extract the byte (CORBA octet) value that is expected to be stored in this
   * DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  byte get_octet()
          throws TypeMismatch, InvalidValue;

  /**
   * Extract the CORBA object reference that is expected to be stored in this
   * DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  org.omg.CORBA.Object get_reference()
                              throws TypeMismatch, InvalidValue;

  /**
   * Extract the <code>short</code> value that is expected to be stored in
   * this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  short get_short()
           throws TypeMismatch, InvalidValue;

  /**
   * Extract the string value that is expected to be stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  String get_string()
             throws TypeMismatch, InvalidValue;

  /**
   * Extract the {@link TypeCode} value that is expected to be stored in this
   * DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  TypeCode get_typecode()
                 throws TypeMismatch, InvalidValue;

  /**
   * Extract the unsigned int (CORBA ulong) value that is expected to be stored
   * in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  int get_ulong()
         throws TypeMismatch, InvalidValue;

  /**
   * Extract the unsingel long (CORBA unsigned long long )value that is expected
   * to be stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  long get_ulonglong()
              throws TypeMismatch, InvalidValue;

  /**
   * Extract the unsigned short value that is expected to be stored in this
   * DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  short get_ushort()
            throws TypeMismatch, InvalidValue;

  /**
   * Extract the value that is expected to be stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  Serializable get_val()
                throws TypeMismatch, InvalidValue;

  /**
   * Extract the wide (usually UTF-16) character value that is expected to be
   * stored in this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  char get_wchar()
          throws TypeMismatch, InvalidValue;

  /**
   * Extract the wide (usually UFT-16) string that is expected to be stored in
   * this DynAny.
   *
   * @throws TypeMismatch if this DynAny holds the value of the different type.
   */
  String get_wstring()
              throws TypeMismatch, InvalidValue;

  /**
   * Insert the {@link Any} value into the enclosed {@link Any} inside this
   * DynAny.
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_any(Any an_any)
           throws TypeMismatch, InvalidValue;

  /**
   * Insert the boolean value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_boolean(boolean a_x)
               throws InvalidValue, TypeMismatch;

  /**
   * Insert the char value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_char(char a_x)
            throws InvalidValue, TypeMismatch;

  /**
   * Insert the double value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_double(double a_x)
              throws InvalidValue, TypeMismatch;

  /**
   * Insert the float value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_float(float a_x)
             throws InvalidValue, TypeMismatch;

  /**
   * Insert the int (CORBA long) value into the enclosed {@link Any} inside this
   * DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_long(int a_x)
            throws InvalidValue, TypeMismatch;

  /**
   * Insert the long (CORBA long long) value into the enclosed {@link Any}
   * inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_longlong(long a_x)
                throws InvalidValue, TypeMismatch;

  /**
   * Insert the byte (CORBA octet) value into the enclosed {@link Any} inside
   * this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_octet(byte a_x)
             throws InvalidValue, TypeMismatch;

  /**
   * Insert the object reference into the enclosed {@link Any} inside this
   * DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_reference(org.omg.CORBA.Object a_x)
                 throws InvalidValue, TypeMismatch;

  /**
   * Insert the <code>short</code> value into the enclosed {@link Any} inside
   * this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_short(short a_x)
             throws InvalidValue, TypeMismatch;

  /**
   * Insert the string value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_string(String a_x)
              throws InvalidValue, TypeMismatch;

  /**
   * Insert the {@link TypeCode} value into the enclosed {@link Any} inside this
   * DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_typecode(TypeCode a_x)
                throws InvalidValue, TypeMismatch;

  /**
   * Insert the int (CORBA unsinged long) value into the enclosed {@link Any}
   * inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_ulong(int a_x)
             throws InvalidValue, TypeMismatch;

  /**
   * Insert the long (CORBA unsigned long long) value into the enclosed
   * {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_ulonglong(long a_x)
                 throws InvalidValue, TypeMismatch;

  /**
   * Insert the short (CORBA unsigned short) value into the enclosed {@link Any}
   * inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_ushort(short a_x)
              throws InvalidValue, TypeMismatch;

  /**
   * Insert the value into the enclosed {@link Any} inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_val(Serializable a_x)
           throws InvalidValue, TypeMismatch;

  /**
   * Insert the wide char (usually UTF-16) value into the enclosed {@link Any}
   * inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_wchar(char a_x)
             throws InvalidValue, TypeMismatch;

  /**
   * Insert the wide string (usually UTF-16) into the enclosed {@link Any}
   * inside this DynAny
   *
   * @param a_x the value being inserted.
   * @throws InvalidValue if the value type does not match the typecode of the
   * enclosed {@link Any}.
   */
  void insert_wstring(String a_x)
               throws InvalidValue, TypeMismatch;

  /**
   * Advances the internal pointer, described in the {@link current_component},
   * one position forward.
   *
   * @return true if the pointer now points to the new component, false if there
   * are no more components of this DynAny holds a basic type that is not
   * divided into components.
   */
  boolean next();

  /**
   * Moves the internal pointer, described in the {@link current_component}, to
   * the first component.
   */
  void rewind();

  /**
   * Moves the internal pointer, described in the {@link current_component}, to
   * the given position.
   *
   * @param p the number of the internal component on that the internal pointer
   * must be focused.
   * @return true on success or false if there is no component with the given
   * number. If the DynAny holds the basic type, this method returs false p
   * values other than 0.
   */
  boolean seek(int p);

  /**
   * Returns a shallow copy of the enclosed {@link Any},
   *
   * @return shallow copy of the enclosed {@link Any}.
   */
  Any to_any();

  /**
   * Returns the typecode of the object, inserted into this DynAny.
   *
   * @return the typecode of the inserted {@link Any} or null typecode if no
   * {@link Any has been yet inserted}.
   */
  TypeCode type();

  /**
   * Insert a value at the current position.
   *
   * @param insert_it a value to insert.
   * @throws TypeMismatch if the component at the current position has a
   * different type.
   * @throws InvalidValue if the current position points nowhere.
   */
  void insert_dyn_any(DynAny insert_it)
               throws TypeMismatch, InvalidValue;

  /**
   * Checks for equality with another Dynamic Any.
   *
   *
   * @specnote This method is currently only implemented only for case when
   * another DynAny was created by the factory of this implementation and is not
   * an independent class, just implementing interface. Otherwise, a
   * NO_IMPLEMENT minor 8148 will be thrown. General implementation is highly
   * ineffective, but we will do if somebody would ever need it.
   */
  boolean equal(DynAny other);

  /**
   * Get the number number of fields in the enclosed structure or number of
   * memebers in the enclosed array, sequence, enumeration, etc. This method
   * only counts elements at the top level. For instance, if invoked on a
   * DynStruct with a single member, it returns 1, irrespective of the type of
   * the member.
   *
   * @return number of components or 0 if the enclosed Any is not divideable.
   */
  int component_count();

  /**
   * Return DynAny, wrapping the second (enclosed any) that is stored in the
   * wrapped Any.
   *
   * @throws TypeMismatch if the wrapped Any does not store another Any.
   * @throws InvalidValue if the current position points nowhere.
   */
  DynAny get_dyn_any()
              throws TypeMismatch, InvalidValue;
}