JavaTM 2 Platform
Standard Ed. 5.0

软件包 org.omg.CORBA

提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。

请参见:
          描述

接口摘要
ARG_IN 向调用符号化 "input" 参数,表示从客户端将该参数传递到服务器。
ARG_INOUT 表示用于某一调用的输入和输出的参数,意味着将该参数从客户端传到服务器,然后再从服务器传回客户端。
ARG_OUT 表示调用的 "input" 参数的常量,意味着从服务器将该参数传递到客户端。
BAD_POLICY 将填充在 PolicyError 异常中的 PolicyErrorCode
BAD_POLICY_TYPE 将填充在 PolicyError 异常中的 PolicyErrorCode
BAD_POLICY_VALUE 包含指示某个策略值的值,该策略值对于 create_policy 方法(在 ORB 类中定义)调用中的有效策略类型而言是不正确的。
CTX_RESTRICT_SCOPE 可以用作 Context.get_values 方法的第二个参数以限制搜索范围的标志。
Current Current 接口派生的接口允许 ORB 和 CORBA 服务访问与它们正运行的执行线程关联的信息(上下文)。
CurrentOperations Current 的接口。
CustomMarshal 将由 ORB 而不是由用户使用的抽象 value 类型。
DataInputStream 定义用来从输入流读取基本数据类型的方法,以便解组自定义值类型。
DataOutputStream 定义用来将基本数据类型写入输出流的方法,以便编组自定义值类型。
DomainManager 提供用来建立关系并将其导航到高级域和从属域的机制,以及用来创建和访问策略的机制。
DomainManagerOperations DomainManager 提供访问策略的方法。
DynAny 已过时。 使用新的 DynAny 替代
DynArray 已过时。 使用新的 DynArray 替代
DynEnum 已过时。 使用新的 DynEnum 替代
DynFixed 已过时。 使用新的 DynFixed 替代
DynSequence 已过时。 使用新的 DynSequence 替代
DynStruct 已过时。 使用新的 DynStruct 替代
DynUnion 已过时。 使用新的 DynUnion 替代
DynValue 已过时。 使用新的 DynValue 替代
IDLType 由所有表示 OMG IDL 类型的接口存储库(Interface Repository,IR)对象继承的抽象接口。
IDLTypeOperations 此接口必须由所有 IDLType 对象实现。
IRObject IRObject IDL 接口表示最一般的接口,其他所有 Interface Repository 接口(甚至包括 Repository 自身)都派生自该接口。
IRObjectOperations 这是用于 IRObject 的映射的 Operations 接口。
Object CORBA 对象引用的定义。
OMGVMCID 为 OMG 保留的供应商次要代码 (minor code) ID。
Policy 派生自 Policy 接口的接口允许 ORB 或 CORBA 服务访问影响其操作的某些选项。
PolicyOperations 提供针对某一 Policy 对象的操作。
PRIVATE_MEMBER 定义 ValueMember 类中私有成员的常量。
PUBLIC_MEMBER 定义 ValueMember 类中公共成员的常量。
UNSUPPORTED_POLICY 在所请求的 Policy 被 ORB 认为是有效的,但目前不受支持时将被填充的一个 PolicyErrorCode
UNSUPPORTED_POLICY_VALUE 当所请求的 Policy 值是有效类型并且在该类型的有效范围内,但该有效值目前不受支持时将被填充的 PolicyErrorCode
VM_ABSTRACT 定义用来表示 typecode 中的 Abstract 接口的代码。
VM_CUSTOM 定义用来表示类型代码中自定义编组值类型的代码。
VM_NONE 定义代码,用来表示一个 typecode 中值类型的值。
VM_TRUNCATABLE 定义用来表示 typecode 中可截断值类型的代码。
 

