可以在Ecore和OCL中保留派生属性并禁用派生吗?

时间:2016-01-20 14:42:02

标签: eclipse-emf emf eclipse-emf-ecore ocl ecore

我希望移植遗留数据格式,其中包含类似于Eclipse Modeling Framework(EMF)Ecore:带参数的元素的概念,这些元素具有不同的数据类型和默认值。

定制工具允许您通过基于表格的精美GUI编辑此类模型实例。

此外,参数的一个共同特征是可以添加派生规则,它指定从其他参数自动计算参数值。这似乎与Ecore派生的属性类似,可以通过Java代码或OCLinEcore实现。

但是,传统格式的参数的自动派生是可选的。即用户总是可以选择这样的派生参数并选择他或她想要手动输入值。因此,即使派生的参数值也不是瞬态的,但总是保持不变,包括参数处于“自动”或“手动”模式的状态。

Ecore(包括像OCLinEcore这样的扩展)是否有任何方法可以持久保存派生属性并在运行时选择性/临时启用/禁用派生?

解决方法可能不是使用Ecore的派生属性功能,而是手动实现客户端代码中的可选派生。但是,可选派生规则的声明将不是标准方式。有没有办法重用OCLinEcore或类似的?

2 个答案:

答案 0 :(得分:4)

以下是我如何在Xcore中执行此操作:

interface Identifier {
    id String uid
    boolean derive_enabled = "true"
    unsettable String uid_derived

    readonly String uid_generated get {  // this is the 'derived' parameter
        if (uid_derived == null || uid_derived.isEmpty) {
            uid_derived  = EcoreUtil.generateUUID().toString
        }
        if (derive_enabled) {
            uid = uid_derived
        }
        return uid
    }
}

您也可以在Ecore / OCL-in-Ecore中轻松实现它。

我持久保存参数的派生值,但我总是可以通过更改布尔参数的值手动更改它(如果我喜欢)。然后,我为我需要的任何类实现了这个接口,所以我在全球范围内拥有这个功能。

答案 1 :(得分:0)

我不相信它是直接可能的。问题是你有两个可能的值:manual和derived,它们可能是相同的。如果派生不容易持久化。但如果导出是持久的,你怎么知道哪个是主人。

在EMF属性视图中出现了类似的问题,在这里可以区分具有灰色/不灰色背景的计算值和显式值。例如是计算或显式的GenModel编辑插件ID。更糟糕的是一个空白的属性default-literal unset或显式空白。

在元模型中有一个额外的主标志后,它应该相对容易。在那之前,你可能有一个大多数时候都能运行的解决方案,但其他时候可能会让人感到困惑。