MASARYKOVA UNIVERZITA }w¡¢£¤¥¦§¨  FAKULTA INFORMATIKY !"#$%&'()+,-./012345

Vy´vojove´prostrˇedı´ pro JavaScript

DIPLOMOVA´ PRA´ CE

Jirˇı´Golembiovsky´

Brno, jaro 2009 Prohla´sˇenı´

Prohlasˇuji, zˇe tato diplomova´pra´ce je my´m pu˚vodnı´m autorsky´m dı´lem, ktere´jsem vypracoval samostatneˇ. Vsˇechny zdroje, prameny a literaturu, ktere´jsem prˇi vypracova´nı´pouzˇı´val nebo z nich cˇerpal, v pra´ci rˇa´dneˇcituji s uvedenı´m u´plne´ho odkazu na prˇı´slusˇny´zdroj.

Vedoucı´pra´ce: RNDr. Radek Osˇlejsˇek, Ph.D.

ii Podeˇkova´nı´

Deˇkuji RNDr. Radkovi Osˇlejsˇekovi, Ph.D. a Ing. Pavlovi Kloba´sovi (rˇediteli vy´voje z firmy oXy Online s.r.o.) za odborne´vedenı´diplomove´pra´ce a po- skytova´nı´rad prˇi jejı´tvorbeˇ. Deˇkuji take´vsˇem ostatnı´m, kterˇı´mi pomohli a poradili s veˇcmi, bez ktery´ch by tato diplomova´pra´ce nebyla dokoncˇena.

iii Shrnutı´

Tato diplomova´pra´ce vznikla v ra´mci aktivit SPP (Sdruzˇenı´pru˚myslovy´ch partneru˚) ve spolupra´ci se spolecˇnostı´oXy Online s.r.o. Pra´ce se zaby´va´ integracı´Mozilla Rhino do vy´vojove´ho prostrˇedı´Eclipse pro zajisˇteˇnı´ladeˇnı´ skriptu˚napsany´ch v jazyce JavaScript.

iv Klı´cˇova´slova

Java, JavaScript, Eclipse, Mozilla Rhino, ECMA-262

v Obsah

1 U´ vod ...... 2 2 JavaScript ...... 3 2.1 Implementace v prohlı´zˇecˇı´ch ...... 3 2.2 Implementace mimo prohlı´zˇecˇe ...... 5 3 Vy´vojove´prostrˇedı´Eclipse ...... 7 3.1 Tvorba modulu˚ ...... 8 3.2 Moduly podporujı´cı´JavaScript ...... 12 3.3 Na´vrhove´vzory ...... 14 3.3.1 Abstraktnı´tova´rna ...... 14 3.3.2 Singleton ...... 15 4 Modul RhinoJS ...... 16 4.1 Editor ...... 17 4.2 Konfigurace ...... 21 4.3 Spousˇteˇnı´a ladeˇnı´skriptu˚ ...... 23 4.3.1 Spousˇteˇnı´ ...... 23 4.3.2 Ladeˇnı´ ...... 25 Vzda´lene´ladeˇnı´ ...... 33 5 Za´veˇr ...... 35

1 Kapitola 1 U´ vod

Tato diplomova´pra´ce je vypsa´na v ra´mci aktivit Sdruzˇenı´pru˚myslovy´ch partneru˚ve spolupra´ci se spolecˇnostı´oXy Online s.r.o. Diplomova´pra´ce se zaby´va´podporou jazyka JavaScript v prostrˇedı´ Eclipse se zameˇrˇenı´m na ladeˇnı´. V textu uvedu popis jazyka JavaScript a jeho ru˚zne´implementace, mezi ktere´patrˇı´i pouzˇite´ Mozilla Rhino. Da´le take´popı´sˇi za´klady tvorby modulu˚ pro prostrˇedı´ Eclipse se zameˇrˇenı´m na spousˇteˇnı´a ladeˇnı´ko´du. Uvedu take´ jizˇexistujı´cı´moduly s podporou JavaScriptu. V poslednı´cˇa´sti pra´ce popı´sˇi vytvorˇeny´modul, jeho graficke´rozhranı´ a mozˇnost jak v modulu prova´deˇt loka´lnı´spousˇteˇnı´a ladeˇnı´. Uvedu take´, jak lze modul rozsˇı´rˇit pro vzda´lene´ladeˇnı´.

2 Kapitola 2 JavaScript

JavaScript[1] je skriptovacı´ jazyk zalozˇeny´ na standardu ECMAScript[2] (aktua´lneˇpouzˇı´vana´verze pro JavaScript je trˇetı´edice ECMA-262[3]). Nej- cˇasteˇji se pouzˇı´va´ pro vy´voj webovy´ch technologiı´, ktere´ beˇzˇı´ na straneˇ klienta. Jazyk byl vytvorˇen tak, aby vypadal jako programovacı´jazyk Java, ale byl jednodusˇsˇı´a snazsˇı´pro lidi, kterˇı´nejsou programa´tory. Kromeˇtoho, zˇe je jazyk ovlivneˇn Javou, je take´ovlivneˇn dalsˇı´mi programovacı´mi jazyky jako Self, C, Scheme, Perl, Python. JavaScript byl vyvinut Bernardem Eichem ze spolecˇnosti Netscape pod jme´nem Mocha, pozdeˇji prˇejmenova´n na LiveScript a na´sledneˇna JavaScript. Netscape jej uvedl v roce 1995 ve sve´m prohlı´zˇecˇi Netscape Navigator. Po jeho u´speˇchu vytvorˇil Microsoft v roce 1996 kompatibilnı´jazyk JScript, ktery´vsˇak nesplnˇuje standard ECMA ve vı´ce nezˇdeseti prˇı´padech. Jazyk JavaScript ma´neˇkolik ru˚zny´ch implementacı´jak pro webove´pro- hlı´zˇecˇe, tak i pro pouzˇitı´mimo neˇ. Protozˇe specifikace ECMA zava´dı´v ja- zyku pouze pa´r za´kladnı´ch objektu˚(Global, Object, Function, Array, String, Boolean, Number, Math, Date, RegExp a Error) definujı´ru˚zne´implemen- tace dalsˇı´ru˚zne´objekty (naprˇı´klad Document a Window v implementacı´ch pro prohlı´zˇecˇe), ktere´se vsˇak v jednotlivy´ch implementacı´ch mohou chovat rozdı´lneˇ. Na´sledujı´cı´souhrn ru˚zny´ch implementacı´a jejich popis vycha´zı´ ze seria´lu cˇla´nku˚”Do hlubin implementacı´JavaScriptu”[4]. Informace jsou rozsˇı´rˇeny o data z dalsˇı´ch zdroju˚jako ”List of ECMAScript engines”[5] nebo ”Server-side JavaScript”[6].

2.1 Implementace v prohlı´zˇecˇı´ch

Teˇch, ktere´se pouzˇı´vajı´v prohlı´zˇecˇı´ch je jen neˇkolik:

• JScript je implementace pro prohlı´zˇecˇ Internet Explorer. Implementace nenı´ zabudovana´ prˇı´mo do prohlı´zˇecˇe, ale je dostupna´ jako samo- statna´DLL knihovna, cˇehozˇse vyuzˇı´va´naprˇı´klad pro skriptova´nı´ve Windows nebo na serverech v ra´mci ASP technologie. O implementaci

3 2. JAVASCRIPT

toho nenı´moc zna´mo, protozˇe ko´d nenı´verˇejneˇdostupny´. Nicme´neˇ z vneˇjsˇı´ch projevu˚jako je ztra´cenı´pameˇti prˇi manipulaci s DOM ob- jekty nebo pomale´zpracova´nı´v implementaci pro IE7, ktera´je mno- hokra´t pomalejsˇı´nezˇv ostatnı´ch prohlı´zˇecˇı´ch (implementace pro IE8 se jizˇrychlostneˇvyrovna´ostatnı´m).

• SpiderMonkey je implementacı´pouzˇı´vanou ve vykreslovacı´m ja´drˇe Gecko, na ktere´m je postaven prohlı´zˇecˇ Firefox. Je jediny´m prˇı´my´m pokracˇovatelem implementace, ktera´byla v prohlı´zˇecˇi Netscape Navi- gator a byla v roce 1998 uvolneˇna pro open source. Dı´ky tomu, zˇe je SpiderMonkey prˇı´my´m pokracˇovatelem, obsahuje JavaScript ve verzi 1.7 a prˇida´va´naprˇı´klad podporu E4X (ECMAScript for XML), gene- ra´tory, itera´tory a let konstrukci nemeˇnı´cı´promeˇnne´. Dı´ky dobre´mu a dobrˇe zdokumentovane´mu API, lze SpiderMonkey pouzˇı´t i samo- statneˇ v jiny´ch programech, cˇehozˇ vyuzˇı´va´ naprˇı´klad firma Adobe v programech Adobe Acrobat a Adobe Reader. Na´stupcem SpiderMon- key se stane TraceMonkey, ktery´by meˇl by´t ve Firefox 3.1 a podporuje just-in-time kompilaci pro urychlenı´zpracova´nı´(cˇa´stecˇneˇzalozˇenou na ).

• SquirrelFish Extreme je implementacı´pouzˇı´vanou v prohlı´zˇecˇi Safari postavene´m na ja´drˇe WebKit, jehozˇje SquirrelFish Extreme soucˇa´stı´. SquirrelFish, stejneˇjako SpiderMonkey, prosˇel neˇkolika prˇejmenova´- nı´mi. Prvnı´verze, prˇevzata´z prohlı´zˇecˇe Konqueror se jmenovala KJS. Pote´co ji Apple prˇevzal byla prˇejmenova´na na JavaScriptCore. Im- plementace JavaScriptCore byla velice pomala´, protozˇe byla zalozˇena na procha´zenı´cele´ho AST (Abstract syntax tree). V minule´m roce ji vy´voja´rˇi Apple prˇepsali a nazvali SquirrelFish. O pa´r meˇsı´cu˚pozdeˇji, pote´co prˇidali podporu generova´nı´nativnı´ho ko´du pro platformu x86 a dalsˇı´ optimalizace, ji prˇejmenovali na SquirrelFish Extreme. Tato implementace je v soucˇasnosti jedna z nejaktivneˇji se vyvı´jejı´cı´ch.

• futhark je implementace pouzˇı´vana´v prohlı´zˇecˇi Opera od verze 9.50. V prˇedchozı´ch verzı´ch se jmenoval linear b. Podle testu˚je tato imple- mentace dvakra´t rychlejsˇı´nezˇjeho prˇedchu˚dce a srovnatelna´s ostat- nı´mi implementacemi.

• V8 je implementace pouzˇı´vana´v prohlı´zˇecˇi Google Chrome i prˇesto, zˇe prohlı´zˇecˇpouzˇı´va´ja´dro WebKit. Tato implementace je uzˇod sve´ho na´vrhu zameˇrˇena´na rychle´zpracova´nı´JavaScriptu, cˇehozˇje dosazˇeno kompilacı´do nativnı´ho ko´du (nema´zˇa´dny´byte ko´d ani interpret),

