/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/portal/trunk/portal-impl/impl/src/java/org/sakaiproject/portal/charon/handlers/PageHandler.java $ * $Id: PageHandler.java 132395 2013-12-10 01:03:59Z 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.portal.charon.handlers; import java.util.Locale; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.portal.api.Portal; import org.sakaiproject.portal.api.PortalHandlerException; import org.sakaiproject.portal.api.PortalRenderContext; import org.sakaiproject.portal.api.StoredState; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SitePage; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.api.Session; import org.sakaiproject.tool.api.ToolException; import org.sakaiproject.portal.util.URLUtils; /** * @author ieb * @since Sakai 2.4 * @version $Rev: 132395 $ */ public class PageHandler extends BasePortalHandler { private static final String INCLUDE_PAGE = "include-page"; private static final Log log = LogFactory.getLog(PageHandler.class); private static final String URL_FRAGMENT = "page"; /** * Keyword to look for in sakai.properties copyright message to replace * for the server's time's year for auto-update of Copyright end date */ private static final String SERVER_COPYRIGHT_CURRENT_YEAR_KEYWORD = "currentYearFromServer"; public PageHandler() { setUrlFragment(PageHandler.URL_FRAGMENT); } @Override public int doPost(String[] parts, HttpServletRequest req, HttpServletResponse res, Session session) throws PortalHandlerException { return doGet(parts, req, res, session); } @Override public int doGet(String[] parts, HttpServletRequest req, HttpServletResponse res, Session session) throws PortalHandlerException { if ((parts.length == 3) && (parts[1].equals(PageHandler.URL_FRAGMENT))) { try { // Resolve the placements of the form // /portal/page/sakai.resources?sakai.site=~csev String pagePlacement = portal.getPlacement(req, res, session, parts[2], true); if (pagePlacement == null) { return ABORT; } parts[2] = pagePlacement; doPage(req, res, session, parts[2], req.getContextPath() + req.getServletPath()); return END; } catch (Exception ex) { throw new PortalHandlerException(ex); } } else { return NEXT; } } public void doPage(HttpServletRequest req, HttpServletResponse res, Session session, String pageId, String toolContextPath) throws ToolException, IOException { // find the page from some site SitePage page = SiteService.findPage(pageId); if (page == null) { portal.doError(req, res, session, Portal.ERROR_WORKSITE); return; } // permission check - visit the site Site site = null; try { site = SiteService.getSiteVisit(page.getSiteId()); } catch (IdUnusedException e) { portal.doError(req, res, session, Portal.ERROR_WORKSITE); return; } catch (PermissionException e) { // if not logged in, give them a chance if (session.getUserId() == null) { StoredState ss = portalService.newStoredState("", ""); ss.setRequest(req); ss.setToolContextPath(toolContextPath); portalService.setStoredState(ss); portal.doLogin(req, res, session, URLUtils.getSafePathInfo(req), false); } else { portal.doError(req, res, session, Portal.ERROR_WORKSITE); } return; } // form a context sensitive title String title = ServerConfigurationService.getString("ui.service","Sakai") + " : " + site.getTitle() + " : " + page.getTitle(); String siteType = portal.calcSiteType(site.getId()); // start the response PortalRenderContext rcontext = portal.startPageContext(siteType, title, page .getSkin(), req); addLocale(rcontext, site); includePage(rcontext, res, req, session, page, toolContextPath, "contentFull"); portal.sendResponse(rcontext, res, "page", null); StoredState ss = portalService.getStoredState(); if (ss != null && toolContextPath.equals(ss.getToolContextPath())) { // This request is the destination of the request portalService.setStoredState(null); } } /** * @param rcontext * @param res * @param req * @param session * @param page * @param toolContextPath * @param wrapperClass * @return * @throws IOException */ public void includePage(PortalRenderContext rcontext, HttpServletResponse res, HttpServletRequest req, Session session, SitePage page, String toolContextPath, String wrapperClass) throws IOException { int toolCount = 0; if ( page == null ) return; if (rcontext.uses(INCLUDE_PAGE)) { // divs to wrap the tools rcontext.put("pageWrapperClass", wrapperClass); rcontext .put("pageColumnLayout", (page.getLayout() == SitePage.LAYOUT_DOUBLE_COL) ? "col1of2" : "col1"); Site site = null; try { site = SiteService.getSite(page.getSiteId()); } catch (Exception ignoreMe) { // Non fatal - just assume null if (log.isTraceEnabled()) log.trace("includePage unable to find site for page " + page.getId()); } { List<Map> toolList = new ArrayList<Map>(); List tools = page.getTools(0); for (Iterator i = tools.iterator(); i.hasNext();) { ToolConfiguration placement = (ToolConfiguration) i.next(); if (site != null) { boolean thisTool = portal.getSiteHelper().allowTool(site, placement); // System.out.println(" Allow Tool Display -" + // placement.getTitle() + " retval = " + thisTool); if (!thisTool) continue; // Skip this tool if not // allowed } Map m = portal.includeTool(res, req, placement); if (m != null) { toolCount++; toolList.add(m); } } rcontext.put("pageColumn0Tools", toolList); } rcontext.put("pageTwoColumn", Boolean .valueOf(page.getLayout() == SitePage.LAYOUT_DOUBLE_COL)); // do the second column if needed if (page.getLayout() == SitePage.LAYOUT_DOUBLE_COL) { List<Map> toolList = new ArrayList<Map>(); List tools = page.getTools(1); for (Iterator i = tools.iterator(); i.hasNext();) { ToolConfiguration placement = (ToolConfiguration) i.next(); Map m = portal.includeTool(res, req, placement); if (m != null) { toolCount++; toolList.add(m); } } rcontext.put("pageColumn1Tools", toolList); } // Add footer variables to page template context- SAK-10312 rcontext.put("pagepopup", page.isPopUp()); if (!page.isPopUp()) { String copyright = ServerConfigurationService .getString("bottom.copyrighttext"); /** * Replace keyword in copyright message from sakai.properties * with the server's current year to auto-update of Copyright end date */ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy"); String currentServerYear = simpleDateFormat.format(new Date()); copyright = copyright.replaceAll(SERVER_COPYRIGHT_CURRENT_YEAR_KEYWORD, currentServerYear); String service = ServerConfigurationService.getString("ui.service", "Sakai"); String serviceVersion = ServerConfigurationService.getString( "version.service", "?"); String sakaiVersion = ServerConfigurationService.getString( "version.sakai", "?"); String server = ServerConfigurationService.getServerId(); String[] bottomNav = ServerConfigurationService.getStrings("bottomnav"); String[] poweredByUrl = ServerConfigurationService .getStrings("powered.url"); String[] poweredByImage = ServerConfigurationService .getStrings("powered.img"); String[] poweredByAltText = ServerConfigurationService .getStrings("powered.alt"); { List<Object> l = new ArrayList<Object>(); if ((bottomNav != null) && (bottomNav.length > 0)) { for (int i = 0; i < bottomNav.length; i++) { l.add(bottomNav[i]); } } rcontext.put("bottomNav", l); } // rcontext.put("bottomNavSitNewWindow", // Web.escapeHtml(rb.getString("site_newwindow"))); if ((poweredByUrl != null) && (poweredByImage != null) && (poweredByAltText != null) && (poweredByUrl.length == poweredByImage.length) && (poweredByUrl.length == poweredByAltText.length)) { { List<Object> l = new ArrayList<Object>(); for (int i = 0; i < poweredByUrl.length; i++) { Map<String, Object> m = new HashMap<String, Object>(); m.put("poweredByUrl", poweredByUrl[i]); m.put("poweredByImage", poweredByImage[i]); m.put("poweredByAltText", poweredByAltText[i]); l.add(m); } rcontext.put("bottomNavPoweredBy", l); } } else { List<Object> l = new ArrayList<Object>(); Map<String, Object> m = new HashMap<String, Object>(); m.put("poweredByUrl", "http://sakaiproject.org"); m.put("poweredByImage", "/library/image/sakai_powered.gif"); m.put("poweredByAltText", "Powered by Sakai"); l.add(m); rcontext.put("bottomNavPoweredBy", l); } rcontext.put("bottomNavService", service); rcontext.put("bottomNavCopyright", copyright); rcontext.put("bottomNavServiceVersion", serviceVersion); rcontext.put("bottomNavSakaiVersion", sakaiVersion); rcontext.put("bottomNavServer", server); } } } }