Оглавление

Add-In Известные ошибки

Данная страница содержит список ошибок выявленных во время разработки.

EA_MenuClick: Неверный MenuLocation при выборе пункта из "MainMenu".

EA: 7.5.844 - 7.5.847, ...
OS: Win XP Sp3
Описание:
Если с помощью плагина создать следующее меню:

MenuLocation="MainMenu" 
-----------------------
Add-Ins
- Addin Menu
 |- Item 1
 |- Item 2
- -----------
- Manage Add-Ins... 

То при выборе "Item 1" в EA_MenuClick будет передано MenuLocation = "Diagram" хотя должно быть "MainMenu". В EA_GetMenuState передается правильное значение.

Решение:

Add-In Особенности модели

Некоторые особенности Add-In модели, о которых нужно знать.

Отслеживание добавления новых методов


PHP5Plugin

Плагин для Enterprise Architect расширяющий стандартный функционал и улучшающий поддержку PHP5.

Распространяется под лицензией GNU General Public License v3 (GPL).

Обзор

Основные возможности: Системные требования:

1 Тестировался в 7.1.834. В 7.1.831 не работает "Check final methods overriding" и возможно "Check methods overriding".

2 Тестировался в 7.5.847.

Документация

История
Руководство пользователя
Разработка

Дополнительные ресурсы:

Помощь

Если у Вас остались вопросы или есть предложения/пожелания просьба присылать их на support@lastdragon.ru с пометкой "PHP5Plugin" в теме письма. Сообщения об ошибках пока тоже отправляем туда.


История плагина

В начале 2008 года я выбирал себе UML редактор, основным требованием к нему была нормальная кодогенерация для PHP5, а именно - возможность настроить то, что получим на выходе. От бесплатных редакторов отказался практически сразу - все из них или слишком простые (читай - с убогим интерфейсом, кодогенерация сторонними средствами) или тормозные (Eclipse с MDT). Выбирал между:

(Может кому пригодиться - Обзор UML редакторов на хабре. Часть 1 и Часть 2).

Первая неудача

Средство выбрано, изучается, я радуюсь широте настройки кодогенерации... Однажды захотелось показать значения методов по умолчанию на диаграмме - не вышло. Задав вопрос на официальном форуме, получил ответ - "это нельзя сделать" - обидно... Решил спросить на нашем форуме, результат тот же, но там возникла мысль использовать "искусственные способы" и поступило предложение отправить запрос в службу поддержки (спасибо Galogen-у), которая вроде как пообещала это реализовать (это до сих пор не сделано :().

Тогда же было высказано предложение использовать для вывода alias-ы, но их необходимо обновлять после каждого изменения параметров метода. Почитав документацию, я решил написать плагин, который бы выполнял это автоматически.

UMLAddin

Явился развитием идеи использования alias-ов. Написан он был на Delphi в "CodeGear RAD Studio". Особенности: Следующая версия - UMLAddin 1.1.0, несколько расширила функционал, было:

UMLAddin-1.1.0 - 85% от оригинала

В настоящее время проект прекращен

Скачать плагин можно из соответствующих постов на форуме:

Исходники доступны в репозитории: source:UMLAddin

PHP5Plugin

В процессе работы выяснилось много неприятных особенностей при использовании PHP5 в EA. большинство из них не смертельны, но неудобны. Посмотрев на существующий плагин, решил не переделывать его, а создать новый (тем более новый язык всегда интересно выучить :)). В результате появился PHP5Plugin, который в данный момент находиться в стадии разработки и предоставляет намного больший функционал по сравнению с UMLAddin.


Отслеживание добавления новых методов

В ходе реализации #17 необходимо было отследить момент создания нового метода у элемента, по ходу выполнения было выявлено несколько странных моментов. Краткое описание доступно в комментариях к указанной задаче, ниже приведена более подробная информация.

Дано

EA 7.5.847

Задача

Отследить добавление нового метода к элементу и узнать его свойства.

Использование EA_OnPreNewMethod

Событие возникает до добавления нового метода и по идее позволяет плагину определять, будет ли этот метод добавлен или нет. Казалось бы, что еще нужно? НО! посмотрим внимательнее, что можно узнать о добавляемом методе:

И все! Мне не удалось найти способ определить имя, параметры и другие свойства нового метода. Практически событие пригодно только чтобы узнать о том, что к элементу будет добавлен метод (зачем это может пригодиться я не знаю).

Использование EA_OnPostNewMethod

Это событие возникает уже после того как элемент был добавлен. Свойства:

Используя единственное свойство можно узнать любую информацию о методе. НО не все так просто. Рассмотрим несколько случаев:

Создание нового метода

Создадим новый метод "newMethod". Жмем "New", заполняем свойства:

Добавление метода

Жмем "Save", при этом возникают следующие события:

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: int
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: 
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]

EA_OnPostNewMethod [{
    Name: MethodID
    Value: 62
    Description: A long value corresponding to Method.MethodID
    }; ]

EA_OnContextItemChanged [
    GUID: {F1281627-F8E7-4635-935C-A6767545ADA3}
    objectType: otMethod
    ]

EA_OnNotifyContextItemModified [
    GUID: {4AE0DD67-0EE8-43c6-A968-FCB7F8A64ABF}
    objectType: otElement
    ]

Свойства нового метода, полученные в EA_OnPostNewMethod:

Method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {F1281627-F8E7-4635-935C-A6767545ADA3}
    MethodID: 62
    Name: newMethod
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 1000
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: int
    StateFlags: 
    Stereotype: 
    StereotypeEx: 
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
    ]

Создание нового метода путем копирования

Жмем "Copy":

