擬似オブジェクトと Java のマッピング

6


6.1 はじめに

擬似オブジェクトという構造は、通常は「IDL」の中で定義が指定されていますが、そのマッピングは言語によって規定されています。通常、擬似オブジェクトは CORBA の正規のオブジェクトではありません。多くの場合、擬似オブジェクトは、プロセスまたはスレッドのローカルなプログラム言語構造としてクライアントやサーバに公開されます。

IDL の標準的な各擬似オブジェクトについては、Java 言語の特定の構造を指定するか、または擬似インタフェースとして指定します。

このマッピングは、バージョン 1.1 における C++ のマッピングに基づいています。

IDL 仕様の 4.1.3 節で認められているオプションについては、Status を void として定義するように選択し、Java のプログラマが利用しやすいようにこのオプションは取り除いてあります。

6.1.1 擬似インタフェース

擬似インタフェースを使用すると、この仕様で規定されている標準の言語マッピング規則の大部分を機械的に使用して、Java のコードを生成できます。ただし、一般に、結果として作成される構造は CORBA のオブジェクトではなく、次のような特徴があります。

注: PIDL の個々の部分について個別に定義すると、上記の一般的なガイドラインが無効になる場合があります。そのような場合は、個別に定義された内容が優先されます。

擬似インタフェースはすべて、次のような構造の中で定義されているものとしてマッピングされます。