4 2. JAVASCRIPT

optimalizacemi prˇı´stupu k atributu˚m a metoda´m objektu˚a efektivnı´m garbage collectorem.

Ostatnı´prohlı´zˇecˇe pouzˇı´vajı´bud’to implementace jiny´ch prohlı´zˇecˇu˚(naprˇı´- klad prohlı´zˇecˇ Camino pouzˇı´va´implementaci SpiderMonkey, protozˇe je tak jako prohlı´zˇecˇ Firefox, postaven nad Gecko ja´drem) nebo pouzˇı´vajı´imple- mentace, ktere´nebyly vytvorˇeny jen pro pouzˇitı´v prohlı´zˇecˇı´ch (naprˇı´klad prohlı´zˇecˇ Lobo pouzˇı´va´implementace Rhino).

2.2 Implementace mimo prohlı´zˇecˇe

Implementacı´pouzˇı´vany´ch jinde nezˇv prohlı´zˇecˇı´ch je mnoho, od ru˚zny´ch implementacı´pro ru˚zne´programovacı´jazyky azˇpo moduly do ru˚zny´ch webovy´ch serveru˚pro podporu JavaScriptu na straneˇserveru.

• Rhino je kompila´tor JavaScriptu do Javy, ale umı´fungovat take´jako interpretr. Podobneˇjako SpiderMonkey je open source a vyvı´jı´ho Mozilla, ktera´ho prˇevzala od firmy Netscape. Stejneˇtak se snazˇı´dr- zˇet krok s verzemi jazyka a aktua´lneˇimplementuje JavaScript verze 1.7 s rozsˇı´rˇenı´mi. Jelikozˇ projekt Rhino vznikl v roce 1997, je jed- nı´m z prvnı´ch, ktere´do Javy prˇidaly implementaci dynamicke´ho ja- zyka. Tı´m uka´zal, zˇe je implementace dynamicky´ch jazyku˚ v Javeˇ technicky schu˚dna´a uka´zal tak cestu dalsˇı´m implementacı´m jazyku˚ v Javeˇ(naprˇı´klad JRuby) nebo jazyku˚pro Javu prˇı´mo vytvorˇeny´ch (naprˇı´klad Groovy nebo BeanShell). Rhino umozˇnˇuje, kromeˇspousˇ- teˇnı´JavaScriptu v Javeˇ, pouzˇı´vat v JavaScriptu objekty a balı´cˇky z Javy. Dı´ky tomu se hodneˇpouzˇı´va´jako mozˇnost, k dosta´nı´JavaScriptu na webovy´server, je vetsˇinou zprˇı´stupneˇn jako servlet. Takhle jsou udeˇla´ny trˇeba projekty im-jssp, JSSP, Phobos, Apache Sling a Torino, ktere´lze spustit trˇeba na serveru Tomcat nebo jine´m Java servlet kon- tejneru. Existujı´vsˇak take´projekty, ktere´zprˇı´stupnˇujı´ Rhino serve- ru˚m, ktere´nejsou psa´ny v Javeˇ(naprˇı´klad projekty Rhinola a Junction pro server Apache HTTP).

• ActionScript je skriptovacı´jazyk pouzˇı´vany´ve Flashi od firmy Adobe. Podobneˇjako JScript ani ActionScript nenı´plneˇkompatibilnı´se stan- dardem ECMAScriptu, proto ma´jine´jme´no. Poprve´se objevil ve verzi Flash 4 a ve verzi Flash 5 byl upraven, tak aby byl alesponˇcˇa´stecˇneˇ podle standardu ECMAScript. ActionScript prˇisˇel s neˇktery´mi vylep- sˇenı´mi drˇı´ve nezˇbyly prˇida´ny do JavaScriptu. Ve verzi Flash 9 prˇisˇlo

5 2. JAVASCRIPT

Adobe s novy´m virtua´lnı´m strojem pro interpretaci, pod jme´nem Ta- marin, obsahujı´cı´m just-in-time kompila´tor do nativnı´ho ko´du.

• JScript.NET je implementace dialektu JScript pro .NET Framework od firmy Microsoft. Tato implementace nenı´ totozˇna´ s pouzˇı´vanou v prohlı´zˇecˇi Internet Explorer. Je rychlejsˇı´a prˇida´va´neˇktere´veˇci navı´c (naprˇı´klad typove´deklarace). JScript.NET funguje stejneˇjako ostatnı´ jazyky na .NET platformeˇ. Zdrojovy´ko´d je kompilova´n do byte ko´du CIL a ten je pak interpretova´n na spolecˇne´m virtua´lnı´m stroji (nebo prˇı´padneˇjust-in-time prˇekla´da´n do nativnı´ho ko´du).

• QtScript je implementace pouzˇı´vana´pro skriptova´nı´v aplikacı´ch na- psany´ch v Toolkitu. Tato implementace dovoluje propojenı´objektu˚ QtScriptu a nativnı´ch C++ objektu˚. Tato mozˇnost je vsˇak dostupna´azˇ od verze 4.3. Prˇedchozı´verze pouze rozsˇirˇovaly JavaScript (naprˇı´klad o podporu trˇı´d a klasickou deˇdicˇnost).

• Narcissus je implementace JavaScriptu v sobeˇsame´m. Napsal ji tvu˚rce JavaScriptu Bernard Eich. Implementace ke sve´mu beˇhu potrˇebuje SpiderMonkey, protozˇe vyuzˇı´va´neˇktery´ch jeho nestandardnı´ch roz- sˇı´rˇenı´(neˇktera´byla kvu˚li neˇmu prˇida´na).

• JavaScript-SpiderMonkey je modul prˇida´vajı´cı´podporu JavaScriptu do jazyka Perl. Je to v podstateˇjen vrstva nad ce´cˇkovy´m rozhranı´m interpretru SpiderMonkey. Pro jazyky Python a Ruby existujı´podobne´ projekty.

• mod js a mod wxjs jsou moduly pro webovy´server Apache HTTP. mod js je postaven nad SpiderMonkey. mod wxjs obsahuje podporu SQLite a sˇablon.

6 Kapitola 3 Vy´vojove´prostrˇedı´Eclipse

Eclipse[7] je open source komunita jejı´zˇprojekty jsou zameˇrˇeny na vy´voj ote- vrˇene´vy´vojove´platformy skla´dajı´cı´se z rozsˇirˇitelny´ch frameworku˚, utilit a cˇasu˚beˇhu˚pro vy´voj, umist’ova´nı´a spra´vu software beˇhem jeho zˇivotnı´ho cyklu. Jednı´m z projektu˚je Projekt Eclipse[8], ten obsahuje za´kladnı´plat- formu pro vy´voj integrovany´ch vy´vojovy´ch utilit pro web a aplikace. Sama o sobeˇtoho tato platforma moc nenabı´zı´. Platforma Eclipse[9] je zameˇrˇena´na rychly´vy´voj integrovany´ch vlast- nostı´zalozˇeny´ch na modelu modulu˚. Platforma take´poskytuje spolecˇny´ model uzˇivatelske´ho rozhranı´pro pra´ci s utilitami. V ja´drˇe Eclipse je archi- tektura pro dynamicke´nale´za´nı´(vyhleda´nı´prˇı´slusˇny´ch souboru˚modulu), nacˇı´ta´nı´a spousˇteˇnı´modulu˚. Platforma zajisˇt’uje logiku hleda´nı´a spousˇ- teˇnı´spra´vne´ho ko´du, takzˇe se kazˇdy´modul mu˚zˇe zameˇrˇit jen na prova´deˇnı´ male´ho pocˇtu u´kolu˚, ktere´bude deˇlat spra´vneˇ. Platforma je rozdeˇlena´do maly´ch subsyste´mu˚, ktere´jsou tvorˇeny jednı´m nebo vı´ce moduly.Tyto subsyste´my jsou postaveny na male´m runtime ja´drˇe. Hlavnı´mi komponentami platformy jsou:

• Platform runtime - Definuje model takzvany´ch rozsˇirˇovacı´ch bodu˚ (bude vysveˇtleno pozdeˇji) a modulu˚. Dynamicky nacha´zı´ moduly a udrzˇuje informace o modulech a jejich rozsˇirˇujı´cı´ch bodech v re- gistrech platformy. Moduly jsou spousˇteˇny, azˇ kdyzˇ je potrˇeba, na za´kladeˇuzˇivatelovy´ch akcı´. Runtime je implementova´n s pouzˇitı´m OSGi frameworku[10].

• Resource management (workspace) - Definuje API pro vytva´rˇenı´ a spravova´nı´zdroju˚(projekty, slozˇky a soubory), ktere´jsou vytvo- rˇeny utilitami a uchova´ny v souborove´m syste´mu.

• Workbench - Implementuje za´klad pro uzˇivatelovu pra´ci s platfor- mou. Definuje rozsˇirˇujı´cı´ body pro prˇida´va´nı´ komponent uzˇivatel- ske´ho rozhranı´jako pohledy a menu. Doda´va´take´ JFace a SWT pro tvorbu uzˇivatelske´ho rozhranı´.

7 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

• Help - Definuje rozsˇirˇujı´cı´body, aby mohly moduly zprostrˇedkova´vat na´poveˇdu nebo jinou dokumentaci.

• Team - Definuje model programova´nı´pro skupiny, aby mohly spra- vovat a verzovat zdroje.

• Debug - Definuje ladı´cı´model neza´visly´na jazyku a trˇı´dy uzˇivatel- ske´ho rozhranı´pro tvorbu ladı´cı´ch a spousˇteˇcı´ch modulu˚.

• Ostatnı´utility - Moduly zprostrˇedkova´vajı´cı´funkce jako vyhleda´va´nı´ a porovna´va´nı´zdroju˚, prova´deˇnı´kompilace pomocı´konfiguracˇnı´ch souboru˚v XML a dynamicky´ch aktualizacı´platformy ze serveru.

Obra´zek 3.1: Struktura platformy Eclipse

3.1 Tvorba modulu˚

Moduly jsou balı´cˇky prˇispı´vajı´cı´ko´dem, daty nebo dokumentacı´. Zpu˚soby vytva´rˇenı´modulu˚a jejich napojova´nı´na sebe jsou podrobneˇji popsa´ny v do- kumentaci Eclipse v cˇa´sti ”Platform Plug-in Developer Guide”[11] a cˇla´nku ”Notes on the Eclipse Plug-in Architecture”[12].

8 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

