Chyba Enterprise Architecta v objektovém modelu

Při programování rozšíření pro EA jsem narazil na další chybu. Funkce Repository.GetContextItemType() nevrací správnou hodnotu, pokud máte vybraný model v Project Browseru. Namísto hodnoty otModel dostanete otNone, což není úplně zdravé. Chybu jsem poslal do Sparxu, ale údajně o ní již dlouho vědí, ovšem do opravy se jim zřejmě nechce. Než se tak stane, můžete použít následující funkci, které problém řeší:

protected EA.ObjectType temporaryGetContextItemType(EA.Repository Repository) {
EA.ObjectType vOT = Repository.GetContextItemType();
if (vOT == EA.ObjectType.otNone)
//try it to retype to Package and check if it is a model...
//if anything gets wrong, forget it
try {
if (((EA.Package)(Repository.GetContextObject())).ParentID == 0)
return EA.ObjectType.otModel;
} catch { }
return vOT;
}

Funkce v případě, že GetContextItemType vrátí otNone, tak zkusí vybraný objekt přetypovat na balík a zjistit jeho ParentID. Pokud se to povede a hodnota je rovna nule, jde o model, jinak je to cokoliv jiného, chybné přetypování odchytím v sítu výjimek a navrátím původní hodnotu.

Pokud budete dále pracovat s balíkem, který je vlastně modelem, tak také dejte pozor na to, že jeho vlastnost Element je null (což se v dokumentaci nedozvíte). Není to od autorů hezké.

A drobnost na závěr: funkce očekává, že máte otevřený nějaký projekt. Že tomu tak opravdu je, byste si měli zajistit sami např. vhodným povolením či zakázáním jejího volání v EA_GetMenuState.

Jak naprogramovat rozšíření pro Enterprise Architect

Vytvořit vlastní rozšíření (plug-in) pro Enterprise Architect je velmi snadné, rychlé a dokonce bez dalších nákladů na programovací nástroje. Jak tedy na to?

Předpokládám, že máte nainstalovaného Enterprise Architecta (pro uvedené pokusy stačí i dosud funkční trial verze). Dále budete potřebovat nějaký programovací nástroj. Jestliže nechcete do něj vkládat jakékoliv peníze, použijte Express edici Visual Studia od Microsoftu. Já sám používám VS Express 2013 for Desktop s jazykem C#. Pokud tedy i to máte, můžeme přikročit k vlastní tvorbě (ukázky budou právě v C#).