module org {
	module omg { 
		module CORBA {
								...
つまり、擬似インタフェースは Java のパッケージ org.omg.CORBA にマッピングされます。

6.2 例外

標準の CORBA PIDL は、BoundsBadKind、および InvalidName の各例外を使用します。

これらの例外については、ホルダークラスとヘルパークラスが定義されないだけでなく、インタフェースリポジトリで定義されることもありません。ただし、これらの例外は、プログラミングの中で「標準の例外」として扱えるように、標準のユーザ例外としてマッピングされます。

これらの例外は、使用されるスコープの中で定義されます。Bounds 例外と BadKind 例外は、TypeCode インタフェースで使用できるよう TypeCodePackage の中で定義されます。Bounds 例外は、NVListExceptionListContextList の各インタフェースで使用できるよう、CORBA の標準モジュールの中で定義されます。InvalidName 例外は、ORB インタフェースで使用できるよう、ORBPackage の中で定義されます。

// Java
package org.omg.CORBA;
final public class Bounds 
	extends org.omg.CORBA.UserException {
	public Bounds() {...}
}
package org.omg.CORBA.TypeCodePackage;
final public class Bounds
	extends org.omg.CORBA.UserException {
	public Bounds() {...}
}
final public class BadKind 
	extends org.omg.CORBA.UserException {
	public BadKind() {...}
}
package org.omg.CORBA.ORBPackage;
final public class InvalidName
	extends org.omg.CORBA.UserException {
	public InvalidName() {...}
}

6.3 Environment

Environment は、例外情報を利用できるようにするため、要求オペレーションの中で使われます。

// Java code
package org.omg.CORBA;
public abstract class Environment {
	void exception(java.lang.Exception except);
	java.lang.Exception exception();
	void clear();
}

6.4 NamedValue

NamedValue は、名前と値の対を表しています。DII の中では引数と戻り値の記述に使われ、コンテキストルーチンの中ではプロパティと値の対を渡すために使われます。

Java では、名前、値 (any として)、およびフラグの集合を表す整数値を含みます。

typedef unsigned long Flags;
typedef string Identifier;
const Flags ARG_IN = 1;
const Flags ARG_OUT = 2;
const Flags ARG_INOUT = 3;
const Flags CTX_RESTRICT_SCOPE = 15;
pseudo interface NamedValue {
	readonly attribute Identifier name;
	readonly attribute any value;
	readonly attribute Flags flags;
};
// Java 
package org.omg.CORBA;
public interface ARG_IN {
	public static final int value = 1;
}
public interface ARG_OUT {
	public static final int value = 2;
}
public interface ARG_INOUT {
	public static final int value = 3;
}
public interface CTX_RESTRICT_SCOPE {
	public static final int value = 15;
}
public abstract class NamedValue {
	public abstract String name();
	public abstract Any value();
	public abstract int flags();
}

6.5 NVList

NVList は、DII の中では引数を記述するため、コンテキストルーチンの中ではコンテキストの値を記述するために使われます。

Java では、NamedValue の変更可能なリストを保持します。

pseudo interface NVList {
	readonly attribute unsigned long count;
	NamedValue add(in Flags flags);
	NamedValue add_item(in Identifier item_name, in Flags flags);
	NamedValue add_value(in Identifier item_name,
							 in any val, 
							 in Flags flags);
	NamedValue item(in unsigned long index) raises (CORBA::Bounds);
	void remove(in unsigned long index) raises (CORBA::Bounds);
};
// Java 
package org.omg.CORBA;
public abstract class NVList {
	public abstract int count();
	public abstract NamedValue add(int flags);
	public abstract NamedValue add_item(String item_name, int flags);
	public abstract NamedValue add_value(String item_name, Any val,
								int flags);
	public abstract NamedValue item(int index)
					throws org.omg.CORBA.Bounds;
	public abstract void remove(int index) throws org.omg.CORBA.Bounds;
}

6.6 ExceptionList

ExceptionList は、IDL オペレーションが発行できる例外を記述するため、DII の中で使われます。

Java では、TypeCode の変更可能なリストを保持します。

pseudo interface ExceptionList {
	readonly attribute unsigned long count;
	void add(in TypeCode exc);
	TypeCode item (in unsigned long index) raises (CORBA::Bounds);
	void remove (in unsigned long index) raises (CORBA::Bounds);
};
// Java 
package org.omg.CORBA;
public abstract class ExceptionList {
	public abstract int count();
	public abstract void add(TypeCode exc);
	public abstract TypeCode item(int index)
				throws org.omg.CORBA.Bounds;
	public abstract void remove(int index)
				throws org.omg.CORBA.Bounds;
}

6.7 Context

Context は、コンテキスト文字列を解決してから要求の呼び出しとともに送信する必要のあるコンテキストを指定するため、DII の中で使われます。

pseudo interface Context {
	readonly attribute Identifier context_name;
	readonly attribute Context parent;
	Context create_child(in Identifier child_ctx_name);
	void set_one_value(in Identifier propname, in any propvalue);
	void set_values(in NVList values);
	void delete_values(in Identifier propname);
	NVList get_values(in Identifier start_scope,
					     in Flags op_flags,
					     in Identifier pattern);
};
// Java 
package org.omg.CORBA;
public abstract class Context {
	public abstract String context_name();
	public abstract Context parent();
	public abstract Context create_child(String child_ctx_name);
	public abstract void set_one_value(String propname,
						Any propvalue);
	public abstract void set_values(NVList values);
	public abstract void delete_values(String propname);
	public abstract NVList get_values(String start_scpe, int op_flags,
						String pattern);
}

6.8 ContextList

pseudo interface ContextList {
	readonly attribute unsigned long count;
	void add(in string ctx);
	string item(in unsigned long index) raises (CORBA::Bounds);
	void remove(in unsigned long index) raises (CORBA::Bounds);
};
// Java 
package org.omg.CORBA;
public abstract class ContextList {
	public abstract int count();
	public abstract void add(String ctx);
	public abstract String item(int index)
		throws org.omg.CORBA.Bounds;
	public abstract void remove(int index)
		throws org.omg.CORBA.Bounds;
}

6.9 Request

pseudo interface Request {
	readonly attribute Object target; 
	readonly attribute Identifier operation; 
	readonly attribute NVList arguments; 
	readonly attribute NamedValue result;     
	readonly attribute Environment env;        
	readonly attribute ExceptionList exceptions;
	readonly attribute ContextList contexts;
	attribute Context ctx;
	any add_in_arg(); 
	any add_named_in_arg(in string name); 
	any add_inout_arg();
	any add_named_inout_arg(in string name); 
	any add_out_arg();
	any add_named_out_arg(in string name); 
	void set_return_type(in TypeCode tc);
	any return_value();
	void invoke();
	void send_oneway(); 
	void send_deferred();
	void get_response();
	boolean poll_response();
};
// Java 
package org.omg.CORBA;
public abstract class Request {
	public abstract Object target(); 
	public abstract String operation(); 
	public abstract NVList arguments(); 
	public abstract NamedValue result();     
	public abstract Environment env();        
	public abstract ExceptionList exceptions();
	public abstract ContextList contexts();
	public abstract Context ctx();
	public abstract void ctx(Context c);
	public abstract Any add_in_arg(); 
	public abstract Any add_named_in_arg(String name); 
	public abstract Any add_inout_arg();
	public abstract Any add_named_inout_arg(String name); 
	public abstract Any add_out_arg();
	public abstract Any add_named_out_arg(String name); 
	public abstract void set_return_type(TypeCode tc);
	public abstract Any return_value();
	public abstract void invoke();
	public abstract void send_oneway(); 
	public abstract void send_deferred();
	public abstract void get_response();
	public abstract boolean poll_response();
}

6.10 ServerRequest と DynamicImplementation

pseudo interface ServerRequest {
	Identifier op_name();
	Context ctx();   
	void params(in NVList parms); 
	void result(in Any res);  
	void   except(in Any ex); 
} ;
// Java 
package org.omg.CORBA;
public abstract class ServerRequest {
	public abstract String op_name();
	public abstract Context ctx();
	public abstract void params(NVList parms);
	public abstract void result(Any a);
	public abstract void except(Any a);
DynamicImplementation インタフェースは、動的サーバで実装される可能性のあるインタフェースを定義しています。このインタフェースは、スタブとスケルトンについては基底クラスから継承します (「8.5.2 移植性のある ObjectImpl」を参照)。

// Java
package org.omg.CORBA;
public abstract class DynamicImplementation
		extends org.omg.CORBA.portable.ObjectImpl {
	public abstract void invoke(org.omg.CORBA.ServerRequest request);
}

6.11 TypeCode

推奨されない parameter メソッドと param_count メソッドは、マッピングされません。

enum TCKind {
	tk_null, tk_void,
	tk_short, tk_long, tk_ushort, tk_ulong,
	tk_float, tk_double, tk_boolean, tk_char,
	tk_octet, tk_any, tk_TypeCode, tk_Principal, tk_objref,
	tk_struct, tk_union, tk_enum, tk_string,
	tk_sequence, tk_array, tk_alias, tk_except,
	tk_longlong, tk_ulonglong, tk_longdouble,
	tk_wchar, tk_wstring, tk_fixed
};
// Java 
package org.omg.CORBA;
public final class TCKind {
	public static final int _tk_null = 0;
	public static final 
		TCKind tk_null = new TCKind(_tk_null);
	public static final int _tk_void = 1;
		TCKind tk_void = new TCKind(_tk_void);
	public static final int _tk_short = 2;
		TCKind tk_short = new TCKind(_tk_short);
	public static final int _tk_long = 3;
		TCKind tk_long = new TCKind(_tk_long);
	public static final int _tk_ushort = 4;
		TCKind tk_ushort = new TCKind(_tk_ushort);
	public static final int _tk_ulong = 5;
		TCKind tk_ulong = new TCKind(_tk_ulong);
	public static final int _tk_float = 6;
		TCKind tk_float = new TCKind(_tk_float);
	public static final int _tk_double = 7;
		TCKind tk_double = new TCKind(_tk_double);
	public static final int _tk_boolean = 8;
		TCKind tk_boolean = new TCKind(_tk_boolean);
	public static final int _tk_char = 9;
		TCKind tk_char = new TCKind(_tk_char);
	public static final int _tk_octet = 10;
		TCKind tk_octet = new TCKind(_tk_octet);
	public static final int _tk_any = 11;
		TCKind tk_any = new TCKind(_tk_any);
	public static final int _tk_TypeCode = 12;
		TCKind tk_TypeCode = new TCKind(_tk_TypeCode);
	public static final int _tk_Principal = 13;
		TCKind tk_Principal = new TCKind(_tk_Principal);
	public static final int _tk_objref = 14;
		TCKind tk_objref = new TCKind(_tk_objref);
	public static final int _tk_stuct = 15;
		TCKind tk_stuct = new TCKind(_tk_stuct);
	public static final int _tk_union = 16;
		TCKind tk_union = new TCKind(_tk_union);
	public static final int _tk_enum = 17;
		TCKind tk_enum = new TCKind(_tk_enum);
	public static final int _tk_string = 18;
		TCKind tk_string = new TCKind(_tk_string);
	public static final int _tk_sequence = 19;
		TCKind tk_sequence = new TCKind(_tk_sequence);
	public static final int _tk_array = 20;
		TCKind tk_array = new TCKind(_tk_array);
	public static final int _tk_alias = 21;
		TCKind tk_alias = new TCKind(_tk_alias);
	public static final int _tk_except = 22;
		TCKind tk_except = new TCKind(_tk_except);
	public static final int _tk_longlong = 23;
		TCKind tk_longlong = new TCKind(_tk_longlong);
	public static final int _tk_ulonglong = 24;
		TCKind tk_ulonglong = new TCKind(_tk_ulonglong);
	public static final int _tk_longdouble = 25;
		TCKind tk_longdouble = new TCKind(_tk_longdouble);
	public static final int _tk_wchar = 26;
		TCKind tk_wchar = new TCKind(_tk_wchar);
	public static final int _tk_wstring = 27;
		TCKind tk_wstring = new TCKind(_tk_wstring);
	public static final int _tk_fixed = 28;
		TCKind tk_fixed = new TCKind(_tk_fixed);