Kazˇdy´modul obsahuje alesponˇdva soubory. Soubor plugin.xml a sou- bor META-INF/MANIFEST.MF. Soubor META-INF/MANIFEST.MF obsa- huje nı´zko u´rovnˇove´ informace o modulu zapsane´ pomocı´ OSGi termi- nologie. Nejcˇasteˇji obsahuje informace jako jme´no modulu, jeho id, verzi, tvu˚rce, moduly na ktery´ch za´visı´, prˇı´padneˇaktivacˇnı´politiku modulu. Neˇ- ktere´ z teˇchto informacı´ mohou by´t uvedeny take´ v souboru plugin.xml. Navı´c soubor plugin.xml obsahuje take´body rozsˇı´rˇenı´ostatnı´ch modulu˚, na ktere´se modul napojuje a take´body rozsˇı´rˇenı´, ktere´modul nabı´zı´ostatnı´m modulu˚m. Jednotlive´moduly jsou na sebe napojova´ny pomocı´takzvany´ch bodu˚ rozsˇı´rˇenı´. Tyto body definuje vzˇdy hostujı´cı´modul a lze si je prˇedstavit jako sloty, do ktery´ch se jine´moduly zapojujı´, aby pozmeˇnily nebo rozsˇı´rˇily funkci hostujı´cı´ho modulu. Na´sledujı´cı´ obra´zek uva´dı´ prˇı´klad napojenı´ na bod rozsˇı´rˇenı´. Modul Workbench UI je rozsˇı´rˇen modulem zprostrˇedkova´vajı´cı´m na´poveˇdu prˇes bod rozsˇı´rˇenı´ actionSets a definuje polozˇky menu specificke´pro na´poveˇdu.

Obra´zek 3.2: Princip rozsˇı´rˇenı´modulu

Aby toto bylo mozˇne´musı´hostujı´cı´modul (Workbench UI) obsahovat ve sve´m souboru plugin.xml alesponˇtoto:

9 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

1 7 11 Vy´pis 3.1: Prˇı´klad plugin.xml hostujı´cı´ho plug-inu

Spojenı´m parametru˚ id z rˇa´dku˚2 a 8 vznikne jedinecˇny´identifika´tor bodu rozsˇı´rˇenı´. Tento identifika´tor se na´sledneˇpouzˇije v souboru plugin.xml na- pojovane´ho modulu. Jak je uka´za´no v na´sledujı´cı´m prˇı´kladu na rˇa´dku 8.

1 7 9 13 21 22 29 30 31 32 Vy´pis 3.2: Prˇı´klad plugin.xml napojovane´ho plug-inu

Aby byl prˇı´klad popisujı´cı´napojenı´a vytva´rˇenı´bodu˚rozsˇı´rˇenı´kompletnı´ je trˇeba jesˇteˇuve´st sche´ma popisujı´cı´bod rozsˇı´rˇenı´. Odkaz na toto sche´ma je ve vy´pisu 3.1 na rˇa´dku 10. Toto sche´ma popisuje znacˇky, jejich parame-

10 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

try a zanorˇenı´, ktera´jsou pouzˇita prˇi prˇipojova´nı´na bod rozsˇı´rˇenı´(uvnitrˇ znacˇky extension ve vy´pisu 3.2). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 Vy´pis 3.3: Prˇı´klad definice sche´matu bodu napojenı´ Oba moduly majı´ve skutecˇnosti mnohem rozsa´hlejsˇı´soubory plugin.xml a sche´mata. Zde je uveden pouze vy´rˇez ukazujı´cı´tvorbu bodu˚rozsˇı´rˇenı´ a napojenı´na neˇ. Vy´sledkem uka´zane´ho napojenı´je menu ”Help” s polozˇ- kami ”Help Contents” a ”Help...”. Ve vy´pisu 3.2 je take´u jednotlivy´ch akcı´ (na rˇa´dcı´ch 18 a 26) odkaz na trˇı´dy, ktere´jsou zavola´ny prˇi kliknutı´na da- nou akci v menu a jezˇzajistı´provedenı´potrˇebny´ch uda´lostı´(jako vytvorˇenı´ okna na´poveˇdy, otevrˇenı´spra´vne´za´lozˇky v neˇm, atd.). Lze si vsˇimnout, zˇe oba moduly uva´deˇjı´ve znacˇce plugin neˇjakou trˇı´du. Tato trˇı´da je takzvana´”aktivacˇnı´” a spousˇtı´se prˇi zava´deˇnı´modulu. Trˇı´da musı´by´t potomkem trˇı´dy Plugin nebo neˇktere´ho z jejich potomku˚. Tato

11 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE trˇı´da existuje po celou dobu zˇivota modulu a lze ji vyuzˇı´t trˇeba k ukla´da´nı´ staticky´ch informacı´.

3.2 Moduly podporujı´cı´JavaScript

Pro vy´voj JavaScriptu existuje pro prostrˇedı´Eclipse neˇkolik modulu˚. V na´- sledujı´cı´m vy´cˇtu uvedu moduly, ktere´existovaly zacˇa´tkem roku 2008.

• JSEclipse je modul ktery´vyvinula firma InterAKT, jezˇnynı´spada´pod firmu Adobe. Modul byl azˇdo zacˇa´tku roku 2008 volneˇstazˇitelny´, avsˇak nynı´ je dostupny´ uzˇ jen jako soucˇa´st programu Adobe Flex Builder. Editor v tomto modulu podporuje pro JavaScript na´sledujı´cı´:

– zvy´raznˇova´nı´syntaxe – doplnˇova´nı´ko´du (k tomu vyuzˇı´va´Rhino) – na´hled obsahu – sˇablony ko´du – sbalova´nı´bloku˚ko´du – oznamova´nı´chyb – pomocnı´ky editace ko´du

• Eclipse HTML Editor Plugin neslouzˇı´pouze na editaci JavaScriptu, jak uzˇjme´no napovı´da´. Tento modul slouzˇı´take´k editaci HTML, JSP, XML, CSS a DTD. Poslednı´verze vysˇla v za´rˇı´2008 pro Eclipse 3.0 a vysˇsˇı´. Vlastnosti modulu ty´kajı´cı´se JavaScriptu jsou tyto:

– zvy´raznˇova´nı´syntaxe – doplnˇova´nı´ko´du – na´hled obsahu – validaci

• Web Tools Platform je rozsˇı´rˇenı´platformy Eclipse pro vy´voj webo- vy´ch a Java EE aplikacı´. Soucˇa´stı´ te´to platformy je i projekt AJAX Toolkit Framework, ktery´slouzˇı´k editaci a ladeˇnı´JavaScriptu.

– zvy´raznˇova´nı´syntaxe – oznamova´nı´chyb – zjednodusˇene´vytva´rˇenı´AJAX aplikacı´(zalozˇeny´ch trˇeba na Dojo, Zimbra, Rico)

12 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

– breakpointy – zobrazova´nı´promeˇnny´ch a za´sobnı´k prˇi prˇerusˇenı´ – mozˇnost spousˇteˇt webove´aplikace prˇı´mo v zabudovane´m pro- hlı´zˇecˇi Mozilla

• Harish Kataria’s JavaScript Plug-in je jizˇpravdeˇpodobneˇmrtvy´pro- jekt, protozˇe poslednı´ verze vysˇla v roce 2004 a verze pro Eclipse 3.1.0, ktera´meˇla vyjı´t, prˇed zavrˇenı´m stra´nek nevysˇla. Stra´nky a starsˇı´ verze jsou vsˇak porˇa´d prˇı´stupny prˇes http://archive.org. Tento projekt jako jediny´obsahuje ladeˇnı´.

– zvy´raznˇova´nı´syntaxe – doplnˇova´nı´ko´du – sbalova´nı´bloku˚ko´du – oznamova´nı´chyb – konzole pro vy´pis vy´stupu skriptu – na´hled obsahu – breakpointy – vlastnı´ladı´cı´pohled

• myJSEditor - Embeddable JavaScript Editor for Eclipse je take´pro- jekt, ktery´uzˇje dostupny´jen v za´loze na http://archive.org. Tento projekt je kompletneˇpostaven na Mozilla Rhino. Poslednı´verze vysˇla v roce 2006 pro Eclipse 3.1 a vyuzˇı´vala Mozilla Rhino 1.5R5, noveˇjsˇı´verze s Rhinem 1.6 a rozsˇı´rˇenı´m E4X uzˇnevysˇla. Modul meˇl tyto vlastnosti:

– zvy´raznˇova´nı´syntaxe – doplnˇova´nı´ko´du – ohlasˇova´nı´chyb

Poslednı´ dva moduly jsou uvedeny protozˇe majı´ dohromady podstatne´ vlastnosti vyvinute´ho modulu. Harish Kataria’s JavaScript Plug-in obsa- huje ladeˇnı´a myJSEditor - Embeddable JavaScript Editor for Eclipse je postaven na Mozilla Rhino.

13 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE

3.3 Na´vrhove´vzory

Na´vrhovy´vzor[13] je obecne´znovupouzˇitelne´rˇesˇenı´neˇjake´ho beˇzˇneˇse vy- skytujı´cı´ho proble´mu prˇi softwarove´m na´vrhu. Eclipse a take´ vytvorˇeny´ modul vyuzˇı´vajı´neˇktere´ze vzoru˚. Nejpodstatneˇjsˇı´pouzˇite´vzory z pohledu vytvorˇene´ho modulu jsou abstraktnı´tova´rna a singleton.

3.3.1 Abstraktnı´tova´rna

Neˇktere´veˇci je trˇeba rˇesˇit modula´rneˇ. Zajistit modularitu vsˇak nenı´jedno- duche´. Prˇı´kladem vyuzˇitı´je trˇeba aplikace, ktera´beˇzˇı´na rozdı´lny´ch syste´- mech, ale kazˇdy´syste´m ma´jine´trˇı´dy pro tlacˇı´tko v okneˇ. Bez modularizace by totizˇv ko´du spravujı´cı´okno musel by´t ko´d pro vsˇechny syste´my. Vzˇdy prˇi migraci na novy´syste´m by se tak musel ko´d trˇı´dy rozsˇı´rˇit o jeho podporu. Aby se zabra´nilo tomuto zveˇtsˇova´nı´slozˇitosti ko´du trˇı´dy, lze vyuzˇı´t na´- vrhovy´vzor abstraktnı´tova´rny. Pouzˇitı´tohoto vzoru definuje framework, ktery´vytva´rˇı´objekty splnˇujı´cı´obecny´vzor. Tato tova´rna je za beˇhu spo- jena se vsˇemi konkre´tnı´mi tova´rnami, aby produkovala prˇı´slusˇne´objekty. Abstraktnı´tova´rna je tedy super-tova´rna, ktera´vytva´rˇı´ostatnı´tova´rny.

Obra´zek 3.3: UML na´vrhove´ho vzoru abstraktnı´tova´rna

Jak je videˇt z obra´zku obsahuje na´vrhovy´vzor abstraktnı´tova´rny tyto

14 3. VY´ VOJOVE´ PROSTRˇ EDI´ ECLIPSE trˇı´dy: • AbstractFactory - definuje rozhranı´ pro operace, ktere´ vytva´rˇı´ abs- traktnı´produkty

• ConcreteFactory - implementuje operace pro vytvorˇenı´konkre´tnı´to- va´rny

