Получить все дочерние узлы узла пакета Enterprise Architect - PullRequest
0 голосов
/ 19 сентября 2019

Что мне нужно

Шаг 1

Мне нужно сделать экспорт всей информации, независимо от типа узла, под основнойкорневой узел (= пакет).

Шаг 2

Используя эту информацию об экспорте, мне нужно сопоставить контракт JSON, предоставленный третьей стороной.

Шаг 3

Затем третья сторона может использовать мой JSON для импорта информации из EA в свою систему.

Что у меня есть

Шаг 1 завершен, у меня есть файл данных на моем целевом местоположении, например:

enter image description here

По сути, это статическийhtml сайт, который соответствует структуре советника путем отображения информации в древовидном представлении, аналогично тому, как вы видите ее в EA.

Что я могу сделать

перейдите в папку EARoot и прочитайте всю информацию, представленную в html-файлах, которые там находятся.

В моем случае EARoot содержит три подпапки:

  • EA1
  • EA2
  • EA3

Где подпапки EA1 содержат

  • EA1
  • EA2
  • EA1.html
  • EA2.html
  • EA3.html

HTML-файлы содержат необходимую информацию, которую можно интерпретироватьданные осмысленно.

Подвох

В том, что в EA нет прямой ссылки на файлы и фактическую структуру узлов.Я могу сделать предположение на основе доступных данных, которые будут работать в большинстве случаев, но они должны быть надежными и работать в любое время.

Я могу найти правильный UUID в каждом htmlфайл, так что это будет способ ссылки на структуру, но чтобы найти эту структуру, мне нужно иметь возможность получить UUIDS всех дочерних узлов и рекурсивно пройти по дереву.

Я пыталсяследующее:

public Package GetRootPackage()
{
    using (var repo = EnterpriseArchitect.Repository.Open(_connectionString))
    {
        return repo.GetPackage(this.RootPackageName);
    }
}

EnterpriseArchitect.Repository - это оболочка поверх EA.Repository, позволяющая сделать его IDisposable для лучшего управления соединением.

Использование метода GetRootPackageопределенный выше, я могу подключиться и загрузить нужный мне узел:

var root = MyBuilder.ConnectTo(myConnectionString)
    .RootPackage(rootNodeName)
    .GetRootPackage();

Я думаю, что тогда я смог бы получить его потомки вот так:

var children = root.Packages;

Нозатем я получаю эту неприятную ошибку:

System.Runtime.InteropServices.COMException HResult = 0x80010105
Сообщение = Сервер выдал исключение.(Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) Source = my.console
StackTrace: в EA.IDualPackage.get_Elements () в my.console.Program.Main (String [] args) в C: \ Repos \ my.console \ Program.cs: строка 29

Я проверил EventViewer для получения дополнительной информации и нашел (только) это:

Faulting application name: EA.exe, version: 14.1.0.1427, time stamp: 0x5b9718a5
Faulting module name: EA.exe, version: 14.1.0.1427, time stamp: 0x5b9718a5
Exception code: 0xc0000005
Fault offset: 0x0049ffc4
Faulting process id: 0x2eac
Faulting application start time: 0x01d56eb6d931a965
Faulting application path: C:\Program Files (x86)\Sparx Systems\EA\EA.exe
Faulting module path: C:\Program Files (x86)\Sparx Systems\EA\EA.exe
Report Id: 223f8c89-c84a-45c6-9100-82af8e94643a
Faulting package full name: 
Faulting package-relative application ID: 

Вопрос

То, что я нахожу относительно этого HResult=0x80010105, похоже, связано с Excel, поэтому я не уверен, имеет ли это смысл.

Я бегу из консоли, потому что я понял, что interop.EA должно бытьсчитается не поточно-безопасным.

Что я могу сделать, чтобы избежать этой проблемы и получить дочерние пакеты?

...