Как я могу создать ссылку на существующие объекты модели?
Я новичок в 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 вы можете перетаскивать классы из других метамоделей. Они будут синхронизированы.
Я не уверен, однако, если это то, что вы спрашиваете.