ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

10.4.4 インタフェースリポジトリサービスのプログラミング例

注意


  • OOCOBOLは、使用できません。


  • OOCOBOLは、Windows(R)クライアントアプリケーションで使用できます。

1OperationDefオブジェクトの情報の獲得

以下のIDL定義に対するOperationDefオブジェクトのパラメタ情報を獲得するプログラミングについて説明します。

module test1 {
    interface intf1  {
        long add(in long a,  in long b); 
        long sub(in long c,  in long d) ; 
    };  
};

上記のIDL定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。



(1)インタフェースリポジトリのオブジェクトリファレンスの獲得

システム提供サービスのオブジェクトリファレンスの取出しメソッドresolve_initial_references()により、ルートリポジトリのオブジェクトリファレンスを取り出します。


C言語
CORBA_Repository           intf_rep; 
/* インタフェースリポジトリのオブジェクトリファレンス獲得 */
intf_rep = CORBA_ORB_resolve_initial_references(
              orb,CORBA_ORB_ObjectId_InterfaceRepository, &env);

C++言語
CORBA::Object_ptr      obj; 
CORBA::Repository_ptr  intf_rep; 

// インタフェースリポジトリのオブジェクトリファレンス獲得
obj = orb->resolve_initial_references(
      CORBA_ORB_ObjectId_InterfaceRepository, *env ); 

// CORBA::Repositoryクラスに変換
intf_rep = CORBA::Repository::_narrow( obj );

Java言語
org.omg.CORBA.Object       Obj;
org.omg.CORBA.Repository   Rep;
// インタフェースリポジトリのオブジェクトリファレンス獲得
Obj = Orb.resolve_initial_references( "InterfaceRepository" );

// RepositoryHelperクラスに変換
Rep = org.omg.CORBA.RepositoryHelper.narrow( Obj );

COBOL
*########## インタフェースリポジトリのオブジェクトリファレンス獲得 ###########
   MOVE FUNCTION LENG (CORBA-ORB-OBJECTID-INTFREP) TO STRING-LENGTH. 
   CALL "CORBA-STRING-SET" USING
                TEMP-BUF
                STRING-LENGTH
                CORBA-ORB-OBJECTID-INTFREP. 
   CALL "CORBA-ORB-RESOLVE-INITIAL-REFERENCES" USING
                ORB
                TEMP-BUF
                ENV
                OBJ.

OOCOBOL
  01 ORB     OBJECT REFERENCE CORBA-ORB.
  01 OBJ     OBJECT REFERENCE CORBA-OBJECT.
  01 REP     OBJECT REFERENCE CORBA-REPOSITORY.

    INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
 *######## インタフェースリポジトリのオブジェクトリファレンス獲得
    INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_INTERFACERE-001
                                             RETURNING OBJ.
 *######## REPOSITORYクラスに変換
    INVOKE CORBA-REPOSITORY "NARROW" USING OBJ
                                      RETURNING REP. 

(2)OperationDefオブジェクトのオブジェクトリファレンスの獲得

対象のOperationDefオブジェクトのリポジトリIDである“IDL:test1/intf1/add:1.0”とルートリポジトリのオブジェクトリファレンスを指定してlookup_id()を発行すると、OperationDefオブジェクトのオブジェクトリファレンスが獲得できます。


C言語
CORBA_Contained intfobj; 
/* オブジェクトの検索 */
intfobj = CORBA_Repository_lookup_id(intf_rep, "IDL:test1/intf1/add:1.0", &env);

C++言語
CORBA::Object_ptr intfobj; 
// オブジェクトの検索
intfobj = intf_rep->lookup_id( "IDL:test1/intf1/add:1.0", *env );

Java言語
org.omg.CORBA.Object      obj;

// オブジェクトの検索
obj = Rep.lookup_id( "IDL:test1/intf1/add:1.0" );

COBOL
*########## インタフェースリポジトリのオブジェクト検索 ##########
     MOVE FUNCTION LENG ("IDL:test1/intf1/add:1.0") TO STRING-LENGTH
     MOVE "IDL:test1/intf1/add:1.0" TO IN-BUF
     CALL "CORBA-STRING-SET" USING
                REPOSITORYID
                STRING-LENGTH
                IN-BUF. 
     CALL "CORBA-REPOSITORY-LOOKUP-ID" USING
                OBJ
                REPOSITORYID
                ENV
                INTF-INTF.

OOCOBOL
 01 R-OBJ    OBJECT REFERENCE CORBA-OBJECT.

*######## インタフェースリポジトリのオブジェクト検索
     INVOKE REP "LOOKUP_ID" USING "IDL:test1/intf1/add:1.0"
                            RETURNING R-OBJ.

(3)パラメタ情報の獲得

