Inkompatibilitás az Eclipse 3.0 és 3.1 változatok között

Az Eclipse inkompatibilis módon változott a 3.0 és 3.1 verzió között, és ez hatással van a bedolgozókra. Az alábbi bejegyzések leírják a módosított területeket, és útmutatást biztosítanak a 3.0 verziószámú bedolgozók átállításához a 3.1 verzióra. Ezeket csak akkor kell megtekintenie, ha problémája van a 3.0 verziószámú bedolgozó futtatásával a 3.1 verzión.

  1. Bedolgozó beállítások
  2. IPath megszorítások változásai
  3. Kiterjesztés-nyilvántartás
  4. Kódformázó beállítások
  5. AntCorePreferences API szerződésváltozásai
  6. A JFace eszközben a Policy osztály API szerződésváltozásai
  7. Nullértékű alapértelmezett perspektíva engedélyezésének API szerződésváltozásai
  8. Az IViewLayout API szerződésváltozásai
  9. Az IVMInstall API szerződésváltozásai
  10. A SelectionEnabler.SelectionClass csak a csomagban látható
  11. A ContributionItem.getParent() metódus nullértéket is visszaadhat
  12. isPropertySet(boolean) változásai az IPropertySource és IPropertySource2 felületekben
  13. A handlerSubmission elem törlésre került az org.eclipse.ui.commands kiterjesztési pontból
  14. Statikus nem végleges GLOBAL_IGNORES_CHANGED API mező a TeamUI-ben végleges lett
  15. ClassCastException a FillLayout használata esetén
  16. Felületi elem létrehozása megszünetett szülővel

1. Bedolgozó beállítások

Befolyásolt elemek: A bedolgozók, amelyek a Plugin#initializeDefaultPreferences felülírásával inicializálják bedolgozó-beállításaikat vagy beállításváltozás-figyelőket használnak.

Leírás: Eclipse 3.1 rendszeren az org.eclipse.jface.preference.IPreferenceStore objektum az org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore elemből kerül lekérésre, amely az org.eclipse.core.runtime bedolgozó által biztosított új 3.0 Eclipse beállítási keretrendszeren működéshez került átállításra.

Szükséges teendő: Ennek eredményeképp a beállítás alkalmazás programozási felületeket használó ügyfeleknek két lehetséges problémát kell leellenőrizniük:

  1. A beállításváltozási eseményekben tárolt objektumok típusa nincs garantálva, az eseményekben a régi és az új érték is lehet nullértékű, karaktersorozat vagy egy típusos objektum. Emiatt a beállításváltozási figyelőknek kezelniük kell tudni mindhárom lehetséges helyzetet.
  2. Ha a bedolgozó az org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences elemet használja, akkor az org.eclipse.core.runtime.compatibility bedolgozót tartalmaznia kell a szükséges bedolgozók listájának, mert ez a függőség eltávolításra került az org.eclipse.ui.workbench bedolgozóból.

További részletek a beállítástároló dokumentációjában találhatók.

2. IPath megszorítások változásai

Befolyásolt elemek: Bedolgozók, amelyek IPath objektumokat hoznak létre, kezelnek vagy tárolnak.

Leírás: Az Eclipse 3.0 változatában az IPath számos olyan megszorítással rendelkezett az útvonalak szegmenseivel kapcsolatban, amelyek nagyobb korlátozást jelentettek, mint az alapul szolgáló operációs rendszer. Ezek az alábbiak:

Ezen megszorítások eltávolításra kerültek az Eclipse 3.1 változatában, amikor a platform adathelye (munkaterület) olyan fájlrendszeren található, amely nem rendelkezik ezen korlátozásokkal.

