Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第10章 インタフェースリポジトリサービスのプログラミング> 10.4 インタフェースリポジトリサービスのプログラミング

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

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

 以下の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

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005