Wtyczki i pakunki

Mechanizmy obsługi wtyczek są implementowane przy użyciu środowiska OSGi. Z tego punktu widzenia wtyczka niczym nie różni się od pakunku OSGi. Pakunek i skojarzone z nim klasy definiują i implementują proces ładowania klas Java, zarządzanie wymaganiami wstępnymi oraz cykl życia pakunku. W dalszym ciągu omówienia terminy wtyczka i pakunek będą używane wymiennie z wyjątkiem przypadków omawiania określonej klasy przynależnej do środowiska.

Plugin

Klasa Plugin reprezentuje wtyczkę działającą na platformie. Jest to dogodne miejsce do centralnego rozpatrywania ogólnej semantyki oraz aspektów wtyczki w kontekście jej cyklu życia. Wtyczka może zawierać implementacje specjalnych funkcji start i stop, odpowiadających początkowi i końcowi jego cyklu życia. Każda metoda związana z cyklem życia zawiera odwołanie do obiektu BundleContext, który stanowi źródło dodatkowych informacji.

Część startowa cyklu życia zasługuje na szczególną uwagę. Jak wiadomo, informacje na temat wtyczki można uzyskać bez jego uruchamiania, odczytując po prostu związany z nim plik manifestu. Zazwyczaj uruchomienie wtyczki wynika z szeregu czynności podjętych przez użytkownika w obszarze roboczym. Z punktu widzenia implementacji wtyczka jest uruchamiany dopiero w momencie, gdy zaistnieje potrzeba załadowania klasy zawartej w tej wtyczce.

Metoda start jest uważana za dogodne miejsce implementacji kodu odpowiedzialnego za inicjowanie i rejestrację wtyczki. Trzeba jednak sobie uświadomić, że uruchomienie wtyczki może nastąpić w bardzo różnych okolicznościach. Nawet tak prosta operacja, jak odczytanie ikony służącej do oznaczenia obiektu, może spowodować wczytanie jednej z klas wtyczki, co jest równoznaczne z jej uruchomieniem. Niedostateczne wyczucie kontekstu uruchamiania może skutkować załadowaniem wtyczki i jej danych na długo przed tym, gdy staną się faktycznie potrzebne. Dlatego należy bardzo dokładnie przyjrzeć się czynnościom inicjującym wtyczkę i rozważyć alternatywy.

Kontekst pakunku

Sterowanie cyklem życia to dziedzina, w której pojęcie "pakunku" OSGi przenika się z pojęciem "wtyczki" platformy. Po uruchomieniu wtyczka uzyskuje odwołanie do obiektu BundleContext, z którego może uzyskać informacje związane z wtyczką.Obiekt BundleContext jest również źródłem informacji na temat innych pakunków i wtyczek w systemie.

Za pomocą metody BundleContext.getBundles() można uzyskać tablicę wszystkich pakunków w systemie. Można zarejestrować funkcje nasłuchiwania dla obiektów BundleEvent, które poinformują daną wtyczkę o zmianie statusu w cyklu życia innych pakunków. Więcej informacji zawiera dokumentacja javadoc obiektów BundleContext i BundleEvent.

W wersjach wcześniejszych niż 3.0 do udostępniania podobnych informacji służył rejestr wtyczek (IPluginRegistry). Można było na przykład kierować do niego zapytania dotyczące deskryptorów wszystkich wtyczek w systemie. Obecnie rejestr ten jest uznawany za nieaktualny, a do tych samych celów należy używać obiektu BundleContext. Rejestr platformy jest teraz używany wyłącznie w celu uzyskiwania informacji o rozszerzeniach i punktach rozszerzeń.

Aktywator pakunku

Interfejs BundleActivator definiuje ogół operacji związanych z uruchamianiem i zatrzymywaniem w implementacji wtyczki. Jakkolwiek klasa Plugin jest dogodnym miejscem do implementowania tej funkcji, twórca wtyczki ma pełną swobodę w tym względzie i może umieścić implementację interfejsu BundleActivator w dowolnej klasie. W zasadzie wtyczka może być nawet całkiem pozbawiona implementacji tego interfejsu, jeśli nie ma ona specjalnych potrzeb w zakresie zarządzania cyklem życia.

Pakunki

Zapleczem każdej wtyczki jest pakunek zarządzany przez mechanizmy środowiska OSGi. Pakunek jest jednostką modułowości w środowisku OSGi. Zasadniczo pakunek to po prostu zbiór plików (zasobów i kodu) zainstalowanych na platformie. Każdy pakunek dysponuje własnym programem ładującym klasy Java oraz własnym protokołem uruchamiania, zatrzymywania i deinstalacji. Z punktu widzenia platformy Eclipse pakunek jest po prostu klasą implementacji. Twórcy wtyczek nie rozszerzają klasy pakunku, do reprezentowania wtyczki używając klasy Plugin lub innej implementacji obiektu BundleActivator.