Hlavní menu

Nástroje

UvodDoKomponent / ParkovisteOsgi

View (print) - Edit page | Recent changes - Page history

Updated 22 January 2015, 16:18 by PremekBrada

UvodDoKomponent.ParkovisteOsgi History

Hide minor edits - Show changes to output

22 January 2015, 16:18 by PremekBrada -
Changed lines 5-6 from:
V tomto případě by nemělo moc smysl procházet všechny části implementace, protože je k dispozici implementace. Zaměřím se tedy hlavně na novinky v Activatoru a eventy.
to:
V tomto případě by nemělo moc smysl procházet všechny části implementace, protože je k dispozici jako Attach:ParkovisteOsgi.zip archiv. Zaměřím se tedy hlavně na novinky v Activatoru a eventy.
Changed lines 15-16 from:
Položky v této části budou vyžadované pro běh a jsou implementačně závislé. Pokud tedy potřebuji k běhu jeden určitý bundle, použiji tento typ vložení.
to:
Položky v této části budou vyžadované pro běh a jsou implementačně závislé. Pokud tedy potřebuji k běhu jeden určitý bundle, použiji tento typ vložení. _Kvůli vznikající "tvrdé" závislosti na konkrétní bundle je tento způsob nedoporučovaný._
Changed lines 19-24 from:
Tato volba se naopak používá pokud se nechci vázat na určitou implementaci. Je vhodné importovat package interfaců. Implementační část mne pak vůbec nemusí zajímat. Pracuji s rozranními a to je vše, co potřebuji - je mi jedno kdo udělá (nebo udělal) bundle, který implementuje mnou používané rozhranní.

!! Více implementací jednoho rozhranní

Návrh '''Parkoviste''' říká, že '''Tabule''' a '''Brana''' budou obě implementovat rozhranní @@IZapVyp@@. Určitě by to šlo i jednoduše obejít, ale zaregistrovat obě služby pod stejným rozhranním bude zajímavější.
to:
Tato volba se naopak používá pokud se nechci vázat na určitou implementaci. Je vhodné importovat package s rozhraními. Implementační část mne pak vůbec nemusí zajímat. Pracuji s rozraními a to je vše, co potřebuji - je mi jedno kdo udělá (nebo udělal) bundle, který implementuje mnou používané rozhraní.

!! Více implementací jednoho rozhraní

Návrh '''Parkoviste''' říká, že '''Tabule''' a '''Brana''' budou obě implementovat rozhraní @@IZapVyp@@. Určitě by to šlo i jednoduše obejít, ale zaregistrovat obě služby pod stejným rozhraním bude zajímavější.
Changed lines 41-50 from:
Abychom mohli službu získat, musíme zavolat metodu @@getServices()@@, která získá všechny služby rozhranní @@IZapVyp@@ a díky druhému '''String'''ovému parametru pro[[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | filtr]]uje.

V našem případě je filtr dost jednoduchý - chceme ty služby, jejich parametr '''type''' se rovná hodnotě '''tabule'''.

Pro podrobnější informace k filtrování se podívejte [[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | zde]].


tabule = (IZapVyp) context.getService(context.getServiceReferences("cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp", "(type=tabule)")[0]);

to:
Abychom mohli službu získat, musíme zavolat metodu @@getServices()@@, která získá všechny služby rozhraní @@IZapVyp@@ a díky druhému '''String'''ovému parametru pro[[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | filtr]]uje. V našem případě je filtr dost jednoduchý - chceme ty služby, jejich parametr '''type''' se rovná hodnotě '''tabule'''.

Pro podrobnější informace k filtrování se podívejte [[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | na JavaDoc příslušného rozhraní]].

tabule = (IZapVyp) context.getService(context.getServiceReferences("cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp", "(type=tabule)")[0]);

Changed lines 54-60 from:
1) Získání služby @@EventAdmin@@a a zveřejnění události

2) Zaregistrování listenerů

3) Spuštění bundlu - implementace EventAdmina

to:
# Získání služby @@EventAdmin@@a a zveřejnění události
# Zaregistrování listenerů
# Spuštění bundlu - implementace EventAdmina

