Elementtien factory-luokkien avulla luodaan uudelleen työympäristön malliobjekteja tiedoista, jotka on tallennettu työympäristön lopetuksen yhteydessä.
Ennen elementtien factory-laajennuksen tarkempaa esittelyä on syytä tarkastella yleistä tekniikkaa, jota käytetään kaikkialla käyttöympäristössä lisäosakohtaisen toiminnan lisäykseen yleisiin käyttöympäristön malliobjekteihin.
Työympäristön eri luokkia selaillessa huomaat, että monet työympäristön rajapinnat laajentavat IAdaptable-rajapinnan.
Lisäosat lisäävät erityisiä toimintoja aiemmin luoduille järjestelmän lajeille sovittimien avulla. Työympäristö voi esimerkiksi haluta, että resurssit vastaavat nimiön ja kuvan näyttötarkoituksiin. Kun tiedämme, ettei ole hyvää suunnittelua lisätä käyttöliittymäkohtaista toimintaa alatason objekteihin, miten tämän toiminnan voi lisätä resurssien lajeihin?
Lisäosat voivat rekisteröidä sovittimia, jotka lisäävät toiminnan aiemmin luotuihin lajeihin. Sovelluskoodi voi tämän jälkeen kysellä objektilta tiettyä sovitinta. Jos sille on rekisteröity sovitin, sovellus voi hakea sovittimen ja käyttää sovittimessa määritettyjä uusia toimintoja.
Tarjoamalla objektille keinon kysellä dynaamisesti sovitinta voi parantaa järjestelmän joustavuutta sen kehittyessä. Uudet lisäosat voivat rekisteröidä uusia sovittimia joutumatta muuttamaan alkuperäisten lajien määrityksiä. Tietyn sovittimen kysely objektilta tapahtuu seuraavan mallin mukaisesti:
//objektin o suhteen halutaan tehdä "työympäristöön" liittyviä asioita. if (!(o instanceof IAdaptable)) { return null; } IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class); if (adapter == null) return null; // nyt objektia o voi käsitellä IWorkbenchAdapter-rajapintana ...
Jos objektille rekisteröityä sovitinta ei ole saatavissa, sovittimeksi palautetaan arvo null. Työasemien on oltava valmiita tämän tapauksen käsittelyyn. Joskus voi käydä niin, ettei odotettua sovitinta ole rekisteröity.
Työympäristö käyttää sovittimia käyttöliittymän tietojen noutoon käyttöympäristön peruslajeista, kuten IResource. Sovittimet suojaavat peruslajeja käyttöliittymäkohtaiselta tiedolta, ja niiden avulla työympäristö voi kehittää rajapintojaan muuttamatta perusmäärityksiä.
Ilman sovittimia kaikkien luokkien, joita voidaan siirtää työympäristön sovellusohjelmaliittymässä, pitäisi toteuttaa käyttöliittymän rajapinnat, mikä lisäisi luokkien määritysten määrää, ottaisi käyttöön tiukan kytkennän ja loisi kehäriippuvuuksia ydinosan ja käyttöliittymän luokkien välille. Sovitinten kanssa jokainen luokka toteuttaa IAdaptable-rajapinnan ja antaa lisäosien laajentaa peruslajien toimintaa sovitinrekisterin avulla.
Kaikkialla työympäristön koodissa näkyy tapauksia, joissa käyttöympäristön ydinlajilta kysellään sovitinta. Kyselyä käytetään hakemaan objekti, joka tietää, miten käyttöliittymän liittyvät lajia koskevat tiedot tulee vastata.
Kun käyttäjä sulkee työympäristön, sen on tallennettava työympäristössä näkyvien IAdaptable-objektien nykyinen tila. Objektin tila tallennetaan tallentamalla objektin perusalkiotietojen parametrit erityisessä muodossa, IMemento. Lisäksi tallennetaan sen factory-luokan tunnus, joka pystyy luomaan objektin uudelleen IMemento-muodosta, ja tiedot tallennetaan tiedostojärjestelmään.
Kun käyttöympäristö käynnistetään uudelleen, työympäristö etsii IMementon factory-tunnukseen liittyvän elementin factory-luokan. Se etsii factory-luokan tarkistamalla lisäosarekisteristä org.eclipse.ui.elementFactories-laajennuksen lisäykset.
Merkintä on melko yksinkertainen. Tarvitsee vain määrittää factory-luokan tunnus ja factory-luokan toteuttava vastaava luokka.
Seuraava koodikatkelma on työympäristön tiedostosta plugin.xml.
<extension point="org.eclipse.ui.elementFactories"> <factory class="org.eclipse.ui.internal.model.ResourceFactory" id="org.eclipse.ui.internal.model.ResourceFactory"> </factory> <factory class="org.eclipse.ui.internal.model.WorkspaceFactory" id="org.eclipse.ui.internal.model.WorkspaceFactory"> </factory> <factory class="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.ui.part.FileEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory" id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.WorkingSetFactory" id="org.eclipse.ui.internal.WorkingSetFactory"> </factory> </extension>