类摘要
_IDLTypeStub IDLType 的 Stub。
_PolicyStub Policy 的 Stub。
Any 充当可用 IDL 描述的任何数据或任何 IDL 基本类型的容器。
AnyHolder Any 的 Holder。
AnySeqHelper AnySeq 的 Helper。
AnySeqHolder AnySeq 的 Holder。
BooleanHolder Boolean 的 Holder。
BooleanSeqHelper BooleanSeq 的 Helper。
BooleanSeqHolder BooleanSeq 的 Holder。
ByteHolder Byte 的 Holder。
CharHolder Char 的 Holder。
CharSeqHelper CharSeq 的 Helper。
CharSeqHolder CharSeq 的 Holder。
CompletionStatus 指示某一方法抛出 SystemException 时是否已结束运行的对象。
CompletionStatusHelper CompletionStatus 的 Helper。
Context 用于在 Request 操作中指定上下文对象的对象,上下文字符串在与请求调用一起被发送之前,必须在该指定的上下文对象中进行解析。
ContextList 一个对象,它包含表示属性名称的 String 对象所组成的可修改列表。
CurrentHelper Current 的 Helper。
CurrentHolder Current 的 Holder。
DefinitionKind 该类提供用来标识接口存储库 (Interface Repository) 对象类型的常量。
DefinitionKindHelper DefinitionKind 的 Helper。
DoubleHolder Double 的 Holder。
DoubleSeqHelper DoubleSeq 的 Helper。
DoubleSeqHolder DoubleSeq 的 Holder。
DynamicImplementation 已过时。 org.omg.CORBA.DynamicImplementation
Environment 用于 Request 操作的异常的容器 (holder),使异常可用于客户端。
ExceptionList Request 操作中使用的对象,用于描述可由某一方法抛出的异常。
FieldNameHelper FieldName 的 Helper。
FixedHolder Fixed 的 Holder。
FloatHolder Float 的 Holder。
FloatSeqHelper FloatSeq 的 Helper。
FloatSeqHolder FloatSeq 的 Holder。
IdentifierHelper Identifier 的 Helper。
IDLTypeHelper IDLType 的 Helper。
IntHolder Int 的 Holder。
LocalObject 用作 Java 语言映射中的本地 IDL 接口实现的基本类。
LongHolder Long 值的 Holder。
LongLongSeqHelper LongLongSeq 的 Helper。
LongLongSeqHolder LongLongSeq 的 Holder。
LongSeqHelper LongSeqHelper 的 Helper。
LongSeqHolder LongSeq 的 Holder。
NamedValue 在 DII 和 DSI 中用来描述参数和返回值的对象。
NameValuePair 将某一名称与一个属性为 IDL struct 的值关联,并在 DynStruct API 中使用。
NameValuePairHelper NameValuePair 的 Helper。
NVList 包含 NamedValue 对象所组成的可修改列表。
ObjectHelper  
ObjectHolder Object 的 Holder。
OctetSeqHelper OctetSeq 的 Helper。
OctetSeqHolder OctetSeq 的 Holder。
ORB 为 CORBA 对象请求代理 (Object Request Broker) 特性提供 API 的类。
ParameterMode Parameter 参数模式的枚举。
ParameterModeHelper Parameter 参数模式的枚举。
ParameterModeHolder Parameter 参数模式的枚举。
PolicyErrorCodeHelper 封装 Policy 无效的原因。
PolicyErrorHelper 抛出 PolicyError 指示传递给 ORB.create_policy 操作的参数值存在问题。
PolicyErrorHolder 抛出 PolicyError 指示传递给 ORB.create_policy 操作的参数值存在问题。
PolicyHelper Policy 的 Helper。
PolicyHolder Policy 的 Holder。
PolicyListHelper PolicyList 的 Helper。
PolicyListHolder PolicyList 的 Holder。
PolicyTypeHelper PolicyType 的 Helper。
Principal 已过时。 已由 CORBA 2.2 取代。
PrincipalHolder 已过时。 Deprecated by CORBA 2.2.
RepositoryIdHelper RepositoryId 的 Helper。
Request 包含调用某一方法所必需的信息的对象。
ServerRequest 捕获对动态框架接口(Dynamic Skeleton Interface,DSI)请求的显式状态的对象。
ServiceDetail 表示 ORB 服务的对象:其 service_detail_type 字段包含 ORB 服务的类型,其 service_detail 字段包含 ORB 服务的描述。
ServiceDetailHelper  
ServiceInformation CORBA 模块中的 IDL struct,用于存储关于 ORB 实现中可用 CORBA 服务的信息,可使用 ORB.get_service_information 方法获取。
ServiceInformationHelper  
ServiceInformationHolder ServiceInformation 的 Holder。
SetOverrideType 标记 SET_OVERRIDEADD_OVERRIDE 的 CORBA enum 的映射,它指示这些策略是应该替换 Object 的现有策略还是应该被添加到现有策略中。
SetOverrideTypeHelper SetOverrideType 的 Helper。
ShortHolder Short 的 Holder。
ShortSeqHelper ShortSeqHelper 的 Helper。
ShortSeqHolder ShortSeq 的 Holder。
StringHolder String 的 Holder。
StringSeqHelper String 数组
StringSeqHolder String 数组
StringValueHelper StringValue 的 Helper。
StructMember 描述接口存储库 (Interface Repository) 中一个 IDL struct 成员,包括该 struct 成员的名称、该 struct 成员的类型以及表示该 struct 成员(被描述为 struct 成员对象)IDL 类型的 typedef。
StructMemberHelper StructMember 的 Helper。
TCKind IDL enum TCKind 的 Java 映射,TCKind 指定 TypeCode 对象的种类。
TypeCode 用于有关特定 CORBA 数据类型的信息的容器。
TypeCodeHolder TypeCode 的 Holder。
ULongLongSeqHelper ULongLongSeq 的 Helper。
ULongLongSeqHolder ULongLongSeq 的 Holder。
ULongSeqHelper ULongSeq 的 Helper。
ULongSeqHolder ULongSeq 的 Holder。
UnionMember 接口存储库 (Interface Repository) 中关于 IDL union 成员的描述。
UnionMemberHelper UnionMember 的 Helper。
UnknownUserExceptionHelper UnknownUserException 的 Helper。
UnknownUserExceptionHolder UnknownUserException 的 Holder。
UShortSeqHelper UShortSeq 的 Helper。
UShortSeqHolder UShortSeq 的 Holder。
ValueBaseHelper  
ValueBaseHolder ValueBase 的 Holder。
ValueMember 接口存储库 (Interface Repository) 中关于 value 对象成员的描述。
ValueMemberHelper ValueMember 的 Helper。
VersionSpecHelper VersionSpec 的 Helper。
VisibilityHelper Visibility 的 Helper。
WCharSeqHelper WCharSeq 的 Helper。
WCharSeqHolder WCharSeq 的 Holder。
WrongTransactionHelper WrongTransaction 的 Helper。
WrongTransactionHolder WrongTransaction 的 Holder。
WStringSeqHelper WString 数组
WStringSeqHolder WString 数组
WStringValueHelper org/omg/CORBA/WStringValueHelper.java 由 "3.0" 版的 IDL-to-Java 编译器(可移植)从 orb.idl 中生成,生成时间为 1999 年 5 月 31 日 22:27:30 (GMT+00:00) 类定义已经修改,以遵守以下 OMG 规范: 由 CORBA 2.3.1 定义的 ORB 核心 (formal/99-10-07) ptc/00-01-08 中定义的 IDL/Java 语言映射
 