OperationDefオブジェクトのオブジェクトリファレンスを指定してdescribeメソッドを呼び出すことにより、サーバアプリケーションが持っているメソッドの情報をインタフェースリポジトリから検索します。その結果、パラメタの情報(パラメタの名前、個数、パラメタの型など)が返されます。


C言語
CORBA_Contained_Description       *ope_des; 
CORBA_OperationDescription        *o; 
CORBA_TCKind  kind; 
CORBA_ParDescriptionSeq           *parameters; 
CORBA_ParameterDescription        *prmp; 

/* OperationDefオブジェクトのインタフェース情報の獲得  */
ope_des = CORBA_OperationDef_describe(intfobj,&env); 
/* OperationDefオブジェクト固有情報構造体の取り出し    */
o = (CORBA_OperationDescription *)ope_des->value._value; 

parameters = &(o->parameters);  /* パラメタシーケンス情報を参照  */
/* パラメタ数の参照 */
printf("Parameter number = %d\n", parameters->_length ); 
for(k=0,prmp=parameters->_buffer; k<parameters->_length; k++){
      /* パラメタの名前の参照            */
      printf("Parameter Identifier(%d) = %s\n", k, prmp[k].name); 
      /* パラメタの型の参照              */
      kind = CORBA_TypeCode_kind(prmp[k].type,&env); 
      printf("TypeCode_kind(%d) = %d\n",k,kind); 
      /* パラメタのモード(IN/OUT/INOUT)  */
      printf("Parameter_mode(%d) = %d\n",k, prmp[k].mode); 
}

C++言語
CORBA::OperationDef_ptr opef; 
CORBA::Contained::Description  *desc; 
CORBA::OperationDescription    *c; 

// OperationDefオブジェクトのインタフェース情報の獲得
opef = CORBA::OperationDef::_narrow(intfobj); 
desc   = opef->describe(*env); 
// OperationDefオブジェクト固有情報構造体の取り出し
CORBA::Any *opeany = (CORBA::Any*)(desc->value); 
c = (CORBA::OperationDescription *)opeany->value();
// パラメタシーケンス情報を参照
CORBA::ParDescriptionSeq *parseq = (CORBA::ParDescriptionSeq*)c->parameters; 
// パラメタ数の参照
printf("Parameter number = %d\n", parseq->length() ); 
for( int n = 0;n < parseq->length(); n++) {   
      CORBA::ParameterDescription *parades =
               (CORBA::ParameterDescription*)(*parseq)[m]; 
      // パラメタの名前の参照
      printf("para name = %s \n", (char*)parades->name); 
      // パラメタの型の参照
      CORBA::TypeCode
      *typecode2 = (CORBA::TypeCode *)(parades->type); 
      kind = typecode2->kind(*env); 
      printf("TypeCode_kind = %d\n",kind); 

      // パラメタのモード(IN/OUT/INOUT) 
      printf("para mode = %d \n", parades->mode); 
}

Java言語
org.omg.CORBA.OperationDef                  opef;
org.omg.CORBA.ContainedPackage.Description  desc;
org.omg.CORBA.OperationDescription          c;
org.omg.CORBA.ParameterDescription          paraseq[];

// OperationDefオブジェクトのインタフェース情報の獲得
opef = org.omg.CORBA.OperationDefHelper.narrow( obj );
desc = opef.describe();
// OperationDefオブジェクト固有情報構造体の取り出し
org.omg.CORBA.Any opeany = desc.value;
c = ( org.omg.CORBA.OperationDescription )
          org.omg.CORBA.OperationDescriptionHelper.extract( opeany );
// パラメタシーケンス情報を参照
paraseq = c.parameters;
// パラメタ数の参照
inoutcc.output( "Parameter number = " + paraseq.length );
for( i = 0; i < paraseq.length; i++ ) {
    parades = paraseq[i];
    // パラメタの名前の参照
    inoutcc.output( "para name = " + parades.name );
    // パラメタの型の参照
    typecode = parades.type;
    kind = typecode.kind().value();
    inoutcc.output( "TypeCode_kind = " + kind );

    // パラメタのモード
    inoutcc.output( "para mode = " + parades.mode.value() );
}

COBOL
*########## OperationDefオブジェクトのインタフェース情報の獲得 ##########
   CALL "CORBA-OPERATIONDEF-DESCRIBE" USING
                OBJ
                ENV
                LINK-BUF. 
*--- OperationDefオブジェクト固有情報構造体の取り出し ---
   SET ADDRESS OF LINK-CONDES TO LINK-BUF. 
   MOVE IDL-VALUE OF LINK-CONDES TO TMP-ANY. 
   MOVE ANY-VALUE OF TMP-ANY TO TEMP-BUF. 
   SET ADDRESS OF TMP-OPR TO TEMP-BUF. 
   MOVE FUNCTION ADDR(PARAMETERS OF TMP-OPR) TO TEMP-BUF. 
   SET ADDRESS OF PARDESSEQ TO TEMP-BUF. 

