【问题标题】:Setting OCL context设置 OCL 上下文
【发布时间】:2019-08-08 18:29:03
【问题描述】:

我正在尝试从 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"));   

这是设置上下文的正确方法吗?

【问题讨论】:

    标签: java eclipse eclipse-emf ocl


    【解决方案1】:

    您似乎正在使用已过时的 EMF 查询。曾几何时,它代表了一种在类似 SQL 的 API 后面混淆 OCL 查询的方法。随着 OCLinEcore 的出现,EMF Query 没有用了。我怀疑你会找到任何可以帮助你的人。我建议您研究 Eclipse OCL 文档中的示例。

    【讨论】:

    • 好的,我会检查 OCL 文档。为了设置上下文,我使用了 OCL API setContext()。你觉得有什么问题吗?
    • OCL API 用于 OCL 评估。我无法评论它如何与 EMF Query 交互。
    猜你喜欢
    • 2019-08-08
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2015-09-25
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多