Java™ Platform
Standard Edition 7

パッケージ org.omg.CORBA

OMG CORBA API の JavaTM プログラミング言語 (ORB クラスを含む) へのマッピングを提供します。ORB クラスは、プログラマがフル機能の Object Request Broker (ORB) として使用できるように実装されています。

参照: 説明

パッケージ org.omg.CORBA の説明

OMG CORBA API の JavaTM プログラミング言語 (ORB クラスを含む) へのマッピングを提供します。ORB クラスは、プログラマがフル機能の Object Request Broker (ORB) として使用できるように実装されています。

Java(TM) Platform, Standard Edition 6 が準拠する公式の CORBA 仕様のサポートセクションの正確なリストは、「Java(TM) SE 6 での正式な CORBA サポート仕様」を参照してください。

一般的な情報

このセクションでは、Interface Definition Language (IDL) ファイルをコンパイルし、ORB を使用してクライアントおよびサーバーを記述するユーザーに関係する情報を提供します。

このセクションで説明するクラスとインタフェースは、ORB クラス、例外、Helper クラス、および Holder クラスの 4 つにグループ化できます。

ORB クラス

ORB は、クライアントとサーバー上のメソッドの実装間での、メソッド呼び出しを処理 (仲介) します。クライアントとサーバーはネットワーク上のどこにあってもよく、呼び出しと実装は異なるプログラミング言語で記述されている可能性があるため、ORB はこの通信を実現するために内部でさまざまな処理を行います。

ORB の機能のほとんどはユーザーに対して完全に透明であり、CORBA パッケージの主要部分は、ORB によって内部で使用されるクラスで構成されています。そのため、ほとんどのプログラマは、このパッケージの一部分しか直接には使用しません。実際には、ORB クラス、一部の例外、および場合によってホルダークラスの一部のメソッドだけを使用します。

ORB メソッド

アプリケーションを CORBA 環境で使用するには、最初に以下を実行する必要があります。

アプリケーションを初期化して適切なオブジェクト参照を取得するために、次のオペレーションが用意されています。

アプリケーションが CORBA 環境を必要とする場合、ORB オブジェクト参照およびルート POA などの OA オブジェクト参照 (可能な場合) を取得するメカニズムが必要です。このことは、次の 2 つの目的のために行われます。1 つ目は、アプリケーションを ORB と OA 環境に初期化すること、2 つ目は、ORB オブジェクト参照と OA オブジェクト参照をアプリケーションに返し、以降の ORB および OA 操作で使用することです。

ORB オブジェクト参照を取得するには、アプリケーションで ORB.init 操作を呼び出します。呼び出しパラメータは、オブジェクト参照を必要とする ORB の識別子、および環境固有のデータを呼び出し先に渡すために使用する arg_list で構成できます。

次に示すのは、ORB へのアクセスを提供する ORB メソッドです。

パラメータなしで init() メソッドを使用すると、単体 ORB が起動します。単体 ORB は、idlj が Helper クラス内で生成するコードに必要な any を、型コード作成に提供します。

アプリケーションには、その初期のオブジェクト参照を取得するための移植性ある手段が必要です。ルート POA、POA Current、インタフェースリポジトリ、および各種のオブジェクトサービスインスタンスの参照が必要です。アプリケーションが必要とする機能は、ネームサービスが提供される機能と同様です。ただし、アプリケーションを移植性の高い方法で初期化するために、すべてのアプリケーションでネームサービスを使用可能にするよう指示することを、OMG は望んでいません。したがって、このセクションで説明する操作は、ネームサービスの単純なローカルバージョンであり、アプリケーションはこれを使用して、操作に不可欠な小規模の定義済みオブジェクト参照セットを取得できます。このメカニズムでは明確に定義された小規模のオブジェクトセットのみを対象に考えているため、ネーミングコンテキストは単一レベルの名前空間に平板化できます。この単純化により、2 つの操作を定義するだけで必要な機能を実現できます。

初期参照は、ORB オブジェクトインタフェースで提供される 2 つの操作により取得され、初期オブジェクト参照のリストおよび解決機能を提供します。次に初期参照を示します。

これらのメソッドの使用例は、「Java IDL 入門」を参照してください。

例外

