Erőforrások és a helyi fájlrendszer

Ha a platform fut és az erőforrások bedolgozó aktív, akkor a munkaterületet az IWorkspace példánya ábrázolja, amely protokollt biztosít az általa tartalmazott erőforrások eléréséhez. Az IWorkspace példány egy társított fájl- és könyvtárgyűjteményt ábrázol a helyi fájlrendszerben. A munkaterület az erőforrások bedolgozó osztályból érhető el (az org.eclipse.core.resources elemben van megadva).

   IWorkspace workspace = ResourcesPlugin.getWorkspace(); 

Ha az erőforrások bedolgozó nem fut, akkor a munkaterület kizárólagosan létezik a helyi fájlrendszeren és a felhasználó szabványos fájl alapú eszközök segítségével jeleníti meg és kezeli. Tekintsük meg, hogy mely munkaterület néz ki a lemezen úgy, mint ahogy az erőforrások bedolgozó alkalmazás programozási felületet bemutattuk.

Példafa a lemezen

A platform SDK telepítésekor a fájlok a választott könyvtárba csomagolhatók ki. Ezt a könyvtárat platform-gyökérkönyvtárnak hívjuk. Ez a könyvtár, amely többek között tartalmazza a bedolgozók könyvtárat. A platform-gyökérkönyvtárban található egy workspace könyvtár, amely tartalmazza a platform által létrehozott és kezelt erőforrásokat. Ha belenéz a workspace könyvtárba, akkor a munkaterület minden projektjéhez külön alkönyvtárat fog látni. Ezen alkönyvtárakban vannak a projekt által tartalmazott mappák és fájlok.

Ha a példánkban lévő SDK a c:\MySDK könyvtárba van telepítve, akkor a c:\MySDK\workspace könyvtárban találhatók a munkaterület projektjei után elnevezett alkönyvtárak, a MyWeb és a MyServlet. Ezek a projekt tartalomkönyvtárai. A tartalomkönyvtárakat a platform hozza létre, amikor a felhasználó létrehoz egy projektet.

