Я создал простую модель конечного автомата в Enterprise Architect и экспортировал ее в файл, который я хочу прочитать в отдельной программе Java/Scala, основанной на реализации Eclipse MDT UML2.
Мне удалось заставить это частично работать, но все еще есть две оставшиеся проблемы:
Экспортированный файл XMI из EA содержит больше, чем просто часть
<uml:Model></...>
, и в этом случае после синтаксического анализа я получаю только объектыAnyTypeImpl
. На данный момент я вручную изменил файл и сократил его только до тега модели UML, хотя было бы неплохо иметь возможность каким-то образом использовать файл XMI из поля (экспорт EA).Я получаю
IllegalValueException
для разных атрибутов, напримерisOrthogonal="true"
. Трассировка стека для него выглядит примерно так:org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: org.eclipse.emf.ecore.xmi.IllegalValueException: значение «true» недопустимо. (файл: src/test/resources/test.uml, 7, 111) по адресу org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:315) по адресу org.eclipse.emf.ecore.resource .impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274) в org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:397)
Это код (в Scala, но на данный момент он почти такой же, как в Java), который я использую для загрузки файла модели прямо сейчас:
val resSet = new ResourceSetImpl
resSet.getPackageRegistry.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE)
resSet.getResourceFactoryRegistry.getExtensionToFactoryMap.put("*", UMLResource.Factory.INSTANCE)
resSet.getResource(URI.createURI("file:myfile.uml"), true)
Я не думаю, что на данный момент с файлом модели что-то не так (в конце концов, ортогональные состояния в конечных автоматах — это довольно простые и обычные вещи), поэтому я полагаю, что мне не удалось правильно настроить MDT/UML2 здесь. Поиск в Google привел к необходимости зарегистрировать соответствующую фабрику, что, похоже, сработало, иначе я получил бы более простую ошибку об отсутствующей фабрике. Но теперь, когда фабрика зарегистрирована, я не уверен, чего не хватает, и сообщение об ошибке здесь не очень мне помогает.