# Modul Import

## Architektura

Architektura modulu Import a jeho hypotetického submodulu pro jazyk Alpha je na obrázku.

Jazyk Alpha a zvyklosti okolo něj popisuje objekt třídy AlphaImportLang, který je zaregistrován ve statické mapě třídy ImportLang. Mimo jiné umí vygenerovat implicitní hodnotu míst, potřebných pro import (například umístění generovaných knihoven primitivů). Umí také zkonstruovat vlastní importní submodul, tedy objekt třídy AlphaImport, operující nad danou databází obvodu (Hub). Po doplnění a kontrole hodnot jsou objekty Location předloženy importnímu submodulu společně s otevřeným vstupním streamem. Definice některých jazyků předepisuje odvodit jméno hlavní entity ze jména souboru, proto je toto jméno také předáváno jako parametr.

Importní submodul má syntaktický analyzátor ve zvláštním objektu, třídy AlphaParser. Vazba mezi syntaktickou analýzou a importem je přes zpětná volání ze syntaktického analyzátoru do importu. Signatury těchto zpětných volání jsou shrnuty v abstraktní třídě AlphaParserClient.

Otevřený vstupní stream je předán přes syntaktický analyzátor lexikálnímu analyzátoru. Základ signatury lexikálních analyzátorů je shrnut ve třídě Lexan. Tato část kódu pochází z původní práce J. Kozáka, nebyla dostatečně refaktorizována a deále se vyvíjela živelně. Jistě by bylo možno sloučit mnoho rysů různých lexikálních analyzátorů a pravděpodobně kód výrazně zješdnodušit.

## Místa

Původně se předpokládalo, že při každém importu je třeba specifikovat jedno místu v hub-u (popsané třídou Location). Po přehlídce různých krajových zvyklostí se zjistilo, že jsou to 0-3 místa. Proto je vstupním parametrem vektor objektů třídy Location. Jeho implicitní nastavení a tedy i velikost 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ý importní a 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 – importuje a exportuje data.

## Třída ImportLang 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 ImportLang a 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é. Není 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 ImportStream a její potomci

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

## Scénář importu

1. UI dostane ze třídy ImportLang

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 ImportStream na základě poslední přípony dekóduje kompresi a poskytne potomka ImportStream příslušného ke kompresi.

4. Je-li komprese, oddělí se poslední přípona.

5. Není-li komprese, nahradí se PlainImportStream.

6. UI může zkontrolovat, zda soubor existuje a nadávat uživateli.

7. Statická metoda třídy ImportLang na základě přípony dekóduje jazyk a poskytne příslušného potomka ImportLang.

8. Potomek ImportLang obdrží jméno souboru a vrátí implicitně nastavený vektor 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 ImportLang poskytne importní objekt.

11. Potomek ImportStream poskytne otevřený stream.

12. Spustí se importní objekt na stream a nastavený vektor objektů Location.

13. Potomek ImportLang zavře stream (ví jak).

Prosté, že?