190 likes | 348 Views
SimCo – tvorba komponent. Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen , Czech Republic. Agenda. Základnà koncepty PÅ™ehled důležitých tÅ™Ãd SimCa Tvorba simulované komponenty Tvorba intermediate komponenty
E N D
SimCo – tvorba komponent Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen, Czech Republic
Agenda • Základní koncepty • Přehled důležitých tříd SimCa • Tvorba simulované komponenty • Tvorba intermediate komponenty • Zapojení do aplikace
Použití simulace • 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
Nasazení k testování • 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
Struktura SimCa • 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í
Podpora pro simulační komponenty • 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
Simulovaná komponenta • 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
Simulovaná komponenta - příklad public Vector<AccelerometerVector> getVector() { this.simcoCatchEvent(); this.simcoDelay(); Vector<AccelerometerVector> vector_temp = newVector<AccelerometerVector>(); for(AccelerometerVectorvector : this.vectors) { vector_temp.add(vector); } this.vectors.removeAllElements(); returnvector_temp; }
Simulovaná komponenta - zachycení • 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
Simulovaná komponenta - zpoždění • 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
Intermediate komponenta • 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
Intermediate komponenta - příklad public intgetCountOfSteps() { SimulationEventevent = this.intermediateRealEventCatch(); intstepsCount = calculator.getCountOfSteps(); this.intermediateReturnEventCatch(event); returnstepsCount; }
Intermediate komponenta - volání • 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
Kalendář • 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
Sestavení simulace • 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:<entry key="simul" value="true" /> • U těch kdo službu využívají přibude nastavení filtru: <osgi:reference id="Calculator" interface="simco.application.calculator.ICalculator" filter="(simul=true)" />
Popisy pro simulátor • V každém bundlu v kořeni XML souborjmenoSettings.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