Plugins og bundter

Mekanismerne til brug for understøttelse af plugins implementeres vha. rammen OSGi. Fra dette standpunkt er en plugin det samme som et OSGi-bundt. Bundtet og dets tilknyttede klasser angiver og implementerer processen til brug for indlæsning af Java-klasser, nødvendig styring og bundtets livscyklus. I det følgende benyttes begreberne plugin og bundt i flæng, medmindre en bestemt klasse i rammen diskuteres.

Plugin

Plugin-klassen repræsenterer en plugin, der udføres i platformen. Det er et nyttigt sted at centralisere en plugins livscyklusaspekter og dens overordnede semantik. En plugin kan implementere specialiserede funktioner til start og stop af dens livscyklus. Hver livscyklusmetode inkluderer en reference til en BundleContext, som levere flere oplysninger.

Start-delen af livscyklussen kræver nærmere omtale. Oplysninger om en plugin kan som bekendt hentes fra plugin'ens manifestfil, uden at der overhovedet skal udføres noget plugin-kode. En brugerhandling på arbejdsbænk bevirker typisk, at en kæde af aktiviteter udløses, som kræver start af en plugin. Ud fra et implementeringsmæssigt synspunkt startes en plugin ikke, før en klasse, som er indeholdt i plugin'en, skal indlæses.

Start-metoden har været et nyttigt sted at implementere initialiserings- og registreringsfunktioner for en plugin. men det er vigtigt at være klar over, at plugin'en kan startes i mange forskellige omstændigheder. Noget så enkelt som at hente en ikon til at dekorere et objekt kan bevirke, at en af plugin'ens klasser indlæses, hvorved plugin'en startes. Overivrig initialisering kan bevirke, at plugin'ens kode og data indlæses længe før, det er nødvendigt. Det er derfor vigtigt at kontrollere plugin'ens initialiseringsopgaver nøje og at overveje alternativer til initialisering ved start.

Bundtkontekst

Livscyklusstyring opstår, når OSGi-"bundtterminologien" og platformens "plugin-terminologi" mødes. Når plugin'en startes, får den en reference til en BundleContext, hvorfra den kan hente oplysninger, der har relation til plugin'en. BundleContext kan også bruges til at foretage undersøgelser om andre bundter/plugins i systemet.

BundleContext.getBundles() kan bruges til at hente et array af alle bundter i systemet. BundleEvent-lyttere kan registreres, så plugin'en er klar over, hvornår en andet bundt har en ændring i sin livscyklusstatus. I javadoc for BundleContext og BundleEvent finder du flere oplysninger.

Før version 3.0 blev en plugin-registreringsdatabase (IPluginRegistry) stillet til rådighed, som indeholdt lignende oplysninger. Det var f.eks. muligt at forespørge på plugindeskriptorer til alle plugins i systemet. Denne registreringsdatabase er forældet nu, og BundleContext bør benyttes til dette formål. Platformregistreringsdatabasen bruges udelukkende til oplysninger om udvidelser og udvidelsespunkter.

Bundtaktivator

BundleActivator-grænsefladen definerer de start- og stopfunktioner, der er implementeret i plugin'en. Selvom plugin-klassen er et nyttigt sted at implementere denne funktion, har en plugin-udvikler frihed til at implementere grænsefladen for BundleActivator i en vilkårlig klasse, der er relevant for plugin'ens design. Plugin'en behøver faktisk slet ikke at implementere denne grænseflade overhovedet, hvis den ikke har specifikke behov for livscyklusstyring.

Bundter

Under hver plugin ligger et OSGi-bundt, der styres af rammen. Bundtet er OSGi-modularitetsenheden. I grunden er et bundt blot en samling filer (ressourcer og kode), der er installeret i platformen. Hvert bundt har sin egen Java-klasseindlæsningsfunktion og indeholder protokol til brug for start, stop og afinstallation af sig selv. Fra Eclipse-platformens synspunkt er et bundt blot en implementeringsklasse. Plugin-udviklere udvider ikke bundtklassen, men bruger Plugin eller andre BundleActivator-implementeringer til at repræsentere plugin'en.