*---- パラメタシーケンス情報を参照 ---
*---- パラメタ数の参照 ---
   IF SEQ-LENGTH OF PARDESSEQ = 0
        DISPLAY "PARA-LENGTH = 0"
   END-IF. 
   DISPLAY "PARAMETER NUMBER = "  SEQ-LENGTH OF PARDESSEQ. 
   PERFORM TEST BEFORE
           VARYING CNT FROM 1 BY 1
               UNTIL CNT > SEQ-LENGTH OF PARDESSEQ
           CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
                 TEMP-BUF
                 CNT
                 ELEMENT-TYPE
           SET  ADDRESS OF TMP-PARA TO ELEMENT-TYPE
*----        パラメタの名前の参照     ----
           MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
           CALL "CORBA-STRING-GET" USING
               NAME OF TMP-PARA
               STRING-LENGTH
               DSP-BUF
           DISPLAY "NAME=" DSP-BUF
*----        パラメタの型の参照     ----
           CALL "CORBA-TYPECODE-KIND" USING
                IDL-TYPE OF TMP-PARA
                ENV
                TMP-KIND
           DISPLAY "TYPECODE KIND=" TMP-KIND
*----        パラメタのモード(IN/OUT/INOUT)    ----
           DISPLAY "PARA MODE=" IDL-MODE OF TMP-PARA
   END-PERFORM.

OOCOBOL
   01 OPEF          OBJECT REFERENCE CORBA-OPERATIONDEF.
   01 DESC          OBJECT REFERENCE CORBA-CONTAINED-DESCRIPTION.
   01 OPE-ANY       OBJECT REFERENCE CORBA-ANY.
   01 C             OBJECT REFERENCE CORBA-OPERATIONDESCRIPTION.
   01 PARAMSEQ      TYPE CORBA-PARDESCRIPTIONSEQ.
   01 PARADES       OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION.
   01 STR           OBJECT REFERENCE CORBA-STRING.
   01 TYPECODE      OBJECT REFERENCE CORBA-TYPECODE.
   01 PARA-NAME     PIC X(40).
   01 SEQ-LEN       TYPE CORBA-LONG.
   01 N             TYPE CORBA-UNSIGNED-LONG.
   01 TCK           TYPE CORBA-TCKIND.
   01 PARA-MODE     TYPE CORBA-PARAMETERMODE.

*######## OperationDefオブジェクトのインタフェース情報の獲得
     INVOKE CORBA-OPERATIONDEF "NARROW" USING INTF-OBJ
                                        RETURNING OPEF
     INVOKE OPEF "DESCRIBE" RETURNING DESC.
     SET OPE-ANY TO IDL-VALUE OF DESC.
*
     INVOKE CORBA-OPERATIONDESCRIPTION--H "EXTRACT" USING OPE-ANY
                                                    RETURNING C.
*######## パラメタシーケンス情報を参照
     SET PARAMSEQ TO PARAMETERS OF C.
*######## パラメタ数の参照
     MOVE SEQ-LENGTH OF PARAMSEQ TO SEQ-LEN.
     DISPLAY "PARAMETER NUMBER = " SEQ-LEN.
     PERFORM VARYING  N FROM 1 BY 1 UNTIL SEQ-LEN < N
        INVOKE PARAMSEQ "GET-VALUE" USING N
                                   RETURNING  PARADES
*######## パラメタの名前の参照
        SET STR TO NAME OF PARADES
        INVOKE STR "GET-VALUE" RETURNING  PARA-NAME
        DISPLAY " PARA NAME = " PARA-NAME
*######## パラメタの型の参照
        SET TYPECODE TO IDL-TYPE OF PARADES
        INVOKE TYPECODE "KIND" RETURNING TCK
        DISPLAY "TYPECODE_KIND = " TCK
*######## パラメタのモード
        MOVE IDL-MODE OF PARADES TO PARA-MODE
        DISPLAY "PARA MODE = " PARA-MODE
     END-PERFORM.

例2:StructDefオブジェクト、AliasDefオブジェクトの情報の獲得

以下のIDL定義に対するStructDefオブジェクト(構造体定義)、AliasDefオブジェクト(typedef定義情報)の情報を獲得するプログラミングについて説明します。

module test3 {
    struct  struct1{
        long  para1; 
        short para2; 
    };
    typedef  string<50>  string1; 
    interface intf1  {
        long  ope1(in  struct1  struct1_data, in string1 string1_data); 
    };
};

