/* ServiceContext.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 gnu.CORBA.GIOP;

import gnu.CORBA.CDR.AbstractCdrInput;
import gnu.CORBA.CDR.AbstractCdrOutput;

import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.portable.IDLEntity;

/**
 * Contains the ORB service data being passed.
 *
 * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
 */
public class ServiceContext
  implements IDLEntity
{
  /**
   * Use serialVersionUID for interoperability.
   */
  private static final long serialVersionUID = 1;

  /* Standard values for the context_id. */
  public static final int TransactionService = 0;

  /**
   * Defines code sets, used to encode wide and narrow characters. Required for
   * messages with data structures, involving wide characters.
   */
  public static final int CodeSets = 1;

  public static final int ChainBypassCheck = 2;

  public static final int ChainBypassInfo = 3;

  public static final int LogicalThreadId = 4;

  public static final int BI_DIR_IIOP = 5;

  public static final int SendingContextRunTime = 6;

  public static final int INVOCATION_POLICIES = 7;

  public static final int FORWARDED_IDENTITY = 8;

  /**
   * Contains exception details if exception being transferred is other than
   * System or User exception. javax.rmi uses this context to transfer arbitrary
   * java exceptions as CORBA value types.
   */
  public static final int UnknownExceptionInfo = 9;

  public static final int RTCorbaPriority = 10;

  public static final int RTCorbaPriorityRange = 11;

  public static final int FT_GROUP_VERSION = 12;

  public static final int FT_REQUEST = 13;

  public static final int ExceptionDetailMessage = 14;

  public static final int SecurityAttributeService = 15;

  public static final int ActivityService = 16;

  /**
   * The context id (for instance, 0x1 for code sets context). At the moment of
   * writing, the OMG defines 16 standard values and provides rules to register
   * the vendor specific context ids. The range 0-4095 is reserved for the
   * future standard OMG contexts.
   */
  public int context_id;

  /**
   * The context_data.
   */
  public byte[] context_data;

  /**
   * Crete unitialised instance.
   */
  public ServiceContext()
  {
  }

  /**
   * Create from omg context.
   */
  public ServiceContext(org.omg.IOP.ServiceContext from)
  {
    context_id = from.context_id;
    context_data = from.context_data;
  }

  /**
   * Read the context values from the stream.
   *
   * @param istream a stream to read from.
   */
  public static ServiceContext read(AbstractCdrInput istream)
  {
    int id = istream.read_ulong();

    switch (id)
      {
        case CodeSetServiceContext.ID:

          CodeSetServiceContext codeset = new CodeSetServiceContext();
          codeset.readContext(istream);
          return codeset;

        default:

          ServiceContext ctx = new ServiceContext();
          ctx.context_id = id;
          ctx.context_data = istream.read_sequence();
          return ctx;
      }
  }

  /**
   * Read a sequence of contexts from the input stream.
   */
  public static ServiceContext[] readSequence(AbstractCdrInput istream)
  {
    int size = istream.read_long();
    ServiceContext[] value = new gnu.CORBA.GIOP.ServiceContext[size];
    for (int i = 0; i < value.length; i++)
      value[i] = read(istream);
    return value;
  }

  /**
   * Write the context values into the stream.
   *
   * @param ostream a stream to write the data to.
   */
  public void write(AbstractCdrOutput ostream)
  {
    ostream.write_ulong(context_id);
    ostream.write_sequence(context_data);
  }

  /**
   * Write the sequence of contexts into the input stream.
   */
  public static void writeSequence(AbstractCdrOutput ostream, ServiceContext[] value)
  {
    ostream.write_long(value.length);
    for (int i = 0; i < value.length; i++)
      value[i].write(ostream);
  }

  /**
   * Add context to the given array of contexts.
   */
  public static void add(org.omg.IOP.ServiceContext[] cx,
    org.omg.IOP.ServiceContext service_context, boolean replace)
  {
    int exists = -1;

    for (int i = 0; i < cx.length; i++)
      if (cx[i].context_id == service_context.context_id)
        exists = i;

    if (exists < 0)
      {
        // Add context.
        org.omg.IOP.ServiceContext[] n = new org.omg.IOP.ServiceContext[cx.length + 1];
        for (int i = 0; i < cx.length; i++)
          n[i] = cx[i];
        n[cx.length] = service_context;
      }
    else
      {
        // Replace context.
        if (!replace)
          throw new BAD_INV_ORDER("Repetetive setting of the context "
            + service_context.context_id, 15, CompletionStatus.COMPLETED_NO);
        else
          cx[exists] = service_context;
      }
  }

  /**
   * Add context to the given array of contexts.
   */
  public static ServiceContext[] add(ServiceContext[] cx,
    org.omg.IOP.ServiceContext service_context, boolean replace)
  {
    int exists = -1;

    for (int i = 0; i < cx.length; i++)
      if (cx[i].context_id == service_context.context_id)
        exists = i;

    if (exists < 0)
      {
        // Add context.
        ServiceContext[] n = new ServiceContext[cx.length + 1];
        for (int i = 0; i < cx.length; i++)
          n[i] = cx[i];
        n[cx.length] = new ServiceContext(service_context);
        return n;
      }
    else
      {
        // Replace context.
        if (!replace)
          throw new BAD_INV_ORDER("Repetetive setting of the context "
            + service_context.context_id, 15, CompletionStatus.COMPLETED_NO);
        else
          cx[exists] = new ServiceContext(service_context);
        return cx;
      }
  }

  /**
   * Find context with the given name in the context array.
   */
  public static org.omg.IOP.ServiceContext findContext(int ctx_name,
    org.omg.IOP.ServiceContext[] cx)
  {
    for (int i = 0; i < cx.length; i++)
      if (cx[i].context_id == ctx_name)
        return cx[i];
    throw new BAD_PARAM("No context with id " + ctx_name);
  }

  /**
   * Find context with the given name in the context array, converting into
   * org.omg.IOP.ServiceContext.
   */
  public static org.omg.IOP.ServiceContext findContext(int ctx_name,
    ServiceContext[] cx)
  {
    for (int i = 0; i < cx.length; i++)
      if (cx[i].context_id == ctx_name)
        return new org.omg.IOP.ServiceContext(ctx_name, cx[i].context_data);
    throw new BAD_PARAM("No context with id " + ctx_name);
  }

  /**
   * Find context with the given name in the context array without conversions.
   */
  public static ServiceContext find(int ctx_name, ServiceContext[] cx)
  {
    for (int i = 0; i < cx.length; i++)
      if (cx[i].context_id == ctx_name)
        return cx[i];
    return null;
  }

  /**
   * Return a string representation.
   */
  public String toString()
  {
    return "ctx " + context_id + ", size " + context_data.length;
  }
}
