Modulární architektura restauračního systému. Alexandr Makarič
|
|
- Anna Burešová
- před 5 lety
- Počet zobrazení:
Transkript
1
2 ii
3 České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů Bakalářská práce Modulární architektura restauračního systému Alexandr Makarič Vedoucí práce: Ing. Martin Komárek Studijní program: Softwarové technologie a management, Bakalářský Obor: Softwarové inženýrství 22. května 2014
4 iv
5 v Poděkování Rád bych poděkoval vedoucímu práce Ing. Martinu Komárkovi a mé matce Janě Makaričové.
6 vi
7 vii Prohlášení Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu 60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Praze dne
8 viii
9 Abstract The aim of this thesis was to analyze the current project of restaurant management system CashBob and propose a set of guidelines and rules to transfer the project to take advantage of OSGi component model for the benefit of adding new functionality without the need to stop the running system. The resulting implementation of these rules was then tested on the client part of the application and structured for the use by future developers of the project. Abstrakt Cílem této práce bylo analyzovat stávající projekt restauračního systému CashBob a navrhnout postup, jakým tento projekt upravit tak, aby využíval komponentového modelu OSGi a bylo možné ho za běhu rozšiřovat o novou funkcionalitu bez nutnosti zastavovat běžící aplikaci. Daný návrh bylo potřeba implementovat, otestovat na klientské části aplikace a navrhnout pravidla, kterými se budou řídit vývojáři nových částí aplikace. ix
10 x
11 Obsah 1 Úvod Services (Služby) Bundl Manifest - OSGi hlavičky Životní cyklus bundlu Skrývání informací Principy GRASP SOLID KISS + DRY Nástroje Testování Restaurační systém CashBob Architektura Problém Řešení OSGi Iterace I 0 Minimální nasazení OSGi Úvod Cíl Iterace BundleActivator Závislosti Externí knihovny Závěr Iterace II - Izolace modulu Úvod Cíl Iterace Úpravy Závěr xi
12 xii OBSAH 5 Iterace III - Dynamická komponenta Úvod Cíl Iterace Závěr Závěr Restaurační systém CashBob Výsledek Literatura 27 A Seznam zkratek 29 B Instalační manuál 31 C Obsah CD 33
13 Seznam obrázků 1.1 Architektura OSGi frameworku [6] Životní cyklus bundlu [4] Dialog spouštěcí konfigurace OSGi projektu xiii
14 xiv SEZNAM OBRÁZKŮ
15 Seznam tabulek 1.1 Výběr OSGi hlaviček Moduly projektu CashBob xv
16 xvi SEZNAM TABULEK
17 Kapitola 1 Úvod V průmyslu se na každém kroku setkáváme se standardizací, v našich končinách nejčastěji reprezentovanou normami ČSN a ISO. Výhody jsou zřejmé: jednotné součástky, jednotné nástroje, jednotné postupy. To vše vede ke snadné zaměnitelnosti a znovupoužitelnosti. Rozhodneme-li se vyrobit například nový automobil, nemusíme znovu vymýšlet kola, matky a šrouby. Použijeme stávající části a pouze pozměníme způsob, jakým vše sestavíme dohromady. Případně vytvoříme novou komponentu, vycházející ze stávajících součástí, ale nejlépe tak, abychom ji mohli použít i v dalším projektu. S obdobným jevem se setkáváme i při vývoji softwarových aplikací. Již od prvních programovacích jazyků se snažíme brát dobré myšlenky, separovat je z existujících programů, zobecňovat je, abychom je mohli snáze používat znovu a znovu. Nové technologie a koncepty, jako například funkcionální programování a objektový pohled na svět, s sebou přinášejí nové možnosti, jak elegantněji řešit problémy. Říká se sice, že: Všechny cesty vedou do Říma, ale v případě vývoje softwarových aplikací ne všechny postupy, na jejichž konci je fungující aplikace, jsou ideální. Každá nová technologie nám přináší nové cesty, jak stavět software, a my se musíme snažt nacházet ty neschůdnější postupy, které se snadno používají. Ty sdružujeme do knihoven, univerzálních modulů, které pouze s malými obměnami můžeme používat znovu a znovu. Myšlenka programovacího jazyku Java, že je možné program přeložit do univerzálního byte-kódu a ten spustit kdekoliv, je dalším krokem ke znovupoužitelnosti myšlenek. Write once, run anywhere býval slogan Javy. Bohužel časem se Java rozdělila na několik odnoží: konkrétně Java SE, Java ME a Java EE. Každá z těchto odnoží se přizpůsobuje jinému prostředí, ve kterém je aplikace spouštěna, a nabízejí tedy různé modely a koncepty řešící modularizaci a znovupoužitelnost kódu [2]. I vývojáři různých aplikací a frameworků, například JBoss nebo NetBeans, řeší otázku modularizace po svém a vznikají různé proprietární modularizační vrstvy s vlastnímy mechanismy načítání tříd, packagování, nasazování (deployment) a řešení závislostí [6]. Cílem OSGi Alliance, původně sdružením výrobců malých domácích embedded zařízení jako například set-top-boxy nebo home gateway zařízení nazývaném Open Service Gateway Initiative, je vytvořit společnou a otevřenou platformu pro poskytovatele služeb, vývojáře, správce systémů a prodejce softwaru a příslušenství ke koordinovanému vytváření, nasa- 1
18 2 KAPITOLA 1. ÚVOD zování a správě služeb. OSGi vytváří specifikaci 1 takového frameworku, jehož primárním cílem je využití platformní nezávislosti a schopnosti dynamického načítání kódu jazyka Java k usnadnění vývoje a dynamického nasazení aplikací na zařízení s omezenými pamět ovými nároky [6], přičemž není nutné se omezovat pouze na embedded zařízení. Velké množství vývojářů aplikací a frameworků již adaptovalo OSGi model jako základ svých projektů nebo se k němu začíná přiklánět. Můžeme zmínit například platformu Eclipse nebo aplikační servery JBoss, GlassFish, Websphere a další [1]. Framework se snaží nespoléhat na prostředí, ve kterém je spuštěn a snahou vývojáře aplikace má být podobné smýšlení. Především jde o oddělení vlastní implementace služby od její specifikace (typicky reprezentovanou pomocí Java interface). Důsledkem je, že aplikace je méně svázána s prostředím, ve kterém je spouštěna, nebot pro nasazení na konkrétní platformu se použije patřičná implementace služby. Příkladem může být logování událostí. V případě, že je aplikace nasazena na standartním PC, není problém události logovat do souboru na disk. V případě nenáročného embedded zařízení s omezenou kapacitou je příhodnější logovat na vzdálený server. Vývojáři služby pro logování vždy implementují podle stejné specifikace stejně jako vývojáři aplikace, která bude službu využívat. Interface pak vytváří bod, kde dochází k odstínění kódu vyžadujícího službu a její implementace. Další vlastnost, kterou framework přináší, je možnost rozdělení aplikace na drobnější instalovatelné komponenty, kde každá má svůj životní cyklus. Tyto komponenty se nazývají bundles 2. Bundly je možné přidávat či odebírat dle potřeby za běhu, bez nutnosti zastavovat celý systém. Když je bundl nainstalován do systému, může zaregistrovat libovolné množství služeb, které poskytuje pro ostatní bundly. Framework pracuje s následujícími klíčovymi prvky: Služby - Java třídy poskytující danou funkcionalitu Bundly - základní jednotka modularizace nesoucí funkcionalitu Bundle Context - souhrnné prostředí, v němž jsou bundly spouštěny uvnitř Frameworku 1.1 Services (Služby) Služba je uzavřená komponenta dostupná skrze její rozhraní (interface). OSGi aplikaci si můžeme představit jako sadu kooperujících služeb. Framework se stará o mapování konkrétních služeb na jejich implementace a poskytuje mechanizmus k vyhledávání jejich dostupných implementací. Jak již bylo řečeno, je služba definována rozhraním a její implementací. K registraci služeb daného bundlu do frameworku se typicky využívá třídy implementující rozhraní BundleActivator, která, pokud je přítomna, je použita k inicializaci bundlu a registraci služeb. Protože ale tento postup byl poněkud těžkopádný nebot bylo nutné pro 1 V době psaní této práce byla aktuální verze R5, která přinesla pouze pár drobných změn. Většina této práce se odkazuje především na verzi R4. 2 V češtině je možná nejvhodnější použít termín modul, nicméně tento pojem budu používat v jiném kontextu. Dále v textu budu používat počeštěný termín bundl/bundly.
19 1.2. BUNDL 3 každý bundl obsahující službu typicky implementovanou jednoduchou POJO třídou definovat novou aktivační třídu s pokaždé téměř identickou funkcionalitou, vznikly různé projekty, které automatizovaly a zjednodušovaly tento proces. Následně přinesla verze R4 specifikace požadavek, aby tuto funkcionalitu zajišt oval přímo framework. Vznikl model Declarative Services (DS). Ten využívá konfigurace pomocí XML souboru a zbavuje potřeby přidávat do bundlu kód, který nesouvisí s funkcionalitou služby. Obrázek 1.1: Architektura OSGi frameworku [6] 1.2 Bundl Specifikací definovaná jednotka modularizace se nazývá bundl. Bundl může obsahovat kód a další zdroje nutné k implementaci služeb, přičemž jeden bundl může implementovat více různých služeb nebo také žádnou. Bundl je ve své podstatě obyčejný JAR soubor, který má svůj MANIFEST.MF soubor doplněn o hlavičky OSGi. Tyto hlavičky framework zparsuje a dle nich správným způsobem bundl nainstaluje do systému a aktivuje ho. Takovouto minimální úpravou je možné nasadit libovolný kód zabalený v JAR souboru bez nutnosti zasahovat do výkonného kódu. Pro každý bundl, nainstalovaný do frameworku je vytvořen samostatný Classloader, který defaultně načítá pouze třídy a zdroje v bundlu samotném, základní třídy frameworku a Java packages z ostatních bundlů explicitně vyjmenované v hlavičce Import-Package.
20 4 KAPITOLA 1. ÚVOD Hlavička Význam Bundle-ManifestVersion Verze OSGi hlaviček manifestu. Pro specifikaci verze R3 je použita hodnota 1, pro verzi R4 hodnota 2, přičemž následující verze specifikace mohou tuto hodnotu změnit. Bundle-SymbolicName (povinná) Jedinečný identifikátor bundlu. Typicky se používá identifikátor balíčku nejvyšší úrovně v daném bundlu. Bundle-Version Verze bundlu. V kombinaci s Bundle-SymbolicName jedinečně identifikují konkrétní bundl. Bundle-Name Člověkem čitelný název bundlu. Bundle-Activator Třída určená ke korektnímu spuštění bundlu. Implementující rozhraní BundleActivator s metodami start a stop. Export-Package Čárkami oddělený seznam Java balíčků, které bundl veřejně zpřístupňuje ostatním. Import-Package Čárkami oddělený seznam Java balíčků, které daný bundl vyžaduje ke svému běhu. Předtím než Framework může změnit stav bundlu na RESOLVED, musí všechny tyto balíčky nalézt v ostatních nainstalovaných bundlech a zpřístupnit je v Class-Loaderu tohoto bundlu. Tabulka 1.1: Výběr OSGi hlaviček Manifest - OSGi hlavičky Životní cyklus bundlu Framework splňující specifikaci OSGi obhospodařuje nasazování bundlů do běžící instance aplikace, registraci služeb a řízení životního cyklu bundlu. Bundl se může nacházet v jednom z následujících stavů: INSTALLED - V tomto stavu se nachází po tom, co byl úspěšně nainstalován. RESOLVED - V tomto stavu jsou všechny závislosti na ostatních třídách a nativní kódu vyřešeny a zpřístupněny bundlu. V tomto stavu je bundl připraven ke spuštění. Bundl, který byl zastaven, se vrací do tohoto stavu. STARTING - Indikace spouštění bundlu. STOPPING - Indikace zastavování bundlu. ACTIVE - Bundl byl úspěšně spuštěn a běží. UNINSTALLED - Bundl byl odinstalován z frameworku a již nemůže nabýt jiného stavu. Informace o spuštění nebo zastavení bundlu (stavy ACTIVE a RESOLVED) se zachovává mezi restarty frameworku.
21 1.3. PRINCIPY 5 Obrázek 1.2: Životní cyklus bundlu [4] Skrývání informací Implicitně jsou všechny balíčky bundlu pro ostatní neviditelné. Pouze balíčky explicitně vyjmenované v hlavičce Export-Packages framework zpřístupňuje a spravuje jejich závislosti. Analogicky pouze balíčky, které jsou bundlem deklarovány jako závislosti hlavičkami Import- Package nebo Require-Bundle, mu jsou zpřístupněny. 1.3 Principy Jak již bylo zmíněno v úvodu, s každou technologií se vyvinuly i doporučené postupy ověřené praxí. V případě objektového modelu, který využívá Java, bych rád zmínil několik z nich, které jsem se snažil během práce dodržovat, protože v některých případech mohou být rozhodujícím argumentem pro výběr řešení při přechodu na OSGi model[5] GRASP (General Responsibility Assignment Software Patterns) Sada vodítek a návrhových vzorů, ze kterých vybírám především: High cohesion - Rozhodovací vzor, jehož cílem je udržovat funkcionalitu dané komponenty úzce zacílenou k řešení daného problému.
22 6 KAPITOLA 1. ÚVOD Low coupling - Značí nízkou závislost na ostatních komponentách systému Information expert - Princip přiřazující odpovědnost za vykonání úkolu komponentě, která má dostatečné množství informací k jeho dokončení SOLID Je akronymem pro: Single responsibility - Třída má nést odpovědnost pouze za jedinnou věc. Open-closed principle - Softwarová entita by měla být otevřená pro rozšíření, ale uzavřena pro úpravy. Liskov substitution - Objekty v programu by měly být nahraditelné instancemi jejich podtypů bez změny korektnosti programu. Interface segregation - Je lépe mít více roztříštěných rozhraní než jedno řešící vše. Dependency inversion - Moduly by měly záviset na abstrakcích, nikoli na implementacích KISS + DRY Dvě související vodítka objektově orientovaného návrhu: Keep It Simple Stupid a Don t Repeat Yourself. KISS princip souvisí s výše zmíněnými principy High cohesion a Low coupling. K DRY principu se váže také pravidlo tří. 1.4 Nástroje K nasazování na OSGi model jsem použil implementace frameworku Equinox, která je považována za referenční. Dalším důvodem bylo, že je použita v knize [2], kterou jsem používal jako výchozí bod. Pokud je aplikace závislá čistě na OSGi modelu dle dané specifikace, nemělo by činit žádné problémy nasadit ji na jiný framework. Na to je třeba pamatovat a vyhnout se už při vývoji závislostem na proprietární funkcionalitě frameworku. Jako vývojové prostředí jsem použil Eclipse for RCP and RAP Developers, což je prostředí zaměřené právě na vývoj modulárních softwarových aplikací, pluginů a právě i aplikací využívajících OSGi model, nebot právě platforma Eclipse od její verze 3.0 přešla na OSGi komponentový systém. 1.5 Testování Protože hlavní podstatou této práce není přidávat novou funkcionalitu, bude testování mít formu úspěšného sestavení a spuštění upravovaných částí aplikace. Pokaždé, kdy je spuštěna klientská část aplikace, je spuštěn i server.
23 Kapitola 2 Restaurační systém CashBob CashBob je projekt restauračního systému určeného pro komplexní správu procesů v restauračním zařízení. Je postaven na architektuře server-klient s neomezeným počtem klientů. Server obstarává perzistenci dat v databázi a veškerou doménovou logiku. Klientská část aplikace obsahuje pouze vrstvu obsluhující komunikaci se serverem a logiku uživatelského rozhraní. Funkcionalita projektu je rozdělena do modulů: Modul CashBob CashBobLibrary CashBobManager CashBobPokladna CashBobRestLib CashBobServer CashBobStorage CashBobWorkShift CashBobBuildClient CashBobBuildServer CashBobBuild Význam Hlavní modul klientské části aplikace Knihovna sdíleného kódu a zdrojů Správa nastavení a základních doménových dat Klíčová funkcionalita aplikace, obsluha menu, objednávek a plateb Podčást knihovního modulu obsahující třídy zajišt ující komunikaci mezi klientem a serverem Hlavní modul serverové části aplikace Správa skladových zásob Správa pracovních směn zaměstnanců Bez funkcionality, určeno k sestavení klienta Bez funkcionality, určeno k sestavení serveru Bez funkcionality, určeno k sestavení celé aplikace Tabulka 2.1: Moduly projektu CashBob Sestavení celého projektu je řízeno pomocí nástroje Maven[3]. Každý modul obsahuje soubor pom.xml, který definuje závislosti na externích knihovnách, způsob překladu, parametry sestavení a další konfiguraci daného modulu. Poslední tři moduly neobsahují žádný výkonný kód, pouze mají definovány závislosti na ostatních modulech, a tím určují, ze kterých modulů se klient resp. server skládá. 7
24 8 KAPITOLA 2. RESTAURAČNÍ SYSTÉM CASHBOB 2.1 Architektura Jak již bylo zmíněno, projekt CashBob stojí na architektuře server-klient. Serverová část používá k uchování dat databázový systém H2, se kterým pracuje skrze framework Hibernate. K obsluze požadavků klientů je použito frameworku Spring. Server poskytuje pro připojení klientů REST API, které je celé implementováno vlastním proprietárním kódem. Klientská část má minimální závislosti na externích knihovnách. Obsahuje komunikační vrstvu a controller k řízení GUI jednotlivých modulů Problém Architektura aplikace z hlediska návrhu neobsahuje žádné závažné nedostatky. Hlavní problém však tkví ve vlastní organizaci kódu projektu. Moduly reprezentující základní funkcionální bloky, jako například CashBobPokladna nebo CashBobStorage, obsahují pouze klientskou část. Business logika je rozdělena mezi CashBobRestLib a CashBobServer. Hlavním problémem je spíše než nesprávná architektura, špatná organizace kódu a opomenutí doporučených principů objektově orientovaného vývoje Řešení OSGi Mým primárním cílem bylo upravit a převést klientskou část projektu na OSGi komponentový model, včetně lepší organizace kódu. Klientská část byla zvolena proto, že má velmi minimální závislost na externích knihovnách, což snižuje riziko možných chyb z hlediska nekompatibility při přechodu na OSGi model.
25 Kapitola 3 Iterace I - Minimální nasazení OSGi 3.1 Úvod Stávající kód klienta je modulární především z hlediska organizace kódu Cíl Primárním cílem je vytvořit proof-of-concept OSGi verzi projektu bez výrazných zásahů do kódu. Výstupem iterace bude klientská aplikace běžící na OSGi frameworku Equinox. 3.2 Iterace Práci jsem zahájil stažením kompletního stromu projektu z repozitáře. Projekt je primárně vyvíjen ve vývojovém prostředí NetBeans, avšak jeho zprovoznění v prostředí Eclipse je jednoduché. Postačilo importovat Maven projekty sloužící k sestavení klientské a serverové části a Eclipse se postaralo o import závisejících projektů jednotlivých modulů a stažení externích závislostí z centrálního repozitáře. Sestavení celé aplikace bylo úspěšné a po spuštění aplikace pracovala bez problémů. Pustil jsem se tedy do nasazení OSGi. Prvním krokem bylo převedení jednotlivých podprojektů na Plug-in projekty. To jsem provedl pravým kliknutím na projekt a volbou možnosti Configure >Convert to Plug-in Projects... V dialogovém okně jsem poté vybral všechny projekty. Tím je Eclipse začalo chápat jako OSGi projekty, což má především za následek správnou interpretaci direktiv Manifestu, korektní napovídání a možnost editace konfiguračních souborů prostřednictvím dialogových formulářů. IDE dále vytvořilo ve všech projektech soubor META-INF/MANIFEST.MF s minimální sadou OSGi hlaviček, čímž se z každého projektu stal bundl: 9
26 10 KAPITOLA 3. ITERACE I - MINIMÁLNÍ NASAZENÍ OSGI Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CashBobLibrary Bundle-SymbolicName: CashBobLibrary Bundle-Version: qualifier Protože doposud bylo sestavení a spuštění řízeno nástrojem Maven, bylo potřeba vytvořit novou spouštěcí konfiguraci pro OSGi. Tu jsem vytvořil následujícím způsobem: Nejprve jsem otevřel dialogové okno z nabídky Run >Run Configurations.... V levém sloupci jsem zvolil typ konfigurace OSGi Framework a klepl jsem na ikonu New launch configuration, čímž se vytvořila nová spouštěcí konfigurace pro OSGi projekt. V pravé části okna nabízí Eclipse výběr, které bundly má použít k sestavení aplikace. Z části, která obsahuje aktuálně otevřené projekty, jsem zvolil všechny, které doposud tvořily klientskou část. V části Target Platform jsem zvolil pouze bundl org.eclipse.osgi. Na kartě argumentů jsem nastavil pracovní adresář do kořene modulu CashBob kvůli dostupnosti konfiguračního souboru. Při spuštění však framework selhal s chybovou hláškou: Could not find bundle: org.eclipse.equinox.console, ačkoliv jsem nechal automaticky zkontrolovat závislosti přes tlačítko Validate Bundles a volba Validate bundles automatically prior to launching byla zaškrtnuta. Po krátké chvíli jsem ručně doplnil zbývající závislosti dle obrázku 3.2. Obrázek 3.1: Dialog spouštěcí konfigurace OSGi projektu
27 3.2. ITERACE BundleActivator V tomto stavu se již aplikace sestaví, ale nespustí. Na konzoli se zobrazí příkazový řádek frameworku. Po zadání příkazu ss vypíše framework všechny nainstalované bundly a jejich stav: osgi> ss "Framework is launched." id State Bundle 0 ACTIVE org.eclipse.osgi_3.9.1.v ACTIVE CashBobRestLib_1.0.0.qualifier 2 ACTIVE org.apache.felix.gogo.shell_ v ACTIVE CashBobWorkShift_1.0.0.qualifier 4 ACTIVE org.eclipse.equinox.console_ v ACTIVE CashBobManager_1.0.0.qualifier 6 ACTIVE org.apache.felix.gogo.command_ v ACTIVE CashBobLibrary_1.0.0.qualifier 8 ACTIVE org.apache.felix.gogo.runtime_ v ACTIVE CashBobClient_1.0.0.qualifier 10 ACTIVE CashBobStorage_1.0.0.qualifier 11 ACTIVE CashBobPokladna_1.0.0.qualifier osgi> První řádek nás informuje o spuštění frameworku. Následuje tabulka obsahující identifikátor, který byl přidělen danému bundlu, jeho stav odpovídající diagramu 1.2 a unikátní název bundlu sestavený z jeho symbolického jména a verze. Protože jsem prostředím generované manifesty neupravoval, mají všechny bundly projektu výchozí jména a verze. Na první pohled se tedy zdá, že je vše spuštěno, ale klient nefunguje. Důvod je následující: v případě klasické Java aplikace je potřeba definovat statickou metodu main, která je výchozím spouštěcím bodem. Protože ale OSGi aplikace je tvořena z velkého množství splupracujících bundlů, kdy každý z nich by měl pracovat sám o sobě, pokud možno nezávisle na ostatních, je tento problém řešen pomocí mechanizmu BundleActivator. Specifikace OSGi nám umožňuje v každém bundlu definovat jednu třídu implementující rozhraní BundleActivator, která je po vyřešení závislostí bundlu použita k vykonání námi definovaného kódu. Existence této třídy v bundlu je indikována hlavičkou Bundle-Activator v manifestu. Tohoto mechanizmu jsem tedy využil k zavolání původní metody main klienta. Protože se metoda main nachází v projektu CashBob, otevřel jsem MANIFEST.MF tohoto projektu. Využil jsem nástroje vývojového prostředí a namísto ručních úprav souboru zvolil kartu Overview. Zde byla mimo jiné i položka Activator, která byla momentálně prázdná. Když jsem kliknul na popisek pole, otevřelo se dialogové okno pro vytvoření nové Java třídy. Jako jméno jsem zvolil Activator a jako package cz.cvut.fel.restauracefel.restauracefel.bundle 1. 1 Konvencí je ukládat aktivační třídu mimo hierarchii vlastního kódu bundlu. Typicky je to package v kořeni hierarchie packages.
28 12 KAPITOLA 3. ITERACE I - MINIMÁLNÍ NASAZENÍ OSGI Všechny ostatní volby jsem ponechal ve výchozím stavu. Po odsouhlasení dialogu se vytvořila nová třída Activator a byla zobrazena. V manifestu přibyla hlavička Bundle-Activator s hodnotou cz.cvut.fel.restauracefel.restauracefel.bundle.activator, což je absolutní cesta v rámci bundlu k aktivační třídě. Vygenerovala se prázdná třída. Eclipse v tomto okamžiku hlásilo, že nemůže nalézt import org.osgi.framework.bundleactivator, což je rozhraní, které musí naše aktivační třída implementovat, aby ji mohl framework použít k aktivaci bundlu. Definice tohoto rozhraní se nachází v základním bundlu frameworku. Ten jsem sice použil pro sestavení klienta, ale ve výchozím stavu nebyly balíčky, které tento bundl obsahuje, dostupné. Aby vývojové prostředí a následně framework dodaly potřebné balíčky pro kód, musel jsem deklarovat závislost bundlu CashBob na balíčku org.osgi.framework.bundleactivator. To lze provést dvěma způsoby, obojí přidáním hlavičky do manifestu: Import-Package - Deklaruje závislost daného bundlu na konkrétním balíčku bez ohledu na to, který bundl jej poskytuje. Require-Bundle - Deklaruje závislost na daném bundlu, a tím na všech jeho exportovaných balíčcích. Obecně se doporučuje volit možnost Import-Package, nebot se tím zbavujeme závislosti na konkrétním bundlu. V případě rozsáhlejších projektů však seznam importovaných balíčků může rapidně narůstat. Prostředí Eclipse poskytuje nástroj na automatickou správu těchto závislostí. Na kartě Dependencies editoru manifestu se nachází sekce Automated Management of Dependencies. Zde lze definovat závislost na kokrétních bundlech bez jejich přidání do manifestu. Spuštěním odkazu add dependencies s volbou Import-Package se spustí analýza kódu daného projektu a jsou-li nalezeny v kódu importy balíčků, které poskytují tyto automaticky spravované závislosti, jsou přidány do manifestu přes hlavičku Import-Package. Definoval jsem závislosti na ostatních bundlech projektu, tedy stejně jako tomu bylo u původního způsobu sestavení pomocí nástroje Maven, a přidal závislost na org.eclipse.osgi, vygenerovalo mi Eclipse seznam všech balíčků, které tento projekt (bundl) importuje z ostatních. Dále jsem naimplementoval metody vyžadované rozhraním a doplnil zavolání původní metody main. Výsledný kód třídy vypadal následovně:
29 3.2. ITERACE 13 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. bundle ; 2 3 import org. o s g i. framework. BundleActivator ; 4 import org. o s g i. framework. BundleContext ; 5 6 import cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. main. Main ; 7 8 p u b l i c c l a s s A c t i v a t o r implements BundleActivator { 9 11 p u b l i c void s t a r t ( BundleContext context ) throws Exception { 12 Main. main ( n u l l ) ; 13 } p u b l i c void stop ( BundleContext context ) throws Exception { 17 // Not needed 18 } } Výpis 3.1: BundleActivator projektu CashBob Závislosti Po spuštění se nyní korektně zavolala metoda main a začal se vykonávat kód klienta. Krátce po zavolání metody main, která obsahovala pouze vytvoření instance třídy Controller 2 a následné volání její metody run, která spouští inicializaci aplikace a spuštění logiky přihlašování, selhala aplikace s chybou: NoClassDefFoundError: cz/cvut/fel/restauracefel/- library/interfaces/imoduleinterface. To bylo známkou stejného problému jako v případě vytváření aktivační třídy, respektive demonstrace výchozího chování bundlů. Tedy že všechny balíčky, které bundl obsahuje jsou implicitně skryty před ostatními. Doposud jednotlivé části spoléhaly na to, že třídy z ostatních modulů budou dostupné po sestavení aplikace. Tím že jsem aplikaci rozdělil na bundly podle jednotlivých projektů modulů, jsem jednotlivé části izoloval od sebe. Nejjednodušším řešením nyní bylo u všech bundlů exportovat všechny packages, v nich obsažené. Otevřel jsem tedy manifest každého projektu a na kartě Runtime v části Exported Packages zvolil Add.... Eclipse prohledalo daný projekt a nabídlo všechny dostupné balíčky. Označil jsem všechny, potvrdil a soubor uložil. Důsledkem toho bylo přidání hlavičky Export-Package se seznamem exportovaných balíčků. Druhým krokem bylo deklarovat závislosti bundlů mezi sebou. Toho jsem dosáhl stejným způsobem jako v předchozím případě pomocí automatické správy závislostí. 2 Dle návrhového vzoru Controller, viz GRASP.
30 14 KAPITOLA 3. ITERACE I - MINIMÁLNÍ NASAZENÍ OSGI Externí knihovny Dalším problémem z hlediska závislostí byly externí knihovny. Ve stávající konfiguraci byly externí závislosti spravovány nástrojem Maven a vyřešeny během sestavení aplikace. Aby daná knihovna byla použitelná jako OSGi bundl, je potřeba, aby její JAR soubor obsahoval manifest s příslušnými OSGi hlavičkami. To bohužel zatím dělá pouze malá skupina poskytovatelů těchto knihoven, a tak veškerá práce spočívá na vývojáři samotném. Problémem je tedy přidání hlaviček OSGi do manifestu knihovny. To je možné řešit třemi způsoby: Využít automatizace pomocí Bundle Plugin for Maven - Příslušné vkládání hlaviček do existujících knihoven je možno automatizovat pomocí plug-inu nástroje Maven, který vychází z nástroje BND. Výhodou je plná automatizace procesu včetně vnořených závislostí. Nevýhodou je trochu vyšší složitost konfigurace. Bohužel se mi nepodařilo tuto možnost plnohodnotně zprovoznit, a proto jsem kvůli úspoře času toto řešení odložil. Extra bundl - vložené JAR - Další možností je vytvořit nový bundl sloužící jakožto poskytovatel závislostí tak, že soubory JAR knihoven jsou obsaženy uvnitř tohoto bundlu. Výhodou je jednoduchost řešení s možnou výjimkou prvotního získání všech knihoven. Nevýhodou je, že si framework nemusí být schopen poradit s několikanásobným vnořením JAR archivů. Extra budl - Rozbaleno - Poslední možností je, stejně jako v předchozím případě, vytvořit nový bundl s tím rozdílem, že obsah externích knihoven je rozbalen do tohoto bundlu. Tuto metodu jsem zvolil pro další postup. Vytvořil jsem tedy nový projekt pomocí nabídky File >New >Project... a jako typ projektu jsem zvolil Plug-in project from Existing JAR Archives. Vybral jsem JAR soubory z distribučního sestavení aplikace a vytvořil nový projekt s názvem CashBobLibExternal. Závislosti na tomto externě knihovním bundlu jsem doplnil do správy závislostí projektu CashBob. Dále jsem přidal CashBobLibExternal do spouštěcí konfigurace. Toto se projevilo jako nešt astné řešení, nebot některé moduly závisely na externích knihovnách tranzitivně skrze CashBobLibrary, respektive CashBobRestLib. Když jsem tedy všem modulům přidal závislost na tomto nově vytvořeném knihovním bundlu, framework nedokázal správně provázat závislosti a spuštění skončilo chybou. Řešením bylo vytvořit pro každý modul samostatný bundl obsahující externí závislosti specifické pro daný modul. Dalším problémem bylo načítání grafických souborů (resources) z ostatních bundlů. Od toho bylo prozatím opuštěno a odloženo na další iteraci. Závislosti na grafických prvcích z ostatních bundlů byly odstraněny. 3.3 Závěr Výstupem iterace je funkční prototyp klientské aplikace CashBob. Přes prvotní problémy se podařilo provázat bundly reprezentující jednotlivé moduly aplikace včetně závislostí na externích knihovnách. Jediným nedostatkem je absence některých grafických prvků, které však na funkčnost nemají zásadní vliv.
31 Kapitola 4 Iterace II - Izolace modulu 4.1 Úvod Kód klienta je nyní spustitelný v OSGi frameworku, ale je stále velmi úzce provázaný. Je potřeba se na projekt dívat jako na platformu umožňující snadné rozšíření o novou funkcionalitu Cíl Oddělit modul CashBobPokladna a odstínit ho od hlavního controlleru aplikace. 4.2 Iterace Modul pokladny byl svázán s hlavní aplikací prostřednictvím jediné třídy PokladnaController. Ta byla odkazována ze třídy Controller, která je výchozím bodem klientské aplikace, a třídou ViewController, která obsahuje obsluhu GUI klienta. Přestože controllery modulů všechny implementují společné rozhraní IModuleInterface, je k nim přistupováno přímo. To je hrubým porušením Dependency inversion principu. 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. C o n t r o l l e r ; 2 3 p u b l i c c l a s s C o n t r o l l e r implements I M o d u l e I n t e r f a c e { p u b l i c void l o g o u t ( ) { 6 i f ( PokladnaController. g e t I n s t a n c e ( ). i s A c t i v e ( ) ) PokladnaController. g e t I n s t a n c e ( ). k i l l ( ) ; 7 } } Výpis 4.1: Původní třída Controller 15
32 16 KAPITOLA 4. ITERACE II - IZOLACE MODULU 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. C o n t r o l l e r ; 2 3 p u b l i c f i n a l c l a s s ViewController { p u b l i c void showpokladna ( ) { 6 g e t C o n t r o l l e r ( ). showmodule ( PokladnaController. g e t I n s t a n c e ( ) ) ; 7 } p u b l i c void showusergate ( S t r i n g username ) { 10 mainframe. settoolbar ( new MainMenu ( ) ) ; 11 mainframe. s e t T i t l e (MAIN TITLE USER + + username ) ; 12 mainframe. createtoolbar ( ) ; 13 } 14 } Výpis 4.2: Úryvek třídy ViewController Dalším prvkem, kterým byl modul nepřímo spojen s aplikací (pominu-li grafické ikony a lokalizační zdroje umístěné v modulu CashBobLibrary), bylo tlačítko v hlavní nabídce umožňující jeho spuštění. Vytvoření vlastního tlačítka se nacházelo ve třídě MainMenu, která reprezentuje panel hlavní nabídky, a ve třídě MainFrame představující úvodní obrazovku aplikace, kde mu byla přidělena funkcionalita (spuštění modulu pokladny) přes ActionListener. 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. gui ; 2 3 p u b l i c c l a s s MainMenu extends javax. swing. JPanel { p u b l i c JButton modulepokladnabutton = new MainMenuButton ( new ImageIcon ( images / n b i l l s. png ), Pokladna ) ; p u b l i c MainMenu ( ) { toppanel. add ( modulepokladnabutton ) ; } 12 } Výpis 4.3: Původní třída MainMenu
33 4.2. ITERACE 17 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. gui ; 2 3 p u b l i c c l a s s MainFrame extends JFrame implements InterfaceGUIObject { p u b l i c void createtoolbar ( ) { toolbar. modulepokladnabutton. addactionlistener ( new A c t i o n L i s t e n e r ( ) { 8 10 p u b l i c void actionperformed ( ActionEvent e ) { 11 view. showpokladna ( ) ; 12 } 13 }) ; } Výpis 4.4: Původní třída MainFrame Úpravy Tyto třídy jsem upravil následujícím způsobem: 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. C o n t r o l l e r ; 2 3 p u b l i c c l a s s C o n t r o l l e r implements I M o d u l e I n t e r f a c e { 4 5 p r i v a t e Map<String, IModuleInterface > modules = new HashMap<String, IModuleInterface >() ; 6 7 p u b l i c void r e g i s t e r M o d u l e ( S t r i n g modulename, I M o d u l e I n t e r f a c e module ) { 8 i f ( modules. containskey ( modulename ) ) { 9 throw new I l l e g a l S t a t e E x c e p t i o n ( Modul +modulename+ j e j i z r e g i s t r o v a n ) ; 10 } 11 modules. put ( modulename, module ) ; 12 } p u b l i c void unregistermodule ( S t r i n g modulename ) { 15 modules. remove ( modulename ) ; 16 } p u b l i c Map<String, IModuleInterface > getmodules ( ) { 19 r e t u r n modules ; 20 } p r i v a t e C o n t r o l l e r ( ) { // Docasna umela i n i c i a l i z a c e 25 modules. put ( PokladnaController. c l a s s. getname ( ), 26 PokladnaController. g e t I n s t a n c e ( ) ) ; 27 } p u b l i c void l o g o u t ( ) { 30 f o r ( I M o d u l e I n t e r f a c e module : modules. v a l u e s ( ) ) {
34 18 KAPITOLA 4. ITERACE II - IZOLACE MODULU 31 i f ( module. i s A c t i v e ( ) ) { 32 module. k i l l ( ) ; 33 } 34 } } p u b l i c void showmodule ( S t r i n g modulename ) { 39 i f (! modules. containskey ( modulename ) ) { 40 throw new I l l e g a l S t a t e E x c e p t i o n ( Modul +modulename+ neni r e g i s t r o v a n. ) ; 41 } 42 showmodule ( modules. get ( modulename ) ) ; 43 } p u b l i c void showmodule ( I M o d u l e I n t e r f a c e module ) { 46 i f (! module. i s A c t i v e ( ) ) { 47 module. run ( r e s t C l i e n t. getcurrlog ( ), r e s t C l i e n t, rightmanager ) ; 48 } e l s e { 49 module. takefocus ( ) ; 50 } 51 } 52 } Výpis 4.5: Upravená třída Controller I přesto že nesmí být třída Controller svázána s konkrétními implementacemi modulů, je nutné aby si na ně spravovala reference. To jsem zajistil vytvořením registru modulů realizovaným pomocí standartní kolekce Map a vytvořením obslužných metod registermodule, unregistermodule a getmodules 1. Metodu logout jsem upravil, aby zpracovala všechny moduly v registru. Dále jsem přetížil metodu showmodule, aby byla schopna vyvolat modul pouze pomocí String hodnoty jeho názvu z registru. Pro vyhledávání modulů jsem použil úplný název třídy, jak je možno vidět v konstruktoru, kde jsem ručně přidal modul pokladny do registru. Toto volání se tak stalo jediným bodem propojení modulu pokladny s hlavní řídicí částí aplikace. 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. C o n t r o l l e r ; 2 3 p u b l i c f i n a l c l a s s ViewController { p u b l i c void showmodule ( S t r i n g modulename ) { 6 g e t C o n t r o l l e r ( ). showmodule ( modulename ) ; 7 } p u b l i c void showusergate ( S t r i n g username ) { 10 MainMenu mainmenu = new MainMenu ( ) ; 11 f o r ( S t r i n g modulename : g e t C o n t r o l l e r ( ). getmodules ( ). keyset ( ) ) { 12 mainmenu. createmodulebutton ( modulename ) ; 13 } 14 1 Pro jednoduchost vědomě porušuji u této metody princip zapouzdření a zpřístupňuji vnitřní implementaci registru.
35 4.2. ITERACE mainframe. settoolbar ( mainmenu ) ; 16 mainframe. s e t T i t l e (MAIN TITLE USER + + username ) ; 17 mainframe. createtoolbar ( ) ; 18 } 19 } Výpis 4.6: Upravená třída ViewController Do třídy ViewController jsem doplnil univerzální metodu showmodule pracující opět se String reprezentací jména modulu a doplnil jsem vytváření hlavní nabídky v metodě showusergate o vytvoření příslušných spouštěcích tlačítek modulů z registru. 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. gui ; 2 3 p u b l i c c l a s s MainMenu extends javax. swing. JPanel { p r i v a t e Map<String, JButton> modulebuttons = new HashMap<String, JButton >() ; p u b l i c void createmodulebutton ( S t r i n g modulename ) { 8 i f ( modulebuttons. containskey ( modulename ) ) { 9 throw new I l l e g a l S t a t e E x c e p t i o n ( T l a c i t k o pro modul +modulename+ bylo j i z vytvoreno. ) ; 10 } MainMenuButton button = new MainMenuButton ( new ImageIcon ( images / n b i l l s. png ), modulename ) ; 13 button. setenabled ( t r u e ) ; 14 modulebuttons. put ( modulename, button ) ; toppanel. add ( button ) ; 17 System. out. p r i n t l n ( Created [ button ] f o r +modulename ) ; 18 } p u b l i c Map<String, JButton> getmodulebuttons ( ) { 21 r e t u r n modulebuttons ; 22 } } Výpis 4.7: Upravená třída MainMenu Ve třídě MainMenu jsem odstranil inicializaci tlačítka z konstruktoru. A vytvořil jsem metodu createmodulebutton vytvářející nové instance spouštěcích tlačítek pro dynamicky registrované moduly. Tato metoda je volána v předchozím výpisu metody showusergate třídy ViewController. 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. gui ; p u b l i c c l a s s MainFrame extends JFrame implements InterfaceGUIObject { p u b l i c void createtoolbar ( ) { 6 f o r (Map. Entry<String, JButton> entry : toolbar. getmodulebuttons ( ). e n t r y S e t ( ) ) { 7 entry. getvalue ( ). addactionlistener ( new A c t i o n L i s t e n e r ( ) { 8
36 20 KAPITOLA 4. ITERACE II - IZOLACE MODULU 10 9 p r i v a t e S t r i n g modulename ; 11 p u b l i c A c t i o n L i s t e n e r i n i t ( S t r i n g modulename ) { 12 t h i s. modulename = modulename ; 13 r e t u r n t h i s ; 14 } p u b l i c void actionperformed ( ActionEvent arg0 ) { 18 view. showmodule ( modulename ) ; 19 } 20 }. i n i t ( entry. getkey ( ) ) ) ; 21 System. out. p r i n t l n ( S e t t i n g a c t i o n l i s t e n e r f o r +entry. getkey ( ) ) ; 22 } } 25 } Výpis 4.8: Upravená třída MainFrame Namapování tlačítek na konkrétní akce, to jest spuštění daného modulu, v metodě createtoolbar třídy MainFrame jsem provedl opět s využitím registru modulů. Pro názornost jsem se nezabýval odstíněním závislostí na grafických zdrojích a lokalizaci. Ve výsledném řešení by tyto informace měl poskytovat sám modul, například doplněním rozhraní IModuleInterface o metody getmenuiconresource a getmenubuttonlabel. Nikoli jako doposud, kdy jsou tyto zdroje uloženy v centrálním modulu klienta. 4.3 Závěr Výstupem této etapy je odstínění modulu CashBobPokladna od hlavní klientské části. Úpravy byly provedeny takovým způsobem, že ostatní moduly je nyní možné odstínit s již minimální námahou.
37 Kapitola 5 Iterace III - Dynamická komponenta 5.1 Úvod Modul pokladna není už sice tak úzce vázán k základu klientské části použitím vzoru Dependency inversion, ale stále není úplně nezávislý. Jeho načtení do klienta je řešeno ručně v konstruktoru Cíl Cílem pro tuto iteraci je vytvořit komponentu reprezentující modul pokladny a pomocí mechanizmu Declarative services (DS) zajistit jeho injekci do hlavní třídy Controller klienta. 5.2 Iterace Modul Pokladna rozšiřuje funkcionalitu klientské aplikace. Toto rozšíření můžeme považovat za službu, která má pevně definované rozhraní (IModuleInterface). Naproti tomu modul CashBob je konzumentem služby tohoto typu. S tímto konceptem pracuje mechanizmus Declarative Services, který nám umožňuje definovat bundly jakožto komponenty poskytující nebo vyžadující služby. Pro definice služeb se používají standardní Java rozhraní. Nejprve jsem začal upravovat modul CashBobPokladna. Ten poskytuje navenek službu, jejíž výchozí bod splňující výše zmíněné rozhraní, je ve třídě PokladnaController v balíčku cz.cvut.fel.restauracefel.pokladna.controller. Ten jako jediný bylo nutné vyexportovat z bundlu, takže jsem všechny ostatní záznamy v hlavičce Export-Package odstranil z manifestu. Dále bylo potřeba vytvořit z modulu pokladny komponentu ve smyslu DS. K tomu jsem použil vývojové prostředí: z kontextové nabídky prostředí jsem vybral New >Component Definition. Pomocí nástrojů prostředí jsem vytvořil definici OSGi komponenty, která sestává z následujícího XML souboru: 21
38 22 KAPITOLA 5. ITERACE III - DYNAMICKÁ KOMPONENTA 1 <?xml v e r s i o n= 1. 0 encoding= UTF 8?> 2 <scr:component x m l n s : s c r= h t t p : //www. o s g i. org /xmlns/ s c r /v name= CashBobPokladna > 3 <implementation c l a s s= cz. cvut. f e l. r e s t a u r a c e f e l. pokladna. c o n t r o l l e r. PokladnaController /> 4 <s e r v i c e> 5 <provide i n t e r f a c e= cz. cvut. f e l. r e s t a u r a c e f e l. l i b r a r y. i n t e r f a c e s. I M o d u l e I n t e r f a c e /> 6 </ s e r v i c e> 7 </ scr: com ponent> Výpis 5.1: Deklarace OSGi DS komponenty modulu CashBobPokladna Komponentu jsem nazval CashBobPokladna. Z její definice lze vyčíst, že tato komponenta poskytuje službu definovanou rozhraním IModuleInterface a třída implementující tuto službu je PokladnaController. Eclipse tuto definici automaticky nalinkovalo do manifestu pomocí hlavičky Service-Component. Dále bylo potřeba upravit klientský modul CashBob, aby mohl tyto komponenty registrovat a využívat jejich služeb. Původně jsem chtěl jako komponentu použít přímo třídu Controller. Ta je ale vytvořena dle návrhového vzoru Singleton a s tím si mechanizmus DS nebyl schopen poradit. Proto jsem ji obalil třídou CashBobClientComponent: 1 package cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. component ; p u b l i c c l a s s CashBobClientComponent { 4 C o n t r o l l e r c o n t r o l l e r ; 5 6 p u b l i c void s t a r t u p ( ) { 7 c o n t r o l l e r = C o n t r o l l e r. g e t I n s t a n c e ( ) ; 8 c o n t r o l l e r. run ( ) ; 9 } p u b l i c void r e g i s t e r M o d u l e ( I M o d u l e I n t e r f a c e module ) { 12 C o n t r o l l e r. g e t I n s t a n c e ( ). r e g i s t e r M o d u l e ( module ) ; 13 } p u b l i c void unregistermodule ( I M o d u l e I n t e r f a c e module ) { 16 C o n t r o l l e r. g e t I n s t a n c e ( ). unregistermodule ( module ) ; 17 } 18 } Výpis 5.2: Třída CashBobClientComponent DS má vlastní způsob aktivace kódu, takže jsem z projektu vymazal třídu Activator a spouštěcí metodu startup jsem umístil do třídy komponenty. Dále jsem provedl několik drobných úprav registru modulů a přidal metody pro výmaz modulu z registru a s tím spojené odstranění spouštěcího tlačítka v hlavní nabídce. Nakonec jsem vytvořil definici komponenty: 1 <?xml v e r s i o n= 1. 0 encoding= UTF 8?> 2 <s c r : component xmlns : s c r= http : / /www. o s g i. org /xmlns/ s c r /v a c t i v a t e= s t a r t u p name= CashBobClient > 3 <implementation c l a s s= cz. cvut. f e l. r e s t a u r a c e f e l. r e s t a u r a c e f e l. component. CashBobClientComponent />
39 5.2. ITERACE 23 4 <r e f e r e n c e bind= r e g i s t e r M o d u l e c a r d i n a l i t y= 0.. n i n t e r f a c e= cz. cvut. f e l. r e s t a u r a c e f e l. l i b r a r y. i n t e r f a c e s. I M o d u l e I n t e r f a c e name= I M o d u l e I n t e r f a c e p o l i c y= dynamic unbind= unregistermodule /> 5 </ s c r : component> Výpis 5.3: Definice OSGi komponenty CashBobClient Komponentu jsem pojmenoval CashBobClient. Její implementační třídu jsem nastavil na obalující třídu CashBobClientComponent a navíc nastavil metodu startup jako spouštěcí. Každá komponenta může využívat libovolné množství služeb poskytovaných ostatními komponentami. Tag <reference> umožňuje deklarovat závislost komponenty na ostatních službách. Atribut interface určuje rozhraní služby, kterou komponenta požaduje, atributy bind a unbind vyjmenovávají metody komponenty, které budou použity k injektování služby do komponenty, respektive její odpojení. Tímto jsem dokončil převod bundlů na komponenty. Posledním krokem bylo přidání bundlů org.eclipse.equinox.ds a org.eclipse.equinox.utils, které poskytují implementaci mechanizmu DS do spouštěcí konfigurace projektu. Po spuštění se aplikace chovala jako obvykle a na první pohled se nic nezměnilo. Po přihlášení se zobrazila hlavní nabídka. Zásadní přínos ale nastal v tom, že jsem si bundl nyní mohl za běhu aplikace beztrestně zastavit. Nejprve jsem si zjistil id, které framework přidělil bundlu pokladny: osgi>ss "Framework is launched." id State Bundle... 3 ACTIVE CashBobPokladna_1.0.0.qualifier... Rozhodl jsem se zastavit bundl pomocí příkazu stop 3. Framework na to zareagoval odpojením modulu od komponenty CashBobClientComponent, což mělo za následek vymazání modulu z registru a odstranění spouštěcího tlačítka z menu. Bundl byl nyní ve stavu RESOLVED: osgi> ss... 3 RESOLVED CashBobPokladna_1.0.0.qualifier... Zadáním příkazu start 3 došlo opět ke spuštění bundlu, injekci služby mezi komponentami a zobrazení spouštěcího tlačítka. Při spuštění modulu samotného dojde k chybě způsobené špatným načtením správce uživatelských rolí a oprávnění z modulu CashBobLibrary. To je způsobeno závislostí pokladního modulu na knihovním, kterou jsem ale nepřevedl na mechanizmus dynamických komponent.
40 24 KAPITOLA 5. ITERACE III - DYNAMICKÁ KOMPONENTA 5.3 Závěr Výsledkem iterace je prototyp klientské aplikace, která korektně reaguje na přidání a odebrání, resp. spuštění a zastavení modulu.
41 Kapitola 6 Závěr Modularizace a znovupoužitelnost jsou neustále skloňované koncepty ve všech odvětvích. Pokud se vývoje softwarových aplikací v jazyce Java týká, zdá se, že technologie OSGi je tím správným směrem, kterým se vydat. Nabízí poměrně jednoduchý model a relativně intuitivní sadu nástrojů k vytvoření plně modulárního řešení softwarových aplikací. Na první pohled se OSGi zdá jako země zaslíbená, vždyt slogan OSGi TM - The Dynamic Module System for Java TM k této myšlence vybízí, ale ne vše je úplně zadarmo. Použití této technologie od nás sice vyžaduje myslet určitým způsobem a používat jisté postupy, které však jsou již známé. Správné nasazení technologie OSGi stojí na správném objektovém návrhu aplikace. Jde tedy o použití praxí ověřených postupů a pouček pro návrh objektových aplikací. Nejedná se o nic jiného než o zásady zmíněné v úvodní kapitole, především principy High Cohesion a Low Coupling. Za největší výzvu při nasazení OSGi a obecně při softwarovém návrhu bych označil lenost nebo ještě lépe absenci snahy o čistý design, která nás ovlivňuje ve dvou směrech: Vnitřní vliv - Jedna část problémů vychází přímo od nás, samotných vývojářů aplikace. Jsme-li konfrontováni s nečekaným problémem, máme tendenci hledat řešení cestou nejmenšího odporu. Často je řešením dočasné obcházení problému pouze v místě výskytu, které se však časem stane trvalým. V lepším případě sáhneme k osvědčenému návrhovému vzoru, který nám ale díky nesystémovému použití bez dostatečného nadhledu nabídne pouze falešný pocit dobře odvedené práce a problém pouze rozmělní. Vnější vliv - Druhým zdrojem problémů bývají často nástroje z externích zdrojů, především knihovny a frameworky. V případě dlouhodobě vyvíjených knihovních projektů se nemusíme příliš obávat nesystémového designu knihovny samotné. Problém tkví v jejich používání. Ačkoliv nám usnadňují řešení některých úloh, často se stává, že okouzleni snadným řešením problému se necháme zlákat a používáme metody konkrétní knihovny kdekoliv uznáme za vhodné, aniž bychom si uvědomili, že tím svazujeme náš kód s konkrétní knihovnou namísto toho, abychom mezi náš kód a knihovnu zanesli jistou míru abstrakce a zapouzdření. 25
OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha
OSGi Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
NetBeans platforma Aplikační programování v Javě (BI-APJ) - 7 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme
TÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího
Softwarové komponenty a Internet
Softwarové komponenty a Internet Doc. Dr. Ing. Miroslav Beneš Katedra informatiky FEI VŠB-TU Ostrava Miroslav.Benes@vsb.cz Obsah přednášky Motivace Vývoj přístupů k tvorbě programů Definice komponenty
Programátorská příručka
KAPITOLA 1. PROGRAMÁTORSKÁ PŘÍRUČKA Kapitola 1 Programátorská příručka 1.1 Úvod 1.1.1 Technologie Program je psaný v jazyce Java 1.7. GUI je vytvářeno pomocí knihovny SWT. (http://eclipse.org/swt/) Pro
Analýza a Návrh. Analýza
Analysis & Design Návrh nebo Design? Design = návrh Není vytváření použitelného uživatelského prostředí (pouze malinká podmnožina celého návrhu) Často takto omezeně chápáno studenty nedokáží si představit,
Základy objektové orientace I. Únor 2010
Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných
Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.
1 Grafické rozhraní Studijní cíl Tento blok je věnován vytváření programů s využitím grafického rozhraní (GUI). Vysvětlen bude základní filozofie pro vytváření aplikací s GUI ve srovnání s konzolovými
1 Webový server, instalace PHP a MySQL 13
Úvod 11 1 Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského
Bridge. Známý jako. Účel. Použitelnost. Handle/Body
Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době
8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním
Semináˇr Java X J2EE Semináˇr Java X p.1/23
Seminář Java X J2EE Seminář Java X p.1/23 J2EE Složitost obchodních aplikací robusní, distribuované, spolehlivé aplikace s transakcemi na straně serveru, klientské aplikace co nejjednodušší Snaha : Návrh,
PHP framework Nette. Kapitola 1. 1.1 Úvod. 1.2 Architektura Nette
Kapitola 1 PHP framework Nette 1.1 Úvod Zkratka PHP (z anglického PHP: Hypertext Preprocessor) označuje populární skriptovací jazyk primárně navržený pro vývoj webových aplikací. Jeho oblíbenost vyplývá
Nastavení DCOM. Uživatelský manuál
Nastavení DCOM Uživatelský manuál Obsah Úvod... 2 Nastavení DCOM pro počítač Hostitel... 3 Operační systém Windows XP... 3 Nastavení vlastností DCOM na Windows XP... 3 Rozšířená nastavení DCOM na Windows
Reliance 3 design OBSAH
Reliance 3 design Obsah OBSAH 1. První kroky... 3 1.1 Úvod... 3 1.2 Založení nového projektu... 4 1.3 Tvorba projektu... 6 1.3.1 Správce stanic definice stanic, proměnných, stavových hlášení a komunikačních
TÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 25. Otázka : Komponentní technologie - základní pojmy a principy, metody specifikace komponent. Obsah : 1. Základní pojmy 1.1 Komponenta Komponenta
Příloha 6. Palety nástrojů
Příloha 6. Palety nástrojů Palety nástrojů v IDE poskytují zkrácení pro příkazy nabídky. Příkazy jsou rozděleny do několika palet nástrojů, které mohou být nezávisle přeskupeny nebo vloženy do plovoucích
plussystem Příručka k instalaci systému
plussystem Příručka k instalaci systému Tato příručka je určena zejména prodejcům systému a případně koncovým uživatelům. Poskytuje návod, jak provést potřebná nastavení komponent. ITFutuRe s.r.o. 26.2.2015
KMI / TMA Tvorba mobilních aplikací
KMI / TMA Tvorba mobilních aplikací 2. seminář 5.10.2018 ZS 2017/2018 STŘEDA 13:15-15:45 OBSAH SEMINáře konfigurační soubory projektu, aktivity, základní události, životní cyklus aplikace, intenty a práce
KMI / TMA Tvorba mobilních aplikací. 2. seminář ZS 2016/2017 Středa 13:15-15:45
KMI / TMA Tvorba mobilních aplikací 2. seminář 5.10.2016 ZS 2016/2017 Středa 13:15-15:45 OBSAH SEMINáře konfigurační soubory projektu, aktivity, základní události, životní cyklus aplikace, intenty a práce
Programování II. Modularita 2017/18
Programování II Modularita 2017/18 Modul? Osnova přednášky Vývoj programování Modularita Příklad Vývoj programování Paradigmata programování Jak a proč se jazyky vyvíjejí? V čem se OOP liší od předchozích
IS pro podporu BOZP na FIT ČVUT
IS pro podporu BOZP na FIT ČVUT Závěrečná zpráva pro 2. iteraci 21. dubna 2011 Zadavatel: Ing. Jiří Chludil Řešitelský tým: Jiří Kopecký Jan Kratochvíl Milan Matějček Štefan Pinďák Kristýna Streitová Úvod
2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML
ROZHRANÍ ESA XML Ing. Richard Vondráček SCIA CZ, s. r. o., Thákurova 3, 160 00 Praha 6 www.scia.cz 1 OTEVŘENÝ FORMÁT Jednou z mnoha užitečných vlastností programu ESA PT je podpora otevřeného rozhraní
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE
Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13
Obsah Úvod 11 Platforma.NET 11.NET Framework 11 Visual Basic.NET 12 1 Základní principy a syntaxe 13 Typový systém 13 Hodnotové typy 13 Struktury 15 Výčtové typy 15 Referenční typy 15 Konstanty 16 Deklarace
1. Webové služby. K čemu slouží? 2. RPC Web Service. 3. SOA Web Service. 4. RESTful Web services
13. Webové služby. K čemu slouží? Popis a vyhledávání služeb. Co je a k čemu slouží orchestrace a choreografie služeb. Technologie pro implementaci služeb 1. Webové služby. K čemu slouží? Definice WS -
VComNet uživatelská příručka. VComNet. Uživatelská příručka Úvod. Vlastnosti aplikace. Blokové schéma. «library» MetelCom LAN
VComNet Uživatelská příručka Úvod Aplikace VComNet je určena pro realizaci komunikace aplikací běžících na operačním systému Windows se zařízeními, které jsou připojeny pomocí datové sběrnice RS485 (RS422/RS232)
2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.
2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. GEOVAP, spol. s r. o. Čechovo nábřeží 1790 530 03 Pardubice Česká republika +420 466 024 618 http://www.geovap.cz V dokumentu použité názvy programových
První kroky s METEL IEC IDE
První kroky s poskytuje programování v IEC 61131-3 jazycích, podporuje jak grafickou tak textovou podobu. Umožňuje vytvářet, upravovat a ladit IEC 61131-3 (ST, LD, IL, FBD) programy pro řídicí jednotky
TECHNICKÁ SPECIFIKACE VEŘEJNÉ ZAKÁZKY
Příloha č. 3 k č.j. MV-159754-3/VZ-2013 Počet listů: 7 TECHNICKÁ SPECIFIKACE VEŘEJNÉ ZAKÁZKY Nové funkcionality Czech POINT 2012 Popis rozhraní egon Service Bus Centrální Místo Služeb 2.0 (dále jen CMS
Vzdálená správa v cloudu až pro 250 počítačů
Vzdálená správa v cloudu až pro 250 počítačů S pomocí ESET Cloud Administratoru můžete řídit zabezpečení vaší podnikové sítě bez nutnosti nákupu, instalace nebo údržby dalšího hardwaru. Řešení je poskytováno
Podpora skriptování v Audacity
Specifikace softwarového díla & Časový plán implementace pro Podpora skriptování v Audacity Audacity je oblíběný editor zvuku, který ovšem v současné době postrádá možnost automatizovaného vykonávání skriptů.
Windows a real-time. Windows Embedded
Windows a real-time Windows Embedded Windows pro Embedded zařízení Současnost (2008): Windows Embedded WINDOWS EMBEDDED Windows Embedded CE Windows XP Embedded Windows Embedded for Point of Service Minulé
Obsah. Úvod 11 O autorovi 11 Koncept knihy 11 Zpětná vazba od čtenářů 12 Zdrojové kódy ke knize 12 Errata 12 ČÁST I VÝVOJ MOBILNÍ APLIKACE
Úvod 11 O autorovi 11 Koncept knihy 11 Zpětná vazba od čtenářů 12 Zdrojové kódy ke knize 12 Errata 12 ČÁST I VÝVOJ MOBILNÍ APLIKACE KAPITOLA 1 Vývojové prostředí a výběr frameworku 15 PhoneGap 15 jquery
KAPITOLA 10. Implementace mezinárodní podpory a lokalizace. V této kapitole:
KAPITOLA 10 Implementace mezinárodní podpory a lokalizace V této kapitole: Řetězce ve zdrojovém kódu Internacionalizace nápovědy Internacionalizace ostatních zdrojů Administrace a příprava lokalizovaných
SECTRON s.r.o. Výstavní 2510/10, 709 00 Ostrava - Mariánské Hory +420 595 626 333, sales@sectron.cz
Datum posledního záznamu: 5.12.2012 Verze 2.3.3.1 Výrobní kód 1212 2012-12 Aktualizován manuál Napájecí konektor změněn na 2-pinový MRT9 Přidáno rozhraní pro připojení záložního Pb akumulátoru 12 V, max
1. Programování proti rozhraní
1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
1 Administrace systému 3. 1.3 Moduly... 3 1.4 Skupiny atributů... 4 1.5 Atributy... 4 1.6 Hodnoty atributů... 4
CRM SYSTÉM KORMORÁN PŘÍRUČKA ADMINISTRÁTORA Obsah 1 Administrace systému 3 1.1 Uživatelské účty.................................. 3 1.2 Přístupová práva................................. 3 1.3 Moduly.......................................
10 Balíčky, grafické znázornění tříd, základy zapozdření
10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému
Primární klíč, cizí klíč, referenční integrita, pravidla normalizace, relace
Téma 2.2 Primární klíč, cizí klíč, referenční integrita, pravidla normalizace, relace Obecný postup: Každá tabulka databáze by měla obsahovat pole (případně sadu polí), které jednoznačně identifikuje každý
Webové rozhraní pro datové úložiště. Obhajoba bakalářské práce Radek Šipka, jaro 2009
Webové rozhraní pro datové úložiště Obhajoba bakalářské práce Radek Šipka, jaro 2009 Úvod Cílem práce bylo reimplementovat stávající webové rozhraní datového úložiště MU. Obsah prezentace Úložiště nasazené
1. Administrace služby Bezpečný Internet přes webovou aplikaci WebCare GTS
1. Administrace služby Bezpečný Internet přes webovou aplikaci WebCare GTS Pro přístup do administrace služby GTS Bezpečný Internet používejte zákaznický WebCare GTS Czech, který je přístupny přes webové
Informační systémy 2008/2009. Radim Farana. Obsah. Nástroje business modelování. Business modelling, základní nástroje a metody business modelování.
3 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah Business modelling, základní nástroje a metody business modelování.
Bc. Martin Majer, AiP Beroun s.r.o.
REGISTR DIGITALIZACE HISTORICKÝCH FONDŮ (RDHF) A DIGITÁLNÍCH KONKORDANCÍ (DK) Návrh uživatelského rozhraní klientských aplikací verze 1.0 Bc. Martin Majer, AiP Beroun s.r.o. 28.11.2016-1 - Obsah 1 Seznam
Uživatelská příručka Autor: Martin Fiala
1 Uživatelská příručka Autor: Martin Fiala Vzhledem k tomu, že navržený program nefunguje samostatně a jedná se pouze o část implementovanou do pluginu BJ2NB vyvíjeného na Vysoké škole ekonomické, je nutné
Formulář NÚV v programu PPP4
Formulář NÚV v programu PPP4 Verze programu: 4.2.1.0 Datum: 16. 5. 2017 1. Nastavení programu PPP4 V programu je nutné nastavit: 1. cestu k programu Form Filler 602 (tento program musí mít každý uživatel
Obsah. 1) Rozšířené zadání 2) Teorie zásuvných modulů a) Druhy aplikací používajících zásuvné moduly b) Knihovny c) Architektura aplikace d) Výhody
Obsah 1) Rozšířené zadání 2) Teorie zásuvných modulů a) Druhy aplikací používajících zásuvné moduly b) Knihovny c) Architektura aplikace d) Výhody 3) 4) Mantichora Mantichora je moderní aplikace, který
DUM 06 téma: Tvorba makra pomocí VBA
DUM 06 téma: Tvorba makra pomocí VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: 18-20-M/01 Informační technologie
Průvodce instalací modulu Offline VetShop verze 3.4
Průvodce instalací modulu Offline VetShop verze 3.4 Úvod k instalaci Tato instalační příručka je určena uživatelům objednávkového modulu Offline VetShop verze 3.4. Obsah 1. Instalace modulu Offline VetShop...
Návod k instalaci S O L U T I O N S
Návod k instalaci SOLUTIONS Návod k instalaci Hasičská 53 700 30 Ostrava-Hrabůvka www.techis.eu www.elvac.eu +420 597 407 507 Obchod: +420 597 407 511 obchod@techis.eu Podpora: +420 597 407 507 support@techis.eu
43 HTML šablony. Záložka Šablony v systému
43 HTML šablony Modul HTML šablony slouží ke správě šablon pro výstupy z informačního systému modularis ve formátu HTML. Modul umožňuje k šablonám doplňovat patičku, dokumentaci a vázat šablony na konkrétní
Vyřešené teoretické otázky do OOP ( )
Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika
Obsah. Zpracoval:
Zpracoval: houzvjir@fel.cvut.cz 03. Modelem řízený vývoj. Doménový (business), konceptuální (analytický) a logický (návrhový) model. Vize projektu. (A7B36SIN) Obsah Modelem řízený vývoj... 2 Cíl MDD, proč
Úvod...1 Instalace...1 Popis funkcí...2 Hlavní obrazovka...2 Menu...3 Práce s aplikací - příklad...5
Rejstřík Úvod...1 Instalace...1 Popis funkcí...2 Hlavní obrazovka...2 Menu...3 Práce s aplikací - příklad...5 Úvod Správcovská aplikace slouží k vytvoření vstupního a zašifrovaného souboru pro odečtovou
STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE
STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE WEBOWÉ STRÁNKY TŘÍD KAMIL POPELKA ZÁVĚREČNÁ MATURITNÍ PRÁCE BRNO 2011 Prohlášení Prohlašuji, že maturitní práce je mým původním autorským dílem, které
Tvorba informačních systémů
Tvorba informačních systémů Michal Krátký 1, Miroslav Beneš 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2005/2006 c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních
Nastavení provozního prostředí webového prohlížeče pro aplikaci
Nastavení provozního prostředí webového prohlížeče pro aplikaci IS o ISVS - Informační systém o informačních systémech veřejné správy verze 2.03.00 pro uživatele vypracovala společnost ASD Software, s.r.o.
NOVÉ GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ (GUI)
NOVÉ GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ (GUI) UŽIVATELSKÁ PŘÍRUČKA TYP DOKUMENTU: NÁVOD VYHOTOVIL: PETR VONDRÁČEK DATUM VYHOTOVENÍ: 29.3.2012 PLATNOST OD: 29.3.2012 CÍLOVÁ SKUPINA: UŽIVATELÉ B2B PORTÁLU GROW
APS Administrator.OP
APS Administrator.OP Rozšiřující webový modul pro APS Administrator Přehled přítomnosti osob v oblastech a místnostech Instalační a uživatelská příručka 2004 2013,TECH FASS s.r.o., Věštínská 1611/19, Praha,
BALISTICKÝ MĚŘICÍ SYSTÉM
BALISTICKÝ MĚŘICÍ SYSTÉM UŽIVATELSKÁ PŘÍRUČKA Verze 2.3 2007 OBSAH 1. ÚVOD... 5 2. HLAVNÍ OKNO... 6 3. MENU... 7 3.1 Soubor... 7 3.2 Měření...11 3.3 Zařízení...16 3.4 Graf...17 3.5 Pohled...17 1. ÚVOD
Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý
Uživatelský manuál Aplikace GraphViewer Vytvořil: Viktor Dlouhý Obsah 1. Obecně... 3 2. Co aplikace umí... 3 3. Struktura aplikace... 4 4. Mobilní verze aplikace... 5 5. Vytvoření projektu... 6 6. Části
APS Web Panel. Rozšiřující webový modul pro APS Administrator. Webové rozhraní pro vybrané funkce programového balíku APS Administrator
APS Web Panel Rozšiřující webový modul pro APS Administrator Webové rozhraní pro vybrané funkce programového balíku APS Administrator Instalační a uživatelská příručka 2004 2016,TECH FASS s.r.o., Věštínská
Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU 8.6.2011
Technologie Java Enterprise Edition Přemek Brada, KIV ZČU 8.6.2011 Přehled tématu Motivace a úvod Infrastruktura pro velké Java aplikace (Java základní přehled) Části třívrstvé struktury servlety, JSP
Administrace služby - GTS Network Storage
1. Návod k ovládání programu Cisco VPN Client (IP SECový tunel pro přístup GTS Network Storage) Program Cisco VPN client lze bezplatně stáhnout z webových stránek GTS pod odkazem: Software ke stažení http://www.gts.cz/cs/zakaznicka-podpora/technicka-podpora/gtspremium-net-vpn-client/software-ke-stazeni.shtml
Maven. Aplikační programování v Javě (BI-APJ) - 2 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha
Maven Aplikační programování v Javě (BI-APJ) - 2 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.
2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena. GEOVAP, spol. s r. o. Čechovo nábřeží 1790 530 03 Pardubice Česká republika +420 466 024 618 http://www.geovap.cz V dokumentu použité názvy programových
EPLAN Electric P8 2.7 s databázemi na SQL serveru
EPLAN Electric P8 2.7 s databázemi na SQL serveru EPLAN Electric P8 2.7 k dispozici pouze ve verzi 64bit. EPLAN Electric P8 využívá k ukládání některých dat databáze. Artikly, překladový slovník 1 ) a
MBI - technologická realizace modelu
MBI - technologická realizace modelu 22.1.2015 MBI, Management byznys informatiky Snímek 1 Agenda Technická realizace portálu MBI. Cíle a principy technického řešení. 1.Obsah portálu - objekty v hierarchiích,
Jazz pro Účetní (export) Příručka uživatele
JAZZ pro Účetní - export (SQL/E1) Příručka uživatele 1 / 8 JAZZ pro Účetní export (SQL/E1) Příručka uživatele 2019 Václav Petřík JAZZWARE.CZ Příručka k programu Jazz pro Účetní - export (SQL/E1) pro Windows
Common Object Request Broker Architecture
Common Object Request Broker Architecture Tvorba aplikací, jejichž komponenty budou komunikovat přes počítačovou síť Programátor jedné aplikace volá metody vzdálených objektů podobně jako u sebe lokální
IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz
IoC/DI Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz SOLID 5 pravidel pro testovatelný kód Na netestovatelném kódu se IoC/DI používá špatně SOLID Single Responsibility Principle Každá třída
Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13
Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací
Synchronizace CRM ESO9 a MS Exchange
Synchronizace CRM ESO9 a MS Exchange Zpracoval: U Mlýna 2305/22, 141 Praha 4 Záběhlice Dne: 1.4.2015 tel.: +420 585 203 370-2 e-mail: info@eso9.cz Revize: Urych Tomáš www.eso9.cz Dne: 23.2.2016 Obsah 1.
Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.
13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny
(Enterprise) JavaBeans. Lekce 7
(Enterprise) JavaBeans Lekce 7 JavaBeans vs. Enterprise JavaBeans (EJB) JavaBeans technologie: jedná se o tzv. komponentní architekturu určenou pro JSE platformu určená pro tvorbu JSE GUI programů pomocí
Nápověda k aplikaci EA Script Engine
Nápověda k aplikaci EA Script Engine Object Consulting s.r.o. 2006 Obsah Nápověda k aplikaci EA Script Engine...1 1. Co je EA Script Engine...2 2. Důležité upozornění pro uživatele aplikace EA Script Engine...3
Instalace SQL 2008 R2 na Windows 7 (64bit)
Instalace SQL 2008 R2 na Windows 7 (64bit) Pokud máte ještě nainstalovaný MS SQL server Express 2005, odinstalujte jej, předtím nezapomeňte zálohovat databázi. Kromě Windows 7 je instalace určena také
ŘÍZENÍ POHLEDÁVEK A AUTOMATICKÉ UPOMÍNKY. Katalogový doplněk ABRA Gen
ŘÍZENÍ POHLEDÁVEK A AUTOMATICKÉ UPOMÍNKY Katalogový doplněk ABRA Gen Dokumentace k doplňku ABRA Gen Datum: 20.4.2017 Obsah 1 Instalace a aktivace... 3 1.1 Instalace... 3 1.2 Aktivace... 5 2 Funkce... 6
INFORMAČNÍ SYSTÉM VIDIUM A VYUŽITÍ MODERNÍCH TECHNOLOGIÍ
INFORMAČNÍ SYSTÉM VIDIUM A VYUŽITÍ MODERNÍCH TECHNOLOGIÍ Michal Brožek, Dominik Svěch, Jaroslav Štefaník MEDIUM SOFT a.s., Cihelní 14, 702 00 Ostrava, ČR Abstrakt Neustále rostoucí význam sběru dat, možnost
Komponentový návrh SW
Komponentový návrh SW Komponentový návrh SW Komponenty jsou kompletně specifikované pomocí interface Jejich funkčnost je nezávislá na programovacím jazyku a mohou být integrované do toho samého systému
Versiondog 3.1.0 Lukáš Rejfek, Pantek (CS) s.r.o. 7/2014
Versiondog 3.1.0 Lukáš Rejfek, Pantek (CS) s.r.o. 7/2014 Strana 2 Versiondog 3.1.0 Nová verze systému Versiondog 3.1.0 přináší oproti předchozí verzi 3.0.3 celou řadu nových funkčností. Zásadní změnou
Propojení Pohoda a Virtuemart 2. popis funkcí, instalace a nastavení. (verze 2.5.12) MICHAL KOPECKÝ, MILAN PASTOR
2013 Propojení Pohoda a Virtuemart 2 popis funkcí, instalace a nastavení (verze 2.5.12) MICHAL KOPECKÝ, MILAN PASTOR FIRMADAT S.R.O. Havlíčkova 1280,765 02 Otrokovice, tel.: 571 112 089 Obsah Propojení
RUP - Disciplíny. Jaroslav Žáček jaroslav.zacek@osu.cz
RUP - Disciplíny Jaroslav Žáček jaroslav.zacek@osu.cz Disciplíny Množství disciplíny v dané iteraci Disciplíny podle RUP Šest základních: Business modeling - pro pochopení problémové domény Requirements
1. Webový server, instalace PHP a MySQL 13
Úvod 11 1. Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského
FORTANNS. havlicekv@fzp.czu.cz 22. února 2010
FORTANNS manuál Vojtěch Havlíček havlicekv@fzp.czu.cz 22. února 2010 1 Úvod Program FORTANNS je software určený k modelování časových řad. Kód programu má 1800 řádek a je napsán v programovacím jazyku
Tvorba kurzu v LMS Moodle
Tvorba kurzu v LMS Moodle Před počátkem práce na tvorbě základního kurzu znovu připomínám, že pro vytvoření kurzu musí být profil uživatele nastaven administrátorem systému minimálně na hodnotu tvůrce
MATLABLINK - VZDÁLENÉ OVLÁDÁNÍ A MONITOROVÁNÍ TECHNOLOGICKÝCH PROCESŮ
MATLABLINK - VZDÁLENÉ OVLÁDÁNÍ A MONITOROVÁNÍ TECHNOLOGICKÝCH PROCESŮ M. Sysel, I. Pomykacz Univerzita Tomáše Bati ve Zlíně, Fakulta aplikované informatiky Nad Stráněmi 4511, 760 05 Zlín, Česká republika
TÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 29. Otázka : Zpracování událostí: mechanismus událostí a jejich zpracování (Event/Listener), nepřímá invokace (Observer/Observable). Obsah : 1. Mechanisums
RMI - Distribuované objekty v Javě
Vysoká škola báňská - Technická univerzita Ostrava 30. března 2009 Osnova Co je to RMI? 1 Co je to RMI? 2 Vnější pohled Vrstvy RMI Stub & Skeletons Layer Remote Reference Layer Transport Layer Pojemnování
APS mini.ed programová nadstavba pro základní vyhodnocení docházky. Příručka uživatele verze 2.2.0.6
APS mini.ed programová nadstavba pro základní vyhodnocení docházky Příručka uživatele verze 2.2.0.6 APS mini.ed Příručka uživatele Obsah Obsah... 2 Instalace a konfigurace programu... 3 Popis programu...
Specifikace softwarového díla & Časový plán implementace. pro. MEF Editor
Specifikace softwarového díla & Časový plán implementace pro MEF Editor Cílem projektu je vytvoření pluginu do vývojového prostředí Visual Studio 2010. Plugin bude umožňovat grafickou editaci objektů spojených
Instalace a první spuštění Programu Job Abacus Pro
Instalace a první spuštění Programu Job Abacus Pro Pro chod programu je nutné mít nainstalované databázové úložiště, které je připraveno v instalačním balíčku GAMP, který si stáhnete z našich webových
7 Jazyk UML (Unified Modeling Language)
7 Jazyk UML (Unified Modeling Language) 7.1 Základní charakteristika jazyka Motivace - vznik řady OO metod a metodologií (konec 80. let a první polovina 90.let) podobné notace vyjadřující totéž, komplikující
I.CA RemoteSeal. Ing. Filip Michl První certifikační autorita, a.s
Technické řešení služby I.CA RemoteSeal Ing. Filip Michl První certifikační autorita, a.s. 5. 4. 2018 Agenda Úvod ARX CoSign vs. DocuSign Signature Appliance Architektura Zřízení služby Aktivace služby