上記のIDL定義の場合、以下のオブジェクトがインタフェースリポジトリサービスに格納されます。



(1)オブジェクトリファレンスの獲得

OperationDefオブジェクトのパラメタ情報より、StructDefオブジェクト、AliasDefオブジェクトのオブジェクトリファレンスを獲得します。


C言語
CORBA_Repository               intf_rep; 
CORBA_Contained                intfobj; 
CORBA_Contained_Description    *ope_des; 
CORBA_OperationDescription     *o; 
CORBA_TCKind                   kind; 
CORBA_ParDescriptionSeq        *parameters; 
CORBA_ParameterDescription     *prmp; 
CORBA_StructDef                StructObj; 
CORBA_AliasDef                 AliasObj; 

/* インタフェースリポジトリのオブジェクトリファレンス獲得 */
intf_rep = CORBA_ORB_resolve_initial_references(
              orb,CORBA_ORB_ObjectId_InterfaceRepository, &env); 

/* オブジェクトの検索 */
intfobj = CORBA_Repository_lookup_id(intf_rep, "IDL:test1/intf1/ope1:1.0", &env); 

/* OperationDefオブジェクトのインタフェース情報の獲得  */
ope_des = CORBA_OperationDef_describe(intfobj,&env); 
exception_check("CORBA_OperationDef_describe");
/* OperationDefオブジェクト固有情報構造体の取り出し    */
o = (CORBA_OperationDescription *)ope_des->value._value; 

parameters = &(o->parameters);  /* パラメタシーケンス情報を参照  */
for(k=0,prmp=parameters->_buffer; k<parameters->_length; k++){
      /* パラメタの型の参照              */
      kind = CORBA_IRObject__get_def_kind(prmp[k].type_def,&env); 
      if(kind == CORBA_dk_Struct) 
           /* StructObjにStructDefのオブジェクトリファレンス設定 */
           StructObj = (CORBA_StructDef)prmp[k].type_def; 
      else if(kind == CORBA_dk_Alias) 
             /* AliasObjにAliasDefのオブジェクトリファレンス設定 */
             AliasObj  = (CORBA_AliasDef)prmp[k].type_def; 
}

C++言語
CORBA::Object_ptr              obj; 
CORBA::Repository_ptr          intf_rep; 
CORBA::Contained_ptr           intfobj; 
CORBA::OperationDef_ptr        opef; 
CORBA::Contained::Description  *desc; 
CORBA::OperationDescription    *c; 
CORBA::IRObject_ptr            irobj; 
CORBA::StructDef_ptr           StructObj; 
CORBA::AliasDef_ptr            AliasObj; 
CORBA::IDLType_ptr             idltypep; 

// インタフェースリポジトリのオブジェクトリファレンス獲得
obj = orb->resolve_initial_references(
        CORBA_ORB_ObjectId_InterfaceRepository, *env ); 
// CORBA::Repositoryクラスに変換
intf_rep = CORBA::Repository::_narrow( obj ); 

// オブジェクトの検索
intfobj = intf_rep->lookup_id( "IDL:test3/intf1/ope1:1.0", *env ); 
if(intfobj == CORBA_OBJECT_NIL){ 
      /* オブジェクトが存在しない  */
      printf("Not Found Object\n");
      exit(1); 
}

// OperationDefオブジェクトのインタフェース情報の獲得
opef = CORBA::OperationDef::_narrow(intfobj); 
desc   = opef->describe(*env); 

// OperationDefオブジェクト固有情報構造体の取り出し
CORBA::Any *opeany = (CORBA::Any*)(desc->value); 
c = (CORBA::OperationDescription *)opeany->value();

// パラメタシーケンス情報を参照
CORBA::ParDescriptionSeq *parseq = (CORBA::ParDescriptionSeq*)c->parameters; 
for( int n = 0;n < parseq->length(); n++){ 
      CORBA::ParameterDescription *parades = 
                  (CORBA::ParameterDescription*)(*parseq)[n]; 
      // パラメタの型の参照
      objvar = (CORBA::Object_var*)&(parades->type_def); 
      idlobj = (CORBA::Object_ptr)(*objvar); 
      idltypep = CORBA::IDLType::_narrow( idlobj ); 
      kind  = idltypep->def_kind(*env); 
      if(kind == CORBA::dk_Struct) 
            // StructObjにStructDefのオブジェクトリファレンス設定
            StructObj = CORBA::StructDef::_narrow(idltypep); 
      else if(kind == CORBA::dk_Alias) 
            // AliasObjにAliasDefのオブジェクトリファレンス設定
            AliasObj  = CORBA::AliasDef::_narrow(idltypep); 
}