• AbstractProduct - definuje rozhranı´pro typ objektu produktu

• Product - definuje produkt vytva´rˇeny´ prˇı´slusˇnou ConcreteFactory a implementuje rozhranı´AbstractProduct

• Client - pouzˇı´va´rozhranı´definovane´trˇı´dami AbstractFactory a Abs- tractProduct Trˇı´da AbstractFactory urcˇı´skutecˇny´typ konkre´tnı´ho objektu, vytvorˇı´jej a vra´tı´abstraktnı´ukazatel vytvorˇene´ho objektu. Klient tedy zˇa´da´tova´rnu o vytvorˇenı´prˇı´slusˇne´ho abstraktnı´ho typu a navra´cenı´abstraktnı´ho uka- zatele. Dı´ky tomu nepotrˇebuje klient nic veˇdeˇt o tvorbeˇdane´ho objektu. Klient tedy prˇistupuje k objektu˚m dane´ho typu, vytvorˇeny´mi tova´rnou, pouze prˇes abstraktnı´rozhranı´.

3.3.2 Singleton Obcˇas je du˚lezˇite´mı´t jen jednu instanci trˇı´dy. Naprˇı´klad mı´t jen jeden sou- borovy´syste´m nebo frontu tiska´rny. Singletony se cˇasto pouzˇı´vajı´pro cent- ralizovany´prˇı´stup ke zdroju˚m a poskytujı´k sobeˇsouhrnny´prˇı´stup. Vzor singletonu obsahuje pouze jednu trˇı´du, ktera´instancuje sebe samu pouze jednou a za´rovenˇposkytuje souhrnny´prˇı´stup k instanci. To zajisˇt’uje mozˇnost pouzˇitı´instance odkudkoliv bez prˇı´me´ho vola´nı´konstruktoru.

Obra´zek 3.4: UML na´vrhove´ho vzoru singleton

Vzor definuje metodu getInstance(), ktera´zprˇı´stupnˇuje instanci trˇı´dy. Metoda za´rovenˇzajisˇt’uje vytvorˇenı´instance v prˇı´padeˇ, zˇe jesˇteˇneexistuje. Pokud by trˇı´da obsahovala jesˇteˇmetodu doSomething() je spra´vne´vola´nı´ te´to metody na´sledujı´cı´: Singleton.getInstance().doSomething();

15 Kapitola 4 Modul RhinoJS

Modul, ktery´byl vytvorˇen v ra´mci te´to diplomove´pra´ce, dovoluje editovat, spousˇteˇt a ladit scripty v jazyce JavaScript v prostrˇedı´Eclipse. Pro tvorbu tohoto modulu byl pouzˇit projekt jme´nem Rhino[14] vytva´- rˇeny´komunitou Mozilla. Jak jizˇbylo zmı´neˇno v kapitole 2.2 je Rhino imple- mentace JavaScriptu v jazyce Java. Vy´hodou te´to implementace je, zˇe podporuje aktua´lnı´verze JavaScriptu. Urcˇitou nevy´hodou pak, zˇe se chova´ tak trochu jako cˇerna´ skrˇı´nˇka a to zteˇzˇuje pra´ci prˇi ladeˇnı´. Lze ji vsˇak dı´ky jednoduche´mu rozhranı´pouzˇı´t pro spousˇteˇnı´, prˇı´padneˇkontrolu syntaxe ko´du. Uvnitrˇvytvorˇene´ho modulu se Rhino pouzˇı´va´pro tyto akce:

• kontrola syntaxe ko´du

• spousˇteˇnı´skriptu

• ladeˇnı´skriptu

V te´to kapitole budou, kromeˇfunkcionality modulu, popsa´ny take´za´- klady napojova´nı´a vytva´rˇenı´jednotlivy´ch cˇa´stı´na prostrˇedı´. Modul je roz- deˇlen na dveˇza´kladnı´cˇa´sti. Prvnı´cˇa´stı´je editor a druhou je syste´m pro spousˇteˇnı´a ladeˇnı´skriptu˚.

Obra´zek 4.1: UML aktivacˇnı´trˇı´dy

Jak bylo zmı´neˇno v prˇedchozı´ kapitole, obsahuje kazˇdy´ modul svou aktivacˇnı´trˇı´du, ktera´slouzˇı´k inicializaci modulu a zastrˇesˇenı´globa´lnı´ch

16 4. MODUL RHINOJS funkcı´a promeˇnny´ch. Aktivacˇnı´trˇı´da musı´by´t potomkem trˇı´dy Plugin nebo neˇktere´ho z jeho potomku˚. Protozˇe vytvorˇeny´modul prˇispı´va´do UI pouzˇı´va´ potomka AbstractUIPlugin jako rodicˇe. Vyuzˇitı´te´to trˇı´dy usnadnˇuje prˇı´stup k neˇktery´m staticky´m datu˚m. Za beˇhu by nikdy nemeˇla by´t vytvorˇena´vı´c nezˇjedna instance. Toho je dosazˇeno pouzˇitı´m na´vrhove´ho vzoru singleton (popsa´n v sekci 3.3.2).

4.1 Editor

Jak jizˇbylo zmı´neˇno doda´va´sebou modul editor pro editaci JavaScript sou- boru˚. Editor je automaticky sva´za´n s prˇı´ponou js. Dı´ky tomu se soubory zobrazujı´s ikonou doda´vanou modulem. Jak je videˇt na obra´zcı´ch 4.2 a 4.3. Aby modul mohl prove´st takove´to sva´za´nı´editoru, ikony a prˇı´pony sou- boru, musı´se napojit na bod rozsˇı´rˇenı´ org.eclipse.ui.editors, ve ktere´m tyto informace uvede.

Obra´zek 4.2: Project Explorer

Prˇı´slusˇne´napojenı´take´urcˇuje trˇı´du, ktera´je prˇı´slusˇny´m editorem. Trˇı´da editoru musı´implementovat rozhranı´ IEditorPart. Toho je v modulu dosa- zˇeno pomocı´rozsˇı´rˇenı´trˇı´dy TextEditor, ktera´je soucˇa´stı´Eclipse. Tato trˇı´da zajisˇt’uje vsˇechnu za´kladnı´funkcˇnost textove´ho editoru (naprˇı´klad modifi- kaci textu, vyhleda´va´nı´a nahrazova´nı´) a take´poskytuje podporu pro rozsˇı´- rˇenı´, ktera´jsou za´visla´na dane´m souboru (naprˇı´klad zvy´raznˇova´nı´syntaxe nebo doplnˇova´nı´ko´du). Editor v modulu podporuje zvy´raznˇova´nı´ syntaxe, sbalova´nı´ bloku˚ ko´du (symboly + a - na leve´straneˇeditoru a cˇa´ra zobrazujı´cı´rozsah bloku).

17 4. MODUL RHINOJS

Obra´zek 4.3: Editor

Jak je videˇt na obra´zku 4.3. Dı´ky vyuzˇitı´trˇı´dy TextEditor a ProjectionViewer se nenı´trˇeba starat o grafickou cˇa´st editoru, protozˇe ta je v teˇchto trˇı´da´ch napsa´na obecneˇ, tak aby nebyla za´visla´na obsahu. Je tedy trˇeba rˇesˇit hlavneˇ to, jak zpracovat dany´text a prˇeve´st ho na potrˇebne´struktury, ktery´m editor rozumı´. Eclipse rozdeˇluje zobrazova´nı´obsahu souboru do neˇkolika u´rovnı´. To zajisˇt’uje,zˇe je zobrazova´nı´oddeˇleno od editace. Editor je napojen na prohlı´- zˇecˇ(viewer) a ten da´le na dokument. Kombinace teˇchto trˇı´cˇa´stı´je dostacˇujı´cı´ pro zvy´raznˇova´nı´syntaxe a sbalova´nı´bloku˚ko´du. Obsah dokumentu se deˇlı´ na cˇa´sti, teˇm se pak nastavujı´takzvane´skenery. Pomocı´skeneru˚se dosa- huje zvy´razneˇnı´. Skenery vyuzˇı´va´prohlı´zˇecˇk urcˇenı´barvy pı´sma (lze meˇnit i styl pı´sma) textu dokumentu uvnitrˇjednotlivy´ch cˇa´stı´dokumentu. Editor v modulu deˇlı´dokument pouze na dva druhy cˇa´stı´(text a vı´ce rˇa´dkovy´ko- menta´rˇ). Pokud by meˇl editor v modulu podporovat pouze zvy´raznˇova´nı´ syntaxe, stacˇilo by pouzˇı´t SourceViewer. ProjectionViewer je pouzˇit pra´veˇkvu˚li sbalova´nı´bloku˚ko´du. Uvedena´ trˇı´da postavı´mezi sebe a dokument jesˇteˇjeden dokument (takzvany´pro- jekcˇnı´). Tento projekcˇnı´dokument obsahuje pouze nesbalene´cˇa´sti hlavnı´ho dokumentu. Vı´ce informacı´o rozdeˇlenı´dokumentu˚je v cˇla´nku ”Folding in Eclipse Text Editors”[15]. Prohlı´zˇecˇi se potom nastavuje mapa anotacı´ na pozice (pocˇa´tek a de´lka bloku) v dokumentu. Kazˇda´anotace ma´nasta-

18 4. MODUL RHINOJS

Obra´zek 4.4: UML trˇı´dy editoru veny´text. Tento text se zobrazuje prˇi najetı´mysˇı´na indika´tor sbalene´ho bloku (symbol + na obra´zku 4.3). O zobrazova´nı´symbolu˚de´lky bloku˚, za- cˇa´tku nesbaleny´ch a sbaleny´ch bloku˚(prˇı´padneˇjejich anotacı´) se stara´sa´m prohlı´zˇecˇ.

Obra´zek 4.5: Doplnˇova´nı´jmen funkcı´

Dalsˇı´funkcı´, ktera´se v editorech vy´vojovy´ch prostrˇedı´beˇzˇneˇvyskytuje je asistence doplnˇova´nı´ ko´du beˇhem psanı´. Editor v modulu podporuje tuto funkci jen cˇa´stecˇneˇ. Uzˇivateli jsou pro doplneˇnı´nabı´zeny pouze jme´na funkcı´, ktere´jsou v dane´m dokumentu. Jak je videˇt na obra´zku 4.5, jsou v nabı´dce funkce vcˇetneˇparametru˚. Tyto parametry se vsˇak nedoplnˇujı´, aby je uzˇivatel nemusel prˇepisovat. Doplnˇova´nı´se aktivuje automaticky po 500-ti milisekunda´ch nebo ji mu˚zˇe uzˇivatel aktivovat rucˇneˇ (vy´chozı´ kombinace kla´ves je Ctrl+Space). Aby byla uzˇivateli poskytnuta mozˇnost doplnˇova´nı´ko´du, je trˇeba pro-

19 4. MODUL RHINOJS