Szükséges teendő: Az útvonalak kibővített tartományának megfelelő kezelésének lehetővé tétele érdekében a Path és IPath elemek bedolgozókban használatát át kell tekinteni az alább leírtak szerint. A legtöbb nem módosított bedolgozó pontosan úgy fog viselkedni, ahogy a 3.0 változatban a megfelelő útvonalak esetén. Ha azonban az előírt módosítások nem kerülnek végrehajtásra, akkor valószínűleg meg fognak hiúsulni azon útvonalak esetén, amelyek a 3.1 változatban megfelelőek, de a 3.0 változatban illegálisak.

Azon bedolgozók, amelyek az elérési utakat karaktersorozatként tárolják olyan formátumban, amelynek különböző platformokon kell olvashatónak lennie, át kell térniük az új Path.fromPortableString gyári metódusra. Ez a metódus egy IPath példányt állít elő egy platformfüggetlen formátumból. Az útvonal ilyen karaktersorozatos ábrázolása az IPath.toPortableString metódus használatával hozható létre. Az érintett metaadatfájlok példái olyan fájlokat tartalmaznak, amelyek az Eclipse munkaterület-projektjeiben (.project, .classpath, stb.) és a beállítástárolóban (org.eclipse.core.runtime.preferences.IPreferencesService) lévő összes elérési útban kerülnek tárolásra.

Megjegyzés: A fromPortableString helyesen fog beolvasni minden olyan útvonal-karaktersorozatot, amely az Eclipse 3.0 IPath.toString metódusával, nem pedig az Eclipse 3.1 toString metúdusával került létrehozásra. Így a legtöbb esetben nincs szükség a meglévő metaadatfájlok fortmátumának módosítására, azonban az útvonalakat ezentúl a toPortableString metódussal kell írni és a fromPortableString metódussal kell olvasni.

Azon bedolgozókat át kell állítani, amelyek olyan beégetett karaktersorozat-literálokból hoztak létre útvonalakat, amelyek a ':' és '\' karaktereknek speciális jelentést tulajdonítottak minden platformon. A legegyszerűbb megoldás a karaktersorozatos útvonalliterálok azon részhalmazra korlátozása, amely minden platformon támogatott (kerülje el a kettőspont és fordított törtvonal karakterek használatát). Az útvonalliterálok támogatják az érvényes Unix útvonalak teljes halmazát a Path.toPortableString által előállított hordozható karaktersorozatos útvonalformátum használatával. Ez a formátum az első egyedülálló kettőspontot (':') eszközelválasztóként, az osztásjelet ('/') szegmenselválasztóként és a dupla kettőspontot ("::") literál kettőspont karakterként értelmezi. Például a new Path("c:/temp") kód Unix platformokon egy relatív útvonalat fog létrehozni két szegmenssel. Ehhez hasonlóan a new Path("a\\b") kód egy útvonalat fog létrehozni egyetlen szegmenssel Unix platformokon és egy útvonalat két szegmenssel Windows platformokon.

Azon bedolgozók kódját frissíteni kell, amelyek az IPath.append(String) metódust használják az útvonalak összeállításához, amely a ':' és '\' karaktereknek speciális jelentést tulajdonít minden platformon. Az Eclipse 3.1 változatában ez a metódus az operációs rendszerre jellemző eszköz- és szegmenshatárolókat használja a megadott útvonal-karaktersorozat értelmezéséhez. Például az append("a\\b") Unix platformon meghívásával egyetlen szegmens, míg Windows esetén két szegmens fog hozzáfűzésre kerülni.

A platform által olvasott és értelmezett adatfájlok a továbbiakban a ':' és '\' karaktert egyik platformon sem kezelik speciális karakterként. A több platformon olvasható adatfájlokban tárolt elérési utakat hordozható formában kell megadni. Az ikonfájlok elérési útjaiban és a plugin.xml egyéb elérési útjaiban például csak '/' használható elérési út szegmenselválasztóként.

3. Kiterjesztés-nyilvántartás

Befolyásolt elemek: Azon bedolgozók, amelyek az Eclipse platform bedolgozójából vagy kiterjesztés-nyilvántartásából származó IExtensionPoint, IExtension és IConfigurationElement objektumokat kezelik vagy őrzik.