A projekten belül minden könyvtárban ugyanolyan elrendezésben találunk fájlokat és könyvtárakat, mint a munkaterület erőforrásfájában. Minden fájlnév és a fájlok tartalma is megegyezik attól függetlenül, hogy elérésre került-e a fájlrendszerből vagy a munkaterületről. Az egyetlen meglepetés a .project fájl, amelyet rögtön elmagyarázunk.

   C:\MySDK\workspace  (workspace root)
      .metadata\ (platform metadata directory
      MyWeb\ (project content directory for MyWeb)
	 .project
         index.html
         images\
            logo.png
      MyServlet\ (project content directory for MyServlet)
	 .project
         src\
            main.java
         bin\
            main.class

A platform egy speciális .metadata könyvtárral rendelkezik a platform belső információinak tárolásához. A munkaterület .metadata könyvtára egy "feketedoboznak" tekinthető. A munkaterület-struktúrával kapcsolatos fontos információk - mint például a projekt hivatkozásai vagy az erőforrás tulajdonságai - a munkaterület metaadat részében kerülnek tárolásra, és az eszközök csak a platform alkalmazás-programozási felületen keresztül érhetik el.  Ezek a fájlok nem szerkeszthetők és kezelhetők általános fájlrendszer API segítségével.

Ezen felül minden projekt rendelkezik saját .project fájllal, amelyben a projekttel kapcsolatos metaadatok tárolásra kerülnek. Ez a fájl alapvetően a projekt IProjectDescription elemében található információk lemezen lévő megfelelője.  

A .metadata könyvtártól és a .project fájloktól eltekintve a munkaterület-könyvtárban lévő fájlokat és mappákat az eszközök szabadon használhatják. A fájlok és mappák kezelhetők nem integrált eszközökkel, mint például a szövegszerkesztők és fájlrendszer-segédprogramok. Az egyetlen probléma, hogy a felhasználónak körültekintően kell eljárnia a fájlok szerkesztésében a munkaterületen és külsőleg egyaránt.  (Ez nem különbözik attól, amikor a felhasználó a fájlt két független önálló eszközzel szerkeszti.)  A munkaterület frissítési műveletet biztosít az erőforrások munkaterület nézetéhez és a fájlrendszer aktuális állapotának összeegyeztetéséhez, és a fájlrendszer állapota alapján rendszeres időközönként frissíti a munkaterületet.

A példafa kódban

Ezt az erőforrásfát a kódban az erőforrás API segítségével kezelheti. Az erőforrás API gyors áttekintése érdekében megnézünk néhány kódrészletet. Az erőforrás API a felületek sorozatában van megadva az org.eclipse.core.resources elemben. Felületek állnak rendelkezésre az összes erőforrástípushoz, mint például az IProject, IFolder, és IFile. Az IResource elemben egy átfogó általános protokoll van megadva. Az org.eclipse.core.runtime IPath felületet is használjuk, amely a szegmentált elérési utakat ábrázolja, mint például az erőforrás vagy fájlrendszer elérési utak.

Az erőforrások kezelése nagyon hasonlít a fájlok java.io.File segítségével kezeléséhez.  Az API kezelőkre épül. Ha a getProject vagy getFolder elemhez hasonló alkalmazás programozási felületet próbál használni, akkor egy kezelőt ad vissza az erőforrásnak.  Nincs garancia vagy előírás arra, hogy az erőforrásnak léteznie kell, amíg meg nem próbál valamit tenni a kezelővel.  Ha elvárja, hogy egy erőforrás létezzen, akkor az exists metódus segítségével biztosíthatja ezt.  

A munkaterület bedolgozóból navigálásához először le kell kérni az IWorkspaceRoot elemet, amely az erőforrás-hierarchia tetejét ábrázolja a munkaterületen.

   IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

A munkaterület-gyökér segítségével elérhetjük a munkaterület projektjeit.

   IProject myWebProject = myWorkspaceRoot.getProject("MyWeb");
   // szüksége setén megnyitásra kerül
   if (myWebProject.exists() && !myWebProject.isOpen())
      myWebProject.open(null);

A projektet a kezeléséhez meg kell nyitni. A projekt megnyitása kiolvassa a projekt struktúráját a lemezről, és létrehozza a projekt erőforrásfájának memóriában lévő objektumábrázolását. A projekt megnyitása egy explicit művelet, mivel minden megnyitott projekt memóriát foglal el az erőforrásfa belső ábrázolásához és projektrésztvevőket nyit meg a különböző erőforrás életciklus eseményekben (mint például az összeépítés), amely hosszú lehet.  A bezárt projektek általában nem érhetők el és üresen jelennek meg abban az esetben is, ha az erőforrások továbbra is jelen vannak a fájlrendszeren.

Látni fogja, hogy az erőforráspéldák nagy része üres paramétert ad át az erőforrások kezelésekor. Számos erőforrás-művelet elég nehéz ahhoz, hogy előrehaladás-jelentést és felhasználótörlés biztosítson. Ha a kód rendelkezik felhasználói felülettel, akkor általában egy IProgressMonitor kerül átadása, amelynek segítségével az erőforrások bedolgozó jelentést készíthet az előrehaladásról az erőforrás kezelésekor, a felhasználó pedig szükség esetén törölheti a műveletet.   Eddig egyszerűen üres értéket adtunk át annak jelzéséhez, hogy nincs előrehaladás-megfigyelés.

Nyitott projekt esetén elérhetjük a projekt mappáit és fájljait, valamint létrehozhatunk továbbiakat.  Az alábbi példában a munkaterületen kívül található fájl tartalmából létrehozunk egy fájlerőforrást.

   IFolder imagesFolder = myWebProject.getFolder("images");
   if (imagesFolder.exists()) {
      // új fájl létrehozása
      IFile newLogo = imagesFolder.getFile("newLogo.png");
      FileInputStream fileStream = new FileInputStream(
         "c:/MyOtherData/newLogo.png");
      newLogo.create(fileStream, false, null);
      // bezárja a fájlfolyamot, így nincs gond.   
   }

A fenti példában az első sor lekér egy kezelőt a képek mappához.  Mielőtt bármit is tennénk vele, ellenőrizni kell, hogy a mappa létezik-e. Hasonlóképpen, ha lekérjük a newLogo fájlt, akkor a kezelő nem valós fájlt ábrázol, amíg létre nem hozza a fájlt az utolsó sorban. Ebben a példában létrehozunk egy fájlt a logo.png tartalmának feltöltésével.

A következő részlet az előzőhöz hasonló azzal a kivétellel, hogy átmásolja a newLogo fájlt az eredeti logóból ahelyett, hogy egy újat hozna létre a tartalomból.

   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");
      ...
   }