Obra´zek 4.6: UML trˇı´d doplnˇova´nı´ko´du hlı´zˇecˇi nastavit trˇı´du implementujı´cı´rozhranı´ IContentAssistant. K tomuto lze vyuzˇı´t trˇı´du ContentAssistant, ktera´tento interface implementuje. Te´to trˇı´deˇje pak jesˇteˇnutno nastavit trˇı´du implementujı´cı´rozhranı´ IContentAs- sistProcessor, ktera´bude poskytovat seznamy aktua´lneˇnabı´zeny´ch mozˇ- nostı´doplneˇnı´. Jedna trˇı´da ContentAssistant mu˚zˇe mı´t nastaveny´ch vı´ce ru˚zny´ch trˇı´d (pro kazˇdou cˇa´st dokumentu jeden).

Obra´zek 4.7: Zobrazova´nı´syntakticky´ch chyb

Poslednı´cˇa´stı´editoru v modulu, ktera´je spojena´s GUI, je zobrazova´nı´ chyb v dokumentu. Na testova´nı´teˇchto chyb se vyuzˇı´va´ Rhino. Jak je videˇt na obra´zku 4.7 jsou chyby zobrazeny jak prˇı´mo v dokumentu (i vcˇetneˇ popisu), tak take´v okneˇ Problems. Chybne´dokumenty jsou take´automaticky oznacˇeny v Project Exploreru (viz. obra´zek 4.2). Pro zobrazova´nı´chyb, varova´nı´, pozna´mek a dalsˇı´ch podobny´ch infor-

20 4. MODUL RHINOJS macı´, se v Eclipse pouzˇı´vajı´znacˇky. Kazˇdy´dokument mu˚zˇe mı´t prˇirˇazeny´ch neˇkolik znacˇek a ty se v neˇm mohou prˇekry´vat. Kazˇda´znacˇka ma´urcˇeny´ svu˚j typ, text a pozici v dokumentu (bud’cˇı´slo rˇa´dku nebo cˇı´slo pocˇa´tecˇnı´ho a koncove´ho znaku). Vsˇechny znacˇky musı´implementovat rozhranı´ IMar- ker. Modul nevytva´rˇı´pro zobrazova´nı´chyb zˇa´dne´nove´znacˇky, ale vyuzˇı´va´ teˇch, ktere´jsou prˇı´mo v Eclipse. Takzˇe vsˇechny chyby jsou vytva´rˇeny s ty- pem IMarker.PROBLEM a za´vazˇnosti IMarker.SEVERITY ERROR (prˇı´- padneˇ IMarker.SEVERITY WARNING pro varova´nı´). Poslednı´cˇa´stı´, ktera´v editoru a nenı´prˇı´mo zajisˇt’ova´na nadtrˇı´dami je automaticke´odsazova´nı´. Pro odsazova´nı´ve vı´cerˇa´dkove´m komenta´rˇi se po- uzˇı´va´vy´chozı´ DefaultIndentLineAutoEditStrategy, ktera´zachova´va´odsa- zenı´z prˇedchozı´ho rˇa´dku. Pro odsazova´nı´v ko´du se pouzˇı´va´trˇı´da, ktera´ automaticky zveˇtsˇuje a zmensˇuje odsazenı´podle slozˇeny´ch za´vorek.

4.2 Konfigurace

Modul obsahuje dva druhy konfigurace. Jednı´m je nastavenı´skriptu pro spusˇteˇnı´. Ten bude popsa´n pozdeˇji v podkapitole zaby´vajı´cı´se spousˇteˇnı´m skriptu, protozˇe s touto podkapitolou prˇı´mo souvisı´. Jak obsahoveˇ, tak i co se ty´cˇe pouzˇity´ch balı´ku˚a trˇı´d. Tato kapitola se bude veˇnovat obecne´konfi- guraci modulu, ktera´je v Eclipse pod Window→Preferences. Modul zde ma´ nastavenı´barev pro zvy´raznˇova´nı´syntaxe, ktere´je uka´za´no na obra´zku 4.8. Pro vytvorˇenı´nastavenı´se modul napojuje na dva body rozsˇı´rˇenı´. Prv- nı´m z nich je org.eclipse.core.runtime.preferences. Prˇes tento bod rozsˇı´rˇenı´ se nastavuje trˇı´da, ktera´nastavı´vy´chozı´hodnoty pro vsˇechny vlastnosti. Trˇı´da, ktera´zajisˇt’uje nastavenı´vy´chozı´ch vlastnostı´, musı´rozsˇirˇovat trˇı´du AbstractPreferenceInitializer. Druhy´m bodem rozsˇı´rˇenı´, bez ktere´ho se vy- tva´rˇenı´nastavenı´neobejde, je org.eclipse.ui.preferencePages, ve ktere´m se uva´deˇjı´jednotlive´stra´nky nastavenı´. Modul obsahuje dveˇstra´nky, protozˇe prˇida´va´dva uzly do stromu stra´nek nastavenı´. Prvnı´m uzlem je ”RhinoJS”, ktery´se odkazuje na trˇı´du reprezentujı´cı´pra´zdnou stra´nku. Druhy´uzel je potomek prˇedchozı´ho uzlu s na´zvem ”Colors” a reprezentujı´cı´m stra´nku pro nastavenı´barev zvy´raznˇova´nı´syntaxe. Trˇı´da kazˇde´stra´nky musı´im- plementovat rozhranı´ IWorkbenchPreferencePage. Pro zjednodusˇenı´ko´du vhodne´rozsˇı´rˇit trˇı´du FieldEditorPreferencePage a implementovat rozhranı´ IWorkbenchPreferencePage. Pouzˇitı´rozsˇı´rˇenı´trˇı´dy je vhodne´, hlavneˇpro- tozˇe veˇtsˇina ko´du v trˇı´deˇstra´nky je SWT ko´d. Zmı´neˇna´trˇı´da prˇida´va´me- tody, ktere´psanı´zjednodusˇujı´. Nenı´tedy nutne´psa´t prˇı´mo SWT ko´d, ale s vyuzˇitı´m te´to trˇı´dy zkra´tit za´pis trˇı´dy stra´nky na naproste´minimum vy-

21 4. MODUL RHINOJS

Obra´zek 4.8: Nastavenı´zvy´raznˇova´nı´ jmenova´vajı´cı´jednotlive´vlastnosti, ktere´se na stra´nce majı´nastavovat a je- jich typy.

Obra´zek 4.9: UML trˇı´d nastavenı´

Vsˇechny vlastnosti modulu jsou ukla´da´ny do workspace. Trˇı´da nasta- vujı´cı´vy´chozı´hodnoty a take´vsˇechny stra´nky nastavenı´musı´veˇdeˇt, kam prˇesneˇma´hodnoty ukla´dat. K tomu v Eclipse slouzˇı´rozhranı´ IPreferenceS- tore (prˇı´padneˇjeho potomci a trˇı´dy implementujı´cı´tato rozhranı´). Pokud chceme vyuzˇı´t ukla´da´nı´ do workspace je vhodne´ nechat zajisˇteˇnı´ zjisˇt’o- va´nı´, toho kam hodnoty ukla´dat, na trˇı´deˇ AbstractUIPlugin a nezajisˇt’ovat

22 4. MODUL RHINOJS to rucˇneˇ.

4.3 Spousˇteˇnı´a ladeˇnı´skriptu˚

Spousˇteˇnı´a ladeˇnı´skriptu˚majı´v Eclipse stejny´za´klad. Aby fungovala, je pro neˇtrˇeba nastavit trˇı´du, ktera´prova´dı´spousˇteˇnı´na za´kladeˇkonfigurace. Pro korektnı´ fungova´nı´ ladeˇnı´, je trˇeba jesˇteˇ nastavit neˇktere´ dalsˇı´ trˇı´dy a body rozsˇı´rˇenı´. Ty musı´zajistit naprˇı´klad vy´beˇr spra´vne´ho souboru prˇi prˇerusˇenı´beˇhu skriptu. V na´sledujı´cı´ch podkapitola´ch je popsa´no co vsˇe je trˇeba udeˇlat pro fungova´nı´spousˇteˇnı´a ladeˇnı´. V cˇla´ncı´ch ”We Have Lift-off: The Launching Framework in Eclipse”[16] a ”How to write an Eclipse debugger”[17] jsou neˇktere´cˇa´sti popsa´ny podrobneˇji. Jsou v nich take´popsa´ny neˇktere´dalsˇı´ trˇı´dy a body rozsˇı´rˇenı´, ktere´mu˚zˇe modul pro spousˇteˇnı´a ladeˇnı´vyuzˇı´t.

4.3.1 Spousˇteˇnı´

Pro zajisˇteˇnı´spousˇteˇnı´je trˇeba nejprve napojenı´na bod rozsˇı´rˇenı´ org.eclipse. debug. core. launchConfigurationTypes, ktery´definuje typ konfigurace. V tomto napojenı´je trˇeba uve´st jake´bude mı´t typ konfigurace jme´no, id, delegujı´cı´trˇı´du a mo´dy. Uvedene´id se pouzˇı´va´v dalsˇı´ch bodech napojenı´ pro spojenı´s tı´mto typem konfigurace. Mo´dy uva´deˇjı´jake´druhy spusˇteˇnı´ dany´typ konfigurace podporuje. Eclipse sa´m o sobeˇdefinuje trˇi za´kladnı´ mo´dy run, debug a profile. Modul mu˚zˇe vyuzˇı´t tyto trˇi mo´dy nebo si definovat svoje. Je vhodne´pouzˇı´vat prˇı´mo mo´dy Eclipse, proto tento modul vyuzˇı´va´ mo´dy run a debug, mı´sto definova´nı´svy´ch vlastnı´ch. Poslednı´m du˚lezˇity´m atributem je delegujı´cı´trˇı´da. Tato trˇı´da musı´ implementovat rozhranı´ ILaunchConfigurationDele- gate. Prˇi spusˇteˇnı´dane´ho typu konfigurace je zavola´na metoda launch te´to trˇı´dy a je jı´prˇeda´na prˇı´slusˇna´konfigurace, mo´d, ktery´se ma´spustit a objekt spusˇteˇnı´. Do objektu spusˇteˇnı´se v prˇı´padeˇpotrˇeby nastavujı´spusˇteˇne´pod- procesy nebo ladı´cı´trˇı´da. Podle zadane´konfigurace a mo´du je pak trˇeba spustit prˇı´slusˇne´funkce nebo podprocesy, ktere´vykonajı´prˇı´slusˇnou akci. Tento modul pro spousˇteˇnı´skriptu vyuzˇı´va´trˇı´d implementace Rhino. Nemusı´tedy vytva´rˇet zˇa´dne´podprocesy, ktere´by prˇeda´val objektu spusˇ- teˇnı´. Podle vy´sledku spusˇteˇnı´je bud’ uzˇivateli ozna´mena chyba nebo zob- razen vy´sledek skriptu (pokud si to uzˇivatel prˇeje). Aby bylo mozˇne´ nastavit dany´ typ konfigurace (naprˇı´klad nastavit jme´no spousˇteˇne´ho skriptu), je trˇeba dane´mu typu konfigurace prˇirˇadit skupinu konfiguracˇnı´ch panelu˚. Tato skupina se prˇirˇazuje pomocı´bodu roz-