Java IDL の例外は、Java プログラミング言語で記述されたコードの例外と似ています。メソッドが例外をスローするように定義されている場合、そのメソッドを使用するコードには、try/catch ブロックを記述して、例外がスローされたときにその例外を処理しなければいけません。

詳細は、「Java IDL 例外」を参照してください。システム例外とユーザー定義例外の違いを説明しています。

次に、システム例外のリストを示します。これらは、org.omg.CORBA パッケージで定義されている java.lang.RuntimeException から org.omg.CORBA.SystemException を介して継承する、非チェック例外です。


        BAD_CONTEXT
        BAD_INV_ORDER
        BAD_OPERATION
        BAD_PARAM
        BAD_TYPECODE
        COMM_FAILURE
        DATA_CONVERSION
        FREE_MEM
        IMP_LIMIT
        INITIALIZE
        INTERNAL
        INTF_REPOS
        INVALID_TRANSACTION
        INV_FLAG
        INV_IDENT
        INV_OBJREF
        INV_POLICY
        MARSHAL
        NO_IMPLEMENT
        NO_MEMORY
        NO_PERMISSION
        NO_RESOURCES
        NO_RESPONSE
        OBJECT_NOT_EXIST
        OBJ_ADAPTER
        PERSIST_STORE
        TRANSACTION_REQUIRED
        TRANSACTION_ROLLEDBACK
        TRANSIENT
        UNKNOWN

次に、org.omg.CORBA で定義されているユーザー定義例外のリストを示します。


        Bounds
        UnknownUserException
        WrongTransaction 
        PolicyError

サブパッケージ

CORBA パッケージの中には、名前の一部に「Package」が付いているパッケージがいくつかあります。これらのパッケージは、CORBA パッケージのインタフェースおよびクラスによって使用される例外またはクラスを提供するだけなので、一般にかなり小さいものです。

たとえば、org.omg.CORBA.TypeCodePackage パッケージには、TypeCode クラスのメソッドによってスローされる例外が 2 つあります。そのような例外は次のとおりです。

org.omg.CORBA.ORBPackage パッケージには、次の 2 つの例外があります。

CORBA のサブパッケージである別のパッケージは、portable パッケージです。これは、あるベンダーのIDL コンパイラで生成されたコードを別のベンダーの ORB で実行可能にする ORB API セットを提供します。

ホルダークラス

out および inout パラメータの引渡しモードをサポートするには、追加のホルダークラスが必要です。Java プログラミング言語は out または inout パラメータをサポートしないため、変更可能なパラメータを渡す手段としてホルダークラスが必要になります。ポータブルスタブおよびスケルトンをサポートするため、ホルダークラスは org.omg.CORBA.portable.Streamable インタフェースも実装します。

ホルダークラスの名前は、型の名前に「Holder」が追加されて付けられています。型の名前によって、Java プログラミング言語での名前が参照されます。たとえば、Java プログラミング言語で Account という名前のインタフェースのホルダークラスは、AccountHolder という名前になります。

ホルダークラスは org.omg.CORBA パッケージ内のすべての基本 IDL データ型に使用できます。たとえば、LongHolderShortHolderFloatHolder などには、定義済みのクラスが存在します。typedefs で定義されたものを除くすべての名前付きユーザー定義 IDL 型についてもクラスが生成されます。この場合、ユーザー定義には、インタフェースリポジトリ用などの OMG 仕様、およびその他の OMG サービスで定義される型が含まれます。

各ホルダークラスには、次の内容が含まれます。

デフォルトのコンストラクタは、値フィールドを Java 言語で定義された型のデフォルト値に設定します。

たとえば、OMG IDL で定義されたインタフェース Account が Java プログラミング言語にマッピングされている場合は、次のホルダークラスが生成されます。

public final class AccountHolder implements 
    org.omg.CORBA.portable.Streamable
{
  // field that holds an Account object
  public Account value = null;

  // default constructor
  public AccountHolder ()
  {
  }
  
  // creates a new AccountHolder from initialValue
  public AccountHolder (Account initialValue)
  {
    value = initialValue;
  }
  
  // reads the contents of i and assigns the contents to value
  public void _read (org.omg.CORBA.portable.InputStream i)
  {
    value = AccountHelper.read (i);
  }

  // writes value to o
  public void _write (org.omg.CORBA.portable.OutputStream o)
  {
    AccountHelper.write (o, value);
  }
 
  // returns the typecode for Account
  public org.omg.CORBA.TypeCode _type ()
  {
    return AccountHelper.type ();
  }

}

