5.4.1 ステップ1: OMG IDLコードの記述

他のCORBAインタフェースの場合と同じように、トランザクションに関係するインタフェースをObject Management Group (OMG)のインタフェース定義言語(IDL)で指定する必要があります。また、そのインタフェースを使用して発生する可能性のあるすべてのユーザー例外を指定することも必要です。

Transactionsサンプル・アプリケーションでは、Registrarインタフェースとregister_for_courses()操作をOMG IDLで定義します。register_for_courses()操作には、NotRegisteredListというパラメータがあります。このパラメータは、登録の失敗したコースのリストをCORBAクライアント・アプリケーションに返します。NotRegisteredListの値が空の場合、CORBAクライアント・アプリケーションはトランザクションをコミットします。また、TooManyCreditsユーザー例外も定義する必要があります。

次のコード・スニペットには、Transactionsサンプル・アプリケーションのOMG IDLコードが含まれています。

#pragma prefix "beasys.com"

module UniversityT {
  typedef unsigned long CourseNumber;
  typedef sequence<CourseNumber>CourseNumberList;

  struct CourseSynopsis {
    CourseNumber course_number;
    string title;
  }

  ;
  typedef sequence<CourseSynopsis>CourseSynopsisList;

  interface CourseSynopsisEnumerator {
    //Returns a list of length 0 if there are no more entries
    CourseSynopsisList get_next_n(in unsigned long number_to_get, // 0 = return all
      out unsigned long number_remaining);
    void destroy();
  }

  ;
  typedef unsigned short Days;
  const Days MONDAY=1;
  const Days TUESDAY=2;
  const Days WEDNESDAY=4;
  const Days THURSDAY=8;
  const Days FRIDAY=16;

  //Classes restricted to same time block on all scheduled days,
  //starting on the hour
  struct ClassSchedule {
    Days class_days; // bitmask of days
    unsigned short start_hour; // whole hours in military time
    unsigned short duration; // minutes
  }

  ;

  struct CourseDetails {
    CourseNumber course_number;
    double cost;
    unsigned short number_of_credits;
    ClassSchedule class_schedule;
    unsigned short number_of_seats;
    string title;
    string professor;
    string description;
  }

  ;
  typedef sequence<CourseDetails>CourseDetailsList;
  typedef unsigned long StudentId;

  struct StudentDetails {
    StudentId student_id;
    string name;
    CourseDetailsList registered_courses;
  }

  ;

  enum NotRegisteredReason {
    AlreadyRegistered,
    NoSuchCourse
  }

  ;

  struct NotRegistered {
    CourseNumber course_number;
    NotRegisteredReason not_registered_reason;
  }

  ;
  typedef sequence<NotRegistered>NotRegisteredList;

  exception TooManyCredits {
    unsigned short maximum_credits;
  }

  ;

  //The Registrar interface is the main interface that allows
  //students to access the database.
  interface Registrar {
    CourseSynopsisList get_courses_synopsis(in string search_criteria,
      in unsigned long number_to_get,
      out unsigned long number_remaining,
      out CourseSynopsisEnumerator rest);
    CourseDetailsList get_courses_details(in CourseNumberList courses);
    StudentDetails get_student_details(in StudentId student);
    NotRegisteredList register_for_courses(in StudentId student,
      in CourseNumberList courses) raises (TooManyCredits);
  }

  ;

  // The RegistrarFactory interface finds Registrar interfaces.
  interface RegistrarFactory {
    Registrar find_registrar();
  }

  ;