23 4. MODUL RHINOJS

Obra´zek 4.10: Konfigurace spusˇteˇnı´ sˇı´rˇenı´ org.eclipse.debug.ui.launchConfigurationTabGroup. Tomuto bodu rozsˇı´rˇenı´ je potrˇeba nastavit trˇı´du, ktera´ skupinu panelu˚ vytvorˇı´ a typ konfigurace, ktere´mu se ma´prˇirˇadit. Uvedena´trˇı´da musı´implementovat rozhranı´ ILaunchConfigurationTabGroup. Pro zjednodusˇenı´ko´du je vsˇak vhodne´pouzˇı´t jako rodicˇe trˇı´du AbstractLaunchConfigurationTabGroup. Prˇi jejı´m pouzˇitı´, je trˇeba jen implementovat funkci, ktera´nastavuje seznam panelu˚. Jednotlive´panely musı´implementovat rozhranı´ ILaunchConfigurati- onTab. Pro zjednodusˇenı´ko´du lze pouzˇı´t jako rodicˇe trˇı´du AbstractLaunch ConfigurationTab nebo pouzˇı´t neˇkterou z podtrˇı´d (naprˇı´klad SourceLoo- kupTab, ktera´slouzˇı´k definici cest pro vyhleda´va´nı´souboru˚se zdrojovy´mi ko´dy). Tento modul vyuzˇı´va´jak zmı´neˇne´trˇı´dy SourceLookupTab, tak take´ vytva´rˇı´jednu vlastnı´. Vytvorˇena´trˇı´da je potomkem AbstractLaunchCon- figurationTab a slouzˇı´k nastavenı´spousˇteˇne´ho skriptu a nastavenı´, zda-li vypisovat vy´sledek spusˇteˇnı´. Toto nastavenı´je zobrazeno na obra´zku 4.10. Poslednı´m bodem rozsˇı´rˇenı´, ktery´je prˇi vytva´rˇenı´spousˇteˇnı´vhodne´vy- uzˇı´t, je org.eclipse.debug.ui.launchConfigurationTypeImages. Tento bod rozsˇı´rˇenı´prˇirˇazuje dane´mu typu konfigurace vlastnı´ikonu. Pokud toto prˇi-

24 4. MODUL RHINOJS

Obra´zek 4.11: UML delegujı´cı´trˇı´dy a konfigurace rˇazenı´nenı´provedeno, pouzˇije se standardnı´ikona Eclipse. V tomto bodu rozsˇı´rˇenı´se uva´dı´jak cesta k ikoneˇ, tak i id typu konfigurace, ktere´je prˇirˇa- zena. Cesta k ikoneˇje relativnı´vzhledem k modulu.

4.3.2 Ladeˇnı´ Jak bylo rˇecˇeno v prˇedchozı´podkapitole, tak spousˇteˇnı´i ladeˇnı´majı´stejny´ za´klad. Asponˇco se ty´cˇe napojenı´azˇpo delegujı´cı´trˇı´du. Modul vyuzˇı´va´, jak pro spousˇteˇnı´, tak pro inicializaci ladeˇnı´stejnou delegujı´cı´trˇı´du. Ta, pokud je jako mo´d uveden ILaunchManager.DEBUG MODE, inicializuje trˇı´du defi- nujı´cı´ladı´cı´cı´l a nastavı´jej objektu spusˇteˇnı´. Tato trˇı´da musı´implementovat rozhranı´ IDebugTarget. Trˇı´da ladı´cı´ho cı´le je jednou z nejdu˚lezˇiteˇjsˇı´ch trˇı´d potrˇebny´ch pro ladeˇnı´. Ve skutecˇnosti je to centralizovany´bod, prˇes ktery´Eclipse komunikuje s in- terpretrem zajisˇt’ujı´cı´m ladeˇnı´. Dalsˇı´podstatnou trˇı´dou je trˇı´da implemen- tujı´cı´rozhranı´ IThread. Tato trˇı´da by meˇla zaobalovat interpretr (prˇı´padneˇ komunikaci s nı´m). Prˇi vytva´rˇenı´trˇı´d a napojova´nı´na interpretr je trˇeba myslet na to, zˇe je akce nutne´prova´deˇt neblokovaneˇ. To proto, aby mohl Eclipse aktualizovat GUI i kdyzˇinterpretr zrovna prova´dı´neˇjakou dlou- hotrvajı´cı´akci. Je tedy vhodne´aby interpretr a trˇı´da zajisˇt’ujı´cı´komunikaci s nı´m beˇzˇely v samostatne´m vla´kneˇ. Tı´m se dosta´va´me k dalsˇı´podstatne´ skutecˇnosti na kterou si da´t prˇi psanı´ko´du pozor. Jak Eclipse tak modul, ktery´zprostrˇedkova´va´ladeˇnı´, jsou vı´ce vla´knove´, takzˇe je trˇeba psa´t ko´d,

25 4. MODUL RHINOJS tak aby byl vla´knoveˇbezpecˇny´. Dalsˇı´dobrou zkusˇenostı´, kterou je vhodne´prˇi programova´nı´modulu zajistit, je jednotna´implementace trˇı´d a rozhranı´, ktere´jsou pouzˇity v neˇko- lika ru˚zny´ch trˇı´da´ch. Prˇı´kladem takove´trˇı´dy je PlatformObject a rozhranı´ IDebugElement. Je proto vhodne´spojit implementaci jejich metod do jedne´ trˇı´dy, ktera´je potom pouzˇita jako rodicˇovska´trˇı´da ostatnı´ch trˇı´d. Ve vyvinu- te´m modulu je to zajisˇteˇno trˇı´dou JSDebugElement. Tato trˇı´da je na´sledneˇ pouzˇita jako rodicˇovska´pro implementace vsˇech trˇı´d a rozhranı´, ktere´majı´ vy´sˇe zmı´neˇnou trˇı´du nebo rozhranı´podeˇdeˇne´od rodicˇu˚.

Obra´zek 4.12: UML trˇı´dy cı´le ladeˇnı´

Napsa´nı´, nastavenı´a napojenı´vy´sˇe zmı´neˇny´ch trˇı´d je nutny´m minimem pro prˇida´nı´ladeˇnı´do modulu. Nicme´neˇtakto prˇidane´ladeˇnı´je uzˇivatelsky velmi neprˇı´veˇtive´, protozˇe uzˇivatel nema´mozˇnost prˇerusˇit beˇh skriptu na prˇesneˇdefinovane´m mı´steˇnebo zobrazenı´zdrojove´ho ko´du beˇhem kroko- va´nı´. Aby uzˇivatel mohl definovat znacˇku bodu prˇerusˇenı´, je trˇeba vytvo- rˇit napojenı´ na trˇi body rozsˇı´rˇenı´ a implementovat trˇi trˇı´dy. Prvnı´m bo- dem rozsˇı´rˇenı´je org.eclipse.core.resources.markers. Tento bod definuje id nove´ho typu znacˇek a jejı´ rodicˇovsky´ typ. V prˇı´padeˇ znacˇky bodu prˇe- rusˇenı´urcˇovany´ch pozicı´rˇa´dku, ktery´pouzˇı´va´vytvorˇeny´modul, je rodi- cˇovsky´m typem org.eclipse. debug.core.lineBreakpointMarker. Druhy´m bodem rozsˇı´rˇenı´, na ktery´se je trˇeba napojit je org.eclipse.debug.core.breakpoints. Tı´mto bodem rozsˇı´rˇenı´se urcˇuje, ktera´trˇı´da bude obhospodarˇovat dany´typ znacˇky. Je zde tedy v jednom parametru nutno uve´st id typu znacˇky uve- dene´v prˇedchozı´m bodu rozsˇı´rˇenı´. Poslednı´m bodem rozsˇı´rˇenı´, na ktery´je trˇeba se napojit je org.eclipse.core.runtime.adapters. Toto rozsˇı´rˇenı´definuje adapte´rove´tova´rny. Dı´ky tomuto, lze spojit editor a adapte´rovou tova´rnu (popsa´na v sekci 3.3.1), ktera´adaptuje typ akce pro prˇepı´nanı´znacˇek rˇa´d-

26 4. MODUL RHINOJS

