java - 设置 OCL 上下文
问题描述
我正在尝试从 Java 应用程序更改 OCL 上下文。当前上下文是根节点。ARPackage 是根节点下的一个节点,我正在尝试将上下文设置为此节点。示例代码如下。
public void getPortInterfaces(Resource srcResource) throws ParserException {
OCL ocl = org.eclipse.ocl.ecore.OCL.newInstance();
OCL.Helper helper = ocl.createOCLHelper();
IQueryResult OEMPackage = GetIQueryResult(srcResource,"self->forAll(b|b.shortName='OEM')","ARPackage");
if(null != OEMPackage){
for (EObject obj : OEMPackage.getEObjects()) {
String shortName = ((ARPackage)obj).getShortName();
System.out.println("shortName: "+shortName);
if(shortName.equals("OEM")){
helper.setContext(Autosar40Package.eINSTANCE.getEClass("ARPackage"));
EObjectCondition condition = new BooleanOCLCondition<EClassifier, EClass, EObject>(ocl.getEnvironment(),
"context ARPackage inv:self.shortName<> 'null'", Autosar40Package.eINSTANCE.getEClass("ARPackage"));
SELECT statement = new SELECT(SELECT.UNBOUNDED, false, new FROM((obj.eResource()).getContents()),new WHERE(condition), new NullProgressMonitor());
IQueryResult results = statement.execute();
if(null != results){
for (EObject obj1 : results.getEObjects()) {
System.out.println(((ARPackage)obj1).getShortName());
}
}
}
}
}
}
private IQueryResult GetIQueryResult(Resource srcResource,String arg0,String arg1)
{
OCL ocl = org.eclipse.ocl.ecore.OCL.newInstance();
EObjectCondition condition;
IQueryResult results = null;
try {
condition = new BooleanOCLCondition<EClassifier, EClass, EObject>(ocl.getEnvironment(),
arg0, Autosar40Package.eINSTANCE.getEClass(arg1));
SELECT statement = new SELECT(SELECT.UNBOUNDED, false, new FROM((srcResource).getContents()),new WHERE(condition), new NullProgressMonitor());
results = statement.execute();
} catch (ParserException e) {
e.printStackTrace();
}
return results;
}
这里设置上下文后statement.execute()
仍然返回根节点本身对应的结果。我相信我设置上下文的方式是不正确的。
helper.setContext(Autosar40Package.eINSTANCE.getEClass("ARPackage"));
这是设置上下文的正确方法吗?
解决方案
您似乎正在使用已过时的 EMF Query。曾几何时,它代表了一种在类似 SQL 的 API 后面混淆 OCL 查询的方法。随着 OCLinEcore 的出现,EMF Query 没有用了。我怀疑你会找到任何可以帮助你的人。我建议您研究 Eclipse OCL 文档中的示例。
推荐阅读
- reactjs - 如何修复(Strapi-Plugin-users-permission > grant-koa@5.4.8nhas unmet peer dependency "koa@>=2.0.0"
- c - 有没有办法从 C 中的 .txt 文件中读取具有给定条件的可重复数据模式?
- typescript - .bail() 不适用于 express-validator
- c++ - C++ lambda 作为模板函数中的 std::function
- javascript - 这是打字稿功能吗?
- r - 如何更改数据框中列的顺序,然后按降序排列另一列?
- firebase - 数据功能不起作用反应本机 Firestore
- tkinter - 如何以 .png 格式保存画布屏幕(tkinter)?
- javascript - WKWebView,使用javascript提交表单
- project - 如何重用 Qbs 项目的属性?