Как я могу создать ссылку на существующие объекты модели?

Я новичок в MDSD/EMF, но делаю большие успехи благодаря поддержке Eclipse.

Я создал игрушечную модель, как вчера отвечал, как предложил awynne, и я очень близок. Я использую только EMF и его редактор сгенерированного дерева.

Вот краткое изложение моей метамодели EMF:

- EClass: Widget
  - name

- EClass: WidgetReference
  - aWidgetReference : Widget [0..1] Containment = false

- EClass: WidgetContainer
  - myWidgets : Widget [0..*] Containment = true

- EClass: ReferenceContainer
  - myReferences : WidgetReference [0..*] Containment = true

- EClass: TopLevelClass
  - myWidgetContainer    : [1] WidgetContainer    Containment = true
  - myReferenceContainer : [1] ReferenceContainer Containment = true

Сейчас происходит то, что в редакторе сгенерированного дерева для модели я создаю все, начиная с TopLevelClass. Я могу успешно создать несколько виджетов в WidgetContainer, и я могу создать одну ссылку WidgetReference в ReferenceContainer и связать ее с конкретным виджетом.

В случае, если кто-то сталкивается с этим, в сгенерированном коде редактора EMF есть ошибка:

Когда я пытаюсь добавить более одного WidgetReference в ReferenceContainer, редактор дерева показывает только первый WidgetReference в ReferenceContainer. Если я щелкну элемент WidgetReferences в дереве, он отобразит несколько ссылок WidgetReferences в представлении свойств. Это просто не позволит мне увидеть их в дереве, и поэтому не позволит мне выбрать их, чтобы изменить их ссылку, чтобы связать ее с реальным виджетом.

Обходной путь к этому - создать столько ссылок, сколько вам нужно, сохранить и закрыть модель, а затем снова открыть ее. После повторного открытия все ссылки будут показаны.

Спасибо за любую помощь / руководство.

Джефф

2 ответа

Решение

Я думаю, что ответ на ваш вопрос связан с идеей "сдерживания". Любой родительский объект, у которого есть ссылка на содержание (contentsment=true в метамодели EMF) на дочерний объект, управляет жизненным циклом этого дочернего объекта. Поэтому, когда дочерний элемент создается, ссылка родителя на этот объект создается автоматически. Если ссылка не относится к типу сдерживания (contentsment=false), вы можете указать ссылку на любой существующий объект модели правильного типа. Я думаю, что вам нужно установить ссылку как сдерживание = ложь.

Я не использовал Acceleo, поэтому давайте использовать редактор дерева EMF в качестве примера (эта концепция также применяется к редактору GMF): если в редакторе дерева родительский объект имеет ссылку на дочерний объект, пользователь может создать child, щелкнув правой кнопкой мыши по родителю и выбрав "new->child ->ChildObject." Если ссылка на дочерний элемент НЕ имеет типа сдерживания, пользователь сможет выбрать экземпляры этого объекта, которые уже существуют в модели, щелкнув соответствующее дочернее свойство в окне свойств родительского объекта.

Это помогает? Если это описание сбивает с толку, это может помочь создать игрушечную модель с некоторыми не содержащими ссылки ссылками и сгенерировать для нее редактор EMF.

Я не уверен, что концепция ссылок между моделями в EMF - это то, что вы описываете. Однако в модели вы можете ссылаться на элементы в других моделях. В редакторе Generic EMF, в котором вы создаете экземпляры модели, вы можете нажать правую кнопку и выбрать "Загрузить ресурс...". Этим новым ресурсом может быть любая другая модель, связанная с вашей моделью (ваша метамодель ссылается на метамодель другой модели).

Вы можете сделать это и на уровне метамодели. В графическом редакторе Ecore вы можете перетаскивать классы из других метамоделей. Они будут синхронизированы.

Я не уверен, однако, если это то, что вы спрашиваете.

Другие вопросы по тегам