我可以使用IDL中定义的接口作为另一个IDL接口的方法的返回类型吗?

时间:2014-10-14 12:30:33

标签: java corba idl

假设我创建了以下IDL文件:

module ProviderTest {
    interface Multiplier {
        long twice(in long number);
    };

    interface MultiplierProvider {
        Multiplier get();
    };
};

以后能够在客户端执行这样的调用(在Java中):

MultiplierProvider provider = /* obtain a stub form ORB */
Multiplier multiplier = provider.get();
int four = multiplier.twice(2);

Java IDL编译器为该IDL生成代码而没有抱怨,但是我在编写MultiplierProvider servant的实现时遇到了麻烦。它的get()方法的返回类型为Multiplier,这是一个生成的接口。为了实现MultiplierProvider,我扩展了MultiplierProviderPOA,但我没有Multiplier的合适实现类,因此我无法实现get()方法。

通常(如果没有从MupltiplierProvider引用Multiplier),在服务器端我会扩展MultiplierPOA(生成的类),然后通过命名服务发布它。 问题MultiplierPOA没有实现Multiplier接口,因此无法从MultiplierProvider.get()返回实例。

我在这里遗漏了一些基本原则,你不能用CORBA IDL做这样的事情(或者说Java的IDL支持不能处理这种情况)?如果这样的接口可以实现 - 实现如何工作?

2 个答案:

答案 0 :(得分:1)

这是可能的。在C ++中,您将从MultiplierPOA创建派生类并创建它的实例。然后,您将使用_this()成员函数返回对象引用,并可能激活默认POA上的服务方(如果之前尚未激活)。

粗略的C ++:

MyMultiplierPOA_ptr servant = new MyMultiplierPOA();
Multiplier_ptr object_ref = servant->_this(); // activate & create object reference
return object_ref;   // return to caller

我遗漏了一些神秘的IDL到C ++映射废话(例如_duplicate_var的东西,所以我不会让你感到困惑。)

我意识到你想要一个Java答案,但也许这会有所帮助。我假设IDL到Java映射提供了与_this()类似的机制。您可能想咨询IDL to Java mapping document on the OMG website。简而言之,它看起来似乎支持_this()方法。

答案 1 :(得分:0)

最近我找到了一个适合我的解决方案。因此,为了获得类型Multiplier的引用,可以从MultiplierPorider.get()方法返回,可以创建从MultiplierPOA派生的类的实例,然后将其注册到ORB同时从ORB获取存根,然后可以从get()方法返回。这是代码:

MultiplierImpl servant = new MultiplierImpl();
POA rootPOA = /* obtain a reference to the Root Object Adapter from the ORB */
/* get a reference of type Multiplier: 
   register the servant with POA and get a stub for it */
Multiplier multiplier = MultiplierHelper.narrow(rootPOA.servant_to_reference(servant));
/* construct the MultiplierProvider servant passing the stub to it */
MultiplierProviderImpl provider = new MultiplierProviderImpl(multiplier);
/* then register provider in Naming Context, so it can be obtained by the client using the name */

我还检查过,在以这种方式注册servant之后,可以使用以下代码来获取对stub的引用(感谢this answer):

/* method _this() is defined in MultiplierPOA */
Multiplier stub = servant._this();

虽然实现看似微不足道,但为了清楚起见,MultiplierProviderImpl类可能看起来像这样:

public class MultiplierProviderImpl extends MultiplierProviderPOA {

    private final Multiplier multiplier;

    public MultiplierProviderImpl(Multiplier multiplier) {
        this.multiplier = multiplier;
    }

    @Override
    public Multiplier getMultiplier() {
        return multiplier;
    }
}

,MultiplierImpl看起来像这样:

public class MultiplierImpl extends MultiplierPOA {

    @Override
    public void twice(int number) {
        return number * 2;
    }
}