Changed lines 61-62 from:
V OSGi nemusíme implementovat žádné rozhranní, ani třídu. Stačí získat službu @@EventAdmin@@a. Tomu ale předchází několik kroků.
to:
V OSGi nemusíme implementovat žádné rozhraní, ani třídu. Stačí získat službu @@EventAdmin@@a. Tomu ale předchází několik kroků.
Changed lines 68-70 from:
this.messageService = (EventAdmin) context.getService(context.getServiceReference("org.osgi.service.event.EventAdmin"));

to:
this.messageService = (EventAdmin) context.getService(context.getServiceReference("org.osgi.service.event.EventAdmin"));

Changed lines 82-84 from:
messageService.postEvent(new Event("parkoviste/plne", new HashMap<String, Integer>()));

to:
messageService.postEvent(new Event("parkoviste/plne", new HashMap<String, Integer>()));

Changed lines 91-92 from:
2) Třída, která bude zpracovávat události musí implementovat rozhranní @@EventHandler@@, které vyžaduje přetížení metody @@handleEvent()@@.
to:
2) Třída, která bude zpracovávat události musí implementovat rozhraní @@EventHandler@@, které vyžaduje přetížení metody @@handleEvent()@@.
Changed lines 106-107 from:
3) Zaregistrovat listener, tedy @@EventHandler@@. Pokud jde o třídu, která je zaregistrovaná už jako jiná služba nevadí, prostě ji zaregistruji znovu, ale tentokrát pod tímto rozhranním.
to:
3) Zaregistrovat listener, tedy @@EventHandler@@. Pokud jde o třídu, která je zaregistrovaná už jako jiná služba nevadí, prostě ji zaregistruji znovu, ale tentokrát pod tímto rozhraním.
Changed lines 118-121 from:
Konkrétněji bundlu, který poskytuje jeho implementaci.

Volba je na Vás, já jsem používal equinoxovou verzi a následující část bude právě k ní.
to:
Je potřeba spustit bundle, který poskytuje jeho implementaci. Volba implementace je na Vás, já jsem používal equinoxovou verzi a následující část bude právě k ní.
Changed lines 125-131 from:
1) Jděte na equinoxovou [[http://download.eclipse.org/equinox/ | download page]]

2) Běžte na '''Latest release'''

3) V sekci '''Add-on Bundles''' najděte '''org.eclipse.equinox.event''' a stáhněte

to:
# Jděte na equinoxovou [[http://download.eclipse.org/equinox/ | download page]]
# Běžte na '''Latest release'''
# V sekci '''Add-on Bundles''' najděte '''org.eclipse.equinox.event''' a stáhněte

Changed lines 132-139 from:
1) V menu zvolte '''File -> Import'''

2) V otevřeném okně vyberte '''Plug-ins and Fragments''' a jděte dál

3) V novém okně vyberte v sekci '''Import from''' možnost '''Directory''' a zadejte cestu k bundlu, pokračujte '''Next'''.

4) Vlevo bude seznam dostupných bundlý, vyberte tedy '''org.eclipse.equinox.event''' a přidejte ho do pravého seznamu, což jsou bundly, které budou importovány. Dokončíme pomocí '''Finish'''.
to:
# V menu zvolte '''File -> Import'''
# V otevřeném okně vyberte '''Plug-ins and Fragments''' a jděte dál
# V novém okně vyberte v sekci '''Import from''' možnost '''Directory''' a zadejte cestu k bundlu, pokračujte '''Next'''.
# Vlevo bude seznam dostupných bundlý, vyberte tedy '''org.eclipse.equinox.event''' a přidejte ho do pravého seznamu, což jsou bundly, které budou importovány. Dokončíme pomocí '''Finish'''.
Added line 143:
22 January 2015, 15:46 by PremekBrada -
Changed line 31 from:
=java122 [=
to:
Changed lines 35-36 from:
=]
to:

Changed line 47 from:
=java122 [=
to:
Changed lines 49-50 from:
=]
to:

Changed line 72 from:
=java122 [=
to:
Changed lines 74-75 from:
=]
to:

Changed line 78 from:
=java122 [=
to:
Changed lines 82-83 from:
=]
to:

