package com.loomis.jsf.component; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.servlet.http.HttpServletResponse; /** * * @author AGORI and Octoberdan */ public class ResourcePhaseListener implements PhaseListener { public static final String RESOURCE_KEY = "ResourceNames_" + new Date().getTime(); private Map resourceMap; private String getResource(String resourceName) { if (getResourceMap().containsKey(resourceName)) { return getResourceMap().get(resourceName); } StringBuffer resourceBuf = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(getClass() .getResourceAsStream(resourceName))); try { String line = ""; while ((line = br.readLine()) != null) { resourceBuf.append(line + "\n"); } } catch (Exception e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException ex) { } } } String resource = resourceBuf.toString(); if (resource != "") { getResourceMap().put(resourceName, resource); } return resource; } public static List getResourceNames(ExternalContext exContext) { Object obj = exContext.getRequestMap().get(RESOURCE_KEY); return obj instanceof List ? (List)obj : null; } public void afterPhase(PhaseEvent event) { if (!event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) { return; } FacesContext context = event.getFacesContext(); ExternalContext exContext = context.getExternalContext(); PrintWriter out = null; HttpServletResponse response = (HttpServletResponse) exContext .getResponse(); List resourceNames = getResourceNames(exContext); if (resourceNames == null) { return; } for (String resourceName : getResourceNames(exContext)) { try { String resource = getResource((String) resourceName); response.setContentType("text/plain;charset=UTF-8"); out = response.getWriter(); out.print(resource); } catch (Exception e) { } finally { if (out != null) { out.close(); } context.responseComplete(); } } } public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; } public void beforePhase(PhaseEvent event) { } public Map getResourceMap() { if (resourceMap == null) resourceMap = new HashMap(); return resourceMap; } public void setResourceMap(Map resourceMap) { this.resourceMap = resourceMap; } }