在基于模型的分布式应用部署工具开发过程中,需要将向导页里的填写的值设置到对应的模型中。直接修改EditPart显然是不可取的,需要更改模型的属性,然后它会自动反映到EditPart中,从而保持一致性。通过如下代码可以获得EJBEditPart模型的实现类:

Object obj = ((StructuredSelection)viewer.getSelection()).getFirstElement();
EJBEditPart ejbPart
= (EJBEditPart)obj;
Object model
= ejbPart.getModel();
final EJBImpl ejbImpl = (EJBImpl)((View)model).getElement();

直接对这个实现类调用set函数进行设置会产生java.lang.IllegalStateException: Cannot modify resource set without a write transaction异常,也就是说,GMF中必须要在写事务中才能对资源进行修改,所以需要将ejbImpl封装起来用TransactionalEditingDomain执行命令来实现,GMF本身提供的RecordingCommand是不错的选择,它为我们提供了Undo支持,所以只要实现执行部分的代码就可以了,具体代码如下:

TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(ejbImpl);
domain.getCommandStack().execute(
new RecordingCommand(domain) {
@Override
protected void doExecute() {
ejbImpl.setName(name);
ejbImpl.setJndi(jndi);
ejbImpl.setUri(uri);
}
});

这样,就修改了GMF模型的属性,而且这个属性被设置后也会反映到EditPart中。