Holder クラスの詳細は、「OMG IDL から Java 言語へのマッピング」の第 1.4 章「基本型のマッピング」を参照してください。次に、org.omg.CORBA パッケージで定義されている Holder クラスを示します。

     AnyHolder
     AnySeqHolder
     BooleanHolder
     BooleanSeqHolder
     ByteHolder
     CharHolder
     CharSeqHolder
     CurrentHolder
     DoubleHolder
     DoubleSeqHolder
     FixedHolder
     FloatHolder
     FloatSeqHolder
     IntHolder
     LongHolder
     LongLongSeqHolder
     LongSeqHolder
     ObjectHolder
     OctetSeqHolder
     ParameterModeHolder
     PolicyErrorHolder
     PolicyListHolder
     PrincipalHolder
     ServiceInformationHolder
     ShortHolder
     ShortSeqHolder
     StringHolder
     StringSeqHolder
     TypeCodeHolder
     ULongLongSeqHolder
     ULongSeqHolder
     UnknownUserExceptionHolder
     UShortSeqHolder
     ValueBaseHolder
     WCharSeqHolder
     WrongTransactionHolder
     WStringSeqHolder

ヘルパークラス

ヘルパーファイルは、型の操作に必要な複数の static メソッドを提供します。たとえば、次のような場合があります。

マップされた IDL インタフェースまたは抽象インタフェースのヘルパークラスにはナロー操作も含まれます。static ナローメソッドにより、org.omg.CORBA.Object がさらに特定の型のオブジェクト参照にナロー変換されます。オブジェクト参照がリクエストされた型をサポートしないためにナロー変換に失敗した場合は、IDL 例外 CORBA.BAD_PARAM がスローされます。その他の種類のエラーを示す場合は、異なるシステム例外がスローされます。null のナロー変換は常に成功し、null 値が返されます。一般的に、アプリケーションプログラマが使用するヘルパーメソッドは narrow メソッドのみです。その他のメソッドは、通常は内部で使用され、プログラマは意識する必要がありません。

ヘルパークラスは、値型のヘルパー値型以外のヘルパーの 2 つに大きく分類されます。1 つのカテゴリのヘルパークラスすべてが同じメソッドを提供するため、ここではヘルパークラスの各カテゴリの汎用的な説明を行います。

OMG IDL が Java プログラミング言語にマッピングされると、各ユーザー定義型に対して「ヘルパー」クラスが生成されます。この生成されたクラスには、接尾辞 Helper が追加され、ユーザー定義型の名前が付けられます。たとえば、OMG IDL でインタフェース Account が定義されると、idlj コンパイラにより AccountHelper という名前のクラスが自動的に生成されます。AccountHelper クラスには、型のインスタンス (この場合は Account オブジェクト) の操作に必要な static メソッドが含まれます。

narrow メソッド

オブジェクトがメソッドの戻り値の場合は、ジェネリックオブジェクトである org.omg.CORBA.Object オブジェクトまたは java.lang.Object オブジェクトのどちらかの形式で返されます。このオブジェクトは、操作される前に特定の型にキャストされる必要があります。たとえば、Account オブジェクトはジェネリックオブジェクトとして返され、Account メソッドが呼び出されるように、Account オブジェクトにナロー変換される必要があります。

narrow メソッドには 2 つの形式があります。1 つは org.omg.CORBA.Object オブジェクトを使用し、もう 1 つは java.lang.Object オブジェクトを使用します。インタフェースが abstract かどうかは、ヘルパークラスで提供される narrow メソッドによって決まります。abstract ではないインタフェースのヘルパークラスには、CORBA オブジェクトを使用する narrow メソッドがあります。一方、abstract インタフェースの narrow メソッドでは、Java プログラミング言語のオブジェクトが使用されます。少なくとも 1 つの abstract 基底インタフェースを持つ、abstract 以外のインタフェースのヘルパークラスでは、2 つのバージョンの narrow メソッドが提供されます。

Hello World」チュートリアルでは、次のように narrow メソッドを使用します。

        // create and initialize the ORB
        ORB orb = ORB.init(args, null);

        // get the root naming context
        org.omg.CORBA.Object objRef = 
            orb.resolve_initial_references("NameService");
        // Use NamingContextExt instead of NamingContext. This is 
        // part of latest Inter-Operable naming Service.  
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
 
        // resolve the Object Reference in Naming
        String name = "Hello";
        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