Végül létrehozunk egy másik képek mappát, és áthelyezzük az újonnan létrehozott fájlt ide. Az áthelyezés mellékhatásaként átnevezzük a fájlt.

   ...
   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");

Számos erőforrás API metódus tartalmaz egy force logikai jelzőt, amely megadja, hogy az erőforrások, amelyek kívül esnek a helyi fájlrendszer megfelelő fájljának szinkronizációján, frissítésre kerülnek-e. További információkért tekintse meg az IResource részt. Az IResource.isSynchronized segítségével meghatározhatja, hogy egy adott erőforrás szinkronban van-e a fájlrendszerrel.

Erőforrások leképezése lemezhelyekre

A példa erőforrásfában feltételeztük, hogy az összes projekttartalom-könyvtár a workspace könyvtárban található a platform gyökérkönyvtára alatt (C:\MySDK\workspace). Ez a projektek alapértelmezett konfigurációja. A projekt tartalomkönyvtára újból leképezhető a fájlrendszer egy tetszőleges könyvtárára, amelye esetlegesen egy másik lemezmeghajtón található.

Mivel a projekt helyének leképezése független más projektektől, a felhasználó tárolhatja a projekt tartalmát egy helyen, amely a projekt és a projektcsapat számára megfelelő. A projekt tartalomkönyvtárát úgy kell tekinteni, hogy "nyíltan is elérhető." Ez azt jelenti, hogy a felhasználó létrehozhat, módosíthat és törölhet erőforrásokat a munkaterület és bedolgozók segítségével, vagy közvetlenül a fájlrendszer alapú eszközök és szerkesztők segítségével.

Az erőforrás elérési út nevek nem teljes fájlrendszer elérési utak. Az erőforrás elérési utak alapja mindig a projekt helye (ez általában a workspace könyvtár). Az erőforrás teljes fájlrendszer elérési útjának lekéréséhez az IResource.getLocation segítségével le kell kérdezni a helyét.  Az IProjectDescription.setLocation segítségével nem változtathatja meg a helyet, mivel ez a metódus csak egy egyszerű beállító az adatstruktúrához.  

Viszont ha a megfelelő erőforrás-objektumot meg kívánja kapni egy adott fájlrendszerhez, akkor használhatja az IWorkspaceRoot.getFileForLocation vagy IWorkspaceRoot.getContainerForLocation elemet.

Erőforrás API és a fájlrendszer

Ha az erőforrások API segítségével módosítja a munkaterület erőforrásfáját, akkor az erőforrás-objektumok frissítésén túl a fájlrendszer fájljai is módosulnak. Mi a helyzet azokkal az erőforrásfájl-módosításokkal, amelyek a alkalmazás programozási felületén kívül történnek?

Az erőforrások külső módosításait a munkaterület és az erőforrás-objektumok nem tükrözik, amíg az erőforrások bedolgozó fel nem fedezi. Az erőforrások bedolgozó egy megfelelő mechanizmust használ minden adott natív operációs rendszerhez a fájlrendszer külső módosításainak felfedezéséhez. Ezen felül az ügyfelek az erőforrás API segítségével egyszerűen és felhasználói beavatkozás nélkül összeegyeztethetik a munkaterületet és az erőforrás-objektumokat a helyi fájlrendszerrel. A felhasználó explicit módon is kikényszeríthet frissítést a munkaterület erőforrás-navigátor nézetében.

Az erőforrás alkalmazás programozási felületek számos metódusa tartalmaz force paramétert, amely megadja, hogy a fájlrendszer szinkronizációján kívül eső erőforrásokat hogyan kell kezelni. A metódusok API hivatkozása a paraméterrel kapcsolatos speciális információkat biztosít. Az alkalmazás programozási felületek további metódusai segítségével programozott módon szabályozható a fájlrendszer frissítése, mint például az IResource.refreshLocal(int depth, IProgressMonitor monitor). Az IResource a megfelelő használattal és költséggel kapcsolatos információkat tartalmaz.

A bedolgozók, amelyek saját mechanizmust biztosítanak a munkaterület rendszeres időközönkénti frissítéséhez a külső fájlrendszer állapota alapján, az org.eclipse.core.resources.refreshProviders kiterjesztési pont segítségével tehetik meg. További információkért tekintse meg a Frissítésszolgáltatók részt.