我正在使用RHEL 5上的Redhawk 1.9开发一个Frontend 2.0接口兼容设备。我的实现是使用Java,我在JUnit中设置了一个测试框架,以便在开发过程中简化测试和指标。我希望通过传入“FRONTEND :: tuner_allocation”结构属性来进行自动测试,分配一个可用的调谐器。使用this question的答案,我想出了以下代码:
List<DataType> props = new LinkedList<DataType>();
props.add(new DataType("FRONTEND::tuner_allocation::tuner_type", AnyUtils.toAny("DDC", TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::allocation_id", AnyUtils.toAny(allocId, TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::center_frequency", AnyUtils.toAny(98700000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::bandwidth", AnyUtils.toAny(200000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::bandwidth_tolerance", AnyUtils.toAny(25.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::sample_rate", AnyUtils.toAny(200000.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::sample_rate_tolerance", AnyUtils.toAny(25.0, TCKind.tk_double)));
props.add(new DataType("FRONTEND::tuner_allocation::device_control", AnyUtils.toAny(true, TCKind.tk_boolean)));
props.add(new DataType("FRONTEND::tuner_allocation::group_id", AnyUtils.toAny("", TCKind.tk_string)));
props.add(new DataType("FRONTEND::tuner_allocation::rf_flow_id", AnyUtils.toAny("", TCKind.tk_string)));
DataType[] tunersToAllocate = new DataType[1];
tunersToAllocate[0] = new DataType("FRONTEND::tuner_allocation", AnyUtils.toAny(props, TCKind.tk_struct));
try
{
assertTrue(rhDevice.allocateCapacity(tunersToAllocate));
}
catch (InvalidCapacity invalidCapacity)
{
logger.error("Unexpected allocation failure (invalid capacity)", invalidCapacity);
assertTrue(invalidCapacity.getMessage(), false);
}
catch (InvalidState invalidState)
{
logger.error("Unexpected allocation failure (invalid state)", invalidState);
assertTrue(invalidState.getMessage(), false);
}
但是,这会在最终的AnyUtils.toAny()调用中导致空指针异常,因为采用TCKind的toAny()版本显然不支持非基本类型:
java.lang.NullPointerException
at org.ossie.properties.AnyUtils.insertInto(AnyUtils.java:636)
at org.ossie.properties.AnyUtils.toAny(AnyUtils.java:606)
at org.ossie.properties.AnyUtils.toAny(AnyUtils.java:616)
at com.<company-name>.redhawk.nsi.test.NsiClientDeviceTest.testAllocateTuner(NsiClientDeviceTest.java:247)
第247行是“toAny(props,TCKind.tk_struct)”的行。
查看AnyUtils类代码,我似乎应该传递一个TypeCode。但是,我不确定如何为struct属性获取TypeCode,因为getComplexTypeCode()和getPrimitiveTypeCode()的代码看起来都不包含对struct类型的检查。
我完全以错误的方式解决这个问题吗?如果没有,我如何表明我想要创建任何类型的结构?
答案 0 :(得分:0)
结构属性作为CF.Properties打包到CORBA Anys中,但不幸的是,AnyUtils中没有方法可以做到这一点。相反,您必须创建Any,然后将值插入其中。用户定义的CORBA数据类型(如CF.Properties)具有生成的辅助类,其插入和提取方法与Anys一起使用,而基本类型可以通过Any的成员函数插入或提取。
以下代码段通过ORB创建Any,并使用静态CF.PropertiesHelper.insert()方法将属性存储在其中:
org.omg.CORBA.Any tunerAlloc = org.omg.CORBA.ORB.init().create_any();
CF.PropertiesHelper.insert(tunerAlloc, props.toArray(new DataType[props.size()]));
tunersToAllocate[0] = new DataType("FRONTEND::tuner_allocation", tunerAlloc);
生成的CORBA帮助程序仅适用于数组,因此必须转换Java Collections类型(在上面的示例中,它是在线完成的)。如果您有自己的ORB引用,则可以使用它而不是ORB.init()。