基本ヘルパークラスの例

ここで説明する基本ヘルパークラスは、すべてのヘルパークラス、および OMG IDL で定義された型が Java プログラミング言語のインタフェースにマッピングされる場合に narrow メソッドで指定されるメソッドを含むクラスです。値型ではない型には、それに対して生成された基本ヘルパークラスがあります。

たとえば、インタフェース Account が値型の IDL 型または抽象インタフェースではなく、抽象基底インタフェースがない場合、AccountHelper クラスは次のようになります。

abstract public class AccountHelper
{
  private static String  _id = "IDL:Account:1.0";

  // inserts an Account object into an Any object
  public static void insert (org.omg.CORBA.Any a, Account that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
    a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // extracts an Account object from an Any object
  public static Account extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  
  private static org.omg.CORBA.TypeCode __typeCode = null;
  // gets the typecode for this type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc (AccountHelper.id (), "Account");
    }
    return __typeCode;
  }

  // gets the repository id for this type
  public static String id ()
  {
    return _id;
  }

  // reads an Account object from an input stream
  public static Account read (org.omg.CORBA.portable.InputStream istream)
  {
    return narrow (istream.read_Object (_AccountStub.class));
  }

  // writes an Account object to an outputstream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Account value)
  {
    ostream.write_Object ((org.omg.CORBA.Object) value);
  }

  // converts (narrows) an Object to an Account object
  public static Account narrow (org.omg.CORBA.Object obj)
  {
    if (obj == null)
      return null;
    else if (obj instanceof Account)
      return (Account)obj;
    else if (!obj._is_a (id ()))
      throw new org.omg.CORBA.BAD_PARAM ();
    else
    {
      org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
      _AccountStub stub = new _AccountStub ();
      stub._set_delegate(delegate);
      return stub;
    }
  }

}

値型のヘルパークラス

値型のヘルパークラスには、値型以外のメソッド用に生成された同じメソッドの異なる表現が含まれます。主な違いは、値型は、メソッドのパラメータまたは戻り値として値を渡すことが可能であるため、直列化可能でなければならないことです。

Address が値型の場合、AddressHelper クラスは次のようになります。

abstract public class AddressHelper
{
  private static String  _id = "IDL:Address:1.0";

  // same as for non-value type
  public static void insert (org.omg.CORBA.Any a, Address that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
    a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // same as for non-value type
  public static Address extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  private static org.omg.CORBA.TypeCode __typeCode = null;
  private static boolean __active = false;
  
  // getting the typecode for the type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      synchronized (org.omg.CORBA.TypeCode.class)
      {
        if (__typeCode == null)
        {
          if (__active)
          {
            return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
          }
          __active = true;
          org.omg.CORBA.ValueMember[] _members0 = new org.omg.CORBA.ValueMember[0];
          org.omg.CORBA.TypeCode _tcOf_members0 = null;
          __typeCode = org.omg.CORBA.ORB.init ().create_value_tc (_id, "Address", org.omg.CORBA.VM_NONE.value, null, _members0);
          __active = false;
        }
      }
    }
    return __typeCode;
  }

  // same as for non-value type
  public static String id ()
  {
    return _id;
  }

  // reads a serializable instance of Address from the given input stream
  public static Address read (org.omg.CORBA.portable.InputStream istream)
  {
    return (Address)((org.omg.CORBA_2_3.portable.InputStream) istream).read_value (id ());
  }

  // writes a serializable instance of Address to the given output stream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Address value)
  {
    ((org.omg.CORBA_2_3.portable.OutputStream) ostream).write_value (value, id ());
  }


}

