Validační server - automatická kontrola semestrálních prací

Proces validace

Zpět na hlavní stránku

Na stránce princip je uveden obecný postup, jakým prochází soubor během validace. Zde se zaměříme na jádro vlastní validace, na šestý bod - "Spuštění vlastního validačního procesu".

Každá doména definuje proces, kterým validace souboru probíhá. Tento proces je definován XML souborem, který kromě základních řídících elementů obsahuje fragmenty scriptovacího jazyka, v němž je psán vlastní program. Použitý scriptovací jazyk je JavaScript (implementace Rhino), který byl vybrán pro svoji podobnost Javě a možnost zcela těsného spojení s Java třídami - lze využívat funkce nabízené Validačním serverem i případných Java knihoven.

Hlavní soubor definující proces validace se nazývá "process.xml" (název může být změněn - viz konfigurace serveru) a je uložen v adresáři domény.

Ukázka

Pro začátek bude nejlepší ukázka:

<?xml version="1.0" ?>
<!DOCTYPE validation-process PUBLIC "-//Validation-Process //" "process.dtd">
 
<validation-process>
 
    <!-- volani podprocesu, ktery zkontroluje, zda se jedna o Java zdrojak -->
    <call process="/common/checkjavasource.xml">
        <param name="file">inputFile</param>
    </call>
 
    <!-- Vse uvnitr tohoto elementu ma casovy limit provedeni 5000 ms -->
    <time-limited time="5000" exceed-message="ppa1.prekrocil">
        
        <!-- prelozim zaslany soubor -->
        <call process="/common/compilejava.xml">
            <param name="file">inputFile</param>
        </call>
 
    </time-limited>
 
    <!-- Pokud uz je ve ValidationResult nejaka chyba, koncim -->
    <quit-if-error/>
 
    <!-- Script -->
    <script>
        var testOuput = new java.io.File(workDir,'test.out');
        var vzorOuput = new java.io.File(domainDir,'vzor.out');
    </script>
 
    <time-limited time="3000" exceed-message="ppa1.prekrocil">

      <!-- zjistim vystup testovane tridy -->
      <call process="/common/invokejava.xml">
         <param name="mainClass">className</param>
         <param name="classPath">workDir</param>
         <param name="stdIn">null</param>
         <param name="stdOut">testOutput</param>
         <param name="stdErr">null</param>
         <param name="args">null</param>
      </call>
 
    </time-limited>
 
    <!-- porovnam co vylezlo a co melo vylezt -->
    <call process="/common/comparefiles.xml">
        <param name="file1">vzorOutput</param>
        <param name="file2">testOutput</param>
    </call>
 
</validation-process>
 

K dispozici je process.dtd definující strukturu těchto XML souborů.

Tento příklad provádí následující kroky:

Struktura XML souboru

O struktuře XML souborů s popisem procesů je celý tento dokument

Výstup validace - chyby, varování, informace

Každé validaci je přiřazena instance třídy FullValidationResult, do které se během validace ukládají všechny relevantní informace. Tyto informace jsou tří druhů: Informace, varování a chyba. První dva druhy se liší pouze způsobem, jakým jsou poté vizuálně reprezentovány (tj. info "zeleně", varování "žlutě"), ale nijak nemění výsledek validace.

Výsledek validace ale ovlivňují chyby, které mohou být přidány do výstupu validace buď "ručně" použitím příslušných XML elementů, nebo přímo některými službami validačního serveru (např. třída jistící překlad Java tříd přidá chyby překladu). Každá chyba přidaná do FullValidationResult je celé číslo - kód - definovaný v rozhraní ValidationResult, Chybové kódy jsou:
VR_OKValidace proběhla v pořádku
VR_SERVER_ERRORValidace neuspěla kvůli interní chybě validačního serveru.
VR_COMPILATION_ERRORChyba při překladu
VR_RUNTIME_ERRORChyba při běhu validovaného programu
VR_BAD_RESULTSŠpatné výstupy validovaného programu
VR_TIMEOUTVypršení času - validace či některá její část překročila max. povolenou dobu
VR_INVALID_DOMAINNeexistující validační doména
VR_INVALID_INPUTChybný vstup validace (špatné parametry v ValidationInput)
VR_INVALID_LIBRARY_CALLPoužití nepovolené knihovny programovacího jazyka
VR_CUSTOM_ERRORNespecifikovaná chyba - může jí generovat script, pokud nezapadá do uvedených druhů chyb

Zpět na hlavní stránku

autor: Lukáš Valenta, září 2007 (lukas.valenta at seznam.cz)