Module  java.corba

Package org.omg.CORBA

提供OMG CORBA API与Java编程语言的映射,包括ORB类,它被实现为使得程序员可以将其用作全功能对象请求代理(ORB)。

有关Java TM平台(Standard Edition 6)符合的官方CORBA规范支持部分的精确列表,请参阅Official Specifications for CORBA support in Java[TM] SE 6

一般信息

本节中的信息是与编辑界面定义语言(IDL)文件并使用ORB编写客户端和服务器的人相关的信息。

本节中描述的类和接口可以分为四组: ORB classes ,异常, Helper类和Holder类。

ORB

ORB在客户端和方法在服务器上的实现之间处理(或经纪人)方法调用。 因为客户端和服务器可能在网络上的任何地方,并且由于调用和实现可能用不同的编程语言编写,所以ORB在后台进行大量的工作来完成此通信。

ORB的大部分功能对用户来说都是完全透明的, CORBA软件包的主要部分是ORB在幕后使用的类。 结果是大多数程序员只能直接使用这个包的一小部分。 实际上,大多数程序员将仅使用ORB类中的几种方法,一些例外,有时候也是持有者类。

ORB方法

在应用程序进入CORBA环境之前,必须首先:

  • 被初始化为ORB和可能的对象适配器(POA)环境。
  • 获取对ORB对象的引用(用于将来的ORB操作)以及其他对象(包括根POA或一些对象适配器对象)。

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

  • 提供对ORB的访问的操作,这将在本节中讨论。
  • 提供对对象适配器,接口存储库,命名服务和其他对象服务的访问的操作。 这些操作在Other Classes进行了描述。

当应用程序需要CORBA环境时,它需要一种获取ORB对象引用和可能的OA对象引用(例如根POA)的机制。 这有两个目的。 首先,它将应用程序初始化到ORB和OA环境中。 其次,它将ORB对象引用和OA对象引用返回到应用程序,以供将来的ORB和OA操作使用。

为了获得ORB对象引用,应用程序调用ORB.init操作。 呼叫的参数可以包括需要对象引用的ORB的标识符,以及用于允许环境特定数据被传递到呼叫中的arg_list。

这些是提供对ORB的访问的ORB方法:

  • init()
  • init(String [] args, Properties props)
  • init(Applet app, Properties props)

使用init()方法不带参数启动一个单ORB,它只能给类型代码创建any在由辅助类生成的代码所需要小号idlj

应用程序需要一种便携式手段来获取其初始对象引用。 根POA,POA Current,Interface Repository和各种对象服务实例需要引用。 应用程序所需的功能类似于命名服务提供的功能。 但是,OMG不希望将命名服务提供给所有应用程序,以便可以对其进行可移植的初始化。 因此,本节中显示的操作提供了简化的本地版本的命名服务,应用程序可以使用它来获取对其操作至关重要的小型定义的对象引用集。 因为只有一个很好的定义对象集合才能使用这种机制,所以命名上下文可以被平坦化成单级名称空间。 这种简化导致仅定义了两个操作来实现所需的功能。

初始引用通过ORB对象接口中提供的两个操作获得,提供列出和解析初始对象引用的功能。 这些是:

  • resolve_initial_references(String name)
  • list_initial_services()
  • register_initial_reference(String id, org.omg.CORBA.Object obj)

使用以下某些方法的示例是Getting Started with Java IDL

例外

Java IDL中的异常与使用Java编程语言编写的任何代码类似。 如果一个方法被定义为抛出异常,然后使用该方法的任何代码必须有一个try / catch块和处理该异常,当它被抛出。

关于Java IDL exceptions的文档有更多的信息,并解释了系统异常和用户定义的异常之间的区别。

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

           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包中有一些包, CORBA包是“包”,作为其名称的一部分。 这些软件包通常是相当小的,因为它们所做的一切只是提供CORBA软件包中的接口和类使用的异常或类。

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

  • BadKind
  • Bounds
org.omg.CORBA.ORBPackage包含两个例外:
  • InvalidName
  • InconsistentTypeCode

另一个包是CORBA的子包是portable包。 它提供了一组ORB API,使得一个供应商的IDL编译器生成的代码可以在另一个供应商的ORB上运行。

