Thema’s voor Alfresco Share sites
Dit artikel laat zien hoe sites in Alfresco Share in een eigen thema kunnen worden vormgegeven door gebruik te maken van een servlet filter.
De Alfresco Share omgeving maakt het mogelijk om sites aan te maken met ieder hun eigen medewerkers, documenten en applicaties zoals wiki, forum en blog. Een site is met een druk op een knop aan te maken door een gebruiker. Wat niet eigen is aan een site is de presentatie: standaard worden alle sites getoond in dezelfde vormgeving.
Alfresco biedt de mogelijkheid om de vormgeving aan te passen door thema’s te definiëren, maar de enige configuratiemogelijkheid is een systeembrede keuze voor een thema. In versie 3.2r2 door twee configuratiebestanden aan te passen en het systeem te herstarten, in versie 3.3 door een keuze te maken in de Admin Console welke onmiddellijk zichtbaar wordt.
Er is echter nog een manier om een thema te activeren: de pagina in het browser window kan in een thema vormgegeven worden door aan de url de extra parameter “theme=thema -naam>” mee te geven. Hiervan kunnen we gebruik maken door een servlet filter te definiëren dat de url leest, daaruit de naam van de site filtert, en vervolgens de theme parameter zet zodat het juiste thema voor deze site wordt weergegeven.
Laten we beginnen met het definiëren van het filter in de web.xml van de share applicatie:

Alle pagina’s van Alfresco Share sites zijn van de vorm /page/site/<site naam>/*, zodat deze nu allemaal het filter passeren.
Het filter gebruikt een properties bestand om de koppeling tussen sites en thema’s te definiëren. Dit bestand bevindt zich in het classpath en de lokatie ervan wordt meegegeven als parameter aan het filter. Voorbeeld voor sites genaamd ‘test’, ‘migrationteam’ en ‘sysadmin’:
# Map sites to properties test=hcBlack migrationteam=greenTheme sysadmin=yellowTheme
Het filter werkt als volgt:
1.Als de url van de vorm /share/page/site/... is, dan wordt uit de url de naam van de site gelezen.
2.Als voor de naam van de site een thema is gedefiniëerd en er is nog geen thema parameter gezet in het request, voeg dan de thema variabele toe aan het request. Doe niets indien er geen mapping is of indien het request al een theme parameter bevat. Zo blijft het mogelijk voor de gebruiker om handmatig een thema te zetten door de url aan te passen.
De belangrijkste vraag is nu: hoe kunnen we de theme parameter toevoegen? Het is namelijk niet mogelijk om een request te wijzigen.
We doen dit door gebruik te maken van de HttpServletRequestWrapper. Hiermee kunnen we functionaliteit implementeren om een bestaande request heen welke zelf weer meegegeven kan worden als request.
De basis van het resulterende filter is dit:
Package nl.finalist.alfresco.share; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.Filter; import … public class ThemeFilter implements Filter { public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String site = null; if (request instanceof HttpServletRequest) { String pathInfo = ((HttpServletRequest)request).getPathInfo(); int start = pathInfo.indexOf("/site/")+"/site/".length(); int end = pathInfo.indexOf("/",start); if (end > start) { site = pathInfo.substring(start,end); } } // Check here is there is a theme for the site // and add the theme as the parameter if (props.containsKey(site)) { String theme = props.getProperty(site); // Use the 'FilteredRequest' with parameter 'theme' chain.doFilter(new FilteredRequest(request, theme), response); } else { // Pass on the request unmodified chain.doFilter(request, response); } }
Wat rest is de implementatie van FilteredRequest. Deze definiëren we als een inner class binnen ThemeFilter. De implemenatie bestaat uit het schrijven van ‘wrappers’ (vandaar de naam van de class) rond de methods van HttpServletRequest waarin rekening gehouden wordt met de theme parameter. Van één method laat ik hieronder de implementatie zien. De andere noem ik alleen even.
static class FilteredRequest extends HttpServletRequestWrapper { private String theme; public FilteredRequest(ServletRequest request, String theme) { super((HttpServletRequest)request); this.theme = theme; } public Map getParameterMap() { Map m = super.getParameterMap(); if (m.containsKey("theme")) { return m; } else { Map res = new HashMap(); res.putAll(m); res.put("theme",new String[]{theme}); return res; } } public String getParameter(String paramName) { … } public String[] getParameterValues(String paramName) { … } public Enumeration getParameterNames() { … } public String getQueryString() { … } }
Met het bovenstaande is het mogelijk sites in Alfresco Share te koppelen aan thema’s. Op basis van dit principe zijn uitbreidingen mogelijk, bijvoorbeeld om de site beheerder de mogelijkheid te geven in een beheerpagina het thema van de site te laten wijzigen. Dit laat ik vooralsnog over aan de fantasie van de lezer.
P.S. In alle productie versies van Alfresco Share werd het logo van een thema niet getoond op basis van het zetten van de theme parameter in het request, maar op basis van het systeembreed gedefiniëerde thema. Dit is op te lossen door in header.get.js de globale variabele theme te vervangen door de query parameter. Mijn contributie van een fix heeft Alfresco inmiddels geaccepteerd en ze maakt deel uit van Alfresco 3.3G.

[...] This post was mentioned on Twitter by Finalist IT Group. Finalist IT Group said: new blogpost: 'Thema’s voor Alfresco Share sites' http://bit.ly/9kP3xt #Alfresco [...]
Tweets that mention Thema’s voor Alfresco Share sites | Finalist Developers Blog -- Topsy.com April 28, 2010 6:11