Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen, Czech Republic 1
> Základní koncepty > Přehled důležitých tříd SimCa > Tvorba simulované komponenty > Tvorba intermediate komponenty > Zapojení do aplikace 2
> Simulované komponenty běží ve vláknech > Běh vláken řízen kalendářem > Simulovaná komponenta se po vyvolání uspí a po vyvolání kalendářem provede „scénář“ > Intermediate komponenta vytvoří událost pro volání reálné, uspí se, provede reálnou akci a vytvoří událost pro návrat hodnoty 3
> Simulace komponent > Pro urychlení výpočtu (komprese) > Potenciálně automaticky generovatelné > Pro interakci s okolím > Simulace vstupu od uživatele > Simulace síťových a dalších rozhraní která nejsou během testování k dispozici > Vyžaduje tvorbu netriviálních scénářů > Problém při složitějších zapojeních > Vyžaduje splnění behaviorálního modelu 4
> core > Jen rozraní mezi jádrem a GUI, nic víc > extension > Simulační kontext SimCoContext, řízení běhu vláken, podpora načítání scénářů, definice typů > gui > Celé grafické rozhraní > scheduler > Implementace kalendáře CalendarImpl, podpora práce s ním, řízení běhu simulace SimcoSimulation, logování > Simco > Abstraktní třídy a rozhraní pro simulované komponenty, EventCreator pro tvorbu událostí 5
> ABaseSimObject > Vložení události volání a návratu do kalendáře > AIntermediate > Zachycení volaných metod, určení událostí a bundlů > ASimco > Tvorba událostí pro volání reálných a simulovaných komponent > Řízení běhu simulované komponenty > Zachycení volaných metod, určení zdroje 6
> Potomek třídy ASimco, musí implementovat rozhraní simulované komponenty > V konstruktoru předat reference na kalendář ( ICalendar ), simulační kontext ( ISimCoContext ) a tvorbu událostí ( EventCreator ) > Volání metody > Zachycení volané metody > Naplánování zpoždění > Simulační běh komponenty 7
public Vector getVector() { this.simcoCatchEvent(); this.simcoDelay(); Vector vector_temp = new Vector (); for(AccelerometerVector vector : this.vectors) { vector_temp.add(vector); } this.vectors.removeAllElements(); return vector_temp; } 8
9
> ASimco.CatchEvent() > Zachycení a tvorba události pro kalendář > Získání jména ze StackTrace → obecné > Podle toho koho volá vytvoří > Reálnou událost > Simulovanou událost pokud volá další simulovanou komponentu > Vloží událost do kalendáře > Kontrola zařazení do skupiny 10
> ASimco.simcoDelay() > Získání jména volané metody > Uspání simulační komponenty > Vytvoření události simulovaného návratu hodnoty a vložení do kalendáře > Pokud se má odehrát okamžitě, probuzení kalendáře aby ji vyvolal 11
> Potomek třídy AIntermediate, musí implementovat rozraní zakryté komponenty > Konstruktor jako simulovaná komponenta, navíc potřebuje referenci na zakrytou komponentu > Volání metody > Vytvoření simulační události volání > Skutečné volání a získání návratové hodnoty > Vytvoření simulační události návratu hodnoty > Návrat hodnoty z reálné komponenty 12
public int getCountOfSteps() { SimulationEvent event = this.intermediateRealEventCatch(); int stepsCount = calculator.getCountOfSteps(); this.intermediateReturnEventCatch(event); return stepsCount; } 13
14
> AIntermediate.intermediateRealEventCatch() > Získá jméno volané metody ze StackTrace a ID bundlu > Vytvoří událost pro kalendář – kdy má v simulačním čase dojít k volání > AIntermediate.intermediateReturnEventCatch() > Vloží do kalendáře událost návratu hodnoty 15
> Rozhraní ICalendar, implementace scheduler.CalendarImpl > Umožňuje jeden krok nebo plynulý běh simulace > Podle typu událostí je volá přes EventsInvoker > invokeCasualEvent() – jedno volání metody > invokeRegularEvent() – volání metod ze scénáře > invokeReturnEvent() – událost s návratem hodnoty 16
> Manifesty pro OSGi se měnit nemusí > SpringDM > Pro simulované komponenty > V popisu simulované komponenty uvést že poskytuje potřebnou službu > V popisu reálné komponenty umazat že poskytuje potřebnou službu > Pro intermediate komponenty > U intermediate komponenty vznikne nová služba se stejným rozhraním jako u zakryté komponenty, navíc ale s parametrem: > U těch kdo službu využívají přibude nastavení filtru: 17
> V každém bundlu v kořeni XML soubor jmenoSettings.xml > V něm popis bundlu – třídy jaké poskytuje > Nastavení metod, které se budou opakovaně volat (pro scénáře) > I pro reálné bundly > Celkový soubor s popisem > Seznam a odlišení typů bundlů > Seznam událostí které se mají volat, nastavení period pokud je potřeba 18
19