Java言語
org.omg.CORBA.Object                        Obj;
org.omg.CORBA.Repository                    Rep;
org.omg.CORBA.Object                        obj;
org.omg.CORBA.OperationDef                  opef;
org.omg.CORBA.ContainedPackage.Description  desc;
org.omg.CORBA.OperationDescription          c;
org.omg.CORBA.ParameterDescription          paraseq[];
org.omg.CORBA.ParameterDescription          parades;
int                                         kind;
org.omg.CORBA.IDLType                       idltype;
org.omg.CORBA.AliasDef                      AliasObj;
org.omg.CORBA.StructDef                     StructObj;

// インタフェースリポジトリのオブジェクトリファレンス獲得
Obj = Orb.resolve_initial_references( "InterfaceRepository" );
// RepositoryHelperクラスに変換
Rep = org.omg.CORBA.RepositoryHelper.narrow( Obj );
// オブジェクトの検索
obj = Rep.lookup_id( "IDL:test3/intf1/ope1:1.0" );
// OperationDefオブジェクトのインタフェース情報の獲得
opef = org.omg.CORBA.OperationDefHelper.narrow( obj );
desc = opef.describe();

// OperationDefオブジェクト固有情報構造体の取り出し
org.omg.CORBA.Any opeany = desc.value;
c = ( org.omg.CORBA.OperationDescription )
    org.omg.CORBA.OperationDescriptionHelper.extract( opeany );
// パラメタシーケンス情報を参照
paraseq = c.parameters;
for( i = 0; i < paraseq.length; i++ ) {
    // パラメタの型の参照
    parades = paraseq[i];
    idltype = org.omg.CORBA.IDLTypeHelper.narrow( parades.type_def );
    kind = idltype.def_kind();
    if( kind == org.omg.CORBA.DefinitionKind.dk_Struct.value() ) {
        // StructObjにStructDefのオブジェクトリファレンス設定
        StructObj = org.omg.CORBA.StructDefHelper.narrow( obj );
    } else if( kind == org.omg.CORBA.DefinitionKind.dk_Alias.value() ) {
        // AliasObjにAliasDefのオブジェクトリファレンス設定
        AliasObj = org.omg.CORBA.AliasDefHelper.narrow(stcf);
    }
}

COBOL
*########## インタフェースリポジトリのオブジェクト検索 ##########
     MOVE FUNCTION LENG ("IDL:test3/intf1/ope1:1.0") TO STRING-LENGTH. 
     MOVE "IDL:test3/intf1/ope1:1.0" TO REP-BUF. 
     CALL "CORBA-STRING-SET" USING
                REPOSITORYID
                STRING-LENGTH
                REP-BUF. 
     CALL "CORBA-REPOSITORY-LOOKUP-ID" USING
                OBJ
                REPOSITORYID
                ENV
                INTF-INTF. 
     CALL "CORBA-FREE" USING REPOSITORYID. 
*--- オブジェクトが存在するかのチェック ---
     CALL "CORBA-OBJECT-IS-NIL" USING
                INTF-INTF
                ENV
                TMP-RESULT. 
     IF TMP-RESULT = CORBA-TRUE
*--- オブジェクトは存在しない ---
          DISPLAY "Null Object Reference"
          GO TO MAIN-END
     END-IF. 

*########## OperationDefオブジェクトのインタフェース情報の獲得 ##########
   MOVE INTF-INTF TO OBJ. 
   CALL "CORBA-OPERATIONDEF-DESCRIBE" USING
                OBJ
                ENV
                LINK-BUF. 
   MOVE "CORBA-OPERATIONDEF--DESCRIBE" TO MESS. 
   PERFORM ENV-CHECK. 
*--- OperationDefオブジェクト固有情報構造体の取り出し ---
   SET ADDRESS OF LINK-CONDES TO LINK-BUF. 
   MOVE IDL-VALUE OF LINK-CONDES TO TMP-ANY. 
   MOVE ANY-VALUE OF TMP-ANY TO TEMP-BUF. 
   SET ADDRESS OF TMP-OPR TO TEMP-BUF. 
   MOVE FUNCTION ADDR(PARAMETERS OF TMP-OPR) TO TEMP-BUF. 
   SET ADDRESS OF PARDESSEQ TO TEMP-BUF. 
*---- パラメタシーケンス情報を参照 ---
   IF SEQ-LENGTH OF PARDESSEQ = 0
*---- パラメタがない ---
        DISPLAY "PARA-LENGTH = 0"
   END-IF. 
   PERFORM TEST BEFORE
           VARYING CNT FROM 1 BY 1
               UNTIL CNT > SEQ-LENGTH OF PARDESSEQ
           CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
                 TEMP-BUF
                 CNT
                 ELEMENT-TYPE
           SET  ADDRESS OF TMP-PARA TO ELEMENT-TYPE
           MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
