Kun ympäristö on ajossa ja resurssilisäosa on aktiivinen, työtilaa edustaa IWorkspace-ilmentymä, joka toimittaa käytännön sisältämiensä resurssien käyttöä varten. IWorkspace-ilmentymä edustaa asiaan liittyvää tiedostojen ja hakemistojen kokoelmaa yhdessä tai useassa tiedostojärjestelmässä. Voit käyttää työtilaa resurssien lisäosaluokasta (määritetty kohteessa org.eclipse.core.resources).
IWorkspace workspace = ResourcesPlugin.getWorkspace();
Kun resurssien lisäosa ei ole ajossa, työtila on vain tiedostojärjestelmässä ja käyttäjä voi tarkastella ja käsitellä sitä tavallisten tiedostotyökalujen avulla. Seuraavaksi tarkastellaan, miltä työtila näyttää levyssä, ja samalla selitetään resurssien lisäosan ohjelmointirajapinta.
Kun aloitit käyttöympäristön SDK:n, järjestelmä kehotti antamaan työtilan hakemiston. Tähän hakemistoon eri lisäosat tallentavat kiinnostavat metatiedot, jotka ovat yksilöllisiä tietylle käyttöympäristön ilmentymälle. Oletusarvon mukaan resurssien lisäosa tallentaa kunkin projektin työtilahakemiston alihakemistoon. Näissä alihakemistoissa on kunkin projektin sisältämiä kansioita ja tiedostoja.
Oletetaan, että olet valinnut työtilaa varten hakemiston c:\MySDK\workspace. Tässä hakemistossa on työtilan projektien mukaan nimetyt alihakemistot MyWeb ja MyServlet. Niitä kutsutaan projektin sisältöhakemistoiksi. Ympäristö luo sisältöhakemistot, kun käyttäjä luo projektin.
Kussakin hakemistossa on projektin tiedostoja ja kansioita aseteltuna samalla tavalla kuin työtilan resurssirakenteessa. Kaikki tiedostojen nimet ovat samoja, ja tiedostojen sisällöt ovat samoja, käytettiin niitä tiedostojärjestelmästä tai työtilasta. Ainoa ero on .project-tiedosto, joka selitetään tuonnempana.
C:\MySDK\workspace (työtilan juuri) .metadata\ (ympäristön metatietohakemisto MyWeb\ (projektin sisältöhakemisto kohteelle MyWeb) .project index.html images\ logo.png MyServlet\ (projektin sisältöhakemisto kohteelle MyServlet) .project src\ main.java bin\ main.class
Ympäristössä on erityinen .metadata-hakemisto, jossa on ympäristön sisäisiä tietoja. Työtilan .metadata-hakemisto on "musta laatikko". Työtilan metatieto-osioon on tallennettu tärkeitä tietoja työtilan rakenteesta, esimerkiksi projektin viittauksista tai resurssin ominaisuuksista, ja niitä saa käyttää työkaluilla vain ympäristön ohjelmointirajapinnan kautta. Näitä tiedostoja ei koskaan saa muokata tai käsitellä tavallisen tiedostojärjestelmän ohjelmointirajapinnan avulla.
Lisäksi kullakin projektilla on oma .project-tiedostonsa, jossa säilytetään projektin metatietoja. Tämä tiedosto on käytännössä projektin IProjectDescription-tietojen levyssä oleva vastine.
Lukuun ottamatta .metadata-hakemistoa ja .project-tiedostoja työtilahakemiston tiedostoja ja kansioita voi käsitellä muillakin työkaluilla. Tiedostoja ja kansioita voi käsitellä muiden kuin integroitujen työkalujen avulla, esimerkiksi tekstinmuokkausohjelmien ja tiedostojärjestelmän apuohjelmien avulla. Käyttäjän on kuitenkin oltava huolellinen muokatessaan näitä tiedostoja sekä työtilassa että ulkoisesti. (Tämä ei eroa siitä, että käyttäjä muokkaa tiedostoa kahden itsenäisen työkalun avulla.) Työympäristössä on käytettävissä verestystoimintoja, joiden avulla voi saattaa työtilan resurssinäkymän vastaamaan tiedostojärjestelmän todellista tilaa, ja joiden avulla voi säännöllisesti verestää työtilan tiedostojärjestelmän tilan mukaan.
Resurssien ohjelmointirajapinnan avulla voi käsitellä tätä resurssirakennetta koodissa. Tässä tarkastellaan joitakin koodikatkelmia, jotka valaisevat resurssien ohjelmointirajapintaa. Resurssien ohjelmointirajapinta on määritetty joukossa rajapintoja kohteessa org.eclipse.core.resources. Kaikille resurssilajeille on rajapintoja, esimerkiksi IProject, IFolder ja IFile. Laaja yhteinen käytäntö on määritetty kohteessa IResource. Lisäksi hyödynnetään org.eclipse.core.runtime-rajapintaa IPath, joka edustaa lohkottuja polkuja, esimerkiksi resurssi- tai tiedostojärjestelmäpolkuja.
Resurssien käsittely on hyvin samanlaista kuin tiedostojen käsittely java.io.File-kohteen avulla. Ohjelmointirajapinta perustuu kahvoihin. Kun käytät esimerkiksi ohjelmointirajapintaa getProject tai getFolder, järjestelmä palauttaa resurssin kahvan. Ei ole mitään takuuta tai pakkoa, että itse resurssi on olemassa, ennen kuin yrität tehdä jotain kahvan avulla. Jos oletat resurssin olevan olemassa, voit varmistaa asian exists-metodin avulla.
Työtilassa siirtyminen lisäosan avulla edellyttää, että noudat IWorkspaceRoot-kohteen, joka edustaa työtilan resurssihierarkian ylätasoa.
IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
Kun työtilan juuri on noudettu, voit käyttää työtilan projekteja.
IProject myWebProject = myWorkspaceRoot.getProject("MyWeb"); // avaa tarvittaessa if (myWebProject.exists() && !myWebProject.isOpen()) myWebProject.open(null);
Projekti on avattava ennen sen käsittelyä. Projektin avauksen yhteydessä luetaan projektin rakenne levystä ja luodaan projektin resurssirakenteesta muistissa oleva objektiedustus. Projektin avaus on erillinen toiminto, koska kukin avoin projekti käyttää muistia resurssirakenteen kuvaamiseen sisäisesti, ja avoimet projektit osallistuvat erilaisiin resurssien elinkaarten tapahtumiin (esimerkiksi koontiin), jotka voivat olla pitkäkestoisia. Suljettuja projekteja ei yleensä voi käyttää, ja ne näyttävät tyhjiltä, vaikka resurssit ovat silti paikalla tiedostojärjestelmässä.
Huomaa, että monet näistä resurssiesimerkeistä välittävät null-parametrin resurssien käsittelyn yhteydessä. Monet resurssitoiminnot voivat olla kyllin mittavia, että niiden tilatiedot kannattaa raportoida ja että käyttäjä voi peruuttaa ne. Jos koodissa on käyttöliittymä, yleensä välitetään IProgressMonitor, jonka avulla resurssien lisäosa voi raportoida tilatiedot resurssin käsittelyn yhteydessä ja käyttäjä voi peruuttaa toiminnon. Toistaiseksi välitetään vain arvo null, joka tarkoittaa, että tilannetietojen valvontaohjelmaa ei ole.
Kun projekti on avattu, sen tiedostoja ja kansioita voi käyttää ja niitä voi luoda lisää. Seuraavassa esimerkissä luodaan tiedostoresurssi työtilan ulkopuolella sijaitsevan tiedoston sisällöstä.
IFolder imagesFolder = myWebProject.getFolder("images"); if (imagesFolder.exists()) { // luo uusi tiedosto IFile newLogo = imagesFolder.getFile("newLogo.png"); FileInputStream fileStream = new FileInputStream( "c:/MyOtherData/newLogo.png"); newLogo.create(fileStream, false, null); // luonti sulkee tietovirran, joten ei hätää. }
Edellä olevassa esimerkissä ensimmäinen rivi noutaa images-kansion kahvan. Ennen kuin kansiota voi käyttää, on varmistettava, että se on olemassa. Samalla tavoin, kun noudetaan newLogo-tiedosto, kahva edustaa todellista tiedostoa vasta, kun tiedosto luodaan viimeisellä rivillä. Tässä esimerkissä tiedosto luodaan täyttämällä se logo.png-kohteen sisällöllä.
Seuraava katkelma on samankaltainen kuin edellinen, paitsi että se kopioi newLogo-tiedoston alkuperäisestä logosta sen sijaan että loisi uuden logon sisällöstä.
IFile logo = imagesFolder.getFile("logo.png"); if (logo.exists()) { IPath newLogoPath = new Path("newLogo.png"); logo.copy(newLogoPath, false, null); IFile newLogo = imagesFolder.getFile("newLogo.png"); ... }
Lopuksi luodaan toinen images-kansio ja siirretään vasta luotu tiedosto siihen. Tiedosto nimetään uudelleen siirron sivuvaikutuksena.
... IFolder newImagesFolder = myWebProject.getFolder("newimages"); newImagesFolder.create(false, true, null); IPath renamedPath = newImagesFolder.getFullPath().append("renamedLogo.png"); newLogo.move(renamedPath, false, null); IFile renamedLogo = newImagesFolder.getFile("renamedLogo.png");
Monet resurssien ohjelmointirajapintametodeista sisältävät force-määritteen. Se on totuusarvomäärite, joka määrittää, päivitetäänkö joka tapauksessa ne resurssit, jotka ovat epäsynkronisia suhteessa tiedostojärjestelmän vastaaviin tiedostoihin. Kohdassa IResource on lisätietoja. Voit selvittää myös IResource.isSynchronized-kohteen avulla, onko tietty resurssi synkronoitu tiedostojärjestelmän kanssa.
Esimerkkinä olevassa resurssirakenteessa on oletettu, että kaikki projektin sisältöhakemistot ovat workspace-hakemistossa ympäristön juurihakemiston (C:\MySDK\workspace) alla. Tämä on projektien oletuskokoonpano. Projektin sisältöhakemiston voi kuitenkin määrittää mihin tahansa hakemistoon jossakin tiedostojärjestelmässä, myös eri koneeseen.
Projektin sijainnin määritys muista projekteista riippumatta antaa käyttäjälle mahdollisuuden tallentaa projektin sisältö sijaintiin, joka on projektin ja projektityöryhmän kannalta käytännöllinen. Projektin sisältöhakemisto kannattaa mieltää "avoimeksi". Tämä tarkoittaa, että käyttäjät voivat luoda, muokata ja poistaa resursseja työympäristön ja lisäosien avulla tai suoraan käyttämällä tiedostojärjestelmän työkaluja ja muokkausohjelmia.
Resurssien polkunimet eivät ole kokonaisia tiedostojärjestelmän polkuja. Resurssipolut perustuvat aina projektin sijaintiin (yleensä workspace-hakemisto). Voit hakea resurssin koko tiedostojärjestelmäpolun tekemällä sen sijaintia koskevan kyselyn IResource.getLocationURI-kohteen avulla. IProjectDescription.setLocation-kohteen avulla ei kuitenkaan voi muuttaa sen sijaintia, koska kyseinen metodi on vain yksinkertainen tietorakenteen asetusmetodi.
Jos haluat hakea tiedostojärjestelmäpolun avulla vastaavan resurssiobjektin, voit käyttää IWorkspaceRoot.findFilesForLocationURI- tai IWorkspaceRoot.findContainersForLocationURI-kohdetta.
Kun työtilan resurssirakennetta muokataan resurssien ohjelmointirajapinnan avulla, tiedostoja muutetaan tiedostojärjestelmässä sen lisäksi, että resurssiobjektit päivitetään. Entä resurssitiedostojen muutokset, jotka tapahtuvat ympäristön ohjelmointirajapinnan ulkopuolella?
Resursseihin tehdyt ulkoiset muutokset heijastuvat työtilaan ja resurssiobjekteihin vasta, kun resurssien lisäosa havaitsee ne. Resurssien lisäosa käyttää myös kullekin käyttöjärjestelmälle sopivaa menetelmää, jonka avulla se etsii tiedostojärjestelmään tehdyt ulkoiset muutokset. Lisäksi asiakkaat voivat resurssien ohjelmointirajapinnan avulla sovittaa yhteen työtilan ja resurssiobjektit paikallisen tiedostojärjestelmän kanssa huomaamatta ja ilman käyttäjän toimia. Käyttäjä voi myös nimenomaisesti pakottaa verestyksen työympäristön resurssien navigaattorinäkymään.
Monet resurssien ohjelmointirajapintojen parametrit sisältävät force-parametrin, joka määrittää, kuinka käsitellään resursseja, jotka ovat epäsynkronisia suhteessa tiedostojärjestelmään. Kunkin metodin ohjelmointirajapintaohjeessa on lisätietoja tästä parametrista. Ohjelmointirajapinnan muut metodit mahdollistavat tiedostojärjestelmän verestyksen ohjelmallisen hallinnan, esimerkiksi IResource.refreshLocal(int depth, IProgressMonitor monitor). Kohdassa IResource on lisätietoja oikeasta käytöstä ja kustannuksista.
Lisäosat, jotka haluavat käyttää omaa työtilan säännöllistä verestysmenetelmäänsä, joka perustuu ulkoisen tiedostojärjestelmän tilaan, voivat tehdä niin laajennuspisteen org.eclipse.core.resources.refreshProviders avulla. Lisätietoja on kohdassa Verestyksen toimittajat.