Hlavní navigace

Cocoon v příkladech: Jak na portál

7. 4. 2004
Doba čtení: 6 minut

Sdílet

Zajímá vás, na jaké technologii je založen portál Kennedy Space Center agentury NASA, chemického koncernu BASF, mobilního operátora Vodafone a dalších organizací a firem? Nebo byste si rádi postavili portál a nechcete či neumíte programovat? Pojďme se podívat, jak lze vytvářet portály pomocí Cocoonu.

Co je to vlastně portál?

Definujme si portál jako webovou aplikaci, která sjednocuje pohled na obsah pocházející z různých datových zdrojů. Po autentizaci dostává uživatel přístup ke všem příslušným datovým zdrojům najednou (single sign on). Datové zdroje nabízené uživateli také téměř vždy závisejí na jeho autenticitě (personalizace) a konfiguraci, kterou si zvolil (individualizace).

Portlety a coplety

Komponenty, ze kterých se portál skládá, se nazývají portlety. Dá se (zjednodušeně) říci, že každý portlet reprezentuje jeden datový zdroj a zobrazuje jeho obsah. Zobrazovaná stránka portálu pak obsahuje portlety jako „okénka“ organizovaná do sloupců a (nebo) řádků, jak je vidět na obrázku (klikněte pro původní velikost):

Portál

Uvědomíte-li si, že datové zdroje jednotlivých portletů mohou být opravdu různorodé (výsledek SQL dotazu, data jiného webového serveru ve formě RSS nebo RDF, statický obsah jako XML nebo HTML, apod.), je zřejmé, že každý takový portlet (nebo skupina portletů) musí mít nějakou možnost převést tuto reprezentaci na nějaký společný formát (např. XML nebo fragment HTML). Ten je pak zobrazen pro všechny použité portlety na stránce portálu. Sledujete-li články o Cocoonu pravidelně, už vás jistě napadá, že Cocoon se svými rourami, které lze navíc různě spojovat sériově (interní roury) či paralelně (agregace v mapě) nebo vkládat do sebe (CInclude Transformer aj.), je pro daný účel více než vhodný.

Implementace portletu v Cocoonu se nazývá coplet.

Portál v Cocoonu

Asi vás nepřekvapí, že Cocoon obsahuje dva frameworky pro tvorbu portálů. Starší naleznete jako blok s názvem „ portal-fw“, novější se nazývá „ portal“. Tyto bloky patří rozhodně k těm složitějším a jejich dokumentace má (prozatím) dost daleko nejen k dokonalosti, ale i k uspokojivému stavu. Podívejme se na ten novější přístup, ačkoliv zatím nebyl prohlášen za stabilní. Stabilitou se zde rozumí spíše to, že jeho API a základní komponenty bloku nejsou konstantní a s každou verzí Cocoonu mohou být měněny. Oba portálové frameworky používají autentizační framework.

Vzhledem k tomu, že je téměř nemožné udělat malý a jednoduchý příklad na portál, zvolil jsem cestu zjednodušení a úpravy příkladu, který je v instalaci Cocoonu. Příklad je uložen v archivuportal­.zip, který je potřeba rozbalit v hlavním adresáři Cocoonu. Příklad vyžaduje Cocoon verze 2.1.4 a lze jej spustit pomocí URL http://localhost:8888/portal/ (nezapomeňte na ukončovací lomítko). Hlavním cílem je vytvořit stránku portálu tak, aby obsahovala aktuální RSS exporty serverů www.root.cz, www.abclinuxu.cz, diskusi na www.abclinuxu.cz a lxer.com. Vzhledem k tomu, že diskuse na Abclinuxu bývá rozsáhlejší, bude příslušnému portletu (vlastně copletu) vyhrazeno místo v celé šířce stránky dole. Ostatní coplety budou zabírat tři sloupce nahoře. Rozložení je vidět na předchozím obrázku (jedno okénko copletu je tam minimalizováno). Definice rozložení copletů na stránce je v souboru .../profiles/layout/portal.xml a vypadá takto:

...
<named-item name="O&#160;Linuxu">
  <composite-layout name="row">
    <item>
      <composite-layout name="column">
        <item>
          <coplet-layout name="coplet">
            <coplet-instance-data> Root-1 </coplet-instance-data>
          </coplet-layout>
        </item>
        <item>
          ...
        </item>
        <item>
          ...
        </item>
      </composite-layout>
    </item>
    <item>
      <coplet-layout name="coplet">
        <coplet-instance-data> Abclinuxu-forum-1 </coplet-instance-data>
      </coplet-layout>
    </item>
  </composite-layout>
</named-item>
... 

(Pozn. ed.: mezery kolem Roota a ABCLinuxu přidány násilím kvůli sazbě –Johanka)