Leírás: A 3.0 változat előtt a kiterjesztés-nyilvántartásból (ami a korábbi bedolgozó-nyilvántartáshoz tartozott) megszerzett objektumok örökre jók voltak. Olyan módosítások történtek az Eclipse 3.0 változatában, amelyek lehetővé teszik a bedolgozók dinamikus hozzáadását vagy eltávolítását az Eclipse újraindítása nélkül. Amikor egy bedolgozó újraindítás nélkül kerül eltávolításra, akkor a kiterjesztés-nyilvántartásban lévő bejegyzései szükségszerűen érvénytelenné válnak. Ez azt jelenti, hogy azon másik bedolgozó érvénytelen objektumot tartalmaz, amely a törölt bedolgozó kiterjesztés-nyilvántartási bejegyzéséből korábban megszerzett objektumot tárolja. Az IRegistryChangeEvent figyelése lehet az egyetlen tipp, amit az ügyfél kaphat. A probléma az Eclipse 3.0 változata óta létezett, de gyakorlatban ritkán fordult elő, mert nagyon szokatlan egy bedolgozó eltávolítása az Eclipse újraindítása nélkül.

Ez a probléma a 3.1 változatban került megoldásra az alábbiak szerint:

Szükséges teendő: Ha a bedolgozónak dinamikusan tudatosnak kell lennie (pl.: a bedolgozó menet közbeni hozzáadásának vagy eltávolításának kezelése), akkor a valamely másik bedolgozóból származó IExtensionPoint, IExtension és IConfigurationElement objektumot kezelő kódot módosítani kell az IRegistryChangeEvent esemény elfogásához pontosan úgy, mintha az egy ellenőrzött kivétel lenne. Az isValid() előellenőrzés helyett a kivétel elfogása az egyetlen biztos módszer egy párhuzamos szál által eltávolított bedolgozó esetének kezelésére.

4. Kódformázó beállítások

Befolyásolt elemek: Azon bedolgozók, amelyek programból érik el a Java kódformázó beállításokat.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants#FORMATTER_TAB_CHAR kódformázó beállítás értékei csak TAB vagy SPACE értékek lehettek. A specifikáció nem tett konkrét említést arról, hogy az értéktípus egy felsorolás, amely a későbbi kiadásokban kibővülhet. Az Eclipse 3.1 változatában egy harmadik lehetséges érték (MIXED) került hozzáadásra a 73104 számú hiba kijavítása érdekében. A specifikáció úgy változott, hogy ezen új értéket tartalmazza és lehetővé teszi további értékek hozzáadását a későbbiekben.

Szükséges teendő: Az új harmadik érték figyelembe vétele és annak biztosítása érdekében, hogy a kód olyan módon legyen megírva, hogy elegánsan hiúsuljon meg, ha valaha is váratlan beállítási értékkel találkozik, azon ügyfeleknek le kell ellenőrizniük a kódot, akik programból olvassák vagy állítják be ezt a kódformázó beállítást.

5. AntCorePreferences API szerződésváltozásai

Befolyásolt elemek: Azon bedolgozók, amelyek az org.eclipse.ant.core.AntCorePreferences osztályt továbbszármaztatják vagy példányosítják.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.ant.core.AntCorePreferences osztály nem volt megjelölve arra, hogy az ügyfelek nem példányosíthatják vagy nem származtathatják tovább. Ez egy tévedés volt, amely az Eclipse 3.1 változatában került kijavításra azzal, hogy az osztály meg lett jelölve úgy, hogy nem származtatható tovább és nem példányosítható.

Szükséges teendő: Az org.eclipse.ant.core.AntCorePreferences osztály példányát programból létrehozó ügyfeleknek át kell állítaniuk a kódot a beállítások org.eclipse.ant.core.AntCorePlugin.getPreferences() használatával lekéréséhez.Az összes alosztályt át kell dolgozni úgy, hogy ne legyenek az org.eclipse.ant.core.AntCorePreferences alosztályai.