	public int value() {...}
	public static TCKind from_int(int value) {...}
	private TCKind(int value) {...}
}
pseudo interface TypeCode {
	exception Bounds {};
	exception BadKind {};
	// for all TypeCode kinds
	boolean equal(in TypeCode tc);
	TCKind kind();
	// for objref, struct, union, enum, alias, and except
	RepositoryID id() raises (BadKind);
	RepositoryId name() raises (BadKind);
	// for struct, union, enum, and except
	unsigned long member_count() raises (BadKind);
	Identifier member_name(in unsigned long index)
		 raises (BadKind, Bounds);
	// for struct, union, and except
	TypeCode member_type(in unsigned long index) 
		raises (BadKind, Bounds);
	// for union
	any member_label(in unsigned long index) raises (BadKind, Bounds);
	TypeCode discriminator_type() raises (BadKind);
	long default_index() raises (BadKind);
	// for string, sequence, and array
	unsigned long length() raises (BadKind);
	TypeCode content_type() raises (BadKind);
	}
// Java
package org.omg.CORBA;
public abstract class TypeCode {
	// for all TypeCode kinds
	public abstract boolean equal(TypeCode tc);
	public abstract TCKind kind();
	// for objref, struct, unio, enum, alias, and except
	public abstract String id() throws TypeCodePackage.BadKind;
	public abstract String name() throws TypeCodePackage.BadKind;
	// for struct, union, enum, and except
	public abstract int member_count() throws TypeCodePackage.BadKind;
	public abstract String member_name(int index)
			throws TypeCodePackage.BadKind;
	// for struct, union, and except	
	public abstract TypeCode member_type(int index)
			throws TypeCodePackage.BadKind,
				TypeCodePackage.Bounds;
	// for union	
	public abstract Any member_label(int index)
			throws TypeCodePackage.BadKind,
						TypeCodePackage.Bounds;
	public abstract TypeCode discriminator_type()
			throws TypeCodePackage.BadKind;
	public abstract int default_index() throws TypeCodePackage.BadKind;
	// for string, sequence, and array
	public abstract int length() throws TypeCodePackage.BadKind;
	public abstract TypeCode content_type() throws TypeCodePackage.BadKind;
}

6.12 ORB


問題点 - create_named_value() は CORBA の仕様に適合していません。ここでは、正しい定義を使用しています。これは、CORBA 2.0 で変更されることが予定されています。
UnionMemeberSeqEnumMemberSeqStructMemberSeq の各 typedef は実際の IDL であり、インタフェースリポジトリに格納されます。そのインタフェースとほかのさまざまな型については記述しません。これらの typedef はすべて、「5. IDL と Java のマッピング」で説明されている規則に従ってマッピングされます。

StructMember[], UnionMember[], EnumMember[]

pseudo interface ORB {
	exception InvalidName {};               
	typedef string ObjectId;
	typedef sequence<ObjectId> ObjectIdList;
	ObjectIdList list_initial_services();
	Object resolve_initial_references(in ObjectId object_name)
		raises(InvalidName);
	string object_to_string(in Object obj);
	Object string_to_object(in string str);
	NVList create_list(in long count);
	NVList create_operation_list(in OperationDef oper);
	NamedValue create_named_value(in String name, in Any value,
					in Flags flags);
	ExceptionList create_exception_list();
	ContextList create_context_list();
	Context get_default_context();
	Environment create_environment();
	void send_multiple_requests_oneway(in RequestSeq req);
	void send_multiple_requests_deferred(in RequestSeq req);
	boolean poll_next_response();
	Request get_next_response();
// typecode creation
	TypeCode create_struct_tc (	in RepositoryId id,
			in Identifier name,
			in StructMemberSeq members);
	TypeCode create_union_tc (	in RepositoryId id,
 			in Identifier name,
			in TypeCode discriminator_type,
			in UnionMemberSeq members);
	TypeCode create_enum_tc (	in RepositoryId id,
			in Identifier name,
			in EnumMemberSeq members);
	TypeCode create_alias_tc (	in RepositoryId id,
			in Identifier name,
			in TypeCode original_type);
	TypeCode create_exception_tc (	in RepositoryId id, 
			in Identifier name,
			in StructMemberSeq members);
	TypeCode create_interface_tc (	in RepositoryId id,
			in Identifier name);
	TypeCode create_string_tc (in unsigned long bound);
	TypeCode create_wstring_tc (in unsigned long bound);
	TypeCode create_sequence_tc (in unsigned long bound,
			in TypeCode element_type);
	TypeCode create_recursive_sequence_tc(in unsigned long bound,
			in unsigned long offset);
	TypeCode create_array_tc (in unsigned long length,
			in TypeCode element_type);
	Current get_current();
// Additional operations for Java mapping
	TypeCode get_primitive_tc(in TCKind tcKind);
	Any create_any();
	OutputStream create_output_stream();
	void connect(Object obj);
	void disconnect(Object obj);
// additional methods for ORB initialization go here, but only
// appear in the mapped Java (「8.8 ORB の初期化」を参照)
// Java signatures
//	public static ORB init(Strings[] args, Properties props);
//	public static ORB init(Applet app, Properties props);
//	public static ORB init();
// abstract protected void set_parameters(String[] args,
//			java.util.Properties props);
// abstract protected void set_parameters(java.applet.Applet app,
//			java.util.Properties props);
}
// Java
package org.omg.CORBA;
public abstract class ORB {
	public abstract String[] list_initial_services();
	public abstract org.omg.CORBA.Object resolve_initial_references(
		String object_name)
		throws org.omg.CORBA.ORBPackage.InvalidName;
	public abstract String object_to_string(org.omg.CORBA.Object obj);
	public abstract org.omg.CORBA.Object string_to_object(String str);
	public abstract NVList create_list(int count);
	public abstract NVList create_operation_list(OperationDef oper);
	public abstract NamedValue create_named_value(String name,
				  	Any value,
			  		int flags);
	public abstract ExceptionList create_exception_list();
	public abstract ContextList create_context_list();
	public abstract Context get_default_context();
	public abstract Environment create_environment();
	public abstract void send_multiple_requests_oneway(Request[] req);
	public abstract void sent_multiple_requests_deferred(Request[] req);
	public abstract boolean poll_next_response();
	public abstract Request get_next_response();
	// typecode creation
	public abstract TypeCode create_struct_tc(String id,
						String name,
						StructMember[] members);
	public abstract TypeCode create_union_tc(String id,
						String name,
						TypeCode discriminator_type,
						UnionMember[] members);
	public abstract TypeCode create_enum_tc(String id,
						String name,
						EnumMember[] members);
	public abstract TypeCode create_alias_tc(String id,
						String name,
						TypeCode original_type);
	public abstract TypeCode create_exception_tc(String id,
						String name,
						StructMember[] members);
	public abstract TypeCode create_interface_tc(String id,
						String name);
	public abstract TypeCode create_string_tc(int bound);
	public abstract TypeCode create_wstring_tc(int bound);
	public abstract TypeCode create_sequence_tc(int bound,
						TypeCode element_type);
	public abstract TypeCode create_recursive_sequence_tc(int bound,
						int offset);
	public abstract TypeCode create_array_tc(int length,
						TypeCode element_type);
	public abstract Current get_current();
	// additional methods for IDL/Java mapping
	public abstract TypeCode get_primitive_tc(TCKind tcKind);
	public abstract Any create_any();
	public abstract org.omg.CORBA.portable.OutputStream
		create_output_stream();
	public abstract void connect(org.omg.CORBA.Object obj);
	public abstract void disconnect(org.omg.CORBA.Object obj);
	// additional static methods for ORB initialization
	public static ORB init(Strings[] args, Properties props);
	public static ORB init(Applet app, Properties props);
	public static ORB init();
	abstract protected void set_parameters(String[] args,
					java.util.Properties props);
	abstract protected void set_parameters(java.applet.Applet app,
					java.util.Properties props);
}

6.13 CORBA::Object

IDL の Object 型は、次のように、org.omg.CORBA.Object と org.omg.CORBA.ObjectHelper クラスにマッピングされます。

IDL のユーザ定義の各 interface に対する Java のインタフェースは org.omg.CORBA.Object を継承するので、org.omg.CORBA.Object が受け付けられる場所であればどこでも、任意のオブジェクト参照を渡すことができます。

// Java
package org.omg.CORBA;
public interface Object {
	boolean _is_a(String Identifier);
	boolean _is_equivalent(Object that);
	boolean _non_existent();
	int _hash(int maximum);
	org.omg.CORBA.Object _duplicate();
	void _release();
	ImplementationDef _get_implementation();
	InterfaceDef _get_interface();
	Request _request(String s);
	Request _create_request(Context ctx,
				String operation,
				NVList arg_list,
				NamedValue result);
	Request _create_request(Context ctx,
				String operation,
				NVList arg_list,
				NamedValue result,	
				ExceptionList exclist,
				ContextList ctxlist);
}

6.14 Current

pseudo interface Current {
}
// Java
public abstract class Current
		extends org.omg.CORBA.portable.ObjectImpl {
}

6.15 Principal

pseudo interface Principal {
attribute sequence<octet> name;
}
// Java
public abstract class Principal {
	public abstract byte[] name();
	public abstract void name(byte[] name);
}