Thursday, 31 May 2007
Apache Lenya og XSL - grmpf
« Certified Ethical Hacker CEH | Main | Boosting OpenBSD network performance »Så lykkedes det!
Jeg fik opdateret mit CMS system til Apache Lenya 1.2.5 med opdateret cocoon og hele pivetøjet - og løst problemerne!
Nu kan jeg som det forventes af et CMS:
- Se mine websider! - er der fejl på dem så sig lige til ;-)
- Skifte fra forsiden til en underside
- Gå fra en vilkårlig underside tilbage til en vilkårlig anden side i menuerne! Sejt!
- Opdatere websider - hvis jeg en dag får lyst og tid ;-)
- Oprette nye sider!
Hvorfor skulle det nu være noget specielt? Det skal jeg straks sige!
Når man bruger en Apache Tomcat baseret løsning til applikationer får hver applikation et prefix - undtagen ROOT applikationen som bliver default. Hvis I således kunne tilgå min Apache Tomcat direkte ville I kunne gå til blojsom, lenya, wiki og andre applikationer ved at specificere http://server/prefix.
Men det har I selvfølgelig ikke lov til :-) Jeg er jo passende paranoid og mener der vil være visse elementer som kunne tænkes at misbruge denne adgang. Desuden så er Apache Tomcat ikke liiiige den bedste webserver. Jeg har derfor puttet en Apache HTTPD ind foran Tomcat og denne server serverer så alle flade filer, billeder m.v. - mens Tomcat udelukkende afvikler servlet applikationerne.
Nå tilbage til prefix, udover applikationerne har Apache Lenya som jeg bruger som CMS en vane med at man henviser til de live sider med /www.domæne.dk/live/side.html - altså nogle pænt grimme referencer. Disse referencer ønsker jeg altså at skjule således at siden på serveren www.domæne.dk blot direkte kan henvises til som en virtuel host på Apache HTTPD som så dirigeres videre til Tomcat på den grimme URL.
Alt dette er selvfølgelig beskrevet på Wikien for Apache Lenya - dog med den væmmelige ting at de bruger mod_proxy til at lave reverse proxying - som det reelt også er. Jeg ønsker ikke mod_proxy, det er slemt nok at bruge mod_rewrite! Jeg har defor valgt at pille i koden til Apache Lenya - og det skulle jeg nok aldrig have gjort ;-)
Jeg har nu brugt et par dage på at rode med XSL (Extensible Stylesheet Language) filerne i Lenya for at få fjernet "root"-delen fra alle referencer som Apache Lenya genererer. Således at menuen virkede - det var ikke nemt!
For dem der aldrig har set XSL før drejer det sig om at man fra en XML fil kan påføre en transformation, i dette tilfælde til HTML
Eksempelvis kan denne fil sitetree.xml med en XSLT-processor blive til menuen på www.kramse.org. Sitetree.xml - bemærk linierne med <node>
<?xml version="1.0" encoding="UTF-8"?>
<site xmlns="http://apache.org/cocoon/lenya/sitetree/1.0" xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" i18n:attr="label" label="Live"
xsi:schemaLocation="http://apache.org/cocoon/lenya/sitetree/1.0../../../../resources/entities/sitetree.xsd">
<node id="index" visibleinnav="true">
<label xml:lang="dk">Forside</label>
<label xml:lang="en">Front page</label>
</node>
<node id="email" visibleinnav="true">
<label xml:lang="dk">E-mail politik</label>
<label xml:lang="en">Email policy</label>
</node>
<node id="cool" visibleinnav="true">
<label xml:lang="dk">Cool URIs</label>
<label xml:lang="en">Cool URIs</label>
</node>
<node id="security" visibleinnav="true">
<label xml:lang="en">Security</label>
<label xml:lang="dk">Sikkerhed</label>
<node id="unixsecurity" visibleinnav="true">
<label xml:lang="dk">UNIX sikkerhed</label>
<label xml:lang="en">UNIX Security</label>
<node id="rules" visibleinnav="true">
<label xml:lang="dk">Rules for administration</label>
</node>
<node id="sendmail-nomta" visibleinnav="true">
<label xml:lang="en">Sendmail No MTA</label>
</node>
</node>
<node id="sapphire" visibleinnav="true">
<label xml:lang="en">Sapphire SQL worm</label>
</node>
<node id="password" visibleinnav="true">
<label xml:lang="en">Passwords</label>
<node id="aix-passwords" visibleinnav="true">
<label xml:lang="en">AIX cracking</label>
</node>
<node id="creating-unix-users" visibleinnav="true">
<label xml:lang="en">Creating UNIX users</label>
<label xml:lang="dk">Creating UNIX users</label>
</node>
</node>
</node>
...
</site>
XSL stylesheet (uddrag af Lenya modificeret sitetree2nav.xsl):
<!--
Apply nodes recursively
-->
<xsl:template match="tree:node[not(@visible = 'false')]">
<!-- basic url of parent node -->
<xsl:param name="previous-url" select="''"/>
<xsl:variable name="existinglanguage">
<xsl:call-template name="resolve-existing-language"/>
</xsl:variable>
<nav:node>
<xsl:copy-of select="@id"/>
<xsl:copy-of select="@visibleinnav"/>
<xsl:copy-of select="@protected"/>
<xsl:copy-of select="@folder"/>
<!-- basic url - for all nodes -->
<xsl:variable name="basic-url">
<xsl:text/>
<xsl:choose>
<xsl:when test="@href">
<xsl:value-of select="@href"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$previous-url"/>
<xsl:value-of select="@id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
...
Denne XSL skal læses sådan at for hver gang den matcher en <node> vil den udføre det som står angivet - altså en slags løkke. I hvert gennemløb af denne, for hver gang den matcher node, laver den således noget magi med at spørge på værdien af variable (choose og test), henter andre værdier (select) og ud kommer altså en menu i flere niveauer.
Volapyk? jo tak, det er det! Men der er aligevel en vis logik, og jeg tror jeg forstår meget mere af det nu. Ihvertfald lykkedes det idag at få ændret lidt mere så det nu virker tilfredsstillende - UDEN mod_proxy! :-)
Så kan det være jeg kan komme igang med websitet til mit nyeste projekt freescan.dk.
Posted by at CEST 21:05 31/05/2007 in Java