6. A JFace eszközben a Policy osztály API szerződésváltozásai

Befolyásolt elemek: Azon RCP alkalmazások, amelyek felülbírálják a munkaterület által beállított JFace naplót.

Leírás: Az Eclipse 3.0 változatában a munkaterület állította be a munkaterület naplóját a JFace hibák naplózására a munkaterület-bedolgozó naplójának org.eclipse.jface.util.Policy.setLog(ILog) elemhez közvetlen átadásával. A 3.1 változatban az ILog felülettel kapcsolatos függőség eltávolításra került a JFace eszközből annak lehetővé tétele érdekében, hogy az önálló alkalmazások az SWT és JFace eszközöket az Eclipse futási környezetén kívül használhassák. Egy új felület (ILogger) került bevezetésre a JFace szükségleteinek kielégítésére. A munkaterület módosult egy ILogger felület biztosításával, amely a munkaterület ILog felületét helyettesíti. További részletek a 88608 számú hiba leírásában találhatók.

Szükséges teendő: A legtöbb RCP alkalmazásnak nem kell felülbírálnia a munkaterület által beállított naplót, ha azonban korábban a Policy.setLog(ILog) hívást használták, akkor ehelyett az ILogger felületet kell átadniuk.

7. Nullértékű alapértelmezett perspektíva engedélyezésének API szerződésváltozásai

Befolyásolt elemek: Azon RCP alkalmazások, amelyek nem nullértékű alapértelmezett perspektívát várnak.

Leírás: Annak lehetővé tétele érdekében, hogy az RCP alkalmazások egy olyan üres ablakkal induljanak, amelyben nincs nyitott perspektíva (71150 bővítése), a WorkbenchAdvisor.getInitialWindowPerspectiveId() és IPerspectiveRegistry.getDefaultPerspective() metódusok módosításra kerültek úgy, hogy nullérték visszaadását is engedélyezzék. Az integrált fejlesztői környezetben minden esetben van egy alapértelmezett perspektíva, így az IPerspectiveRegistry.getDefaultPerspective() metódus nem fog nullértéket visszaadni. Ehhez hasonlóan, ha egy meglévő RCP alkalmazás korábban nem nullértékkel tért vissza a WorkbenchAdvisor.getInitialWindowPerspectiveId() metódusból, akkor az IPerspectiveRegistry.getDefaultPerspective() metódus szintén nem nullértéket fog visszaadni.

Szükséges teendő: Az ügyfeleknek nem kell semmit tenniük.

8. IViewLayout API szerződésváltozásai

Befolyásolt elemek: Az org.eclipse.ui.IViewLayout elemet megvalósító bedolgozók.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.ui.IViewLayout osztály nem volt megjelölve arra, hogy az ügyfelek nem valósíthatják meg. Ez egy tévedés volt, amely az Eclipse 3.1 változatában került kijavításra azzal, hogy az osztály meg lett jelölve úgy, hogy az ügyfelek nem valósíthatják meg.

Szükséges teendő: Az összes megvalósító osztályt át kell dolgozni úgy, hogy ne valósítsák meg az org.eclipse.ui.IViewLayout felületet.

9. IVMInstall API szerződésváltozásai

Befolyásolt elemek: Az org.eclipse.jdt.launching.IVMInstall elemet megvalósító bedolgozók.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.jdt.launching osztály nem volt megjelölve arra, hogy az ügyfelek nem valósíthatják meg közvetlenül. Ez egy tévedés volt, amely az Eclipse 3.1 változatában került kijavításra azzal, hogy az osztály meg lett jelölve úgy, hogy az ügyfelek nem valósíthatják meg közvetlenül. Bináris kompatibilitás fenntartásához az ügyfelek a felületet közvetlenül is megvalósíthatják, de ajánlatos inkább az org.eclipse.jdt.launching.AbstractVMInstall alosztályát létrehozni. Az IVMInstall elemet megvalósító ügyfeleknek az új nem kötelező org.eclipse.jdt.launching.IVMInstall2 felületet is meg kell valósítaniuk, amelyet jelenleg az AbstractVMInstall valósít meg. A klienseknek ajánlatos megvalósítaniuk az új IVMInstall2 felületet, a 73493-as hibában megemlített probléma elkerülése érdekében. Az ajánlott átállítás az AbstractVMInstall alosztályának létrehozása.