Formát souboru není nijak složitý – vnořené deklarace řádků a sloupců jsou poměrně přímočaré. Prvek <coplet-instance-data> obsahuje název instance copletu. Instance jsou definovány v souboru .../profiles/copletinstancedata/portal.xml, který vypadá takto:

...
<coplet-instance-data id="Root-1" name="standard">
  <coplet-data>Root</coplet-data>
</coplet-instance-data>

<coplet-instance-data id="Abclinuxu-1" name="standard">
  <coplet-data>Abclinuxu</coplet-data>
</coplet-instance-data>
... 

Poměrně jednoduchým způsobem je zde deklarováno mapování mezi coplety a jejich instancemi. Platí logický předpoklad, že jeden coplet může mít více instancí. Definice copletu jsou v souboru .../profiles/copletdata/portal.xml. Tam mapujeme coplet na příslušný datový zdroj. Soubor vypadá takto:

...
<coplet-data id="Root" name="standard">
  <title>Root.cz</title>
  <coplet-base-data>URICoplet</coplet-base-data>
  <attribute>
    <name>uri</name>
    <value xsi:type="java:java.lang.String"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       >cocoon:/coplets/news/root.rss</value>
    </attribute>
</coplet-data>
... 

Nejzajímavější atribut je uri, jehož hodnota je URL datového zdroje. Jak vidíte, náš zkušební portál využívá informaci uloženou na disku (zde RSS export serveru Root.cz). Je to kvůli možnosti vyzkoušet si příklad, aniž jste připojeni online. (Pro osvěžení paměti: pseudoprotokol cocoon:/ získává data z aktuální mapy aplikace – obvykle je tam definována interní roura nebo se připojuje podřízená mapa.) Pokud hodnotu atributu změníte na /rss/, zobrazí se na stránce portálu skutečná aktuální data z Roota. Pozor ovšem, zda náhodou nespouštíte servletový kontejner Cocoonu za firewallem. V tom případě je potřeba pro bezchybnou funkci před spuštěním Cocoonu nastavit (případně také exportovat) proměnnou prostředí s názvem JAVA_OPTIONS a hodnotou například -Dhttp.proxyHost=moje.proxy.cz -Dhttp.proxyPort=mujPort ( moje.proxy.cz a mujPort samozřejmě nahraďte aktuálními hodnotami), a pokud proxy vyžaduje autorizaci, připojte ještě  -Dhttp.proxyUser=user -Dhttp.proxyPassword=password.

Další funkce

Náš primitivní portál umí i další věci: Pokud je zobrazeno na stránce více copletů, zobrazuje se v RSS copletech jen prvních pět položek obsahu. Pokud okénko copletu roztáhneme na celou stránku (ikona maximize), zobrazí se všechny položky. To je zajištěno přenosem parametru „ fullscreen“ do XSLT transformace, která převádí RSS na fragment HTML. Kliknutím na ikonu delete okénko copletu zavřete, ikonou minimize okénko minimalizujete.

CS24_early

V našem zjednodušeném příkladu jsme se ani nedotkli dalších zajímavých funkcí portálového frameworku (konfigurovatelnost uživatelem, komunikace mezi portlety, aj.). Považuji za nutné zopakovat (jako téměř v každém z minulých dílů), že pro tvorbu portálu máte k dispozici vše, co Cocoon nabízí (a čím jsme se setkávali v minulých dílech – namátkou jmenuji internacionalizaci nebo flowscript). Největší výhoda ale je, že portálový framework je (stejně jako Cocoon samotný) složen zkomponent. Pokud se vám některá z nich nelíbí nebo nehodí, prostě ji vyměňte za jinou. Pokud vhodnou komponentu nenajdete, můžete si ji napsat (většina komponent Cocoonu má jen pár desítek až pár set řádků kódu).

Ani portály se neubránily standardizačním snahám. Návrh specifikace označovaný jako JSR-168 je věnován portletům. Ačkoliv coplety nejsou s touto specifikací kompatibilní, Cocoon od verze 2.1.4 částečně podporuje i portlety podle této specifikace (zatím jen v Tomcatu pomocí implementace Pluto). Funkcionalita portálového frameworku však s každou verzí Cocoonu roste a postupně se více a více stabilizuje. Pokud bych měl dnes začít tvořit portál, portálový framework v Cocoonu by byl určitě velmi vážným kandidátem. Vytvořit dobrý portál není nic jednoduchého (a udělat pěkný, ale jednoduchý a průhledný příklad portálu je skoro nemožné :-), ale i tak vám Cocoon poskytne prostředky, které byste jinde hledali jen obtížně.

Byl pro vás článek přínosný?