【发布时间】:2020-07-03 16:21:52
【问题描述】:
我遇到了来自另一位开发人员的一些代码,他试图针对其他对象 BooFar 验证对象 FooBar,代码执行如下操作:
// Xtend code
@Inject IContainer.Manager containerManager
@Inject IResourceDescriptions resourceDescriptions
@Inject Provider<XtextResourceSet> resourceSetProvider
@Check
def validate(FooBar foobar) {
var desc = resourceDescriptions.getResourceDescription(foobar.eResource.URI)
var visibleContainers = containerManager.getVisibleContainers(desc, resourceDescriptions)
for (visibleContainer : visibleContainers) {
var exported = visibleContainer.getExportedObjectsByType(ModelPackage.Literals.BOOFAR)
var allObjects = newArrayList
exported.forEach [boofar |
// this is the line I'm interested about -->
allObjects.add(resourceSetProvider.get.getEObject(boofar.EObjectURI, true) as BooFar)
]
// ...
}
// ...
}
因此,此验证器尝试访问“类路径”并加载所有导出的 BOOFAR 对象以进行验证。
现在我的问题是:这是否允许?
显然不好,因为
- 我猜
resourceSetProvider会为每个BOOFAREObjectDescription创建一个新的ResourceSet - 对于每个
EObjectDescription,一个Resource被加载并解析以解析EObject
我知道(至少我认为我知道)交叉验证的更(最?)最佳方法是将验证所需的所有信息包含在 BooFar 对象的 EObjectDescription 中,因此,不是解析对象,但针对 EObjectDescription 进行验证。
我的问题是:以上是否允许,代码除了速度慢之外还有其他缺点吗?
另外 - 额外问题 - 我还看到了针对已验证资源的 resourceSet 进行解析的代码。因此,在上面的示例代码中,将有问题的行替换为
allObjects.add(EcoreUtil.resolve(boofar.EObjectOrProxy, foobar.eResource.resourceSet) as BooFar)
这是允许的吗?我的想法是,这可能会导致问题,因为此代码会干扰XtextBuilder 的ResourceSet,如果我们使用ParallelResourceLoader,那么它甚至可能会导致竞争条件?
所以总结一下:我想知道上面的两个变种是否只是不好甚至被禁止。
【问题讨论】:
标签: java validation xtext xtend