*---         パラメタの型の参照  ----
           CALL "CORBA-TYPECODE-KIND" USING
                IDL-TYPE OF TMP-PARA
                ENV
                TMP-KIND
           MOVE TMP-KIND TO TYPE-KIND
           IF  CORBA-TK-STRUCT OF  TYPE-KIND
*---              STRUCT-OBJにSTRUCTDEFのオブジェクトリファレンス設定
                MOVE TYPE-DEF OF TMP-PARA TO STRUCT-OBJ
           ELSE
                IF  CORBA-TK-ALIAS OF TYPE-KIND
*---                    ALIAS-OBJにALIASDEFのオブジェクトリファレンス設定
                      MOVE TYPE-DEF OF TMP-PARA TO  ALIAS-OBJ
                END-IF
           END-IF
   END-PERFORM.

OOCOBOL
   01 ORB           OBJECT REFERENCE CORBA-ORB.
   01 OBJ           OBJECT REFERENCE CORBA-OBJECT.
   01 REP           OBJECT REFERENCE CORBA-REPOSITORY.
   01 CONTAINED-OBJ OBJECT REFERENCE CORBA-CONTAINED.
   01 DESC          OBJECT REFERENCE CORBA-CONTAINED-DESCRIPTION.
   01 OPE-ANY       OBJECT REFERENCE CORBA-ANY.
   01 C             OBJECT REFERENCE CORBA-OPERATIONDESCRIPTION.
   01 PARAMSEQ      TYPE CORBA-PARDESCRIPTIONSEQ.
   01 PARADES       OBJECT REFERENCE CORBA-PARAMETERDESCRIPTION.
   01 STR           OBJECT REFERENCE CORBA-STRING.
   01 IDLTYPE       OBJECT REFERENCE CORBA-IDLTYPE.
   01 PARA-NAME     PIC X(40).
   01 SEQ-LEN       TYPE CORBA-LONG.
   01 N             TYPE CORBA-UNSIGNED-LONG.
   01 TCK           TYPE CORBA-TCKIND.
   01 PARA-MODE     TYPE CORBA-PARAMETERMODE.
   01 KIND          TYPE CORBA-DEFINITIONKIND.
   01 ALIAS-OBJ     OBJECT REFERENCE CORBA-OBJECT.
   01 ALIASDEF-OBJ  OBJECT REFERENCE CORBA-ALIASDEF.
   01 OPEF          OBJECT REFERENCE CORBA-OPERATIONDEF.
   01 TYPECODE      OBJECT REFERENCE CORBA-TYPECODE.
   01 MEM-NAME      PIC X(20).
   01 STRUCT-OBJ    OBJECT REFERENCE CORBA-OBJECT.
   01 STRUCTDEF-OBJ OBJECT REFERENCE CORBA-STRUCTDEF.
   01 TYPE_DEF      PIC X(40).
   01 ID-NAME       OBJECT REFERENCE CORBA-STRING.

     INVOKE CORBA "ORB_INIT" USING APL-NAME FJ-OM_ORBID RETURNING ORB.
*######## インタフェースリポジトリのオブジェクトリファレンス獲得
     INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-OBJECTID_INTERFACERE-001
                                             RETURNING OBJ.
*######## REPOSITORYクラスに変換
     INVOKE CORBA-REPOSITORY "NARROW" USING OBJ
                                      RETURNING REP.
*######## オブジェクトの検索
     INVOKE REP "LOOKUP_ID" USING "IDL:test3/intf1/ope1:1.0"
                            RETURNING OBJ.
*######## OperationDefオブジェクト固有情報構造体の取り出し
     INVOKE CORBA-OPERATIONDEF "NARROW" USING OBJ
                                        RETURNING OPEF.
     INVOKE OPEF "DESCRIBE" RETURNING DESC.
     SET OPE-ANY TO IDL-VALUE OF DESC.
*
     INVOKE CORBA-OPERATIONDESCRIPTION--H "EXTRACT" USING OPE-ANY
                                                    RETURNING C.
*######## パラメタシーケンス情報を参照
     SET PARAMSEQ TO PARAMETERS OF C.
*######## パラメタ数の参照
     MOVE SEQ-LENGTH OF PARAMSEQ TO SEQ-LEN.
     DISPLAY "PARAMETER NUMBER = " SEQ-LEN.
     PERFORM VARYING  N FROM 1 BY 1 UNTIL SEQ-LEN < N
        INVOKE PARAMSEQ "GET-VALUE" USING N
                                   RETURNING  PARADES
*######## パラメタの型の参照
        SET IDLTYPE TO TYPE_DEF OF PARADES
        MOVE DEF_KIND OF IDLTYPE TO KIND
