OpenCTI
Programátorská dokumentace Verze 1.3
Tereza Cihelková, Jakub Faryad, Štěpán Vávra Matematicko-fyzikální fakulta, Univerzita Karlova v Praze Vedoucí projektu: Ing. Aleš Černošek, Ph.D. 2.6.2010
OpenCTI
Programátorská dokumentace
Obsah 1
2
Úvodem ....................................................................................................................................................... 3 1.1
Co je obsahem.................................................................................................................................. 3
1.2
Související dokumenty ................................................................................................................. 3
1.3
Pokyny ke čtení ............................................................................................................................... 3
Klientská strana....................................................................................................................................... 4 2.1
2.1.1
Přenos dat mezi aplikací a serverem ............................................................................. 4
2.1.2
Charakteristika jazyka JavaScript ................................................................................... 5
2.2
Významné vlastnosti nástroje Dojo Toolkit ......................................................................... 5
2.2.1
Dojo parser .............................................................................................................................. 6
2.2.2
Objekty Dojo Toolkit ............................................................................................................ 7
2.3
Zavedení aplikace v prohlížeči .................................................................................................. 7
2.4
Přihlášení uživatele ....................................................................................................................... 8
2.5
Popis JavaScriptových struktur ................................................................................................ 8
2.5.1
Hlavní objekty aplikace ....................................................................................................... 8
2.5.2
Layout ........................................................................................................................................ 8
2.5.3
Panel Průzkumník se stromem projektů ..................................................................... 9
2.5.4
Pracovní plocha (workspace) ........................................................................................... 9
2.5.5
Rošíření a oprava modulů dijit...................................................................................... 12
2.5.6
Dokovatelné nástroje ........................................................................................................ 12
2.5.7
Vícejazyčnost........................................................................................................................ 13
2.5.8
Zprávy vyžadující akci uživatele................................................................................... 14
2.5.9
Ovládání stavového řádku .............................................................................................. 14
2.6 3
OpenCTI jako ajax aplikace ........................................................................................................ 4
Grafické rozvržení stránky ...................................................................................................... 14
Serverová část aplikace ..................................................................................................................... 15 3.1
Obecný průběh obsluhy požadavku..................................................................................... 15
3.2
Obslužné třídy .............................................................................................................................. 15
3.2.1
Vytvoření obslužné třídy ................................................................................................. 16
3.2.2
Seznam obslužných tříd ................................................................................................... 16
3.2.3
Javadoc ................................................................................................................................... 17
1
OpenCTI 3.3
4
Komunikace s Idiom WorldServerem ................................................................................. 17
3.3.1
Java knihovna systému Idiom WorldServer ............................................................ 17
3.3.2
Omezení knihovny Idiom WorldServeru .................................................................. 18
Rozhraní mezi serverovou a klientskou částí OpenCTI ........................................................ 19 4.1
5
Programátorská dokumentace
Popis rozhraní .............................................................................................................................. 19
4.1.1
Seznam všech projektů .................................................................................................... 19
4.1.2
Zalogování uživatele.......................................................................................................... 20
4.1.3
Ukládání překladů .............................................................................................................. 20
4.1.4
Získání překladů pro editor ........................................................................................... 21
4.1.5
Seznam úkolů v projektu ................................................................................................. 22
4.1.6
Ověření platnosti tokenu uživatelské relace ........................................................... 22
4.1.7
Komentáře k segmentu .................................................................................................... 23
4.1.8
Historie překladů segmentu .......................................................................................... 23
4.1.9
Fuzzy shody segmentu ..................................................................................................... 24
4.1.10
Termíny k segmentu ......................................................................................................... 24
4.1.11
Uživatelské preference ..................................................................................................... 25
4.1.12
Uložení uživatelských preferencí ................................................................................. 25
4.1.13
Registrace nového uživatele .......................................................................................... 26
4.1.14
Seznam všech pracovních skupin a jazyků ............................................................... 27
4.1.15
Resetování hesla ................................................................................................................. 27
4.1.16
Vyhledání řetězce ............................................................................................................... 27
4.1.17
Přidání komentáře k segmentu..................................................................................... 28
Přílohy ...................................................................................................................................................... 29 5.1
Obrázky ........................................................................................................................................... 29
5.2
Použité termíny a zkratky ....................................................................................................... 30
2
OpenCTI
Programátorská dokumentace
1 Úvodem 1.1 Co je obsahem Tento dokument je programátorskou dokumentací projektu OpenCTI. Při jeho čtení by měl čtenář získat představu o architektuře aplikace. Tento dokument dává do souvislostí jednotlivé funkce a jejich komentáře ve zdrojových kódech.
1.2 Související dokumenty Tento dokument je jednou ze čtyř částí komplexní dokumentace projektu OpenCTI. Ta se sestává z následujícího: •
Projektová dokumentace: popisuje proces vývoje projektu OpenCTI od zadání až do spuštění verze 1.3
•
Instalační dokumentace: vysvětluje, jak nainstalovat a používat OpenCTI na straně serveru
•
Programátorská dokumentace: popisuje architekturu a implementaci OpenCTI ve verzi 1.3
•
Uživatelská dokumentace: vysvětluje, jak OpenCTI používat na straně klienta
1.3 Pokyny ke čtení V druhé kapitole toho dokumentu je popsaná klientská část OpenCTI. V ní je podrobnější úvod do používání nástroje Dojo Toolkit a to kvůli tomu že tento nástroj poměrně výrazným způsobem mění způsob používání jazyka JavaScript. Za tímto úvodem je rozebrána architektura aplikace. Třetí kapitola pojednává o serverové části OpenCTI Popis rozhraní mezi klientskou částí a serverovou částí OpenCTI je ve čtvrté kapitole. Závěrem tohoto dokumentu jsou přílohy. Důležité jsou obrázky objasňující některé skutečnosti rozebírané v této dokumentaci.
3
OpenCTI
Programátorská dokumentace
2 Klientská strana Klientskou částí OpenCTI se rozumí webová aplikace postavená na technologiích Java Servlet Pages, XHTML (podrobněji viz 2.2.1.1), CSS 2.0, JavaScript 1.2. Tato část se na straně klienta spouští ve webovém prohlížeči, a to za pomoci skriptovacího jazyka JavaScript a nástroje Dojo Toolkit (dále jen DT). Popis adresářové struktury: / |- pom.xml `- WebContent | |- images |- WEB-INF | |- jspf | | |- design | | | `- wsfragments |
| | ||| ||`-
|
`- html
Maven2 build script adresář s obrázky html fragmenty určující vzhled html části pracovní plochy
ostatní html kód
|- lib `- web.xml META-INF js `- modules style lib index.jsp
knihovny deployment descriptor adresář s JavaScriptovými soubory adresář se styly knihovny
2.1 OpenCTI jako ajax aplikace Klient OpenCTI je webovou ajaxovou aplikací. To znamená, že značné množství dotazů z prohlížeče/klienta na server je realizováno asynchronně, na pozadí webové stránky. Na začátku uživatelské relace1 si prohlížeč stáhne přes http protokol celou aplikaci, a dále se již veškerá komunikace odehrává na pozadí2. Komunikace na pozadí probíhá tak, že se jako reakce na nějakou uživatelskou akci (např. kliknutí na odkaz na stránce) zašle serveru na pozadí dotaz a přijmou se nová data, na základě kterých skript v prohlížeči stránku změní. Zobrazí například doposud skrytou část tabulky, či vyplní grafické objekty novým textem. Grafický popis komunikace je znázorněn viz Obrázek 2, Přílohy.
2.1.1 Přenos dat mezi aplikací a serverem Typickým formátem dat, který se při asynchronních voláních na server používá, je XML. V rámci projektu jsme zvolili novější formát JSON. Jeho výhoda je v tom, že je úspornější 1
Uživatelskou relací se rozumí plynulé používání aplikace v konkrétním časovém úseku. V některých případech se stránka přenačítá úplně celá z důvodu zásadních změn funkčnosti aplikace – děje se tak při přihlášení/odhlášení nebo při změne jazykové mutace. 2
4
OpenCTI
Programátorská dokumentace
vzhledem k velikosti výsledných přenášených dat než XML. Navíc data v něm reprezentovaná přesně kopírují strukturu objektů či polí v JavaScriptu, což znamená, že libovolná struktura v tomto formátu je jednoduše převoditelná do objektu JavaScriptu pomocí funkce eval, která je podporována všemi významnými prohlížeči3. Syntaxe JSON je popsána v RFC 4627. Tomuto formátu jsou věnovány stránky 4, na kterých je možné stáhnout parsery5 pro klientskou stranu, jež umožňují převod objektů JavaScript do JSON a zpět. Takový parser využívá také DT použitý v OpenCTI. Výše zmíněné stránky nabízejí rovněž parsery pro serverovou část webových aplikací, a to buď formou odkazu na projekty těchto nástrojů, popřípadě k přímému stažení. Námi vypracovaný projekt využívá i Java implementaci JSON parserů (viz3. Serverová část ), jež je volně dostupná na internetu6.
2.1.2 Charakteristika jazyka JavaScript Problematickým prvkem JavaScriptu je to, že neexistuje pouze jedna jeho implementace. Téměř každý autor internetových prohlížečů si vytváří vlastní interpreter JavaScriptu, který se navíc často liší i dle jednotlivých verzí. Tak dochází k tomu, že syntaxe JavaScriptu a jeho objektový model jsou v jádru stejné (v souladu s doporučeními W3C), nové a okrajové vlastnosti ovšem bývají v prohlížečích rozdílné. Z tohoto důvodu vyrábí různé skupiny vývojářů po celém světě takové nástroje (frameworky), které stírají odlišnosti různých interpreterů JavaScriptu v prohlížečích. Pro projekt OpenCTI byl zvolen nástroj Dojo Toolkit. Další charakteristikou jazyka JavaScript je to, že ač se jeví jako objektový jazyk, nesplňuje principy objektově orientovaného programování, jako je dědičnost. I v tomto směru se některé nástroje snaží vyplnit vzniklou trhlinu. Například DT nabízí svou vlastní nadstavbu nad JavaScriptem nabízející některé prvky OOP. Část OpenCTI je zejména z důvodu modularity a přehlednosti kódu naprogramována s využitím této nadstavby (viz 2.5.4.2).
2.2 Významné vlastnosti nástroje Dojo Toolkit Motivací k použití DT v OpenCTI byly zejména negativní vlastnosti jazyka JavaScript popsané v 2.1.2. V tomto oddíle zmíníme možnosti jeho využití. Všechny funkce DT jsou poskytovány jako metody objektů dojo, dijit či dojox. Objekt dojo a jeho metody jsou označovány jako jádro DT. Poskytují jak funkce, které stírají rozdíly implementací JavaScriptu v rámci jednotlivých prohlížečů, tak i množství jiných užitečných funkcí. Objekt dijit slouží k obohacení stránek o nové grafické prvky 3
http://www.w3schools.com/jsref/jsref_eval.asp http://www.json.org 5 Tyto parsery nahrazují funkci eval zmíněnou na začátku 2.1.1, která by byla schopná formát json rozparsovat také. Nicméně takovýto parser by nebyl odolný vůči chybám ve formátu či podstrčení nějakých spustitelných dat. 6 http://www.json.org/java/index.html 4
5
OpenCTI
Programátorská dokumentace
(komponenty) a nabízí k nim množství potřebných funkcí. A poslední zmíněný objekt dojox zprostředkovává experimentální funkce DT. Podmínkou pro použití DT je, aby byl v hlavičce html stránky (jako zdrojový kód JavaScriptu) přilinkován soubor dojo.js. Další funkcionality, které nejsou obsaženy v souboru dojo.js, se do aplikace přidávají voláním dojo.require, která do prohlížeče stáhne další soubory, a to jak ty se skripty tak i například soubory html šablon či různé konfigurační soubory.
2.2.1 Dojo parser Cílem návrhářů DT bylo vytvořit takový nástroj, který bude snadno využitelný pro začátečníky v oblasti vývoje webových stránek. Obohatili tedy html značky o nové atributy. Nad tímto html, kterému běžný prohlížeč nerozumí, se na straně klienta spustí v JavaScriptu dojo parser. Ten v rámci struktury DOM7 přemění objekty vzniklé ze značek s novými atributy do zcela jiné podoby, které prohlížeč rozumí. Pro ilustraci kód
bude mít díky atributu dojoType za následek vytvoření tabulky, kde je možné dynamicky řadit obsahy sloupců podle abecedy. To znamená, že dojo parser takový objekt spojí s některými obslužnými funkcemi, přidá k němu grafické styly a doplní DOM strom o nové objekty. 2.2.1.1 Dojo a XHTML DTD S použitím html rozšíření DT se stránky stávají nevalidními. Mohlo by se zdát, že tento fakt jde proti záměru DT smazat rozdíly mezi různými prohlížeči. Na stránkách DT se deklaruje, že DT podporuje všechny majoritní prohlížeče, proto v tomto projektu bylo ustoupeno od striktního požadavku na XHTML validní kód. OpenCTI podporuje právě jen ty prohlížeče, které jsou podporovány DT. U ajaxových aplikacích může být požadavek na validitu titulní stránky vyřešen i tak, že html kód je zcela jednoduchý a obsahuje malý skript, který po spuštění v prohlížeči zajistí, že se zbytek (třeba nevalidní) aplikace nahraje prostřednictvím asynchronních volání. V takovém případě je validita kódu relativní a ve výsledku nemá vliv na funkci aplikace v podporovaných prohlížečích.
7
DOM je objektový model prvků stránky. Tyto prvky vznikají buďto přímo z html značek či dynamicky prostřednictvím skriptů.
6
OpenCTI
Programátorská dokumentace
Objekty vytvořené díky upravení html jazyka lze vytvořit i přímo v JavaScriptu (takzvaně programaticky). Znamená to, že stránka může být XHTML validní 8 a nemusí se nad stránkou po načtení v prohlížeči pouštět dojo parser (2.2.1).
2.2.2 Objekty Dojo Toolkit Datové sklady v dojo.data Objekty z této skupiny drží data, jež poskytují jiným DT objektům. Vše je realizováno tak, že implementují rozhraní dojo.data.api.Read, a jiné standardní DT objekty jsou tak schopné tento sklad dat používat. Typicky je takový sklad naplněn daty přijatými ze serveru po ajaxovém volání. Drží si je třeba až do doby, než dojde ke zrušení či znovunačtení stránky. Pokud sklad implementuje rozhraní dojo.data.api.Write, je možné v takovém skladu data měnit. Tato data lze pak ajaxovým voláním zaslat zpět na server, což znamená implementovat metodu dojo.data.api.Write._saveCustom či dojo.data.api.Write._saveEverything. Modely charakterizující zobrazení dat ze skladů v grafických objektech dojo Modely slouží k tomu, aby bylo možné jednoduchým způsobem měnit charakter složitějších grafických objektů DT. Prostřednictvím modelů se definuje vzhled grafického objektu, způsob použití datových skladů a také to, jaké sklady mají být použity. Modely spojují grafickou a datovou stránku komponent. Grafické objekty z balíčků dojox a dijit Některé grafické objekty DT slouží k umístění dalších komponent. Přitom jsou samy schopné interagovat s uživatelem. Jiné objekty se při použití zobrazí jako záložky a bez složitých zásahů programátora je přímo podporováno i přepínání mezi nimi. U dalších objektů je možné pomocí myši měnit jejich velikost či pozici na stránce. Důležitou skupinou objektů jsou komponenty, jež zobrazují data právě s použitím datových skladů. Například objekt dijit.Tree podporuje stromové zobrazení dat s rozbalitelnými prvky (obdobné jako při zobrazení adresářů a dat ve stromové struktuře). Třída dojox.grid.DataGrid pak umožňuje zobrazení dat v tabulce, jež se sama umí starat o třídění dat podle sloupců a dále pak o skrytí a zobrazení sloupců podle výběru uživatele.
2.3 Zavedení aplikace v prohlížeči Po přístupu na adresu, která vrátí soubor WebContent/index.jsp, se v prohlížeči zobrazí splash screen (common.shield.up). Některé prohlížeče spustí JavaScript obsažený na stránce ještě před tím, než dojede k jejímu plnému natažení. Z tohoto důvodu nabízí DT metodu dojo.adOnload, která nadefinované funkce spustí až ve chvíli, kdy je stránka kompletně stažena. Takto je i v OpenCTI zaregistrovaná anonymní inicializační rutina definovaná v souboru js/dojorequirements.js. Z ní se především 8
Dojo atributy html jazyka nejsou součástí žádných schémat XHTML
7
OpenCTI
Programátorská dokumentace
konstruují grafické DT komponenty, jež se začleňují do DOM struktury stránky. Jakmile je grafická proměna stránky kompletní, probíhá přihlášení uživatele. Pokud je v souborech cookie z předchozí relace uložen autentizační token, prohlížeč se jej pokusí ověřit voláním context.user.validateContext na server. V případě, že volání není úspěšné, je zřízena anonymní relace. V opačném případě je kontext relace úspěšně ověřen a uživatel z předchozí relace bude stále přihlášen. Posledním krokem je pak naplnění datových skladů, které slouží jako zdroj dat pro seznamy projektů. K tomu dojde prostřednictvím volání getProjects (viz 4.1.1).
2.4 Přihlášení uživatele Přihlášení uživatele probíhá tak, že data, vyplněná v přihlašovacím okně, jsou v rámci metody context.user.logInUser odeslána na server s požadavkem na stránku DEFS.AJAX.LOGIN_PAGE. V případě, že je uživatel autentizován, je na tento dotaz vrácena zpět stránka, na níž se vyhledá token. Ten se uloží do souboru cookie definovaném v DEFS.USER.TOKEN, a následně je stránka automaticky obnovena. Uživatel je pak v rámci zavádění aplikace v prohlížeči přihlášen.
2.5 Popis JavaScriptových struktur 2.5.1 Hlavní objekty aplikace Objekt context, deklarovaný v souboru js/context.js, slouží jako nosný prvek pro většinu dalších objektů používaných v klientské části aplikace OpenCTI. Motivací takového návrhu je přehledné umístění JavaScriptových objektů, které zastupují různé entity a elementy jak v GUI, tak i v pozadí běhu aplikace. A dále pak určitá analogie k používání funkcí DT přes jeho tři globální objekty. Objekt common sdružuje běžné objekty a funkce, které nejsou úzce spjaté s objektovým modelem aplikace a používají se na více místech. Je implementován v souboru js/common.js.
2.5.2 Layout Třída Layout, jejíž instance je dostupná jako context.layout, je základem pro všechny objekty zastupující graficky viditelné prvky GUI. V rámci inicializace instance této třídy probíhá konstrukce některých dijit objektů a spouštějí se init metody objektů treeexplorer a explorer. Těm byly z důvodu lepší přehlednosti vyčleněny vlastní třídy. Třída: Layout (js/layout.js) Dostupnost: context.layout
8
OpenCTI
Programátorská dokumentace
2.5.3 Panel Průzkumník se stromem projektů Tato část obrazovky je implementována zejména v souboru js/treeexplorer.js. Obsah záložky s možností procházet top projekty, projekty a jejich úkoly je v objektu Treeexplorer.gridTopProjects. Tento objekt je instancí třídy dijit.Tree, která na základě nadefinovaného modelu treeexplorer.modelTopProjects zobrazuje prvky skladu dojo.data.ItemFileReadStore deklarovaného v context.stores.project. Objekt Treeexplorer.gridLanguages používá stejný sklad, ovšem jiný model, a to Treeexplorer.modelLanguages. Každý uzel projektu si po kliknutí stáhne ze serveru data úkolů (pokud ještě nebyla natažena). To je realizováno v rámci ošetřování událostí v metodě Treeexplorer.event. Výsledný sklad pro každý úkol je uložen v poli context.stores.tasks a identifikován pomocí jedinečného id projektu. Sklady úkolů jsou instancí třídy dojo.data.ItemFileReadStore. HTML id: projectBrowserTab (WEB-INF/jspf/design/explorer.jspf) Třída: Treeexplorer (js/treeexplorer.js) Dostupnost: context.layout.treeexplorer
2.5.4 Pracovní plocha (workspace) Hlavními prvky pracovní plochy jsou záložky. Jedná se o proměnné dijit objektu dijit.layout.TabContainer, který realizuje jejich přepínání a správné zobrazování. Pracovní plocha je v html objektech stránky vázána na div s id workspaceTabContainer. Samotné záložky jsou instancemi tříd dijit.layout.ContentPane či dijit.layout.BorderContainer. Vytvoření těchto instancí zajišťuje metoda Layout.init. HTML id: workspaceTabContainer (WEB-INF/jspf/design/workspace.jspf)
2.5.4.1 Záložka Průzkumník Jedná se o záložku, která umožňuje zobrazení jak projektů, tak úkolů, a to v závislosti na tom, jaký uzel je v záložce Průzkumník právě aktivní. Záložku Průzkumník realizuje třída Explorer dostupná v context.layout.explorer. Projekty a úkoly jsou v záložce zobrazeny prostřednictvím tabulky dojox.grid.DataGrid. Ta využívá stejné datové sklady jako panel Průzkumník (2.5.3). Úkolem třídy Explorer je v případě kliknutí na nějaký úkol ošetřit událost metodou Explorer.event a dále vyvolat záložku Editor (2.5.4.2). HTML id: explorerTab (WEB-INF/jspf/design/wsfragments/explorer.jspf) Třída: Explorer (js/explorer.js) Dostupnost: context.layout.explorer
2.5.4.2 Záložka Editor Editor je napsán s využitím prostředků OOP, které poskytuje DT. Převážná část editoru je napsána jako modul opencti.editor ve kterém hraje nejdůležitější roli třída
9
OpenCTI
Programátorská dokumentace
(dále místy jen PagedEditor). O integraci této třídy s aplikací se starají metody třídy Editor. opencti.editor.PagedEditor
Třída Editor Editor zajišťuje inicializaci objektu PagedEditor, kde se v závislosti na tom jestli je uživatel přihlášen definuje datový sklad podporující či nepodporující modifikaci prvků. V metodě Editor.init se nastavuje navázání událostí nad prvky objektu PagedEditor pomocí volání dojo.connect. Nejdůležitějšími událostmi jsou operace nad řádky editoru (Editor.eventEditor), které působí změnu panelu Nástroje (2.5.6). V této třídě je ještě implementována logika přecházení mezi úkoly (Editor.gotoTask) při dosažení první či poslední stránky se segmenty pro určitý úkol. HTML id: editorTab (WEB-INF/jspf/design/wsfragments/editor.jspf) Třída: Editor (js/editor.js) Dostupnost: context.layout.editor
Modul opencti.editor Hlavní třídou modulu je již zmíněná opencti.editor.PagedEditor. Je potomkem tříd dijit._Widget a dijit._Templated, což znamená že třída obsahuje metody zajišťující funkční chování vůči jiným komponentám dijit a pak, že je to třída se šablonou. V šabloně se specifikuje html struktura třídy. Znamená to, že každá instance třídy PagedEditor obsahuje i strom DOM objektů (PagedEditor.domNode), který je potřeba umístit někam na samotnou webovou stránku. To se typicky dělá už při vytváření její instance specifikováním identifikátoru tagu, kde má být editor vykreslen. Zásadní výhodou použití šablony je ta, že jednotlivé tagy html šablony lze jednoznačně identifikovat pomocí atributu dojoAttachPoint (např. dojoAttachPoint=‘apTextareaNodes’). Takové html elementy jsou pak dostupné přímo jako prvky instance třídy (např. PagedEditor.apTextareaNodes). Samotná šablona, která je specifikována v samostatném souboru, se do prohlížeče dostává prostřednictvím ajax dotazu. Třída PagedEditor je kontejnerem pro řádky editoru, ke kterým nabízí funkce jako přecházení mezi stránkami, ovládací panel s různými tlačítky. PagedEditor nepracuje s řádky editoru přímo, ale prostřednictvím abstraktní třídy opencti.editor.AbstractEditorRow. Dále PagedEditor poskytuje prostředky k řešení souběžných úprav jednoho konkrétního segmentu více uživateli pomocí metod PagedEditor._ceSaveCustom a hlídá aby si uživatel omylem nezrušil zatím neuložené překlady v PagedEditor.showDialogBoxIfLeavingUnsavedWork. Třída ExtendedEditor doplňuje svého předka PagedEditor o možnost zobrazit markup (text mezi jednotlivými segmenty z výchozího souboru). To zejména realizuje metoda ExtendedEditor.addRow, která mezi jednotlivé řádky původního editoru vkládá nové. Třída opencti.editor.AbstractEditorRow svým potomkům nabízí prostředky jak synchronizovat viditelný obsah jejich objektů (text) s datovým skladem třídy 10
OpenCTI
Programátorská dokumentace
PagedEditor.
Dále pak implementuje některé události nad řádky editoru (například zkratky, programatické vkládání textů do řádků, práci s kurzorem). Od svých potomků vyžaduje, aby hlavně specifikovaly html šablonu a implementovali některé potřebné metody. V editor tabu je jako potomek výše popsané abstraktní třídy použita třída opencti.editor.PagedEditorRow, používající šablonu templates/PagedEditorRow.html se dvěma buňkami pro každý řádek editoru – zdrojový a cílový text. Pro lepší pochopení použití tříd modulu opencti.editor slouží obrázekObrázek 1(viz 5.1). Datový sklad je v závislosti na tom, zda mají být překlady editovatelné, instancí dojox.data.QueryReadStore či example.data.QueryWriteStore. HTML id: gridEditor (WEB-INF/jspf/design/wsfragments/editor.jspf) Třída: opencti.editor.PagedEditor (js/modules/opencti/editor/PagedEditor.js) Šablona: js/modules/opencti/editor/templates/PagedEditor.html Dostupnost: context.layout.editor.grid
2.5.4.3 Vyhledávání Hledání a zobrazování výsledků je realizováno třídou Search. Kliknutím na odkaz s lupou (Search) v Projektovém průzkumníkovi se spouští obslužná metoda Search.triggerSearch. Ve třídě Search jsou implementovány metody potřebné pro vytvoření dotazu na server Search.findString a metody integrující moduly z balíčku opencti.editor se zbytkem komponent aplikace. HTML id: searchTab (WEB-INF/jspf/design/wsfragments/editor.jspf) Třída: Search (js/search.js) Dostupnost: context.layout.search
Třída Search obdobně jako editor tab používá editor z balíčku opencti.editor. V tomto případě je ale použito rozšíření třídy PagedEditor a to SortableEditor. Ten navíc umožňuje nastavit uspořádání tabulky podle některého sloupce. Jako Potomek třídy AbstractEditorRow je ve výsledcích vyhledávání použita třída SearchEditorRow s pěti buňkami v jedné řádce editoru. K ní je šablona definována v souboru templates/SearchEditorRow.html. Z výsledků vyhledávání se uživatel po kliknutí na Task ID (Search.openTaskId) dostává do editoru přímo na konkrétní segment. To je realizováno na straně serveru, kde se rozhodne (na základě zaslaných parametrů), jaká stránka se má zobrazit. Pro lepší pochopení použití tříd modulu opencti.editor slouží obrázek Obrázek 1 (viz 5.1).
11
OpenCTI
Programátorská dokumentace
HTML id: searchResults (WEB-INF/jspf/design/wsfragments/searchResults.jspf) Třída: opencti.editor.PagedEditor (js/modules/opencti/editor/SortableEditor.js) Šablona: js/modules/opencti/editor/templates/PagedEditor.html Dostupnost: context.layout.search.grid
2.5.5 Rošíření a oprava modulů dijit Některé komponenty dijit nevyhovují úplně zcela aplikaci OpenCTI. Ty komponenty, které se projevovali jako vadné jsou opravené v modulu opencti.dojofix. U jiných komponent bylo potřeba dosáhnout jiné funkčnosti a ty jsou rozšířeny v modulech opencti.dojoext a opencti.form. Třída PerformanceTextareamění způsob vykreslování původních instancí třídy Textarea, který se v některých prohlížečích projevoval pomalým narůstáním výšky stránky, což vypadalo jako nepěkná animace. narozdíl od svého předka uchovává i data přesně v takovém tvaru v jakém byly přijaty ze serveru. Využívá se v případě, když je třeba nějak charakterizovat data odeslaná ze serveru – například přidáním proměné s informací o obsahu dat. QueryReadStore
zobrazuje stránkovanou nábídku od té stránky kde je zrovna aktuální hodnota komponenty narozdíl od předka, který vždy zobrazoval nabídku od první stránky. (Použito v komponentě opencti.editor.PagedEditor.apPageCount.) SmartFilteringSelect
Třídy ComboBoxDataStoreFixed a ExpandoPaneFixed opravují chybné funkcionality svých předků, které neošetřovali všechny možné stavy komponenty. vytváří odkaz, na který když se klikne, tak se zobrazí předdefinovaný dialog. Je to obměna dijit komponenty DropDownButton a je použitá pro odkaz na přihlášení uživatele. DropDownLink
Komponenta SelectLink také vytváří odkaz, ale místo na dialog je navázaná na vysouvací menu. V OpenCTI je použitá pro nabídku jazyků v záhlaví aplikace.
2.5.6 Dokovatelné nástroje V třídě Dockabletool jsou implementovány funkčnosti panelu Nástroje. Jeho struktura je řešena obdobně jako Pracovní plocha. Jednotlivé záložky jsou tedy typu dijit.layout.ContentPane a nadřazeným objektem jim je element toolTabContainer, který je instancí dijit.layout.TabContainer. Přesouvání nástrojů mezi horizontální a vertikální polohou zajišťují metody dockRight a dockBottom objektu Dockabletools. Přidávání
komentářů dijit.TooltipDialog.
v záložce Komentáře je Odeslání komentáře Dockabletools.addComment.
realizováno přes dijit objekt na server pak metodou
12
OpenCTI
Programátorská dokumentace
V rámci třídy Dockabletool se používá třída SegmentStore, která implementuje logiku správy všech tří záložek. Záložky Historie a Komentáře jsou realizovány instancemi komponenty dojox.grid.DataGrid. Třetí záložka Slovník je jen o něco málo komplikovanější tím, že v ní jsou tyto komponenty dvě. Naplnění každého z těchto dojox objektů je realizováno z datových skladů typu dojox.data.QueryReadStore při ošetření událostí nad segmenty překladů v editoru. HTML id: splitToolBox (WEB-INF/jspf/design/wsfragments/tools.jspf) Třída: Search (js/dockabletools.js) Dostupnost: context.layout.docktools
2.5.7 Vícejazyčnost Aplikaci OpenCTI je možné lokalizovat do jiných jazyků. Řetězce s texty jsou umístěny v souborech v adresáři js/modules/l10n. Tyto řetězce jsou použity modulem DT a v aplikaci jsou nahrazovány dle nastavení uživatele. Výjimku tvoří některé statické html stránky (například nápoveda ke glosáři), které jsou uloženy ve složce html/${jazyk}, kde ${jazyk} je název složky shodující se s jazykem, do kterého jsou stránky přeloženy. Takže třeba soubor html/cs/help.html obsahuje českou nápovědu, soubor html/en/help.html obsah anglickou a podobně. Při načítání se pak do url doplní správný název jazyka (dostupný v proměnné l10n.locale) a tím se do panelu s nápovědou načte lokalizovaný obsah. Balíček opencti.editor používá vlastní sadu souborů s řetězci. A to z toho důvodu, že moduly v něm jsou psány jako DT objekty a ty mají v sobě integrovanou podporu internacionalizace ve větší míře než zbytek aplikace. Konkrétně se jedná o používání dijit šablon v adresáři modules/opencti/editor/templates, u kterých se při parsování nahrazují řetězce tvaru ${CLASS_MEMBER}, respektive ${labels.EDITOR_BUT_PREVIOUS}) za hodnoty proměnných definovaných ve widget, respektive prvky objektu PagedEditor.labels. Tyto prvky se inicalizují ještě před parsováním šablony v konstruktoru PagedEditor.constructor díky metodě dojo.i18n.getLocalization a deklaraci umístěném na začátku souboru - dojo.requireLocalization("opencti", "editor");. 2.5.7.1 Podpora jazyků psaných zprava doleva Aplikace podporuje použití i jazyků, které se zapisují zprava doleva. Tedy cílový překládaný text se zobrazuje se zarovnáním doprava. To se řeší na straně serverové části kde se prostřednictvím java.awt.ComponentOrientation.isLeftToRight zjišťuje orientace jazyka a dále se tato informace předává do klientské části společně s překlady. Aplikace je navržena i tak, že se celá umí zrcadlově převrátit zprava doleva. Už v inicializační metodě l10n.init se nastavují potřebné hodnoty zařizující správné zobrazení. Samotné komponenty si ve svých inicializačních metodách hlídají, zdali se mají vykreslit zprava doleva a na základě toho nastavují css styly a předávají patřičné hodnoty konstruktorům dojo komponent.
13
OpenCTI
Programátorská dokumentace
2.5.7.2 Rozšíření aplikace do nového jazyka V případě rozšiřování aplikace do dalších jazyků je třeba přeložit všechny soubory v adresářích html a **/l10n. Dále pak doplnit pole l10n.supportedLanguages, popřípadě l10n.rtlLocales. Nakonec je třeba přidat v souboru WEBINF/jspf/design/header.jspf v divu s id „selectLang“ odkaz na nově přidaný jazyk.
2.5.8 Zprávy vyžadující akci uživatele Tento prvek aplikace je implementován v třídě Dialogbox ve stejnojmenném souboru. Existují dva druhy okének, která se mohou zobrazit. Okénko s jedním tlačítkem Dialogbox.showDialog a okénko se dvěma tlačítky Dialogbox.showConfirmDialog. Objekt samotný je pak přístupný z globálního objektu common.dialogbox.
2.5.9 Ovládání stavového řádku Stavový řádek slouží k nenásilnému zobrazování zpráv uživateli. Takové zobrazení nevyžaduje od uživatele žádnou reakci. Tyto zprávy mohou být přepsány dalšími v pořadí, proto je třeba je chápat pouze jako informativní. Takový způsob zobrazování zpráv vznikl jako reakce na požadavek komunit, aby byl uživatel při práci co nejméně rušen. V aplikaci je dostupný jako common.statusbar.
2.6 Grafické rozvržení stránky Aplikace je z grafického hlediska rozdělena na tři části: hlavička, průzkumník a pracovní plocha. Jejich umístění v rámci html stránky je dáno souborem index.jsp, respektive soubory header.jspf, explorer.jspf a workspace.jspf, umístěné v adresáři WEBINF/jspf/design. Výskyt těchto tří částí ve výsledné aplikaci je dáno způsobem konstrukcí DT komponent, jenž jsou realizovány v metodě Layout.init.
14
OpenCTI
Programátorská dokumentace
3 Serverová část aplikace Serverová část aplikace slouží jako prostředník mezi klientskou částí a samotným překladatelským systémem: v našem případě Idiom WorldServerem. Přijímá požadavky ze strany klienta, vykoná příslušné akce v překladatelském systému a odpověď, kterou obdrží, posílá zpátky klientovi. Na jedné straně tak umožňuje klientské části aplikace být plně nezávislou na překladatelském systému (pokud dodržuje předepsané rozhraní, které je detailně popsáno v sekci 3), na straně druhé to ale znamená, že při změně překladatelského systému bude potřeba serverovou část celou přepsat. V našem případě je napsána v jazyku Java a pro komunikaci s překladatelským systémem využívá Java knihovny poskytované systémem Idiom WorldServer. Po zkompilování je nasazena jako servlet do HTTP web serveru, podporujícího Javu (např. Apache Tomcat). Popis adresářové struktury: / |- build.xml `- src | |- src | |- org | | |- opencti | | | |- server | | | | `- handler `- lib
ant build script
hlavní třída serveru
třídy pro obsluhu jednotlivých požadavků knihovny
3.1 Obecný průběh obsluhy požadavku Při spuštění web serveru, ve kterém je servlet nasazen, dojde k vytvoření instance třídy org.opencti.server.CommunityServletEx, která je rozšířením třídy WSHttpServlet z knihovny Idiom WorldServeru. Ta obsahuje metodu handle, která je volána při každém požadavku ze strany klienta. Podle typu požadavku vytvoří instanci třídy, která dotyčný požadavek obsluhuje a tu pak zavolá. O zasílaní dat klientovi se starají obslužné třídy samy, jelikož podle typu požadavku se liší i možné typy odpovědí.
3.2 Obslužné třídy Aby bylo možné jednotným způsobem volat obsluhy všech typů požadavků, jsou všechny obslužné třídy rozšířením třídy OpenCtiRequestHandler v balíku org.opencti.server.handler. Tato třída obsahuje metody pro operace společné pro 15
OpenCTI
Programátorská dokumentace
všechny druhy obslužných tříd, jako například kontrola parametrů, formátování chybových výstupů nebo některé často používané operace v Idiom WorldServeru, jako například vyhledání překladatelské úlohy podle id a podobně. Každá obslužná třída má již v názvu obsažen typ požadavku, který obsluhuje, např. HANDLERaddComment obsluhuje požadavek typu “addComment”, HANDLERgetProjects obsluhuje požadavek “getProjects” atd. Tím je umožněno jednoduchým přečtením parametru “type” v požadavku přesně určit, která obslužná třída se má instanciovat.
3.2.1 Vytvoření obslužné třídy Vytvořit třídu obsluhující nový typ požadavku je jednoduché díky šabloně, kterou stačí okopírovat ze souboru README.txt v balíku org.opencti.server.handler do nově vytvořeného souboru HANDLERtypPožadavku.java a •
doplnit do ní názvy parametrů, které musí být součásti požadavku,
• doplnit kód pro načtení jednotlivých parametrů z požadavku podle jejich typu do metody loadParamList(), •
doplnit kód pro samotnou obsluhu do těla metody handleRequest().
Přesný
postup
je
podrobně org/opencti/server/handler.
popsán
v
souboru
README.txt
ve
složce
3.2.2 Seznam obslužných tříd K dispozici jsou následující třídy: HANDLERaddComment – Obsluhuje přidávání komentářů k překladům HANDLERexportTask – Obsluhuje export souborů pro překlad HANDLERfindString – Obsluhuje fulltextové prohledávání překladů HANDLERfindTerms – Obsluhuje správu terminologické databáze HANDLERfuzzyMatch – Obsluhuje získávání podobných překladů pro segmenty HANDLERgetComments – Obsluhuje získávání komentářů pro jednotlivé segmenty HANDLERgetCommunityWorkgroups – Vrací seznam komunitních pracovních skupin HANDLERgetHistory – Obsluhuje získávání historie změn pro jednotlivé segmenty HANDLERgetLocalesAndWorkgroups – Vrací dostupné pracovní skupiny a jazyky HANDLERgetProjectIdFromTask – Vrací Id projektu na základě Id úlohy
16
OpenCTI
Programátorská dokumentace
HANDLERgetProjects – Vrací seznam všech uživatelových projektů HANDLERgetTasks – Vrací seznam všech úloh pro daný projekt HANDLERgetTranslations – Vrací
požadovanou stránku překladů pro danou úlohu
HANDLERgetUserPrefs – Vrací seznam uživatelových nastavení HANDLERregister – Obsluhuje registraci nového uživatele HANDLERresetPassword – Obsluhuje požadavek na obnovu hesla HANDLERsaveTranslations – Obsluhuje ukládání překladů HANDLERterminology – Obsluhuje správu terminologické databáze HANDLERupdateUser – Obsluhuje ukládání změn nastavení uživatele HANDLERvalidateContext
- Slouží pro ověření přihlášení uživatele
3.2.3 Javadoc Podrobný popis všech tříd serverové části OpenCTI a jejich funkcí, vygenerovaný pomocí nástroje Javadoc, naleznete na přiloženém CD v HTML formátu.
3.3 Komunikace s Idiom WorldServerem Pokud to není nevyhnutné, servlet OpenCTI nepracuje přímo s daty v databázi. Využívá k tomu Java knihovny poskytované systémem Idiom WorldServer. Ta zpřístupňuje veškerou funkcionalitu grafického uživatelského rozhraní systému Idiom WorldServer, jako jsou například procházení projektů i jednotlivých segmentů překladů, vytváření nových uživatelů, editaci a filtrace překladů, statistiky počtu přeložených slov, export úkolů pro externí editory a podobně. Podrobný popis funkcí knihovny systému Idiom WorldServer není z licenčních důvodů v tomto dokumentu k dispozici.
3.3.1 Java knihovna systému Idiom WorldServer Jedním z parametrů předávaných obslužným třídám při obsluze požadavku je argument context typu WSContext, přes který lze přistupovat k veškerým datům a funkcím WorldServeru. Důležité a často používané funkce parametru context jsou: – Vrací objekt typu WSUser, který obsahuje veškeré informace o uživateli včetně seznamu preferovaných pracovních skupin a jazyků. context.getUser()
– Vrací objekt typu WSUserManager, sloužící pro správu uživatelů, jazyků, uživatelských rolí a podobně. context.getUserManager()
17
OpenCTI context.getWorkflowManager().getProject(int
Programátorská dokumentace projectId)
– Vrací objekt typu
WSProject, poskytující veškeré údaje o konkrétním projektu. context.getWorkflowManager().getTask(int taskId)
– Vrací objekt typu WSTask,
poskytující veškeré údaje o konkrétní úloze. Zmíněné objekty poskytují většinu metod potřebných pro obsluhu klientských požadavků.
3.3.2 Omezení knihovny Idiom WorldServeru Jediným případem, kdy je nutné obejít funkce knihovny Idiom WorldServeru a pracovat přímo s daty v databázi, je fulltextové vyhledávání v překladatelských úkolech nebo v terminologické databázi (obslužné třídy HANDLERfindString a HANDLERterminology). Vyhledávání na úrovni SQL je totiž řádově rychlejší než postupné procházení segmentů všech úkolů a následné vyhledávání pomocí funkcí jazyka Java pro práci s řetězci.
18
OpenCTI
Programátorská dokumentace
4 Rozhraní mezi serverovou a klientskou částí OpenCTI V této kapitole je popsáno rozhraní komunikace mezi klientskou a serverovou částí OpenCTI. Komunikace probíhá prostřednictvím http protokolu a je realizována z klientské části samotnými datovými sklady, které ve svých metodách fetch přistupují na níže specifikované adresy a plní se nazpět zaslanými daty ve formátu JSON. Kromě datových skladů je toto rozhraní používáno některými částmi OpenCTI přímo přes metody dojo.xhrPost či dojo.xhrGet, respektive common.ajaxSync.
4.1 Popis rozhraní Následující podkapitoly obsahují pro každé rozhraní obecný popis s informacemi kde je volání v aplikaci použito, http adresa volání, popis parametrů. Součástí je i příklad dat zasílaných na server a příklad dat přijatých jako odpověď na dané volání. Popis neodpovídá žádné formální struktuře. Použitým jazykem je angličtina a to z důvodu že v adresách, v parametrech či v příkladech se hojně vyskytují anglická slova či zkratky a pak proto, že tento popis patří ke zdrojovým kódům, které jsou také psány v angličtině.
4.1.1 Seznam všech projektů LIST OF ALL PROJECTS Used in: project tree explorer, project workspace explorer Data for: data store dojo.data.ItemFileReadStore Code location: context.js: context.stores.project URL address: '/ws/ws_ext?servlet=community-servletex&type=getProjects&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_ ' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of received datas: { "items": [ { "id": "wg_1050", "name": "openoffice", "children": [ {"_reference": "pg_1161"}, {"_reference": "pg_1161"} ], "type": "workgroupTopNode" }, { "progress": [ [1, 102, 9661] ], "id": 1162, "name": "Ahlo New", "workgroup": "openoffice", "target": "cs_CZ",
19
OpenCTI
Programátorská dokumentace "type": "projectNode", "projectgroup": "Ahlo New" }
], "label": "name", "identifier": "id" } Description of received data: items: 3 types - reference to a project, reference to project group, project id: wg_{project group id}, pg_{project group id}, l_{project group id}, {project id} - unique node id type: workgroupTopNode, projectgroupTopNode, languageTopNode, projectNode - specify how to use the node progress: percent done, words done, total words target: language target workgroup: workgroup name name: display name projectgroup: where does does project group belongs to label, identifier, items: data store required members
4.1.2 Zalogování uživatele LOGIN PAGE Used in: user login Data for: finding a token Code location: context.user.logIn URL address: "/ws/transport/login?username=_TEMPLATE_USER_&password=_TEMPLAT E_PASSWORD_&submittedBy=transport/login&rand=_TEMPLATE_RAND_" Parameters: username : user name password : user password rand : random number which prevents html response caching Description of received data: Just an ordinary html, token is looked for with a regexp
4.1.3 Ukládání překladů TRANSLATION SAVING Used in: user login Data for: finding a token Code location: context.editor.init URL address: '/ws/ws_ext?servlet=community-servletex&type=saveTranslations&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_ RAND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of sent data: { "identifier": "seg", "label": "seg", "items": [ { "taskId": 1642, "seg": 79, "_tgt": "", "tgt": "Ahoj svete", "src": "Hello World" }
20
OpenCTI
Programátorská dokumentace ], "forceSave": false }
Description of sent data: items: - segments for one task taskId: - task id seg: - segment id - unique segment id src: - source text tgt: - target text _tgt: - unchanged target text label, identifier, items: - data store required members
4.1.4 Získání překladů pro editor TRANSLATIONS FETCHING Code location: context.editor.init Used in: used in editor Data for: data store dojox.data.QueryReadStore or dojox.data.QueryWriteStore Code location: editor.js: context.editor.init URL address: '/ws/ws_ext?servlet=community-servletex&type=getTranslations&rand=_TEMPLATE_RAND_&taskId=_TEMPLATE_T ASKID_&trans=2&start=160&count=80' Parameters: Rand : random number which prevents html response caching taskId : task id trans : filtr type (all segments: 2, non-translated: 1, nonleveraged: 0) start : which segment should be as a first one count : count of segments wanted seq : what sequence should be included on returned page (start parameter is skipped) markup: : if markup should be included in the server’s response Example of received data: { "items": [ { "taskId": 1642, "seg": 2, "tgt": "Ahoj svete!", "src": "Hello World", "dir": "rtl" } ], "label": "seg", "numRows": 2598, "identifier": "seg" } Description of received data: items: - one translation taskId: - task id seg: - segment id - unique segment id src: - source text dir: - target text direction tgt: - target text label, identifier, items: - data store required members
21
OpenCTI
Programátorská dokumentace
4.1.5 Seznam úkolů v projektu TASK FETCHING FOR A PROJECT Used in: project tree explorer, project workspace explorer Data for: data store dojo.data.ItemFileReadStore Code location: context.js: context.stores.project URL address: '/ws/ws_ext?servlet=community-servletex&type=getTasks&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_&pr ojectId=_TEMPLATE_PROJECT_ID_', Parameters: token : valid token for current session rand : random number which prevents html response caching projectId : project id Example of received data: { "items": [ { "progress": [ [ 1, 102, 9661 ] ], "id": 1642, "name": "platform.properties", "path": "\/The first one FS\/cs_CZ\/isThisProject\/platform.properties", "type": "taskNode" } ], "label": "name", "identifier": "id" } Description of received data: items: tasks container id: task id type: taskNode progress: percent done, words done, total words path: file system path name: display name label, identifier, items: data store required members
4.1.6 Ověření platnosti tokenu uživatelské relace CONTEXT (SESSION) REVALIDATION Used in: user logging in Data for: fetching user name, login displayed on the page and token validation Code location: user.js: context.user.logIn URL address: '/ws/ws_ext?servlet=community-servletex&type=validateContext&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_R AND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of received data: { "username": "tester56", "lastname": "Test nov", "firstname": "Tester nove prijeddasdf" } Description of received data: username: user login lastname: Last name of an user
22
OpenCTI
Programátorská dokumentace firstname: First name of an user
4.1.7 Komentáře k segmentu GET COMMENTS FOR A SEGMENT Used in: dockabletools Data for: dojox.data.QueryReadStore Code location: dockabletools.js: context.layout.dockabletools.segmentstore URL address: 'http://localhost:10080/ws/ws_ext?servlet=communityservletex&type=getComments&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_ &taskId=_TEMPLATE_TASKID_&seg=_TEMPLATE_SEGID_' Parameters: token : valid token for current session rand : random number which prevents html response caching segId : id of segment taskId : task id Example of received data: { "items": [ { "id": 3, "author": "tester56", "comment": "Ahoj", "date": "10\/12\/09 2:24 PM" } ], "identifier": "id" } Description of important received data: items: - comments for one segment label, identifier, items: - data store required members
4.1.8 Historie překladů segmentu GET HISTORY FOR A SEGMENT Used in: dockabletools Data for: dojox.data.QueryReadStore Code location: dockabletools.js: context.layout.dockabletools.segmentstore URL address: 'http://localhost:10080/ws/ws_ext?servlet=communityservletex&type=getHistory&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_& taskId=_TEMPLATE_TASKID_&seg=_TEMPLATE_SEGID_' Parameters: token : valid token for current session rand : random number which prevents html response caching seg : id of segment taskId : task id Example of received data: { "items": [ { "author": "Mirek Dusin", "target": "Ahoj svete", "date": "08\/27\/09 2:36 PM", "id": 1
23
OpenCTI
Programátorská dokumentace
} ], "identifier": "id" } Description of important received data: items: - comments for one segment label, identifier, items: - data store required members
4.1.9 Fuzzy shody segmentu GET FUZZY MATCHES FOR A SEGMENT Used in: dockabletools Data for: dojox.data.QueryReadStore Code location: dockabletools.js: context.layout.dockabletools.segmentstore URL address: 'http://localhost:10080/ws/ws_ext?servlet=communityservletex&type=fuzzyMatch&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_& taskId=_TEMPLATE_TASKID_&seg=_TEMPLATE_SEGID_' Parameters: token : valid token for current session rand : random number which prevents html response caching seg : id of segment taskId : task id Example of received data: { "items": [ { "id": 0, "score": "100.0", "tgt": "Mam rad syr a miluji hory.", "src": "I like cheese and I love mountains." } ], "identifier": "id" } Description of important received data: items: - comments for one segment label, identifier, items: - data store required members score: - how much is the item similar to the segment
4.1.10 Termíny k segmentu GET TERMS FOR A SEGMENT Used in: dockabletools Data for: dojox.data.QueryReadStore Code location: dockabletools.js: context.layout.dockabletools.segmentstore URL address: 'http://localhost:10080/ws/ws_ext?servlet=communityservletex&type=findTerms&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_&t askId=_TEMPLATE_TASKID_&seg=_TEMPLATE_SEGID_' Parameters: token : valid token for current session rand : random number which prevents html response caching seg : id of segment taskId : task id
24
OpenCTI
Programátorská dokumentace
Example of received data: { "items": [ { "sourceTerm": "partition", "targetTerms": [ "svazek" ] } ], "identifier": "sourceTerm" } Description of important received data: items: - comments for one segment label, identifier, items: - data store required members
4.1.11 Uživatelské preference GET USER PREFERENCES Used in: changing user settings Data for: a form in the tab Code location: user.js: context.user.preferences.startupPreferences URL address: '/ws/ws_ext?servlet=community-servletex&type=getUserPrefs&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND _' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of received data: { "projects": [ { "id": 2316, "name": "GlassFish" }, { "id": 2745, "name": "MySQL" } ], "locales": [ { "id": 2059, "name": "Finnish" }, { "id": 1021, "name": "French" } ], "userPref": { "updateFormPassword": "*****", "updateFormEmail": "
[email protected]", "updateSelectProjects": [ 2316,2745 ], "updateFormEyeColor": "0", "updateFormConfPassword": "*****", "updateSelectLanguages": [ 1021 ], "updateFormRealName": "Michal" } } Description of important received data: items: - comments for one segment label, identifier, items: - data store required members projects: - all available projects locales: - all available locales updateSelectProjects: - selected projects of an user updateSelectLanguages: - selected languages/locales of an user
4.1.12 Uložení uživatelských preferencí SAVE USER PREFERENCES Used in: changing user settings Data for: a form in the tab Code location: user.js: context.user.preferences.savePreferences
25
OpenCTI
Programátorská dokumentace
URL address: '/ws/ws_ext?servlet=community-servletex&type=updateUser&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of sent data: { "updateFormPassword": "heslo", "updateFormConfPassword": "heslo", "updateFormRealName": "Michal ", "updateFormEmail": "
[email protected]", "updateFormEyeColor": "0", "updateSelectProjects": [ "2345" ], "updateSelectLanguages": [ "1019", "1963" ] } Example of received data: { "status": "User information updated successfully" } Description of important received data: status : Displayable message
4.1.13 Registrace nového uživatele REGISTER A NEW USER Used in: registering a new user Data for: a form in the tab Code location: user.js: context.user.preferences.saveRegister URL address: '/ws/ws_ext?servlet=community-servletex&type=register&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of sent data: { "registerFormUsername": "tester", "registerFormPassword": "heslo", "registerFormConfPassword": "heslo", "registerFormRealName": "Tester Testerovic", "registerFormEmail": "
[email protected]", "registerFormEyeColor": "0", "registerSelectProjects": [ "2249", "2745", "2187", "2761" ], "registerSelectLanguages": [ "1435", "2201", "2188", "1017", "1978" ], "registerFormTerms": [ "Agree" ] } Example of received data: Username allready exists! Description of received data: Text is displayed in a dialog box.
26
OpenCTI
Programátorská dokumentace
4.1.14 Seznam všech pracovních skupin a jazyků GET WORKGROUPS AND LOCALES Used in: registering a new user Data for: a form in the tab - fill select boxes Code location: user.js: context.user.preferences.startupRegistration URL address: '/ws/ws_ext?servlet=community-servletex&type=getLocalesAndWorkgroups&token=_TEMPLATE_TOKEN_&rand=_TE MPLATE_RAND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of received data: { "projects": [ { "id": 2316, "name": "GlassFish" }, { "id": 2249, "name": "JavaFX" }, { "id": 2345, "name": "WebSpaceServer_LifeRay" } ], "locales": [ { "id": 2284, "name": "Albanian" }, { "id": 1435, "name": "Arabic" }, { "id": 2201, "name": "Assamese" } ] }
4.1.15 Resetování hesla PASSWORD RESET Used in: reseting password Code location: user.js: context.user.resetPassword - connected ro reset button URL address: '/ws/ws_ext?servlet=community-servletex&type=resetPassword&username=_TEMPLATE_USERNAME_&token=_TEMPL ATE_TOKEN_&rand=_TEMPLATE_RAND_', Parameters: token : valid token for current session rand : random number which prevents html response caching username : login
4.1.16 Vyhledání řetězce FIND STRING Used in: searching string it the translation memory, used in search results Data for: data store dojox.data.QueryReadStore or dojox.data.QueryWriteStore Code location: user.js: context.search URL address: 'http://localhost:10080/ws/ws_ext?servlet=communityservletex&type=findString&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_& string=_TEMPLATE_STRING_&start=0&count=80' Parameters: token : valid token for current session rand : random number which prevents html response caching string : string to search start : start position count : maximum count of expected results
27
OpenCTI
Programátorská dokumentace
Optional paramaters: workGroupId : work group id taskId : task id projectGroupId : project group id localeId : locale id projectId : project id Optional parameters are used when searching only in a part of translation memory Example of received data: { "items": [ { "id": 1, "taskId": 1642, "project": "Ahlo New", "seg": 1581, "locale": "cs_CZ", "tgt": "", "src": "Either a previous session of the program did not exit correctly, or another instance\nof the program is running on a different computer and using the same user directory.\n" } ], "label": "id", "numRows": 1, "identifier": "id" } Description of received data: Simillar to get translations
4.1.17 Přidání komentáře k segmentu ADD COMMENT Used in: adding a comment for the segment Code location: user.js: context.layout.docktools.addComment - connected to add comment button URL address: '/ws/ws_ext?servlet=community-servletex&type=addComment&token=_TEMPLATE_TOKEN_&rand=_TEMPLATE_RAND_' Parameters: token : valid token for current session rand : random number which prevents html response caching Example of sent data: { "comment": "ahojaa", "segId": 1581, "taskId": 1642 } Description of sent data: segId : segment where comment belongs to taskId : task id where segment belongs to Example of received data: { "status": "Comment saved" }
28
OpenCTI
Programátorská dokumentace
5 Přílohy 5.1 Obrázky Editor s markupem ExtendedEditor
Editor PagedEditor
PagedEditorRow
Výsledky vyhledávání SortableEditor
SearchEditorRow w
AbstractEditorRow
Klient si stáhne soubory knihovny Dojo Toolkit
Klient komunikuje se serverovou částí OpenCTI odkud si stahuje data nejenom pro grafické objekty. Do serverově části klient zasílá všechna data, která se ukládají do databáze.
Dotažení ještě nestažených souborů s definicemi ještě nenatažených části klienta OpenCTI
Ukládání dat na server.
Časová osa
Klient si stáhne klientskou část OpenCTI do prohlížeče
Klientský počítač / http klient (klientská část OpenCTI)
http://serveraddress:port/ws (serverová část OpenCTI)
http://www.googleapis.com (zdrojové soubory dojo)
http://serveraddress:port/opencti (klientská část OpenCTI)
Obrázek 1- ilustrace propojení jednotlivých objektů v balíčku opencti.editor (směr šipek naznačuje dědičnost)
Obrázek 2 – popis průběhu komunikace mezi internetovým prohlížečem a OpenCTI.
29
OpenCTI
Programátorská dokumentace
5.2 Použité termíny a zkratky Dojo Toolkit Datový sklad Úkol Záložka
– DT – store – task – tab
30