异常摘要
ACTIVITY_COMPLETED ACTIVITY_COMPLETED 系统异常可以在任何访问 Activity 上下文的方法上引发。
ACTIVITY_REQUIRED ACTIVITY_REQUIRED 系统异常可以在任何需要 Activity 上下文的方法上引发。
BAD_CONTEXT 当客户端调用某一操作,但传递的上下文中不包含该操作所需的上下文值时,抛出该异常。
BAD_INV_ORDER 此异常指示调用方按错误顺序调用了操作。
BAD_OPERATION 当对象引用表示某一现有对象,但该对象并不支持调用的操作时,抛出该异常。
BAD_PARAM 当传递给某一调用的参数超出范围或被认为不合法时,抛出该异常。
BAD_QOS 只要对象无法支持调用参数(具有与之关联的服务质量语义的参数)所需的服务质量,就会引发 BAD_QOS 异常。
BAD_TYPECODE 当 ORB 遇到错误的类型代码(例如,具有无效 TCKind 值的类型代码)时,抛出该异常。
Bounds 当参数不在某一方法试图访问的对象的合法范围内时,抛出该用户异常。
CODESET_INCOMPATIBLE 当客户端和服务器本机代码集之间不能进行有意义的通信时,抛出此异常。
COMM_FAILURE 如果某一操作正在进行时失去通信,此时客户端已经发送了请求,但服务器的应答尚未返回到客户端,则引发此异常。
DATA_CONVERSION 如果 ORB 无法将已编组数据的表示形式转换成其本机表示形式,则引发此异常,反之亦然。
FREE_MEM 当 ORB 试图释放动态内存但却因为某些原因(例如因为堆损坏或内存块被锁定)而失败时,抛出此异常。
IMP_LIMIT 此异常指示在 OBR 运行时超过了某一项实现限制。
INITIALIZE ORB 在其初始化期间出错(例如无法获得网络资源或检测配置错误)时,抛出此异常。
INTERNAL 此异常指示 ORB 中存在内部错误,例如,在 ORB 检测到其内部数据结构被损坏时将抛出此异常。
INTF_REPOS 当 ORB 无法到达接口存储库,或者检测到其他与接口存储库相关的错误时,引发此异常。
INV_FLAG 在将无效标志传递给某项操作时(例如,在创建 DII 请求时),抛出此异常。
INV_IDENT 此异常指示 IDL 标识符在语法上是无效的。
INV_OBJREF 此异常指示对象引用存在内部错误。
INV_POLICY 当应用于特定调用的 Policy 重写之间不兼容而导致无法进行调用时,抛出此标准异常。
INVALID_ACTIVITY 如果在不同于其处于挂起状态时所在的上下文中恢复事务或 Activity,则在该 Activity 或 Transaction 服务的恢复方法上引发 INVALID_ACTIVITY 系统异常。
INVALID_TRANSACTION 当请求带有无效的事务上下文时,抛出此异常。
MARSHAL 表示网络中传来的请求或应答在结构上无效。
NO_IMPLEMENT 此异常指示,尽管被调用的操作存在(它有一个 IDL 定义),但不存在该操作的实现。
NO_MEMORY 如果 ORB 运行时出现内存不足,则抛出此异常。
NO_PERMISSION 当因为调用方没有足够的权限而导致调用失败时,抛出此异常。
NO_RESOURCES 当 ORB 遇到一些一般资源限制时,抛出此异常。
NO_RESPONSE 如果某客户端试图检索延迟同步调用的结果,但请求的响应尚不可用,则抛出此异常。
OBJ_ADAPTER 此异常通常指示管理方面的不匹配,例如,某台服务器可能试图在实现存储库中使用已经在使用或存储库未知的名称注册它自身。
OBJECT_NOT_EXIST 只要在已删除的对象上执行调用,就会引发此异常。
PERSIST_STORE 此异常指示一个持久存储错误,例如,无法建立数据库连接或者某个数据库损坏。
PolicyError 发生策略错误时抛出的用户异常。
REBIND 如果当前有效 RebindPolicy 具有 NO_REBIND 或 NO_RECONNECT 值,且对绑定的对象引用执行调用时生成状态为 OBJECT_FORWARD 的 LocateReply 消息或状态为 LOCATION_FORWARD 的 Reply 消息,则将引发 REBIND
SystemException 所有 CORBA 标准异常的根类。
TIMEOUT 当已超过指定生存时间却没有做出任何交付时,引发 TIMEOUT 异常。
TRANSACTION_MODE 如果客户端 ORB 检测到 IOR 中的 InvocationPolicy 与选中的调用路径(即直接或路由调用)不匹配,则它将抛出 CORBA TRANSACTION_MODE 异常。
TRANSACTION_REQUIRED 此异常指示请求带有一个 null 事务上下文,但需要的是激活的事务。
TRANSACTION_ROLLEDBACK 当与请求处理关联的事务已回滚或已标记为回滚时,抛出此异常。
TRANSACTION_UNAVAILABLE 当由于到事务服务 (Transaction Service) 的连接已异常终止而无法处理事务服务上下文时,由 ORB 抛出 CORBA TRANSACTION_UNAVAILABLE 异常。
TRANSIENT 当 ORB 试图到达某一对象但失败时,抛出此异常。
UNKNOWN 如果操作实现抛出一个非 CORBA 异常(比如特定于该实现编程语言的异常),或者某一操作引发没有出现在该操作引发表达式中的用户异常,则将引发此异常。
UnknownUserException 包含由服务器返回的用户异常的类。
UserException CORBA IDL 定义的用户异常的根类。
WrongTransaction CORBA WrongTransaction 用户定义异常。
 