持有人类

支持out和inout参数传递模式需要使用额外的holder classes 由于Java编程语言不支持out或inout参数,因此需要持有者类作为传递可修改参数的方法。 为了支持便携式存根和骨架,支架类还实现了org.omg.CORBA.portable.Streamable接口。

持有人类通过将“持有人”附加到类型的名称来命名。 该类型的名称指的是其Java编程语言中的名称。 例如,对于命名的接口holder类Account Java编程语言将被命名为AccountHolder

org.omg.CORBA包中的所有基本IDL数据类型都支持持有org.omg.CORBA 因此,举例来说,目前已经定义的类LongHolderShortHolderFloatHolder ,等等。 除了由typedefs定义的所有用户定义的IDL类型之外,还会生成类。 (请注意,在本文中,用户定义包括在OMG规范中定义的类型,例如Interface Repository和其他OMG服务的类型。)

每个持有人类有:

  • 一个实例的构造函数
  • 一个默认构造函数
  • 一个公共实例成员, value这是打字值。
  • 一种读取输入流并将内容分配给类型的value字段的方法
  • 一种将value字段的值写入输出流的方法
  • 一种获取类型代码的方法

默认构造函数将值字段设置为由Java语言定义的类型的默认值:

  • false的布尔值
  • 0用于数字和字符类型
  • null用于字符串和对象引用

例如,如果将OMG IDL中定义的接口Account映射到Java编程语言,则将生成以下持有人类:

  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章“基本类型映射 ”。 org.omg.CORBA中定义的持有人类别是:

        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  

助手班

助手文件提供了几种处理类型所需的静态方法。 这些包括:

  • Any插入和提取类型的操作
  • 获取存储库ID
  • 得到类型代码
  • 从流读取和写入类型
  • 实现ValueHelper接口(如果是用户定义的值类型)

映射IDL接口或抽象接口的帮助类也包括窄操作。 静态窄方法允许将org.omg.CORBA.Object缩小为更具体类型的对象引用。 如果由于对象引用不支持所请求的类型而导致的narrow失败,则抛出IDL异常CORBA.BAD_PARAM 引起不同的系统异常以指示其他种类的错误。 尝试缩小null将始终成功,返回值为null 通常,应用程序员使用的唯一辅助方法是narrow方法。 其他方法通常在幕后使用,对程序员是透明的。

助手课分为两大类: helpers for value typeshelpers for non value types 因为一个类别中的所有帮助类都提供相同的方法,所以在这里给出了每类帮助类的一个通用说明。

当OMG IDL被映射到Java编程语言时,为每个用户定义的类型生成一个“帮助”类。 该生成的类将具有附加后缀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对象。 接口是抽象的还是narrow它的助手类将提供哪种narrow方法。 不是抽象的接口的助手类将具有一个narrow方法,该方法使用CORBA对象,而抽象的接口的narrow方法将采用Java编程语言中的对象。 具有至少一个抽象基础接口的非抽象接口的帮助类将提供narrow方法的两个版本。

Hello World tutorial使用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)); 

基本助手类的示例

为了解释这个目的,一个基本的助手类是一个由每个帮助类提供的方法,另外一个narrow方法,如果在OMG IDL中定义的类型映射到Java编程语言的接口。 不是类型的类型将为它们生成一个基本的帮助类。

例如,假设接口Account不是值类型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;
    }
  }

} 

值类型助手类

值类型的帮助类包括为非值类型方法生成的相同方法的不同渲染。 主要区别在于值类型是可以通过值作为参数或方法的返回值传递的类型,这意味着它们必须是可序列化的。

假设Address是一个值类型, 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中定义的助手类是:

        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创建并包含在请求操作中使用的信息的类。
  • TCKind - 表示TypeCode对象的种类(数据类型)
  • TypeCode - 表示数据类型和可能的其他信息
  • Any - 包含一个值及其类型代码
  • NamedValue - 包含一个名称,一个Any对象和一个参数模式标志。 NamedValue对象包含有关方法参数,方法返回值或上下文的信息。
  • ContextList - 描述需要通过调用解析和发送的上下文的字符串列表
  • ExceptionList - 可能由方法抛出的异常的TypeCode的列表
  • Environment - 在方法调用期间抛出的异常的容器
  • Context - 用于将辅助信息从客户端传递到服务器的NamedValue对象的列表
  • NVList - 一个NamedValue对象的列表,用于传递参数或获取结果