*######## 型のIDの取得
        SET TYPECODE TO IDL-TYPE OF PARADES
        INVOKE TYPECODE "ID" RETURNING ID-NAME
        INVOKE ID-NAME "GET-VALUE" RETURNING TYPE_DEF
*
        EVALUATE TRUE
        WHEN  CORBA-DK_STRUCT OF KIND
*######## STRUCT-OBJにStructDefのオブジェクトリファレンス設定
          INVOKE REP "LOOKUP_ID" USING TYPE_DEF
                                 RETURNING STRUCT-OBJ
          INVOKE CORBA-STRUCTDEF "NARROW" USING STRUCT-OBJ
                                          RETURNING STRUCTDEF-OBJ
        WHEN CORBA-DK_ALIAS  OF KIND
*######## ALIAS-OBJにAliasDefのオブジェクトリファレンス設定
          INVOKE REP "LOOKUP_ID" USING TYPE_DEF
                                 RETURNING ALIAS-OBJ
          INVOKE CORBA-ALIASDEF "NARROW" USING ALIAS-OBJ
                                         RETURNING ALIASDEF-OBJ
        END-EVALUATE
   END-PERFORM.

(2)StructDefオブジェクトのメンバ情報の獲得

StructDefオブジェクトのオブジェクトリファレンスを指定してmembersメソッドを発行すると、構造体のメンバ情報(識別名、タイプコード)がリスト形式で返されます。


C言語
CORBA_StructMemberSeq          *members; 
CORBA_StructMember             *str; 

/* 構造体のメンバ情報がリスト形式で返されます */
members = CORBA_StructDef__get_members(StructObj,&env); 

/* 構造体メンバの解析                         */
for(i=0,str=members->_buffer; i<members->_length;i++){
      /* 識別名の参照                       */
      printf("Identifier     : %s\n",str[i].name); 
      /* タイプコードの参照                 */
      printf("TypeCode_kind  : %d\n",CORBA_TypeCode_kind(str[i].type, &env)); 
}

C++言語
CORBA::StructDef_ptr          strobj; 
CORBA::StructMemberSeq        *structseq; 
CORBA::StructMember           *structmem; 
// 構造体のメンバ情報がリスト形式で返されます
strobj = CORBA::StructDef::_narrow(StructObj); 
structseq = strobj->members(*env); 
for(int y=0; y < structseq->length(); y++) {
      /* 識別名の参照                       */
      structmem = (CORBA::StructMember*)(*structseq)[y]; 
      printf( "name = %s\n", (char *)structmem->name ); 
      /* タイプコードの参照                 */
      CORBA::TypeCode
      *typecode2 = (CORBA::TypeCode *)(structmem->type); 
      kind = typecode2->kind(*env); 
      printf("TypeCode_kind = %d\n",kind); 
}

Java言語
org.omg.CORBA.StructDef     strobj;
org.omg.CORBA.StructMember  structseq[];
org.omg.CORBA.StructMember  structmem;
org.omg.CORBA.TypeCode      typecode;
int                         tkind;

// 構造体のメンバ情報がリスト形式で返されます
strobj = org.omg.CORBA.StructDefHelper.narrow( StructObj );
structseq = strobj.members();
for( i = 0; i < structseq.length; i++ ) {
    // 識別名の参照
    structmem = structseq[i];
    inoutcc.output( "name = " + structmem.name );
    // タイプコードの参照
    typecode = structmem.type;
    tkind = typecode.kind().value();
    inoutcc.output( "TypeCode_kind = " + tkind );
}

COBOL
*##########  構造体のメンバ情報がリスト形式で返されます ##########
   CALL "CORBA-STRUCTDEF--GET-MEMBERS" USING
                STRUCT-OBJ
                ENV
                LINK-BUF. 
   SET ADDRESS OF STRMEMSEQ TO LINK-BUF. 
   IF SEQ-LENGTH OF STRMEMSEQ = 0
        DISPLAY "STRMEM-LENGTH = 0"
   END-IF. 
   PERFORM TEST BEFORE
           VARYING CNT FROM 1 BY 1
               UNTIL CNT > SEQ-LENGTH OF STRMEMSEQ
           CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
                 LINK-BUF
                 CNT
                 ELEMENT-TYPE

           SET  ADDRESS OF STRMEM TO ELEMENT-TYPE
*---         識別名の参照      ---
           MOVE FUNCTION LENG (DSP-BUF) TO STRING-LENGTH
           CALL "CORBA-STRING-GET" USING
               NAME OF STRMEM
               STRING-LENGTH
               DSP-BUF
           DISPLAY "NAME=" DSP-BUF