Changed line 86 from:
=java122 [=
to:
Changed lines 88-89 from:
=]
to:

Changed line 102 from:
=java122 [=
to:
Changed lines 109-110 from:
=]
to:

Changed line 115 from:
=java122 [=
to:
Changed lines 119-120 from:
=]
to:

Changed line 154 from:
Po importu bude bundle dostupný v '''Run -> Run configurations ... -> OSGi framework''' a tedy bude i spustitelný. Je nutné nastavit jeho spuštění před bundle, který ho jako první používá.
to:
Po importu bude bundle dostupný v '''Run -> Run configurations ... -> OSGi framework''' a tedy bude i spustitelný. Je nutné nastavit jeho spuštění před bundle, který ho jako první používá.
16 December 2009, 14:37 by Snajberk -
Added lines 1-154:
! Parkoviste v OSGi

V tomto tutoriálu se používá [[http://www.springsource.com/products/sts | SpringSource Tool Suite]].

V tomto případě by nemělo moc smysl procházet všechny části implementace, protože je k dispozici implementace. Zaměřím se tedy hlavně na novinky v Activatoru a eventy.

!! Export a import

Je samozřejmé, že mezi sebou budou jednotlivé bundly provázány díky importům a exportům. Jakým způsobem je logické a vyplývá to ze zadání úkolu.

Tady bych chtěl pouze upozornit na jednu věc. V MANIFESTu v záložce '''Dependencies''' jsou dvě možnosti jak vložit nějaký projekt. Buď se dá vložit přes '''Required Plug-ins''' nebo přes '''Imported packages'''.

!!! Required Plug-ins

Položky v této části budou vyžadované pro běh a jsou implementačně závislé. Pokud tedy potřebuji k běhu jeden určitý bundle, použiji tento typ vložení.

!!! Imported packages

Tato volba se naopak používá pokud se nechci vázat na určitou implementaci. Je vhodné importovat package interfaců. Implementační část mne pak vůbec nemusí zajímat. Pracuji s rozranními a to je vše, co potřebuji - je mi jedno kdo udělá (nebo udělal) bundle, který implementuje mnou používané rozhranní.

!! Více implementací jednoho rozhranní

Návrh '''Parkoviste''' říká, že '''Tabule''' a '''Brana''' budou obě implementovat rozhranní @@IZapVyp@@. Určitě by to šlo i jednoduše obejít, ale zaregistrovat obě služby pod stejným rozhranním bude zajímavější.

!!! Registrace služeb

Abychom mohli používat oba dva objekty, budeme muset použít parametrů pomocí hashovací tabulky. Vytvoříme si tedy tabulku s jediným parametrem: '''type = tabule.'''

A tuto službu zaregistrujeme.

=java122 [=
Hashtable<String, String> ht = new Hashtable<String, String>();
ht.put("type", "tabule");
context.registerService("cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp", tabule, ht);
=]

Obdobně zaregistrujeme i bránu, jen s tím rozdílem, že parametr bude: '''type = brana.'''

!!! Získání služeb

Abychom mohli službu získat, musíme zavolat metodu @@getServices()@@, která získá všechny služby rozhranní @@IZapVyp@@ a díky druhému '''String'''ovému parametru pro[[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | filtr]]uje.

V našem případě je filtr dost jednoduchý - chceme ty služby, jejich parametr '''type''' se rovná hodnotě '''tabule'''.

Pro podrobnější informace k filtrování se podívejte [[http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Filter.html | zde]].

=java122 [=
tabule = (IZapVyp) context.getService(context.getServiceReferences("cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp", "(type=tabule)")[0]);
=]

Obdobně pro bránu, samozřejmě budeme chtít '''type=brana'''.

!! Eventy

Zjistit jak fungují eventy v OSGi bylo opravdu složité. Samotný princip je pak ovšem velice jednoduchý a skládá se pouze ze tří bodů.

1) Získání služby @@EventAdmin@@a a zveřejnění události

2) Zaregistrování listenerů

3) Spuštění bundlu - implementace EventAdmina


!!! Služba pro odesílání událostí