Obra´zek 4.13: Znacˇka bodu prˇerusˇenı´ kovy´ch bodu˚prˇerusˇenı´(IToggleBreakpointsTarget). Prvnı´dveˇtrˇı´dy, ktere´je trˇeba implementovat, vycha´zı´prˇı´mo z napojova´nı´na body rozsˇı´rˇenı´. Jednou z nich je trˇı´da znacˇky bodu prˇerusˇenı´, ktera´musı´implementovat rozhranı´ IBreakpoint. Protozˇe modul definuje znacˇku rˇa´dkove´ho bodu prˇerusˇenı´, neimplementuje rozhranı´prˇı´mo, ale pouzˇı´va´rodicˇovskou trˇı´du LineBreak- point, ktera´toto rozhranı´implementuje. Dalsˇı´trˇı´dou je adapte´rova´tova´rna. Tato trˇı´da musı´implementovat rozhranı´ IAdapterFactory a je pozˇadova´na trˇetı´m bodem rozsˇı´rˇenı´. Jelikozˇadapte´rova´tova´rna nemu˚zˇe vyuzˇı´vat prˇı´mo trˇı´du znacˇky bodu prˇerusˇenı´, ale adapte´r, je trˇeba implementovat jesˇteˇtrˇı´du implementujı´cı´rozhranı´uvedene´ve trˇetı´m bodu rozsˇı´rˇenı´. Vy´sˇe zmı´neˇne´definova´nı´znacˇek bodu prˇerusˇenı´da´uzˇivateli mozˇnost je zapı´nat a vypı´nat pouze prˇes menu nebo kla´vesove´zkratky. Lze tedy pouzˇı´t Run→Toggle Breakpoint (vy´chozı´kla´vesova´zkratka je Ctrl+Shit+B) a Run→Toggle Line Breakpoint. Je proto vhodne´ da´t uzˇivateli jesˇteˇ jednu mozˇnost, tak jak to je ve veˇtsˇineˇ ostatnı´ch vy´vojovy´ch prostrˇedı´. Touto obvyklou mozˇnostı´je poklepa´nı´na leve´m nebo prave´m okraji editoru. Ec- lipse touto mozˇnostı´disponuje take´. Pro zprˇı´stupneˇnı´te´to mozˇnosti, jak meˇnit znacˇky bodu˚prˇerusˇenı´, je trˇeba prove´st prˇipojenı´k bodu rozsˇı´rˇenı´ org.eclipse.ui.editorActions. V tomto napojenı´je trˇeba uve´st prˇispeˇnı´akcı´ RulerDoubleClick k editoru. Toto prˇipojenı´vynucuje napsa´nı´trˇı´dy, ktera´im- plementuje rozhranı´ IEditorActionDelegate. Pro zjednodusˇenı´implemen- tace je vsˇak vhodneˇjsˇı´ pouzˇı´t trˇı´du AbstractRulerActionDelegate, ktera´ zajisˇt’uje veˇtsˇinu funkcı´tohoto rozhranı´. Pouzˇitı´abstraktnı´trˇı´dy vynucuje napsa´nı´trˇı´dy, ktera´implementuje rozhranı´ IAction. Mı´sto implementace tohoto rozhranı´je vsˇak lepsˇı´pouzˇı´t jako rodicˇe trˇı´du Action (prˇı´padneˇneˇ-

27 4. MODUL RHINOJS

Obra´zek 4.14: UML trˇı´dy znacˇky bodu prˇerusˇenı´

kterou z jejich podtrˇı´d), ktera´toto rozhranı´implementuje. Dalsˇı´uzˇitecˇnou vlastnost, kterou ladı´cı´programy obsahujı´, je nalezenı´ a zobrazenı´ko´du aktua´lnı´ho bodu prˇerusˇenı´. Toto samozrˇejmeˇumı´i Ec- lipse. Aby k te´to funkcˇnosti mohl prˇistupovat i vyvinuty´modul, je trˇeba se napojit na neˇkolik bodu˚rozsˇı´rˇenı´. Prvnı´dva body rozsˇı´rˇenı´, na ktere´je trˇeba se napojit, definujı´ladı´cı´kontext (bod org.eclipse.ui.contexts s na- staveny´m rodicˇovsky´m id jako org.eclipse.debug.ui.debugging). Id uvedene´ u tohoto napojenı´je na´sledneˇpouzˇito prˇi napojova´nı´na druhy´bod napo- jenı´. Tı´mto bodem je org.eclipse.debug.ui.debugModelContextBindings, ktery´spojuje ladı´cı´model a kontext. Toto spojenı´je pozdeˇji vyuzˇito, pro vy´- beˇr spra´vne´ho kontextu, kdyzˇje vybra´n neˇjaky´prvek z ladı´cı´ho pohledu. Tyto dva body rozsˇı´rˇenı´nevyzˇadujı´implementaci zˇa´dny´ch trˇı´d, ale slouzˇı´ pouze k propojova´nı´. Druhy´ bod napojenı´ vyuzˇı´va´ jesˇteˇ jedno id. Tı´m je id z bodu rozsˇı´- rˇenı´ org.eclipse.debug.ui.debugModelPresentations. Toto napojenı´urcˇuje trˇı´du, ktera´je zodpoveˇdna´za poskytova´nı´popisku˚, obra´zku˚a editoru pro dany´ladı´cı´model. Tato trˇı´da musı´implementovat rozhranı´ IDebugModel-

28 4. MODUL RHINOJS

Obra´zek 4.15: Editor beˇhem ladeˇnı´skriptu

Presentation. Jednı´m z dobry´ch rˇesˇenı´implementace te´to trˇı´dy je mı´t prˇida- nou jako rodicˇovskou trˇı´du LabelProvider a prˇetı´zˇit funkce te´to trˇı´dy, aby vracely hodnotu null. Tı´m se zajistı´implementace vsˇech potrˇebny´ch funkcı´ a prˇenecha´zobrazova´nı´obra´zku˚a popisku˚na Eclipse. Je vsˇak trˇeba po- tom myslet na to, aby vsˇechny objekty meˇly spra´vneˇprˇedefinovane´funkce vracejı´cı´popisky (naprˇı´klad funkce toString v neˇktery´ch prˇı´padech funkce getName). Jakmile je beˇh skriptu prˇerusˇen, musı´se nale´zt spra´vny´soubor se skrip- tem. Aby se nalezl spra´vny´soubor je trˇeba prove´st napojenı´na dva body roz- sˇı´rˇenı´. Prvnı´m bodem rozsˇı´rˇenı´je org.eclipse.debug.core. sourcePathCom- puters. Tento bod rozsˇı´rˇenı´ specifikuje trˇı´dy, ktere´ vyhleda´vajı´ cesty se zdrojovy´mi soubory. Trˇı´da uvedena´ v bodu rozsˇı´rˇenı´ musı´ implemento- vat rozhranı´ ISourcePathComputerDelegate. Pokud nenı´trˇeba specifiko- vat specia´lnı´cesty je vhodne´vracet, v metodeˇtohoto rozhranı´, null, aby se pouzˇily vy´chozı´cesty definovane´pomocı´ SourceLookupTab. Tento kon- figuracˇnı´panel je doda´va´n prˇı´mo s Eclipse a stacˇı´jej prˇidat mezi konfi- guracˇnı´panely. Druhy´m bodem rozsˇı´rˇenı´, na ktery´je trˇeba se napojit, je org.eclipse.debug.core.sourceLocators, ktery´ definuje vyhleda´vacˇe zdro- jovy´ch ko´du˚. Trˇı´da uvedena´v tomto bodeˇrozsˇı´rˇenı´musı´implementovat rozhranı´ IPersistableSourceLocator. Pro zjednodusˇenı´ko´du je vsˇak vhodne´ pouzˇı´vat trˇı´du AbstractSourceLookupDirector, ktera´implementuje mimo jiny´ch i toto rozhranı´. Prˇi pouzˇitı´te´to abstraktnı´trˇı´dy stacˇı´implementovat metodu vracejı´cı´pole jednotlivy´ch pomocnı´ku˚vyhleda´va´nı´, ktere´se majı´

29 4. MODUL RHINOJS

Obra´zek 4.16: UML trˇı´d pro vyhleda´va´nı´cesty se zdrojovy´mi soubory pouzˇı´t pro nalezenı´spra´vne´ho zdrojove´ho souboru. Tito pomocnı´ci musı´ implementovat rozhranı´ ISourceLookupParticipant, jako vzˇdy je vsˇak lepsˇı´ pouzˇı´t abstraktnı´trˇı´du doda´vanou prˇı´mo v Eclipse AbstractSourceLookup- Participant, ktera´implementuje veˇtsˇinu metod a dovoluje se soustrˇedit jen na nalezenı´spra´vne´ho jme´na souboru. Poslednı´veˇcı´, kterou je trˇeba pro spra´vne´napojenı´udeˇlat, je zapsa´nı´id uvedeny´ch u obou bodu˚napojenı´do prˇı´slusˇne´ho bodu napojenı´typu konfigurace spousˇteˇnı´, ke ktere´se vztahujı´. Ladı´cı´prostrˇedky beˇzˇneˇpodporujı´zobrazova´nı´za´sobnı´ku a krokova´nı´. Eclipse je podporuje take´a pomocı´rozhranı´ji zprˇı´stupnˇuje modulu˚m. Jizˇ drˇı´ve bylo zmı´neˇno, zˇe centralizovany´m bodem, se ktery´m komunikuje Eclipse, je trˇı´da implementujı´cı´rozhranı´ IDebugTarget. Tato tato trˇı´da si uchova´va´pole vla´ken implementujı´cı´ch rozhranı´ IThread. Obeˇtato roz- hranı´v sobeˇzastrˇesˇujı´rozhranı´ ITerminate a ISuspendResume. Tato roz- hranı´ definujı´ metody pro zastavenı´, prˇerusˇenı´ a znovu spusˇteˇnı´ ladeˇnı´. Vla´knove´rozhranı´navı´c obsahuje i rozhranı´ IStep, ktere´definuje metody zajisˇt’ujı´cı´krokova´nı´. Jednotlive´metody vla´kna by meˇly zajistit spra´vnou komunikaci s interpretrem, aby se Eclipse mohl dozveˇdeˇt, zda-li jsou dane´ akce momenta´lneˇpovoleny, a take´aby interpretr dosta´val spra´vneˇprˇı´kazy akcı´, ktere´ma´udeˇlat. Na obra´zku 4.17 je uka´zka za´sobnı´ku. Je zde videˇt konfigurace, pod kterou je prˇı´slusˇny´ beˇzˇı´cı´ ladı´cı´ cı´l a jeho vla´kno. Pod vla´knem je jeho

30 4. MODUL RHINOJS

Obra´zek 4.17: Za´sobnı´k beˇhem prˇerusˇenı´beˇhu prˇı´slusˇny´za´sobnı´k. To je zajisˇteˇno implementacı´funkce getStackFrames roz- hranı´ IThread. Tato funkce vracı´pole prvku˚typu IStackFrame, jehozˇprvky jsou jednotlive´prvky za´sobnı´ku. Je trˇeba si da´t pozor na spra´vne´usporˇa´da´nı´ prvku˚, protozˇe prvnı´m by meˇl by´t nejvysˇsˇı´prvek za´sobnı´ku (aktua´lnı´bod prˇerusˇenı´beˇhu), aby bylo zachova´no klasicke´usporˇa´da´nı´prˇi zobrazenı´. Pro vytvorˇenı´prvku za´sobnı´ku je nutne´implementovat rozhranı´ IStackFrame. Tak jako rozhranı´ladı´cı´ho cı´le a vla´kna i toto rozhranı´zastrˇesˇuje rozhranı´ pro krokova´ni, prˇerusˇenı´a zastavenı´ladeˇnı´. Kromeˇteˇchto metod obsahuje rozhranı´ jesˇteˇ dalsˇı´ metody. Dı´ky teˇmto metoda´m se prˇi vybra´nı´ prvku za´sobnı´ku mu˚zˇe prˇejı´t na spra´vny´soubor, jeho rˇa´dek (prˇı´padneˇjeho pod cˇa´st). Ladı´cı´ programy, ktere´ podporujı´ zobrazova´nı´ za´sobnı´ku, podporujı´ take´ zobrazenı´ promeˇnny´ch aktua´lnı´ho prvku za´sobnı´ku. Rozhranı´ IS- tackFrame pro to poskytuje dveˇmetody (hasVariables a getVariables). Trˇı´da promeˇnne´musı´implementovat rozhranı´ IVariable. Kazˇda´promeˇnna´ma´ svou hodnotu, ktera´je urcˇena trˇı´dou implementujı´cı´rozhranı´ IValue. Obeˇ uvedena´rozhranı´jsou jednoducha´a obsahujı´pouze pa´r metod. Promeˇnna´ navı´c mu˚zˇe identifikovat, zda-li se od poslednı´ho zobrazenı´zmeˇnila. Toto zvy´razneˇnı´je uka´za´no na obra´zku 4.19 zˇlutou barvou. Pro ladeˇnı´ JavaScriptu je nutne´ vytvorˇit svu˚j vlastnı´ ladı´cı´ interpretr implementujı´cı´rozhranı´ org.mozilla. . ContextFactory. Listener, org.mozilla. javascript. ContextAction, org.mozilla. javascript. debug. De- bugger a org.mozilla. javascript. debug. DebugFrame. Jak jizˇbylo zmı´neˇno drˇı´ve, je nevy´hodou Rhina, zˇe se chova´jako cˇerna´skrˇı´nˇka. Rhino sice zpro- strˇedkova´va´ pa´r trˇı´d pro ladeˇnı´ JavaScriptu, ale nezprˇı´stupnˇuje vsˇechny