软件包 org.omg.CORBA 的描述

提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。

有关 Java 2 平台、标准版 v.1.4 遵守的受支持官方 CORBA 规范部分的明确列表,请参阅 Official Specifications for CORBA support in J2SE 1.4

常规信息

这一节中的信息与编译接口定义语言(Interface Definition Language,IDL)文件以及使用 ORB 编写客户端和服务器的用户有关。

这一节中描述的类和接口可分为四组:ORB 类、异常、Helper 类和 Holder 类。

ORB

ORB 处理(或代理)客户端与服务器上的方法实现之间的方法调用。因为客户端和服务器可能位于网络的任何地方,调用和实现可能以不同的编程语言编写,所以 ORB 在后台做了很多工作来实现此通信。

ORB 所做的大部分工作对于用户而言是完全透明的,CORBA 包的主要部分由 ORB 在后台使用的类组成。因此大部分程序员将只直接使用此包的一小部分。实际上,大多数程序员仅使用 ORB 类和一些异常中的少数方法,偶尔也使用 holder 类中的少数方法。

ORB 方法

在应用程序进入 CORBA 环境之前,它必须先执行以下操作:

提供以下操作来初始化应用程序及获得适当的对象引用:

当应用程序需要 CORBA 环境时,它需要一个机制来获取 ORB 对象引用,也可能是 OA 对象引用(比如根 POA)。此机制有两个用途。第一个用途是将应用程序初始化为 ORB 和 OA 环境。第二个用途是将 ORB 对象引用和 OA 对象引用返回给应用程序,以便在以后的 ORB 和 OA 操作中使用。

