# Modul Export

## Návaznost traverzerů na třídu Location

Traverzér je vlastně iterátor, jehož stav je zachycen v ukazatelích ve třídě Location. K řízení traverzérů odvozených z Location byly již dříve zavedeny členy fixedArch_, fixedEnt_, fixedArch_. Metoda Find() prohlásí každou uživatelem zadanou položku za fixovanou. Traverzéry TopTraverser a také VhdlExpTrav byly upraveny, aby fixní položky respektovaly. Uživatel tedy zadáním položek ve zdrojovém místě určuje filtr exportu. Metoda není příliš sofistikovaná, neboť nemůže říci např. „Entita XY a všechno, co používá“. Určeno spíše pro export jediné behaviorální architektury nebo k filtraci exportovaných architektur podle jména.

## Interface třídy Export

### Místa

Vstupním parametrem je objekt třídy Location. Jeho implicitní nastavení generuje pro každý jazyk specializovaná třída, viz níže. Předpokládá se nově, že na všechna místa byla již spuštěna metoda FindOrCreate() a uživateli vynadáno. Odpadají mnohé varianty konstruktoru a metody operator ()().

### Streamy

Původně si každý exportní modul otevíral stream sám. Tím se duplikoval a natahoval kód. Kromě toho bylo vyloučeno modulu předhodit něco jiného než soubor. Nyní je zakládání, otevírání a zavírání streamu vysunuto mimo modul. Ten dělá jen to, na co je určen – exportuje data.

## Třída ExportLang a její potomci

Tyto třídy jsou úložištěm veškerých jazykově závislých informací, jako je jméno jazyka, možné přípony souborů, počet cílových míst a jejich nastavení v závislosti na jméně souboru atd. Kořenové třídy ExportLang navíc obsahují statické seznamy, kde je možno jazyk najít podle přípony nebo jména. Začlenění jednotlivých jazyků do takového seznamu není automatické. Nebylo by problém použít techniky statické registrace v čase inicializace globálních proměnných. Pokud jsou však jednotlivé importní a exportní moduly v knihovně, linker neví, že je má přisestavit. Museli bychom si to vynutit nějakým odkazem – a to můžeme zrovna tak dobře voláním registrační funkce.

## Třída ExportStream a její potomci

Obdoba ExportLang pro různé druhy streamů, zejména kompresních.

## Scénář exportu – verze se zadáním přes jméno cílového souboru

1. UI dostane ze třídy ExportLang a ExportStream
   1. seznam existujících jazyků
   2. jejich přípony
   3. seznam existujících druhů streamů (kompresí)
   4. jejich přípony
2. UI vyloudí z uživatele jméno souboru.
3. Statická metoda třídy ExportStream na základě poslední přípony dekóduje kompresi a poskytne potomka ExportStream příslušného ke kompresi.
4. Je-li komprese, oddělí se poslední přípona.
5. Není-li komprese, nahradí se PlainExportStream.
6. UI může zkontrolovat, zda soubor existuje a nadávat uživateli.
7. Statická metoda třídy ExportLang na základě přípony dekóduje jazyk a poskytne příslušného potomka ExportLang.
8. Potomek ExportLang obdrží jméno souboru a vrátí implicitně nastavený objekt třídy Location.
9. UI může předhodit tato data uživateli ke kontrole a/nebo změně. Příznaky oblig a locked se použijí pro zvýraznění nebo naopak zašedivění příslušných polí. Položky třídy LocationItem s nastaveným příznakem locked UI odmítne modifikovat.
10. Potomek ExportLang poskytne exportní objekt.
11. Potomek ExportStream poskytne otevřený stream.
12. Spustí se exportní objekt na stream a nastavený vektor objektů Location.
13. Potomek ExportStream zavře stream.

## Scénář exportu – verze se zadáním přes jméno jazyka

1. UI dostane ze třídy ExportLang a ExportStream
   1. seznam existujících jazyků
   2. seznam existujících druhů streamů (kompresí)
2. uživatel zvolí jazyk a kompresi
3. Statická metoda třídy ExportStream poskytne potomka ExportStream příslušného ke jménu (druhu) streamu
4. Statická metoda třídy ExportLang poskytne potomka příslušného ke jménu jazyka
5. Potomek ExportLang poskytne implicitně nastavený objekt Location (zdrojové místo).
6. UI předhodí data uživateli. Příznaky oblig a locked se použijí pro zvýraznění nebo naopak zašedivění příslušných polí. Položky třídy LocationItem s nastaveným příznakem locked UI odmítne modifikovat.
7. Potomek ExportLang poskytne z těchto dat implicitní jméno souboru
8. Potomek ExportLang poskytne implicitní příponu a evtl. další pro zobrazení existujících souborů
9. Potomek ExportStream poskytne implicitní příponu a evtl. další pro zobrazení existujících souborů
10. UI předhodí kompletní implicitní jméno uživateli
11. UI dostane skutečné jméno od uživatele
12. Potomek ExportStream poskytne otevřený stream
13. Potomek ExportLang poskytne exportní objekt
14. Spustí se exportní objekt pro daný stream a zdrojové místo
15. Potomek ExportStream zavře stream