31 4. MODUL RHINOJS

Obra´zek 4.18: UML trˇı´d prvku˚za´sobnı´ku

Obra´zek 4.19: Zobrazova´nı´promeˇnny´ch beˇhem prˇerusˇenı´ trˇı´dy, ktere´obsahuje. Nelze tedy prˇistupovat ke vsˇem potrˇebny´m trˇı´da´m prˇı´mo. Naprˇı´klad nelze prˇistupovat k za´sobnı´ku. Tento fakt zeslozˇit’uje trˇı´du zastrˇesˇujı´cı´interpretr. Je totizˇnutne´si za´sobnı´k vytva´rˇet sa´m z in- formacı´prˇeda´vany´ch Rhinem za beˇhu. Potrˇebne´informace jsou ulozˇeny v objektech s typy Scriptable (prˇeda´vane´m v metodeˇ onEnter) a Debugga- bleScript (prˇeda´vane´m v metodeˇ getFrame). V DebuggableScript je ulozˇeno jme´no souboru a jme´no funkce aktua´lnı´ho prvku za´sobnı´ku. Ve druhe´trˇı´deˇ

32 4. MODUL RHINOJS se nacha´zejı´promeˇnne´. Vzhledem k tomu, zˇe promeˇnne´v JavaScriptu jsou prˇı´stupny ze vsˇech nadrˇazeny´ch bloku skriptu, je trˇeba si vzˇdy uchova´- vat vzˇdy vsˇechny objekty typu Scriptable nadrˇazeny´ch bloku˚a aktua´lnı´ho bloku pro spra´vne´vytvorˇenı´seznamu promeˇnny´ch. Podstatnou veˇcı´, na kterou si je trˇeba da´t pozor, je aby metody pouzˇite´pro komunikaci s trˇı´- dou vla´kna byly synchronizovane´a trˇı´da interpretru beˇzˇela v samostatne´m vla´kneˇ. Zde pozor rozhranı´ org.eclipse.debug.core.model. IThread pou- zˇı´vane´pro vytvorˇenı´vla´kna v ladı´cı´m cı´li nema´nic spolecˇne´ho se trˇı´dou java.lang.Thread, ve ktere´je trˇeba pustit interpretr.

Vzda´lene´ladeˇnı´

Vytvorˇeny´modul dovoluje pouze ladeˇnı´skriptu spusˇteˇne´ho v interpretru prˇı´mo uvnitrˇEclipse. Eclipse vsˇak umozˇnˇuje do modulu prˇidat vzda´lene´ ladeˇnı´. Toznamena´napojenı´se na jiny´proces, ktery´zajisˇt’ujefunkci interpre- tru. Tento proces mu˚zˇe beˇzˇet na stejne´m nebo jine´m pocˇı´tacˇi. Komunikace mezi Eclipse a vzda´leny´m interpretrem se veˇtsˇinou rˇesˇı´pomocı´sı´t’ove´ho spojenı´. Jak je zrˇejme´z prˇedchozı´ho textu, je rozhranı´pro ladeˇnı´v Eclipse cel- kem obecne´. Hlavnı´m proble´mem tedy je jak propojit Eclipse se vzda´leny´m ladı´cı´m programem. Avsˇak i zde se nabı´zı´ neˇkolik mozˇnostı´ jak to udeˇ- lat. U kazˇde´mozˇnosti je trˇeba naprogramovat samostatny´ladı´cı´program postaveny´na Rhinu a komunikujı´cı´pomocı´TCP/IP, soketu˚nebo jinou ces- tou, kterou mu˚zˇe Eclipse vyuzˇı´t. Je take´trˇeba vytvorˇit trˇı´du, ktera´bude komunikovat s ladı´cı´m programem. Prvnı´mozˇnostı´je vytvorˇit novy´ladı´cı´typ. To sebou prˇina´sˇı´prˇı´padne´ vytvorˇenı´nove´skupiny konfiguracˇnı´ch za´lozˇek, ladı´cı´ho cı´le a vla´kna. Tato mozˇnost prˇina´sˇı´nejvı´ce programova´nı´. Nenı´vsˇak zde trˇeba da´vat pozor a rozmy´sˇlet jak zajistit, aby meˇly trˇı´dy spolecˇna´ rozhranı´ jina´ nezˇ ktera´ doda´va´Eclipse. Trˇı´da komunikujı´cı´s ladı´cı´m programem zde mu˚zˇe by´t samostatnou trˇı´dou spojenou s trˇı´dou vla´kna nebo prˇı´mo trˇı´da vla´kna. Druhou mozˇnostı´je mı´t stejny´typ konfigurace jako pro spousˇteˇnı´a lo- ka´lnı´ladeˇnı´, ale mı´t rozdı´lny´ladı´cı´cı´l. To prˇina´sˇı´skoro stejne´mnozˇstvı´ programova´nı´jako v prˇedchozı´m prˇı´padeˇ. Je totizˇsta´le trˇeba naprogramo- vat panel pro konfiguraci vzda´lene´ho ladeˇnı´a rozsˇı´rˇit typ konfigurace, aby nastavenı´z tohoto panelu doka´zal prˇedat ladı´cı´mu cı´li. Dalsˇı´ mozˇnostı´ je posunout rozdı´lnost azˇ na u´rovenˇ ladı´cı´ho vla´kna. V tomto prˇı´padeˇ je nutne´ naprogramovat specia´lnı´ ladı´cı´ vla´kno, panel konfigurace vzda´lene´ho ladeˇnı´a do ostatnı´ch trˇı´d prˇidat jen propagova´nı´ teˇchto informacı´ladı´cı´mu vla´knu. Tato varianta je dle meˇnejlepsˇı´, protozˇe

33 4. MODUL RHINOJS umozˇnˇuje mı´t trˇı´du interpretru a trˇı´du komunikujı´cı´se vzda´leny´m ladı´- cı´m programem propojenou nebo zabalenou prˇı´mo v prˇı´slusˇne´m ladı´cı´m vla´kneˇ.

Obra´zek 4.20: Sche´ma rozhranı´pro vzda´lene´ladeˇnı´

Poslednı´mozˇnostı´je vytvorˇit specia´lnı´rozhranı´, ktere´bude implemen- tova´no jak v trˇı´deˇinterpretru tak, v trˇı´deˇkomunikujı´cı´s ladı´cı´m programem. Prˇes toto rozhranı´pak mu˚zˇe komunikovat ladı´cı´vla´kno s teˇmito trˇı´dami. Dı´ky tomu stacˇı´mı´t jen jedno ladı´cı´vla´kno.

34 Kapitola 5 Za´veˇr

Cı´lem pra´ce bylo vytvorˇit modul obsahujı´cı´editor a mozˇnost ladit skripty napsane´v jazyce JavaScript. Vytvorˇeny´modul RhinoJS zpracova´va´oba tyto cı´le. Editor v modulu obsahuje za´kladnı´vlastnosti pro editaci skriptu˚. La- deˇnı´take´podporuje za´kladnı´vlastnosti a take´mozˇnost spousˇteˇnı´v neladı´- cı´m mo´du. Kromeˇpopisu modulu jsou v textu uvedeny mozˇnosti jak modul rozsˇı´rˇit o vzda´lene´ladeˇnı´. Kromeˇpopisu vytvorˇene´ho modulu jsou v textu take´uvedeny za´klady tvorby modulu˚pro Eclipse. Popis tvorby modulu˚je rozsˇı´rˇen o seznam jizˇ existujı´cı´ch modulu˚, ktere´majı´podporu jazyka JavaScript, jejich vy´hody a nevy´hody. Je zde take´uveden za´kladnı´popis jazyka JavaScript a nejpou- zˇı´vaneˇjsˇı´implementace jeho interpretru. Seznam interpretru˚je rozdeˇlen na ty, ktere´jsou psane´prˇı´mo pro prohlı´zˇecˇe a ty, ktere´jsou psane´obecneˇ. In- terpretry psane´prˇı´mo pro prohlı´zˇecˇe totizˇobsahujı´rozsˇı´rˇenı´, ktera´se beˇzˇneˇ v prohlı´zˇecˇı´ch pouzˇı´vajı´, ale nejsou soucˇa´stı´specifikace.

35 Literatura

[1] Javascript. http://en.wikipedia.org/wiki/JavaScript.

[2] Ecmascript. http://en.wikipedia.org/wiki/ECMAScript.

[3] ECMA General Assembly. ECMAScript Language Specification. ECMA, 114 Rue du Rhoˆne, CH-1204 Geneva, Switzerland, Dec 1999. http://www.ecma.ch, Standard ECMA-262, 3rd Edition.

[4] David Majda. Do hlubin implementacı´javascriptu. Nov 2008. http://zdrojak.root.cz/serialy/do-hlubin-implementaci-javascriptu/.

[5] List of engines. http://en.wikipedia.org/wiki/List of ECMAScript engines.

[6] Server-side javascript. http://en.wikipedia.org/wiki/Server-side JavaScript.

[7] Eclipse.org home. http://www.eclipse.org/.

[8] Eclipse project. http://www.eclipse.org/eclipse/.

[9] Eclipse platform. http://www.eclipse.org/platform/.

[10] Osgi. http://en.wikipedia.org/wiki/OSGi.

[11] Eclipse documentation. http://help.eclipse.org/ganymede/index.jsp.

[12] Bolour Computing Azad Bolour. Notes on the eclipse plug-in archi- tecture. Jul 2003.

36 5. ZA´VEˇ R

http://www.eclipse.org/articles/Article-Plug-in- architecture/plugin architecture.html.

[13] Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. De- sign Patterns: Elements of Reusable Object-Oriented Software. Addison- Wesley Professional, Oct 1994.

[14] Rhino: Javascript for java. http://www.mozilla.org/rhino/.

[15] Prashant Deva. Folding in eclipse text editors. Mar 2005. http://www.eclipse.org/articles/Article-Folding-in-Eclipse-Text- Editors/folding.html.

[16] IBM OTI LabS Joe Szurszewski. We have lift-off: The launching fra- mework in eclipse. Jan 2003. http://www.eclipse.org/articles/Article-Launch-Framework/launch.html.

[17] IBM Rational Software Group Darin Wright and Predictable Software Bjorn Freeman-Benson. How to write an eclipse debugger. Aug 2004. http://www.eclipse.org/articles/Article-Debugger/how-to.html.

[18] Rhino documentation. https://developer.mozilla.org/en/Rhino documentation.

[19] David Flanagan. JavaScript: The Definitive Guide, Fourth Edition. O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472, USA, Jan 2002.

[20] Dan Rubel Eric Clayberg. Eclipse: Building Commercial-Quality Plug-ins, 2nd Edition. Addison-Wesley Professional, Mar 2006.

37