若要获取 ORB 对象引用,应用程序应调用 ORB.init 操作。该调用的参数可能由 ORB 的标识符和 arg_list 组成,前者是对象引用所需要的,后者用于允许将特定于环境的数据传递给调用。

以下 ORB 方法可以访问 ORB:

使用不带参数的 init() 方法可以实例化一个单件 ORB,它只能为创建 typecode 提供 any,在通过 idlj 在 Helper 类中生成的代码中需要这些 any。

应用程序需要一个用来获得其初始对象引用的可移植方法。根 POA、POA Current、Interface Repository 和各种 Object Service 实例都需要引用。应用程序所需的功能类似于 Naming Service 提供的那些功能。但是,OMG 不应该要求 Naming Service 可用于所有应用程序以便能够以可移植方式初始化。因此,这一节中展示的操作提供了一个简化的本地 Naming Service,应用程序可以使用它来获取其操作所必须的一小组已定义对象引用。因为只期望从此机制中获得一小组定义良好的对象,所以命名上下文可能被简化为单一级别的名称空间。这种简化的结果是只定义两个操作来获得所需的功能。

初始引用是通过 ORB 对象接口中提供的两个操作获得的,该接口中提供了一些设施来列出并解析初始对象引用。这些工具包括:

使用其中一些方法的示例见 Java IDL 入门

异常

Java IDL 中的异常类似于用 Java 编程语言编写的 any 代码中的那些异常。如果定义某一方法抛出异常,则使用该方法的 any 代码必须有一个 try/catch 块,并在该异常抛出时进行处理。

关于 Java IDL 异常 的文档中有更多信息,这些文档解释了系统异常和用户定义异常之间的不同。

以下是包 org.omg.CORBA 中定义的系统异常的列表(这些异常是通过 org.omg.CORBA.SystemExceptionjava.lang.RuntimeException 中继承的未经检查异常):


        BAD_CONTEXT
        BAD_INV_ORDER
        BAD_OPERATION
        BAD_PARAM
        BAD_TYPECODE
        COMM_FAILURE
        DATA_CONVERSION
        FREE_MEM
        IMP_LIMIT
        INITIALIZE
        INTERNAL
        INTF_REPOS
        INVALID_TRANSACTION
        INV_FLAG
        INV_IDENT
        INV_OBJREF
        INV_POLICY
        MARSHAL
        NO_IMPLEMENT
        NO_MEMORY
        NO_PERMISSION
        NO_RESOURCES
        NO_RESPONSE
        OBJECT_NOT_EXIST
        OBJ_ADAPTER
        PERSIST_STORE
        TRANSACTION_REQUIRED
        TRANSACTION_ROLLEDBACK
        TRANSIENT
        UNKNOWN

以下是包 org.omg.CORBA 中定义的用户定义异常的列表。


        Bounds
        UnknownUserException
        WrongTransaction 
        PolicyError

子包

CORBA 包中的一些包用 "Package" 作为其名称的一部分。这些包通常非常小,因为这些包要做的所有事情就是提供异常或类,以便 CORBA 包中的接口和类使用。

例如,包 org.omg.CORBA.TypeCodePackage 包含两个由 TypeCode 类中的方法抛出的异常。这些异常包括:

org.omg.CORBA.ORBPackage 中包含以下两个异常:

另一个 CORBA 的子包是 portable 包。该包提供了一组 ORB API,这些 API 使得某个供应商的 IDL 编译器所生成的代码能够在另一个供应商的 ORB 上运行。

Holder 类

