2016-12-16 11 views
0

Чтобы иметь контекст, в настоящее время я работаю над преобразованием модели ecore to java. Практически, я читаю некоторый файл ecore и генерирую строку, которая является допустимым исходным кодом интерфейса Java.ECore отражение и перекрестные ссылки

В качестве примера можно привести рабочий процесс создания кода.

projectA.ecore:

определяет EClass 'A'

package projectA : projectA = 'http://www.example.org/projectA' 
{ 
    class A; 
} 

projectB.ecore:

определяет EClass 'B', которые наследуют от 'A', используя перекрестная ссылка на a.ecore, чтобы получить к нему доступ.

import projectA : '../../projectA/model/projectA.ecore#/'; 

package projectB : projectB = 'http://www.example.org/projectB' 
{ 
    class B extends projectA::A; 
} 

С тех Ecore я сначала создать интерфейс для projectA.ecore:

package projecta; 

interface ProjectA<A> { 
    // ... 
} 

А теперь я хочу сделать то же самое для projectB.ecore и получает следующий интерфейс:

package projectb; 

import projecta.ProjectA; 

interface ProjectB<A,B> extends ProjectA<A> { 
    // ... 
} 

Для этого мне нужно обнаружить, что A и EClass доступны с использованием перекрестной ссылки, и сделать некоторый анализ в projectA.ecore, чтобы создать допустимое расширение интерфейса, пакеты импортируют ...

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

EDIT: Технические детали

Я загружающий Ecore, используя этот вид кода:

final ResourceSetImpl resourceSet = new ResourceSetImpl(); 
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl()); 
final Resource resource = resourceSet.getResource(uri, true); 
final EPackage ePackage = (EPackage) resource.getContents().get(0); 
final String fileContent = new GenerateAlgebra().process(ePackage); 

GenerateAlgebra класс, посвященный .ecore к трансформации String. Технически он разработан с использованием Xtend (https://github.com/manuelleduc/ecore-oa/blob/master/fr.inria.diverse.ecorealgebragenerator/src/fr/inria/diverse/objectalgebragenerator/popup/actions/GenerateAlgebra.xtend).

+0

Вы хотите реализовать свой собственный специфический генератор кода, а не использовать имеющийся генератор ЭДС?Можно загружать объекты ecore xmi в java Objects, а разрешение прокси на связанные с перекрестками EClasses другого EPackage устанавливает связь между ними. Можете ли вы быть более конкретными о том, как вы создаете? –

+0

Я еще не понял вашу проблему. Нужно ли загружать оба Epackages с их соединением? Чтобы вы могли идентифицировать супертип A? –

+0

В основном мне нужно узнать файл .ecore, в котором определен класс EClass. –

ответ

1

Если вы просто хотите, чтобы получить путь к файлу к файлу Ecore, в котором EClass определяется использовать ресурс URI

попробовать:

ePackage.eResource().getURI() который дает фактический URI в файл Ecore, в котором пакет и все его EClasses определены. что-то вроде: file:/Users/../../yourPath/projectA.ecore Вы также можете использовать getNsURI(), getName(), чтобы идентифицировать два файла ecore.

Если вы используете Resourceet, как и вы, и у вас есть перекрестные ссылки между несколькими файлами ecore, тогда набор пытается загрузить все остальные ресурсы. Это означает, что при вызове resourceSet.getResource(uri, true) набор ресурсов должен содержать оба ресурса.

попробовать перебором resourceSet.getResources()

 Смежные вопросы

  • Нет связанных вопросов^_^