Как программно создать модель EMF (.ecore, .genmodel) из схемы XSD? - PullRequest
1 голос
/ 05 августа 2009

Я пытался сделать это как последний этап в автономном приложении для преобразования из формата файла, используемого программой моделирования, в модель EMF. Я могу преобразовать исходный формат в XSD, который я могу вручную преобразовать в модель EMF, используя импортер Eclipse, но я не знаю, как это сделать программно, чтобы автоматизировать процесс. Команды Java будут работать нормально, как и любой оператор командной строки, чтобы сделать то же самое, так как я мог просто выполнить оператор изнутри Java. Я потратил некоторое время на поиски того, как это сделать, пробуя http://wiki.eclipse.org/Generating_Dynamic_Ecore_from_XML_Schema и множество других потенциальных решений, но, похоже, ничего не работает. Если кто-то сможет предоставить пример кода о том, как генерировать файлы .ecore и (/ или?) .Genmodel из файла XSD, я был бы очень признателен, но даже некоторые рекомендации относительно того, как я могу действовать очень помог бы.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 августа 2009

Посмотрите на класс org.eclipse.xsd.ecore.XSDEcoreBuilder и то, как он используется мастером импорта Eclipse.
Кажется довольно простым в использовании, вы просто вызываете один из его generate методов и получаете обратно либо Collection<Resource>, либо Collection<EObject>.

(Изменить: отвечая на дополнительные вопросы в комментариях)
Класс EPackage является эквивалентом Ecore xs:schema, который содержит EClass es, которые в свою очередь являются эквивалентами Ecore xs:complexType s.

Следующий фрагмент кода должен создать и сохранить файл foo.ecore в той же папке, что и исходный XSD. Если в foo.xsd есть дополнительные импортированные XSD, они будут помещены в отдельные файлы .ecore, поэтому тип возвращаемого значения Collection<Resource>.

URI schemaURI = URI.createFileURI("foo.xsd");
Collection<Resource> ecoreResources = XSDEcoreBuilder.generateResources(schemaURI);
for (Resource ecoreResource : ecoreResources) {
    ecoreResource.save(null);
}
0 голосов
/ 24 марта 2015

Вышеупомянутый код работает здесь, используя следующую настройку:

Версия: Luna Service Release 2 (4.4.2) Идентификатор сборки: 20150219-0600

Плагины:

  • ATL SDK - SDK языка преобразования ATLAS 3.5.0.v201405260755 org.eclipse.m2m.atl.sdk.feature.group
  • Проект моделирования Eclipse Инструменты моделирования Eclipse 4.4.2.20150219-0708 epp.package.modeling
  • Kermeta MDK для Ecore 1.4.0 fr.irisa.triskell.kermeta.ecore.feature.group IRISA / INRIA
  • Примеры и редакторы OCL SDK 3.4.4.v20150213-2254 org.eclipse.ocl.examples.feature.group
  • Проект моделирования Eclipse
  • Xtext Complete SDK 2.7.3.v201411190455 org.eclipse.xtext.sdk.feature.group Проект моделирования Eclipse

Однако исходный файл XSD перезаписывается содержимым Ecore. Кроме того, операция save вызывается дважды (один раз для XSDResourceImpl и один раз для EcoreResourceFactoryImpl). Нам это нужно только для EcoreResourceFactoryImpl. Чтобы это исправить, вот пример кода:

    URI schemaURI = URI.createFileURI("library3.xsd");
    File outputFile = new File("library3.ecore");
    XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder(); 
    Collection<Resource> ecoreResources = xsdEcoreBuilder.generateResources(schemaURI);

    // for every resource found (includes eventually referenced XSDs)
    for (Resource ecoreResource : ecoreResources) {
        try {
            if (ecoreResource.getClass().getName().contains("EcoreResourceFactoryImpl")) {
                ecoreResource.save(new FileOutputStream(outputFile), null);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
...