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();
}
;親トピック: 開発ステップ