Hlavní menu

Nástroje

WebKiv / Repository

View (print) - Edit page | Recent changes - Page history

Updated 02 June 2010, 13:29 by Peter Cipov

Repository (úložisko pre Spring context jednotlivých modulov) je súčasť základného modulu commons distribúcie OpenCms pre KIV. Je implementovaný v balíku cz.zcu.kiv.repository. Sprístupňuje a uľahčuje prácu s frameworkom Spring. Slúži ako prostredník, ktorý sa stará o to aby ste mohli použiť Spring bez veľkých zásahov do súčastného kódu. Úlohou tohto programu je zaobstarať komunikáciu a správu Spring frameworku, tak aby jednotlivé moduly boli čo najmenej postihnuté jeho zavedením. Stará sa o vytvorenie kontextov pre jednotlivé moduly, uchováva vytvorené kontexty, poskytuje kontexty a pri odobraní modulu kontext vymaže (deje sa to napr. pri znovuzavedení aplikácie).

Prečo zaviesť Spring

Existuje viacero výhod od sprehľadnenia kódu až po testovanie. Podorobnejšie príklady je možné nájsť tu VyhodySpringu

Zmeny z pohľadu serveru

Repository musí byť zavedené ešte predtým ako sa zavedie štandardný (základný) kontext Springu. Sú potrebné zmeny na úrovni aplikácie. Presnejšie zmeny vo web.xml. Tu je nutné zapísať repository ako listener, presnejšie ako prvý listener (na poradí v súbore záleží). Ako listener slúži trieda cz.zcu.kiv.repository.support.web.RepositoryLoader?. Ak máte vo web.xml štandardný loader Spring-u (org.springframework.web.context.ContextLoader? Listener) odstráňte ho, pretože RepositoryLoader? plne nahradí jeho funkčnosť. Listenery vo web.xml by to vyzerať napríklad takto:

<!-- definice Spring listeneru     -->
<listener>
    <listener-class>
       cz.zcu.kiv.repository.support.web.RepositoryLoader
    </listener-class>
</listener>
<listener>
   <listener-class>
      org.springframework.web.context.request.RequestContextListener
   </listener-class>
</listener>
<listener>
   <listener-class>org.opencms.main.OpenCmsListener</listener-class>
</listener>

Zmeny z pohľadu modulu

Spring nie je potrebný

Ak modul nepotrebuje kontext Spring-u vtedy sa jedná o triviálnu situáciu. Nie je nutné nič meniť.

Potrebujem vlastný kontext aj so základným kontextom

V tomto prípade sú potrebné zmeny na úrovni modulu. Ak aplikácia nebola písaná pre Spring, bude nutná fáza refactoringu a dekomponovania. Pripojiť Spring je veľmi jednoduché. Do classpath (najlepšie však do balíkov špecifických pre Váš modul, aby sme zamedzili možným kolíziam s inými modulmi) pridáme config.xml, ktorý bude obsahovať konfiguráciu Spring-u pre modul. Pridáme aj triedu (na názve nezáleží), ktorá bude dediť od cz.zcu.kiv.repository.support.opencms.AbstractAction?. Jej obsah bude tvoriť cesta ku konfigurácií a jedinečný názov, ktorým sa bude možné odkazovať na danný kontext. (Názov musí byť jedinečný inak dôjde k výnimke). Ukážka ako má vyzerať taká trieda:

public class Action extends AbstractAction{

    public static final String NAME = "MODULE_XY_NAME";

    @Override
    public String getName() {
        return NAME;
    }

    @Override
    public String[] getConfigLocations() {
        return new String [] {
            "/cesta/v/classpath/ku/config.xml"
        };
    }

}

Posledným nastavením je nastavenie OpenCms, a to v administrácií modulu je nutné nastaviť cestu k Action class.

Potrebujem len vlastný kontext

V tomto prípade bude postup veľmi podobný, ako v pripade so základným kontextom, avšak je nutné oddediť od cz.zcu.kiv.repository.support.opencms. AbstractNoParentAction?.

Ako pristupovať ku kontextu

Kontext je dostupný ihneď po inicializácií OpenCms a všetkých jej modulov. Na prítup používajte triedu cz.zcu.kiv.repository.support.web.RepositoryUtils?. V nej nájdete statickú metódu getContext. Ak chceme používař bean-y iného modulu B, získame jeho kontext podobne(rovnaká metóda), len je nutné zadať identifikátor kontextu B ako parameter. Používajte ju výlučne v JSP, pretože výlučne k tomuto účelu bola trieda vytvorená. Používať ju v beanoch Spring-u ide priamo proti jeho všetkým konvenciám a aj proti výhodám spring-u ako jednoduchá konfigurácia a testovanie. Táto trieda bola vytvorená ako kompromis k stávajúcim riešeniam v OpenCms.