支持 out 和 inout 参数传递模式需要使用附加 holder 类。因为 Java 编程语言不支持 out 或 inout 参数,holder 类便作为一种可修改的传递参数方式出现。为了支持可移植 stub 和 skeleton,holder 类还实现了 org.omg.CORBA.portable.Streamable 接口。

Holder 类是通过将 "Holder" 追加到类型名称中来命名的。类型名称是指它在 Java 编程语言中的名称。例如,在 Java 编程语言中名为 Account 的接口所对应的 holder 类应该命名为 AccountHolder

Holder 类可用于 org.omg.CORBA 包中的所有基本 IDL 数据类型。因此,对于 LongHolderShortHolderFloatHolder 等,都已经定义了相应的类。对于所有已命名用户定义的 IDL 类型(typedef 定义的除外),同样会生成一些类。(注意,在这种情况下,用户定义类型包括那些在 OMG 规范中定义的类型(如用于 Interface Repository 的那些类型)和其他 OMG 服务。)

每个 holder 类都包含:

对于 Java 语言定义的类型,默认构造方法将 value 字段设置为以下默认值:

举例来说,如果用 OMG IDL 定义的 Account 接口被映射到 Java 编程语言,则将生成以下 holder 类:

public final class AccountHolder implements 
    org.omg.CORBA.portable.Streamable
{
  // field that holds an Account object
  public Account value = null;

  // default constructor
  public AccountHolder ()
  {
  }
  
  // creates a new AccountHolder from initialValue
  public AccountHolder (Account initialValue)
  {
    value = initialValue;
  }
  
  // reads the contents of i and assigns the contents to value
  public void _read (org.omg.CORBA.portable.InputStream i)
  {
    value = AccountHelper.read (i);
  }

  // writes value to o
  public void _write (org.omg.CORBA.portable.OutputStream o)
  {
    AccountHelper.write (o, value);
  }
 
  // returns the typecode for Account
  public org.omg.CORBA.TypeCode _type ()
  {
    return AccountHelper.type ();
  }

}

关于 Holder 类的更多信息,请参阅 OMG IDL to Java Language Mapping 中的第 1.4 章 Mapping for Basic Typesorg.omg.CORBA 包中定义的 Holder 类有:

     AnyHolder
     AnySeqHolder
     BooleanHolder
     BooleanSeqHolder
     ByteHolder
     CharHolder
     CharSeqHolder
     CurrentHolder
     DoubleHolder
     DoubleSeqHolder
     FixedHolder
     FloatHolder
     FloatSeqHolder
     IntHolder
     LongHolder
     LongLongSeqHolder
     LongSeqHolder
     ObjectHolder
     OctetSeqHolder
     ParameterModeHolder
     PolicyErrorHolder
     PolicyListHolder
     PrincipalHolder
     ServiceInformationHolder
     ShortHolder
     ShortSeqHolder
     StringHolder
     StringSeqHolder
     TypeCodeHolder
     ULongLongSeqHolder
     ULongSeqHolder
     UnknownUserExceptionHolder
     UShortSeqHolder
     ValueBaseHolder
     WCharSeqHolder
     WrongTransactionHolder
     WStringSeqHolder

Helper 类

Helper 文件提供了一些操作类型所需的静态方法。这些操作包括:

用于映射的 IDL 接口或抽象接口的 helper 类还包括收缩操作。静态收缩方法允许将 org.omg.CORBA.Object 收缩成更具体的某种类型的对象引用。如果因为该对象引用不支持所请求的类型而导致收缩失败,则将抛出 IDL 异常 CORBA.BAD_PARAM。引发不同的系统异常则指示存在其他种类的错误。尝试收缩 null 将总是可以成功,并返回 null 值。通常,应用程序编程人员唯一使用的 helper 方法是 narrow 方法。其他方法通常在后台使用,它们对于程序员是透明的。

Helper 类分为两大类,即用于 value 类型的 helper用于非 value 类型的 helper。因为一种类别中的所有 helper 类提供的都是相同的方法,所以这里只提供每种 helper 类的一般性解释。

在将 OMG IDL 映射到 Java 编程语言时,为每个用户定义的类型生成一个 "helper" 类。生成的这个类将具有用户定义类型的名称以及追加的 Helper 后缀。例如,如果接口 Account 是用 OMG IDL 定义的,则 idlj 编译器将自动生成一个名为 AccountHelper 的类。AccountHelper 类将包含操作类型实例所需的静态方法,这里的实例指 Account 对象。

narrow 方法

