/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/help/trunk/help-tool/src/java/org/sakaiproject/jsf/help/HelpFrameSetRender.java $ * $Id: HelpFrameSetRender.java 117275 2012-12-05 23:04:55Z matthew@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.jsf.help; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.faces.application.Application; import javax.faces.component.UIComponent; import javax.faces.component.UIData; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.el.ValueBinding; import javax.faces.render.Renderer; import javax.servlet.http.HttpServletRequest; import org.sakaiproject.api.app.help.HelpManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.entity.api.ResourceProperties; import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.user.api.Preferences; import org.sakaiproject.user.api.PreferencesEdit; import org.sakaiproject.user.cover.PreferencesService; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.util.ResourceLoader; /** * render help frame set * @version $Id: HelpFrameSetRender.java 117275 2012-12-05 23:04:55Z matthew@longsight.com $ */ public class HelpFrameSetRender extends Renderer { private static String DEFAULT_WELCOME_PAGE = "html/help.html"; private static String HELP_DOC_REGEXP = org.sakaiproject.api.app.help.HelpManager.HELP_DOC_REGEXP; /** * supports component type * @param component * @return true if supported */ public boolean supportsComponentType(UIComponent component) { return (component instanceof UIData); } /** * @see javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext, javax.faces.component.UIComponent) */ public void encodeBegin(FacesContext context, UIComponent component) throws IOException { ResponseWriter writer = context.getResponseWriter(); String helpWindowTitle = (String) component.getAttributes().get( "helpWindowTitle"); String searchToolUrl = (String) component.getAttributes().get( "searchToolUrl"); String tocToolUrl = (String) component.getAttributes().get("tocToolUrl"); String helpParameter = ((HttpServletRequest) context.getExternalContext() .getRequest()).getParameter("help"); if (helpParameter != null) { Pattern p = Pattern.compile(HELP_DOC_REGEXP); Matcher m = p.matcher(helpParameter); if (!m.matches()) { helpParameter = "unknown"; } } String welcomepage = getWelcomePage(context); tocToolUrl = tocToolUrl + "?help=" + helpParameter; EventTrackingService.post(EventTrackingService.newEvent("help.access", helpParameter, false)); helpWindowTitle = ServerConfigurationService.getString("ui.service", "Sakai") + " " + component.getAttributes().get("helpWindowTitle"); writer.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">\n"); writer.write("<html><head><title>" + helpWindowTitle + "</title></head>\n"); writer.write("<FRAMESET cols=\"30%, 70%\"><FRAMESET rows=\"250, 350\">"); writer.write("<FRAME src=\"" + searchToolUrl + "\" name=\"search\">"); writer.write("<FRAME src=\"" + tocToolUrl + "\" name=\"toc\">"); writer.write("</FRAMESET>\n"); Application app = context.getApplication(); ValueBinding binding = app.createValueBinding("#{Components['org.sakaiproject.api.app.help.HelpManager']}"); HelpManager manager = (HelpManager) binding.getValue(context); if(manager.getWelcomePage() == null) { if (welcomepage == DEFAULT_WELCOME_PAGE) { writer.write("<FRAME src=\"content.hlp?docId=" + welcomepage + "\" name=\"content\">"); } else { writer.write("<FRAME src=\"" + welcomepage + "\" name=\"content\">"); } } else { writer.write("<FRAME src=\"content.hlp?docId=" + manager.getWelcomePage() + "\" name=\"content\">"); } writer.write("</FRAMESET></html>\n"); } /** * @param prefLocales * The prefLocales to set. */ private Locale getSelectedLocale() { String language = ""; String country = ""; Preferences prefs = (PreferencesEdit) PreferencesService .getPreferences(UserDirectoryService.getCurrentUser().getId()); ResourceProperties props = prefs .getProperties(ResourceLoader.APPLICATION_ID); String prefLocale = props.getProperty(ResourceLoader.LOCALE_KEY); if (prefLocale != null && prefLocale.length() > 0) { if (prefLocale.contains("_")) { language = prefLocale.substring(0, prefLocale.indexOf("_")); country = prefLocale.substring(prefLocale.indexOf("_") + 1); } else { language = prefLocale; } return new Locale(language, country); } else { return Locale.getDefault(); } } /** * Gets localized welcome page if it exists or fall back on default * @return welcome page */ private String getWelcomePage(FacesContext context) { String page = ServerConfigurationService.getString("help.welcomepage"); if ("".equals(page)){ page = DEFAULT_WELCOME_PAGE; } // Build localized welcome page URL urlResource = null; StringBuilder sb = new StringBuilder(); sb.append(page.substring(0, page.lastIndexOf("."))); sb.append("_"); sb.append(getSelectedLocale().toString()); sb.append(page.substring(page.lastIndexOf("."))); // Get localized welcome page try { urlResource = FacesContext.getCurrentInstance().getExternalContext().getResource("/" + sb.toString()); } catch (MalformedURLException e) { // Ignore } // If it doesn't exist, fall back on default if (urlResource != null) { page = sb.toString(); } return page; } }