Szükséges teendő: Az összes olyan megvalósító osztályt át kell dolgozni, amely még nem származtatja tovább az org.eclipse.jdt.launching.AbstractVMInstall osztályt, hogy az org.eclipse.jdt.launching.AbstractVMInstall osztályt származtassa tovább.

10. A SelectionEnabler.SelectionClass csak a csomagban látható

Befolyásolt elemek: Az org.eclipse.ui.SelectionEnabler.SelectionClass elemet használó bedolgozók.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.ui.SelectionEnabler.SelectionClass beágyazott megvalósítási osztály nyilvános volt és nem volt a használatára vonatkozó megszorítás. Ez egy tévedés volt, amely az Eclipse 3.1 változatában került kijavításra azzal, hogy az osztály csak a csomagban látható.

Szükséges teendő: Az összes olyan osztályt át kell dolgozni, amely példányosítja vagy kiterjeszti az org.eclipse.ui.SelectionEnabler.SelectionClass osztályt, hogy ne hivatkozzon erre az osztályra.

11. A ContributionItem.getParent() metódus nullértéket is visszaadhat

Befolyásolt elemek: Azon bedolgozók, amelyek a getParent() metódust hívják meg az org.eclipse.jface.action.ContributionItem valamely alosztályában.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.jface.action.ContributionItem.getParent() metódus úgy volt meghatározva, hogy nem adhat vissza nullértéket. Ez egy tévedés volt, amely az Eclipse 3.1 változatában került kijavításra a metódus számára egy Javadoc megadásával, amely tisztázza, hogy az mikor adhat vissza nullértéket. További részletek a 92777 számú hiba leírásában találhatók.

Szükséges teendő: Az összes olyan kódnak tudnia kell kezelnie a nullértékű eredményt, amely meghívja a ContributionItem.getParent() metódust.

12. isPropertySet(boolean) változásai az IPropertySource és IPropertySource2 felületekben

Befolyásolt elemek: Az org.eclipse.ui.views.properties.IPropertySource vagy IPropertySource2. elemet megvalósító bedolgozók.

Leírás: Az Eclipse 3.0 változatában az org.eclipse.ui.views.properties.IPropertySource.isPropertySet(boolean) metódus meghatározása helytelenül került módosításra annak megadásához, hogy true értéket kell visszaadnia, ha a megadott tulajdonság nem rendelkezik jelentéssel bíró alapértelmezett értékkel. A korábbi változatokban false érték visszaadására volt meghatározva az ilyen esetben. Ez egy gondatlan API módosítás volt, bár a megvalósítás ugyanúgy működött, mint azelőtt, ha a tulajdonságforrás megvalósította az IPropertySource felületet és az IPropertySource2 felületet nem. Ez kijavításra került a 3.1 változatban azzal, hogy az IPropertySource.isPropertySet(boolean) metódus visszaállításra került a korábbi specifikációra (ahol false értéket kell visszaadnia az említett esetben és az IPropertySource2.isPropertySet(boolean) felülbírálta ezt azzal, hogy true érték visszaadását határozta meg erre az esetre). További részletek a 21756 számú hiba leírásában találhatók.

Szükséges teendő: Annak biztosítása érdekében, hogy a megfelelő érték kerüljön visszaadásra az isPropertySource(boolean) hívásakor, az összes olyan osztályt le kell ellenőrizni, amely megvalósítja az IPropertySource vagy IPropertySource2 felületet, ahol némely tulajdonság nem rendelkezik jelentéssel bíró alapértelmezett értékkel. Az ügyfeleknek le kell ellenőrizniük, hogy a Tulajdonságok nézetben az Alapértelmezett érték visszaállítása gomb a várt módon működik-e a tulajdonságforrásokhoz.

