首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置OCL上下文

设置OCL上下文
EN

Stack Overflow用户
提问于 2019-03-18 19:38:25
回答 1查看 71关注 0票数 0

我正在尝试更改Java应用程序中的OCL上下文。当前上下文是根节点。ARPackage是根节点下的一个节点,我正在尝试设置该节点的上下文。示例代码如下所示。

代码语言:javascript
复制
   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;
}

在这里,在设置之后,context statement.execute()仍然返回与根节点本身相对应的结果。我认为我设置上下文的方式是不正确的。

代码语言:javascript
复制
helper.setContext(Autosar40Package.eINSTANCE.getEClass("ARPackage"));   

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

EN

回答 1

Stack Overflow用户

发布于 2019-03-18 20:18:29

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55220497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档