处理请求的类

第二类课程涉及要求:
  • Object - 所有CORBA对象引用的基类
  • Request - DII中的主类,其中包含用于向请求添加参数的方法,用于访问有关正在调用的方法的信息(方法名称,其参数,它们抛出的异常等),并进行调用请求
  • DynamicImplementation - 使用DSI的服务器实现的基类。 它具有方法invoke ,由该类的实现用于确定ServerRequest对象的状态并设置其结果或异常
  • ServerRequest - 捕获动态骨架接口请求的显式状态

作为常量的接口

第三组包含用作常量的接口。 IDL到Java映射要求将IDL枚举映射到Java类,枚举值表示为该类中的public static final字段(例如DefinitionKind)。 另一方面,IDL接口外部定义的IDL常量映射到每个常量的Java接口。

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

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

  • BAD_POLICY
  • BAD_POLICY_TYPE
  • BAD_POLICY_VALUE
  • UNSUPPORTED_POLICY
  • UNSUPPORTED_POLICY_VALUE
方法TypeCode.type_modifier返回以下接口之一的value字段。 这些接口的名称中的VM代表“值修饰符”。
  • VM_NONE
  • VM_ABSTRACT
  • VM_CUSTOM
  • VM_TRUNCATABLE
以下常量由返回ValueMember对象的访问方法来表示的知名度ValueMember对象。
  • PRIVATE_MEMBER
  • PUBLIC_MEMBER
这些标志,用于NamedValue对象或作为方法的参数,在以下接口中定义:
  • ARG_IN
  • ARG_INOUT
  • ARG_OUT
  • CTX_RESTRICT_SCOPE

接口存储库接口和类

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

ORB不要求有一个接口存储库,Java IDL不包含一个。 即使此版本不包括接口存储库的实现,为了创建类型代码,已经包括以下IR类和接口(请参阅org.omg.CORBA.ORB接口中的create_value_tc,create_struct_tc,create_union_tc和create_exception_tc方法):

  • IRObject
  • IDLType
  • DefinitionKind
  • StructMember
  • UnionMember
  • ValueMember

相关文档

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

Java IDL中未实现CORBA功能

org.omg子包中包含的一些API是为符合当前的OMG CORBA规范而提供的,但在Sun的JDK“¢”版本中未实现。 这使得其他JDK许可证持有者可以在标准扩展和产品中提供此API的实现。

特征抛出NO_IMPLEMENT

由于种种原因, org.omg子包中的一些API引发了NO_IMPLEMENT异常。 其中包括:

  • 在某些情况下,例如LocalObject ,根据规范的完整实现表明这些API应该抛出NO_IMPLEMENT
  • 在大多数情况下,例如ORB.java中的方法,抛出NO_IMPLEMENT方法实际上是在ORB代码中其他地方的子类中实现的。
  • 在某些情况下,例如_get_interface_def()_get_interface ,API真的还没有实现。

此版本中未实现的功能或API概述

  • 接口存储库。 Java IDL的正常操作不需要Interface Repository。
  • Java IDL不支持long double
  • 政策( org.omg.CORBA.Policy )及其获取方法尚未实施。
  • 域管理员( org.omg.CORBA.DomainManager )及其获取方法尚未实施。
  • 服务信息org.omg.CORBA.ServiceInformation和ORB方法public boolean get_service_information(short service_type, ServiceInformationHolder service_info)未实现。
  • 支持perform_work ORB方法( work_pending )未实现。
  • IDL上下文。

软件包中的未实现特性的具体列表org.omg.CORBA

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

  • ORB
    • public org.omg.CORBA.Policy create_policy(int type, org.omg.CORBA.Any val)
    • public void perform_work()
    • public boolean work_pending()
    • public org.omg.CORBA.Current get_current()
    • create_operation_list
    • get_default_context
    • get_service_information
    • 过时DynAnys (弃用赞成DynamicAny包)
从以下版本开始:
JDK1.2