次に、org.omg.CORBA パッケージで定義されているヘルパークラスを示します。


     AnySeqHelper
     BooleanSeqHelper
     CharSeqHelper
     CompletionStatusHelper
     CurrentHelper
     DefinitionKindHelper
     DoubleSeqHelper
     FieldNameHelper
     FloatSeqHelper
     IdentifierHelper
     IDLTypeHelper
     LongLongSeqHelper
     LongSeqHelper
     NameValuePairHelper
     ObjectHelper
     OctetSeqHelper
     ParameterModeHelper
     PolicyErrorCodeHelper
     PolicyErrorHelper
     PolicyHelper
     PolicyListHelper
     PolicyTypeHelper
     RepositoryIdHelper
     ServiceDetailHelper
     ServiceInformationHelper
     SetOverrideTypeHelper
     ShortSeqHelper
     StringSeqHelper
     StringValueHelper
     StructMemberHelper
     ULongLongSeqHelper
     ULongSeqHelper
     UnionMemberHelper
     UnknownUserExceptionHelper
     UShortSeqHelper
     ValueBaseHelper
     ValueMemberHelper
     VersionSpecHelper
     VisibilityHelper
     WCharSeqHelper
     WrongTransactionHelper
     WStringSeqHelper
     WStringValueHelper

その他のクラス

CORBA パッケージのほかのクラスおよびインタフェース (内部で使用される) は、4 つのグループに分類できます。そのうちの 3 つのグループは、要求に付随して使用され、4 番目のグループ (インタフェースリポジトリに関連) は、それ自身がカテゴリとなります。

ORB によって作成されるクラス

最初のグループには、ORB によって作成され、要求オペレーションで使用される情報を格納するクラスが含まれます。

要求を処理するクラス

2 番目のグループのクラスは、次のように要求を処理します。

定数として機能するインタフェース

3 番目のグループには、定数として機能するインタフェースが含まれます。IDL から Java へのマッピングでは、public static final フィールドとして表される列挙値を含む Java クラス (DefinitionKind など) に IDL の enum 型がマッピングされる必要があります。また、IDL インタフェース外で定義された IDL 定数は、各定数の Java インタフェースにマッピングされます。

このため、org.omg.CORBA パッケージの複数のインタフェースが short の単一フィールド、value で構成されます。このフィールドは、エラーコードまたは値修飾子などに使用される定数です。たとえば、インタフェース BAD_POLICYvalue フィールドは、例外 PolicyError がスローされる理由の 1 つになる可能性があります。このエラーコードを指定するには、BAD_POLICY.value を使用します。

例外 PolicyError では、可能なエラーコードとして次のインタフェースの value フィールドが使用されます。

TypeCode.type_modifier メソッドは、次のインタフェースの 1 つの value フィールドを返します。これらのインタフェースの名前にある VM は、「値修飾子」を表します。 次の定数は、ValueMember オブジェクトのアクセスメソッドによって返され、ValueMember オブジェクトの可視性を示します。 NamedValue オブジェクトで、またはメソッドへのパラメータとして使用されるこれらのフラグは、次のインタフェースで定義されます。

インタフェースリポジトリインタフェースとクラス

4 番目のグループには、OMG IDL インタフェース ir.idl から、idlj コンパイラによって生成されるインタフェースリポジトリインタフェースとクラスがあります。インタフェースリポジトリの目的は、ORB がアクセスできるように、そこに格納されているインタフェースを識別することです。各モジュール、型、インタフェース、属性、操作、パラメータ、例外、定数などは、インタフェースリポジトリ API によって完全に記述されます。

ORB ではインタフェースリポジトリを必要としないため、Java IDL にはインタフェースリポジトリは含まれません。このリリースではインタフェースリポジトリが実装されていませんが、型コードを作成するために、次の IR クラスおよびインタフェースが含まれています (インタフェース org.omg.CORBA.ORB の create_value_tc、create_struct_tc、create_union_tc、および create_exception_tc メソッドを参照)。
 


関連項目

概要、ガイド、およびチュートリアルについては、次を参照してください。

Java IDL で実装されていない CORBA 機能

org.omg サブパッケージに含まれている API は、現在の OMG CORBA 仕様に準拠するために提供されるものもありますが、Sun の JDKTM リリースでは実装されていません。これにより、ほかの JDK のライセンス保持者は、標準拡張機能および製品でこの API の実装を提供できるようになります。

NO_IMPLEMENT をスローする機能

org.omg サブパッケージに含まれる API には、さまざまな理由により NO_IMPLEMENT 例外をスローするものがあります。その理由として、次の点を挙げることができます。

このリリースで実装されていない機能または API の概要


org.omg.CORBA パッケージで実装されていない機能のリスト

org.omg.CORBA パッケージで実装されていないメソッド

導入されたバージョン:
JDK1.2
Java™ Platform
Standard Edition 7

バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.