Visual Studio

  1. Spusťte si Visual Studio a vytvořte nový projekt podle šablony Class Library.
  2. Nyní musíte svůj projekt ve VS seznámit s Enterprise Architektem, tedy jinými slovy přidat na něj referenci. Díky tomu budete moci využívat třídy a jejich vlastnosti definované přímo dodavatelem EA. To uděláte tak, že:
    1. V Solution Exploreru zvolíte položku References a přes kontextové menu vyberete položku Add Reference… 
    2. V dialogu Reference Manager, který se otevře, zvolte tlačítko Browse… a z adresáře, kde máte nainstalovaný Enterprise Architect, vyberte soubor nazvaný Interop.EA.dll.

       

    3. Zvolte tlačítko OK.
  3. Jelikož budeme zobrazovat nějaké informace i uživateli, pak přidáme ještě System.Windows.Forms (podobně jako v předchozím kroku vyvoláme dialog Reference Manager, vlevo zvolíme Assemblies –> Framework a v seznamu zaškrtneme System.Windows.Forms).
  4. V tomto kroku řekneme překladači, aby s naší knihovnou zacházel tak, aby ji šlo použít jako COM objekt. Toho docílíme tak, že:
    1. dvojitým kliknutím (dablklikem) na položku PropertiesSolution Exploreru zobrazíme vlastnosti našeho projektu.
    2. Zvolíme tlačítko Assembly Information…
    3. Zaškrtneme Make assembly COM-visible.
    4. Volitelně můžete upravit i další pole.
    5. Stiskněte OK.
  5. Abychom si ulehčili ještě trochu život, požádáme Visual Studio, aby po každém sestavení nové verze na našem počítači zaregistrovalo knihovnu do registrů.
    1. Z předchozího kroku máme zobrazené Project Extensions. Po pravé straně zvolíme záložku Build.
    2. V sekci output zaškrtněte políčko Register for COM interop.
  6. Visual Studio pro nás připravilo třídu Class1. Pro lepší pohodlí si ji můžete přejmenovat např. na MyFirstEAPlugin, podobně i soubor na MyFirstEAPlugin.cs.
  7. Zkopírujte si nyní následující zdrojový kód do VS. V textu je pár komentářů, které vysvětlují jednotlivé metody. Obecně lze říct, že EA volá v případě potřeby metody začínající na EA_. Pro další studium je tu pro vás nápověda k Enterprise Architektovi a oblast nazvaná Automation and Scripting.
    using System;
    using System.Windows.Forms;

    namespace OCUPBlokPlugin
    {
    public class MyFirstEAPlugin
    {

    ///
    /// Tuto metodu volá EA aby zjistil, jakého typu je náš plugin.
    /// Můžeme buďto zvolit MDG, pokud tvoříme plugin tohoto typu, jinak
    /// vrátíme prázdný řetězec, čímž říkáme, že jde o obecný plugin.
    ///

    /// Budeme ignorovat.
    /// Vrátíme prázdný řetězec.
    public String EA_Connect(EA.Repository Repository)
    {
    return "";
    }

    ///
    /// Metoda je volána při ukončování EA. Takže po sobě zkusíme trošku uklidit.
    ///

    public void EA_Disconnect()
    {
    GC.Collect();
    GC.WaitForPendingFinalizers();
    }

    ///
    /// Definujeme si někteté položku v Menu
    ///

    const string menuHeader = "-&OCUP blok plug-in";
    const string menuItemAbout = "&About...";

    ///
    /// Pokud EA potřebuje znát seznam položek menu, pak se zavolá tato metoda
    ///

    /// Repository jako taková
    /// Umístění menu
    /// Název menu
    ///
    public object EA_GetMenuItems(EA.Repository Repository, string Location, string MenuName)
    {

    switch (MenuName)
    {
    // Jde o hlavní položku, vrátíme náš název
    case "":
    return menuHeader;
    // a zde vrátíme všechny naše položky mmenu
    case menuHeader:
    string[] subMenus = { menuItemAbout };
    return subMenus;
    }

    return "";
    }

    ///
    /// Tady se nás EA ptá, zda má položku v menu povolit nebo zakázat.
    /// Můžeme tak reagovat na různé stavy (např. zdali je otevřen nějaký projekt).
    ///

    ///
    ///
    ///
    ///
    ///
    ///
    public void EA_GetMenuState(EA.Repository Repository, string Location, string MenuName, string ItemName, ref bool IsEnabled, ref bool IsChecked)
    {
    switch (ItemName)
    {
    case menuItemAbout:
    IsEnabled = true;
    break;
    default:
    IsEnabled = false;
    break;
    }
    }

    ///
    /// Konečně! Někdo zvolil některé z našeho menu, takže směle do toho.
    ///

    ///
    ///
    ///
    ///
    public void EA_MenuClick(EA.Repository Repository, string Location, string MenuName, string ItemName)
    {
    switch (ItemName)
    {
    case menuItemAbout:
    MessageBox.Show("OCUP blok plug-in. Hello, EA user!");
    break;
    default:
    MessageBox.Show("Neobsloužená položka menu!");
    break;
    }
    }




    }
    }
  8. Teď vaše řešení přeložte, aby se vytvořila DLL knihovna. Poznámka: Na některých operačních systémech je třeba mít pro následnou registraci dostatečné oprávnění, Visual Studio je pak nutné spouštět jako správce. 

Záznam do registrů

Nyní máte sestavenou a zaregistrovanou knihovnu. Posledním krokem je říct EA, aby ji používal. K tomu stačí drobný zásah do registrů:

  1. Spusťte editor registrů regedit.
  2. Najděte větev HKEY_CURRENT_USERSoftwareSparx SystemsEAAddins.
  3. Přidejte do této větve nový klíč s názvem projektu ve Visual Studiu (v našem příkladu je to OCUPBlokPlugin).
  4. V registrech vznikne i výchozí hodnota pro tento klíč. Změňte ji dle formátu [název projektu].[název třídy], tedy opět v našem případě na OCUPBlokPlugin.MyFirstEAPlugin.

A je hotovo! Teď můžete svůj výtvor otestovat.

Enterprise Architect

  1. Otevřete si EA (pro náš pokus není nutné mít otevřený žádný projekt).
  2. V menu Extensions zvolte položku OCUP blok plug-in, která rozbalí a ukáže jednu položku About…:
  3. Pokud ji zvolíte, dostanete jednoduché hlášení: 

Jak vaše rozšíření distribuovat?

Pokud máte nějaký software na tvorbu instalačních souborů, tak máte vyhráno, zachovejte se podle jeho instrukcí. V opačném případě je třeba postupovat následovně:

  1. Zkopírujte si knihovnu (s případnými dalšími potřebnými soubory) na nové místo (na jiný počítač).
  2. Na novém místě je třeba zaregistrovat soubor do registrů. To se dělá pomocí aplikace regasm, kterou máte v adresáři %WINDIR%Microsoft.NETFrameworkv4.0.30319. Celá registrace pak probíhá tímto příkazem:

    %WINDIR%Microsoft.NETFrameworkv4.0.30319regasm OCUPBlokPlugin.dll /codebase

  3. Je třeba se zmínit Enterprise Architectovi o vašem pluginu. To, jak již víte, se dělá vytvořením klíče v registrech. Zde stačí export vašeho stávajícího klíče a pak distribuovat přímo .reg soubor.

Jak dál?

Teď už je to na vás. Podívejte se na uvedené metody začínající na EA_ a prostudujte si nápovědu, co vše lze tvořit. Možností je mnoho. Pro vaši potřebu si můžete stáhnout celé zdrojové kódy uvedeného příkladu zde.