V OSGi nemusíme implementovat žádné rozhranní, ani třídu. Stačí získat službu @@EventAdmin@@a. Tomu ale předchází několik kroků.

1) V '''MANIFEST.MF''' přidat mezi '''Imported packages''' balíček '''org.osgi.service.event''' (pozor, vyhledávač porovnává od začátku (ne fulltextově), takže pokud budete přidávat, musíte psát org....)

2) Získat službu @@EventAdmin@@

=java122 [=
this.messageService = (EventAdmin) context.getService(context.getServiceReference("org.osgi.service.event.EventAdmin"));
=]

3) Vytvořit událost. Pomocí @@HashMap@@ se dají vkládat i parametry. Není to však nutné a dá se poslat i událost bez dalších parametrů.

=java122 [=
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("volnaMista", volnaMista);
messageService.sendEvent(new Event("parkoviste/zbyva", hm));
=]

4) Posílat události přes metody @@postEvent()@@ (asynchronní) nebo @@sendEvent()@@ (synchronní).

=java122 [=
messageService.postEvent(new Event("parkoviste/plne", new HashMap<String, Integer>()));
=]

!!! Registrace EventListenerů

I zde je nutné provést několik kroků.

1) V '''MANIFEST.MF''' přidat mezi '''Imported packages''' balíček '''org.osgi.service.event''' (pozor, vyhledávač porovnává od začátku (ne fulltextově), takže pokud budete přidávat, musíte psát org....)

2) Třída, která bude zpracovávat události musí implementovat rozhranní @@EventHandler@@, které vyžaduje přetížení metody @@handleEvent()@@.

Typ zprávy pak získáme pomocí metody @@event.getTopic()@@.

A proměnnou pak získáme pomocí metody @@event.getProperty()@@, samozřejmě s vyplněným názvem proměnné.

=java122 [=
public void handleEvent(Event event) {
if ("parkoviste/zbyva".equals(event.getTopic()))
println("Zbyva mist : " + event.getProperty("volnaMista"));
else
println("Parkoviste plne!");
}
=]

3) Zaregistrovat listener, tedy @@EventHandler@@. Pokud jde o třídu, která je zaregistrovaná už jako jiná služba nevadí, prostě ji zaregistruji znovu, ale tentokrát pod tímto rozhranním.

Jako vstupní parametr určuji typ událostí, které chci zpracovávat. Jsou povoleny wildcards, tedy '''"parkoviste/*"''' bude zachytávat jakékoliv události začínající na "parkoviste/"

=java122 [=
Hashtable<String, String> hm = new Hashtable<String, String>();
hm.put(EventConstants.EVENT_TOPIC, "parkoviste/*");
listenerSR = context.registerService(EventHandler.class.getName(), pult, hm);
=]

!!! Spuštění EventAdmina

Konkrétněji bundlu, který poskytuje jeho implementaci.

Volba je na Vás, já jsem používal equinoxovou verzi a následující část bude právě k ní.

!!!! Získání bundlu

Zde popisuji konkrétně získání equinoxové implementace, pokud chcete jinou, hledejte jinde.


1) Jděte na equinoxovou [[http://download.eclipse.org/equinox/ | download page]]

2) Běžte na '''Latest release'''

3) V sekci '''Add-on Bundles''' najděte '''org.eclipse.equinox.event''' a stáhněte


!!!! Import bundlu

1) V menu zvolte '''File -> Import'''

2) V otevřeném okně vyberte '''Plug-ins and Fragments''' a jděte dál

3) V novém okně vyberte v sekci '''Import from''' možnost '''Directory''' a zadejte cestu k bundlu, pokračujte '''Next'''.

4) Vlevo bude seznam dostupných bundlý, vyberte tedy '''org.eclipse.equinox.event''' a přidejte ho do pravého seznamu, což jsou bundly, které budou importovány. Dokončíme pomocí '''Finish'''.

Attach:import-plugins.png


!!!! Spuštění bundlu

Po importu bude bundle dostupný v '''Run -> Run configurations ... -> OSGi framework''' a tedy bude i spustitelný. Je nutné nastavit jeho spuštění před bundle, který ho jako první používá.