【发布时间】: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