Клонирование метода

Жмем "OK", при этом возникают следующие события:

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: int
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: 
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]

EA_OnPostNewMethod [{
    Name: MethodID
    Value: 63
    Description: A long value corresponding to Method.MethodID
    }; ]

EA_OnNotifyContextItemModified [
    GUID: {4AE0DD67-0EE8-43c6-A968-FCB7F8A64ABF}
    objectType: otElement
    ]

EA_OnContextItemChanged [
    GUID: {F476EA0C-12BC-4acc-8B5A-E252949F0121}
    objectType: otMethod
    ]

Свойства нового метода, полученные в EA_OnPostNewMethod:

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {F476EA0C-12BC-4acc-8B5A-E252949F0121}
    MethodID: 63
    Name: newMethod
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 0
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: int
    StateFlags: 
    Stereotype: 
    StereotypeEx: 
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

Добавление Getter-а и/или Setter-а

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

Добавление Getter-а и Setter-а для атрибута

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: void
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: property get
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]
EA_OnPostNewMethod [{
    Name: MethodID
    Value: 16
    Description: A long value corresponding to Method.MethodID
    }; ]
EA_OnPreNewMethod [{
    Name: ReturnType
    Value: void
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: property set
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]
EA_OnPostNewMethod [{
    Name: MethodID
    Value: 17
    Description: A long value corresponding to Method.MethodID
    }; ]
EA_OnNotifyContextItemModified [
    GUID: {B2593BA2-FBB1-49f8-8E0C-22F0E8D5A3A2}
    objectType: otElement
    ]
EA_OnNotifyContextItemModified [
    GUID: {B2593BA2-FBB1-49f8-8E0C-22F0E8D5A3A2}
    objectType: otElement
    ]

Повторный вызов EA_OnNotifyContextItemModified это не ошибка! Первый раз обновился элемент после добавления методов, второй - после изменения свойств атрибута.

Свойства новых методов, полученные в EA_OnPostNewMethod при первом и втором вызове:

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {54C56618-95EA-495d-B7D8-84F8761E258D}
    MethodID: 16
    Name: getTest
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 1
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: var
    StateFlags: 
    Stereotype: property get
    StereotypeEx: property get
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {98459834-6853-48e4-B6DE-AEBE44FCBC48}
    MethodID: 17
    Name: setTest
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 2
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: void
    StateFlags: 
    Stereotype: property set
    StereotypeEx: property set
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

Добавление нового метода плагином

Неизвестно

Выводы

При внимательном изучении событий видно что:

  1. Различается порядок EA_OnContextItemChanged и EA_OnNotifyContextItemModified после добавления метода
  2. EA_OnContextItemChanged не возникает после добавления Getter-а и/или Setter-а
  3. У нового метода Pos = 1000
  4. У клона имя совпадает(!) с оригиналом
  5. У клона Pos = Pos оригинала

Кроме этого, во время EA_OnPostNewMethod у метода список тегированных (Method.TaggedValues) значений пуст! Возможно, что недоступны и другие коллекции свойств метода.

Исходя из всего вышеперечисленного наилучший вариант - запоминать MethodID (или MethodGUID) в EA_OnPostNewMethod, а все действия производить при возникновении EA_OnNotifyContextItemModified для элемента, к которому был добавлен метод.

Если необходимо удалить клонированный метод после получения его свойств, то это надо делать в EA_OnNotifyContextItemModified, т.к. если это делать в EA_OnContextItemChanged то после удаления метода он останется в списке методов (свойств у него не будет):

Удаленный метод в списке

После повторного открытия списка методов он исчезнет. Способ обновить список из модуля не найден.


Руководство разработчика

Получение исходного кода

Исходный код плагина хранится в SVN репозитории.

Адрес репозитория: http://svn.lastdragon.ru/eaaddins/PHP5Plugin/

Получить разрабатываемую версию можно следующей командой:

svn co http://svn.lastdragon.ru/eaaddins/PHP5Plugin/trunk/ PHP5Plugin

Работоспособность в каждой ревизии не гарантируется!

Получить определенную стабильную ветку можно командой:

svn co http://svn.lastdragon.ru/eaaddins/PHP5Plugin/branches/{version}/ PHP5Plugin-{version}

Получить определенную стабильную версию можно командой:

svn co http://svn.lastdragon.ru/eaaddins/PHP5Plugin/tags/{version}/ PHP5Plugin-{version}

Обозначения:
{version} - номер нужной ветки или версии.

Другая полезная информация

Грань между "ошибками" и "особенностями" размыта...


Руководство пользователя

Установка

Процесс установки плагина предельно прост:

Один важный момент - регистрация плагина происходит только для текущего пользователя. Остальным пользователям нужно сделать это вручную1. Для этого достаточно добавить в реестр информацию из файла:

<Директория, в которую установлен плагин>\PHP5Plugin.reg

После этого плагин будет доступен в EA:

Список плагинов

Настройка EA

Для корректного отображения значений параметров методов по умолчанию необходимо настроить текущую диаграмму2. Для этого:

  1. Заходим в свойства диаграммы
    Открытие свойств диаграммы
  2. На вкладке "Diagram" отмечаем "Use Alias if Available"
    Свойства диаграммы, вкладка Diagram
  3. На вкладке "Features" ставим "Show Parameter Detail" равным "Name Only"
    Свойства диаграммы, вкладка Features
  4. Жмем "OK"

Если нужно, повторяем для остальных диаграмм. После этого получаем:

Вид методов после настройки


1 Если кто-нибудь подскажет, как автоматизировать этот процесс, буду благодарен.

2 В дальнейшем планируется автоматизировать это (#8).