13. A handlerSubmission elem törlésre került az org.eclipse.ui.commands kiterjesztési pontból

Érintett elem: Az org.eclipse.ui.commands Eclipse 3.0 kiterjesztési pontban bevezetett kísérleti handlerSubmission elemet használó bedolgozók.

Leírás: Az Eclipse 3.0 változat org.eclipse.ui.commands kiterjesztési pontjában egy kísérleti elem került bevezetésre. Az elem célja, hogy a kezelőket be lehessen jegyezni XML-en keresztül. Azóta egy sokkal jobb mechanizmus, az org.eclipse.ui.handlers kiterjesztési pont került bevezetésre. Mivel az elem kísérleti elem volt, eltávolításra került.

Szükséges teendő: A handlerSubmission elemet megadó bedolgozóknak át kell térniük az org.eclipse.ui.commands kiterjesztési pontra.

14. A statkus nem végleges GLOBAL_IGNORES_CHANGED API mező a TeamUI-ben végleges lett

Befolyásolt elemek: A TeamUI GLOBAL_IGNORES_CHANGED mezejét beállító bedolgozók.

Leírás: Az Eclipse 3.0 verzióban a GLOBAL_IGNORES_CHANGED mező hozzáadásra került a TeamUI osztályhoz. Ez a mező egy konstans, amelyet a tulajdonságmódosítási esemény használ annak jelzéséhez, hogy a Csapat bedolgozó által fenntartott globális figyelmen kívül hagyások lista megváltozott. Ez a mező a 3.0 vezrióban nem volt véglegesként jelölve, de annak kellett volna lennie. A 3.1 verzióban lett véglegesítve.

Szükséges teendő: A fenti mezőt beállító bedolgozók a továbbiakban nem tudják ezt megtenni.

15. ClassCastException a FillLayout használata esetén

Befolyásolt elemek: A bedolgozók, amelyek a FillLayout elemet helytelenül használják.

Leírás: Az Eclipse 3.0 verzióban a FillLayout elemhez nem kerültek hozzárendelésre elrendezési adatok, és ha egy alkalmazás a FillLayout által kezel leszármazotthoz elrendezési adatot rendelt, akkor ez figyelmen kívül maradt. Az átméretezési teljesítmény javítása érdekében az Eclipse 3.1 verzió már támogatja, hogy a FillLayout ideiglenesen eltárolja a méretinformációkat. Az ideiglenes tárolt adatok a FillLayout átal kezelt leszármazottokhoz rendelt FillData objektum tárolja. Ha egy alkalmazás helytelenül rendelt elrendezésadatokat egy leszármazotthoz, akkor a computeSize szülőn meghívásakor ClassCastException kivétel történik.

Szükséges teendő: Keresse meg a FillLayoutban azokat a leszármazottakat, amelyekhez elrendezési adatok vannak rendelve és szüntesse meg az adatok hozzárendelését.

16. IllegalArgumentException kivétel történt egy felületi elem megszüntetett szülővel létrehozásakor

Befolyásolt elemek: Bedolgozók, amelyek a felületi elemek létrehozása során kivételt észlelnek.

Leírás: Ha az Eclipse 3.0 verzióban egy felületi elem megszüntetett szülővel került létrehozásra, akkor nem történik kivétel és a felületi elem egy későbbi ponton meghiúsul, vagy a "Widget Is Disposed" szövegű SWTException kivétel történik. Ha az Eclipse 3.1 változatban egy felületi elem megszüntetett szülővel kerül létrehozásra, akkor a konstruktor "Argument not valid" szövegű IllegalArgumentException kivételt dob.

Szükséges teendő:A kódnak, amely a felületi elem létrehozásakor az SWTExceptiont kezeli, az IllegalArgumentExceptiont is kezelnie kell.