当某一对象是某个方法的返回值时,该对象是以常规对象的形式返回的,它可以是 org.omg.CORBA.Object 对象或者 java.lang.Object 对象。在可以对此对象执行操作之前,必须将该对象强制转换为其更具体的类型。例如,Account 对象将作为一般对象返回,并且必须收缩为 Account 对象,以便可以对该对象调用 Account 方法。

narrow 方法有两种形式,一种形式带有一个 org.omg.CORBA.Object 对象,另一种形式带有一个 java.lang.Object 对象。根据该接口是否是抽象的来确定其 helper 类将提供哪一种 narrow 方法。用于非抽象接口的 helper 类将有一个带 CORBA 对象的 narrow 方法,而用于抽象接口的 narrow 方法将带有 Java 编程语言中的一个对象。对于至少有一个抽象基本接口的非抽象接口,helper 类将同时提供两种形式的 narrow 方法。

Hello World 教程使用的 narrow 方法如下所示:

        // create and initialize the ORB
        ORB orb = ORB.init(args, null);

        // get the root naming context
        org.omg.CORBA.Object objRef = 
            orb.resolve_initial_references("NameService");
        // Use NamingContextExt instead of NamingContext.This is 
        // part of latest Inter-Operable naming Service.  
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
 
        // resolve the Object Reference in Naming
String name = "Hello";
        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

基本 Helper 类的示例

对于本例,基本 helper 类具有每个 helper 类都会提供的方法,如果用 OMG IDL 定义的类型映射到 Java 编程语言中的接口,则它还包含一个 narrow 方法。非 value 类型的类型将有一个为它们生成的基本 helper 类。

例如,假设接口 Account 不是一个 value 类型的 IDL 类型也不是一个抽象接口,并且没有抽象基本接口,则其 AccountHelper 类将如下所示:

abstract public class AccountHelper
{
  private static String  _id = "IDL:Account:1.0";

  // inserts an Account object into an Any object
  public static void insert (org.omg.CORBA.Any a, Account that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // extracts an Account object from an Any object
  public static Account extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  
  private static org.omg.CORBA.TypeCode __typeCode = null;
  // gets the typecode for this type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc (AccountHelper.id (), "Account");
    }
    return __typeCode;
  }

  // gets the repository id for this type
  public static String id ()
  {
    return _id;
  }

  // reads an Account object from an input stream
  public static Account read (org.omg.CORBA.portable.InputStream istream)
  {
    return narrow (istream.read_Object (_AccountStub.class));
  }

  // writes an Account object to an outputstream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Account value)
  {
    ostream.write_Object ((org.omg.CORBA.Object) value);
  }

  // converts (narrows) an Object to an Account object
  public static Account narrow (org.omg.CORBA.Object obj)
  {
    if (obj == null)
return null;
    else if (obj instanceof Account)
      return (Account)obj;
    else if (!obj._is_a (id ()))
      throw new org.omg.CORBA.BAD_PARAM ();
    else
    {
      org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
      _AccountStub stub = new _AccountStub ();
      stub._set_delegate(delegate);
      return stub;
    }
  }

}

value 类型 Helper 类

用于 value 类型的 helper 类所包含的方法是为非 value 类型方法生成的方法的不同呈现。主要的不同在于 value 类型可以作为某一方法的参数值或返回值传递,这意味着它们必须是可序列化的。

假设 Address 是 value 类型,则 AddressHelper 类将如下所示:

abstract public class AddressHelper
{
  private static String  _id = "IDL:Address:1.0";

  // same as for non-value type
  public static void insert (org.omg.CORBA.Any a, Address that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // same as for non-value type
  public static Address extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  private static org.omg.CORBA.TypeCode __typeCode = null;
  private static boolean __active = false;
  
  // getting the typecode for the type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      synchronized (org.omg.CORBA.TypeCode.class)
      {
        if (__typeCode == null)
        {
          if (__active)
          {
            return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
          }
__active = true;
          org.omg.CORBA.ValueMember[] _members0 = new org.omg.CORBA.ValueMember[0];
          org.omg.CORBA.TypeCode _tcOf_members0 = null;
          __typeCode = org.omg.CORBA.ORB.init ().create_value_tc (_id, "Address", org.omg.CORBA.VM_NONE.value, null, _members0);
__active = false;
        }
      }
    }
    return __typeCode;
  }

  // same as for non-value type
  public static String id ()
  {
    return _id;
  }

  // reads a serializable instance of Address from the given input stream
  public static Address read (org.omg.CORBA.portable.InputStream istream)
  {
    return (Address)((org.omg.CORBA_2_3.portable.InputStream) istream).read_value (id ());
  }

  // writes a serializable instance of Address to the given output stream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Address value)
  {
    ((org.omg.CORBA_2_3.portable.OutputStream) ostream).write_value (value, id ());
  }


}

