package org.sakaiproject.login.impl.velocity; import java.io.InputStream; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; import org.sakaiproject.component.api.ServerConfigurationService; import org.sakaiproject.login.api.LoginRenderContext; import org.sakaiproject.login.api.LoginRenderEngine; import org.sakaiproject.login.api.LoginService; import org.sakaiproject.tool.api.Placement; import org.sakaiproject.tool.api.SessionManager; public class VelocityLoginRenderEngine implements LoginRenderEngine { // Logging private static final Log log = LogFactory.getLog(VelocityLoginRenderEngine.class); // Member variables private List availableLoginSkins; private boolean debug = false; private LoginService loginService; private ServerConfigurationService serverConfigurationService; private ServletContext context; private String loginConfig = "loginvelocity.config"; private SessionManager sessionManager; private boolean styleAble = false; private boolean styleAbleContentSummary = false; private VelocityEngine vengine; // LoginRenderEngine Implementation public void init() throws Exception { /*try { styleAble = serverConfigurationService.getBoolean("portal.styleable", false); styleAbleContentSummary = serverConfigurationService.getBoolean("portal.styleable.contentSummary", false); } catch (Exception ex) { log .warn("No Server configuration service available, assuming default settings "); }*/ if ( sessionManager == null ) { log.warn("No session Manager, assuming test mode "); } vengine = new VelocityEngine(); vengine.setApplicationAttribute(ServletContext.class.getName(), context); vengine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.SimpleLog4JLogSystem"); vengine.setProperty("runtime.log.logsystem.log4j.category", "ve.login"); Properties p = new Properties(); InputStream in = this.getClass().getResourceAsStream(loginConfig); if ( in == null ) { throw new RuntimeException("Unable to load configuration " + loginConfig); } else { log.info("Loaded " + loginConfig); } p.load(in); vengine.init(p); availableLoginSkins = new ArrayList(); Map m = new HashMap(); m.put("name", "defaultskin"); m.put("display", "Default"); availableLoginSkins.add(m); vengine.getTemplate("/vm/defaultskin/macros.vm"); } public LoginRenderContext newRenderContext(HttpServletRequest request) { VelocityLoginRenderContext rc = new VelocityLoginRenderContext(); rc.setRenderEngine(this); rc.setDebug(debug); rc.put("pageSkins", availableLoginSkins); String loginSkin = "defaultskin"; if (request != null) { HttpSession session = request.getSession(); loginSkin = (String) session.getAttribute("loginskin"); String newLoginSkin = request.getParameter("loginskin"); if (newLoginSkin != null && newLoginSkin.length() > 0) { session.setAttribute("loginskin", newLoginSkin); loginSkin = newLoginSkin; log.debug("Set Skin To " + loginSkin); } else { if (loginSkin == null || loginSkin.length() == 0) { loginSkin = "defaultskin"; session.setAttribute("loginskin", loginSkin); } } rc.put("pageCurrentSkin", loginSkin); log.debug("Current Skin is " + loginSkin); } else { log.debug("No Request Object Skin is default"); rc.put("pageCurrentSkin", "defaultskin"); } try { Properties p = new Properties(); p.load(this.getClass().getResourceAsStream("/" + loginSkin + "/options.config")); rc.setOptions(p); } catch (Exception ex) { log.info("No options loaded ", ex); } return rc; } public void render(String template, LoginRenderContext rcontext, Writer out) throws Exception { Context vc = ((VelocityLoginRenderContext) rcontext).getVelocityContext(); String skin = (String) vc.get("pageCurrentSkin"); if (skin == null || skin.length() == 0) { skin = "defaultskin"; } if (!"defaultskin".equals(skin)) { vengine.getTemplate("/vm/" + skin + "/macros.vm"); } vengine.mergeTemplate("/vm/" + skin + "/" + template + ".vm", ((VelocityLoginRenderContext) rcontext).getVelocityContext(), out); } public void setupForward(HttpServletRequest req, HttpServletResponse res, Placement p, String skin) { log.error("setupForward not implemented!!! Didn't think I would need this..."); } // Accessors public ServletContext getContext() { return context; } public void setContext(ServletContext context) { this.context = context; } public ServerConfigurationService getServerConfigurationService() { return serverConfigurationService; } public void setServerConfigurationService( ServerConfigurationService serverConfigurationService) { this.serverConfigurationService = serverConfigurationService; } public SessionManager getSessionManager() { return sessionManager; } public void setSessionManager(SessionManager sessionManager) { this.sessionManager = sessionManager; } public LoginService getLoginService() { return loginService; } public void setLoginService(LoginService loginService) { this.loginService = loginService; } }