*---         タイプコードの参照   ---
           CALL "CORBA-TYPECODE-KIND" USING
                IDL-TYPE OF STRMEM
                ENV
                TMP-KIND
           DISPLAY "TYPECODE KIND=" TMP-KIND
   END-PERFORM.

OOCOBOL
   01 MEM-STR       OBJECT REFERENCE CORBA-STRING.
   01 TKIND         TYPE CORBA-TCKIND.
   01 STRUCT-MEM    OBJECT REFERENCE CORBA-STRUCTMEMBER.
   01 I             TYPE CORBA-UNSIGNED-LONG.
   01 MEM-NUM       TYPE CORBA-UNSIGNED-LONG.
   01 STRUCT-SEQ    TYPE CORBA-STRUCTMEMBERSEQ.

*######## 構造体のメンバ情報がリスト形式で返されます
        SET STRUCT-SEQ TO MEMBERS OF STRUCTDEF-OBJ
        MOVE SEQ-LENGTH OF STRUCT-SEQ TO MEM-NUM
        PERFORM VARYING I FROM 1 BY 1 UNTIL MEM-NUM < I
*######## 識別名の参照
           INVOKE STRUCT-SEQ "GET-VALUE" USING I
                                         RETURNING STRUCT-MEM
           SET MEM-STR TO NAME OF STRUCT-MEM
           INVOKE MEM-STR "GET-VALUE" RETURNING MEM-NAME
           DISPLAY "NAME = " MEM-NAME
*######## タイプコードの参照
           SET TYPECODE TO IDL-TYPE OF STRUCT-MEM
           INVOKE TYPECODE "KIND" RETURNING TKIND
           DISPLAY "TYPECODE_KIND = " TKIND
        END-PERFORM

(3)StringDefオブジェクトのオブジェクトリファレンスの獲得

AliasDefオブジェクトのオブジェクトリファレンスを指定してoriginal_type_defメソッドを発行すると、StringDefオブジェクトのオブジェクトリファレンスが返されます。


C言語
CORBA_IDLType  originalobj; 
/* StringDefオブジェクトのオブジェクトの獲得 */
originalobj = CORBA_AliasDef__get_original_type_def(AliasObj,&env);

C++言語
CORBA::IDLType_ptr  originalobj; 
// StringDefオブジェクトのオブジェクトの獲得
originalobj = AliasObj->original_type_def(*env);

Java言語
CORBA.IDLType         originalobj; 
// StringDefオブジェクトのオブジェクトの獲得
originalobj = AliasObj.original_type_def();

COBOL
*########## StringDefオブジェクトのオブジェクトの獲得 ##########
   CALL "CORBA-ALIASDEF--GET-ORIGINAL-TYPE-DEF" USING
                ALIAS-OBJ
                ENV
                IDLTYPE.

OOCOBOL
 01 ORIGINALOBJ   OBJECT REFERENCE CORBA-IDLTYPE.
 01 TMP-OBJ       OBJECT REFERENCE CORBA-OBJECT.

*######## StringDefオブジェクトのオブジェクトの獲得
       SET ORIGINALOBJ TO ORIGINAL_TYPE_DEF OF ALIASDEF-OBJ
       SET TMP-OBJ TO ORIGINALOBJ

(4)StringDefオブジェクトの情報獲得

StringDefオブジェクトのオブジェクトリファレンスを指定してboundメソッドを発行すると、最大文字列長が返されます。


C言語
CORBA_unsigned_long bound; 
/* StringDefオブジェクトの最大文字列長の獲得 */
bound = CORBA_StringDef__get_bound(originalobj,&env);

C++言語
CORBA::ULong          len; 
CORBA::StringDef_ptr  stringobj; 
// StringDefオブジェクトの最大文字列長の獲得
stringobj = CORBA::StringDef::_narrow(originalobj); 
len = stringobj->bound(*env);

Java言語
org.omg.CORBA.StringDef     stringobj;
int                         len;
// StringDefオブジェクトの最大文字列長の獲得
stringobj = org.omg.CORBA.StringDefHelper.narrow( originalobj );
len = stringobj.bound();

COBOL
*--- StringDefオブジェクトの最大文字列長の獲得 ---
   MOVE IDLTYPE TO TMP-OBJ. 
   CALL "CORBA-STRINGDEF--GET-BOUND" USING
                TMP-OBJ
                ENV
                BOUND.

OOCOBOL
 01 STRINGDEF-OBJ OBJECT REFERENCE CORBA-STRINGDEF.
 01 LEN           TYPE CORBA-UNSIGNED-LONG.

*######## StringDefオブジェクトの最大文字列長の獲得
      INVOKE CORBA-STRINGDEF "NARROW" USING TMP-OBJ
                                      RETURNING STRINGDEF-OBJ
      MOVE BOUND OF STRINGDEF-OBJ TO LEN