org.omg.CORBA 包中定义的 Helper 类有:


     AnySeqHelper
     BooleanSeqHelper
     CharSeqHelper
     CompletionStatusHelper
     CurrentHelper
     DefinitionKindHelper
     DoubleSeqHelper
     FieldNameHelper
     FloatSeqHelper
     IdentifierHelper
     IDLTypeHelper
     LongLongSeqHelper
     LongSeqHelper
     NameValuePairHelper
     ObjectHelper
     OctetSeqHelper
     ParameterModeHelper
     PolicyErrorCodeHelper
     PolicyErrorHelper
     PolicyHelper
     PolicyListHelper
     PolicyTypeHelper
     RepositoryIdHelper
     ServiceDetailHelper
     ServiceInformationHelper
     SetOverrideTypeHelper
     ShortSeqHelper
     StringSeqHelper
     StringValueHelper
     StructMemberHelper
     ULongLongSeqHelper
     ULongSeqHelper
     UnionMemberHelper
     UnknownUserExceptionHelper
     UShortSeqHelper
     ValueBaseHelper
     ValueMemberHelper
     VersionSpecHelper
     VisibilityHelper
     WCharSeqHelper
     WrongTransactionHelper
     WStringSeqHelper
     WStringValueHelper

其他类

CORBA 包中的其他类和接口都是在后台使用的,它们可分为四组。其中三组都以某种方式用于请求,第四组与 Interface Repository 有关,单独列为一类。

ORB 创建的类

第一组中包含由 ORB 创建的类和请求操作中使用的信息。

处理请求的类

第二组类用于处理请求:

用作常量的接口

第三组中包括用作常量的接口。IDL 到 Java 的映射强行将 IDL 枚举映射到 Java 类,并将枚举值表示为该类中的公共静态最终字段(如 DefinitionKind)。另一方面,IDL 接口外部定义的 IDL 常量被映射到 Java 接口(每个常量一个接口)。

这就是为什么 org.omg.CORBA 包中的几个接口包含一个 value 字段的原因,该字段是一个 short 值。此字段是一个用于错误代码或值修饰符之类的常量。例如,BAD_POLICY 接口的 value 字段可能是抛出 PolicyError 异常的原因之一。要指定此错误代码,应使用 BAD_POLICY.value

PolicyError 异常使用以下接口的 value 字段作为其可能的错误代码。

TypeCode.type_modifier 方法返回以下某一接口的 value 字段。这些接口名称中的 VM 表示“值修饰符”。 以下常量由 ValueMember 对象的访问方法返回,用于指示 ValueMember 对象的可见性。 以下接口中定义了 NamedValue 对象中使用的标志或用作方法参数的标志:

Interface Repository 接口和类

第四组中包含 Interface Repository 接口和类,它们由 idlj 编译器从 OMG IDL 接口 ir.idl 中生成。Interface Repository 的用途是标识存储在其中的接口,以便 ORB 可以访问它们。每个模块、类型、接口、属性、操作、参数、异常、常量等都完全由 Interface Repository API 描述。

ORB 不需要接口存储库,Java IDL 也不包含接口存储库。尽管此版本不包括接口存储库的实现,但它包含以下 IR 类和接口,以创建 typecodes(参见 org.omg.CORBA.ORB 接口中的 create_value_tc、create_struct_tc、create_union_tc 和 create_exception_tc 方法):
&nbs


相关文档

有关概述、指南和教程,请参阅:

Java IDL 中没有实现的 CORBA 特性

org.omg 子包中包含的一些 API 是为了与当前 OMG CORBA 规范保持一致而提供的,但 Sun 的 JDKTM 版本中没有实现它们。这使得其他 JDK 被许可人可以在标准扩展和产品中提供此 API 的实现。

抛出 NO_IMPLEMENT 的特性

org.omg 子包中包含的一些 API 会因为各种原因抛出 NO_IMPLEMENT 异常。其中一些原因是:

此版本中未实现的特性和 API 的总结:


org.omg.CORBA 包中未实现特性的详细列表

org.omg.CORBA 包中未实现的方法:

从以下版本开始:
JDK1.2

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策