/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.deliver.applications.filters; import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.RedirectController; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.management.RepositoryVO; import org.infoglue.cms.exception.PageNotFoundException; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.security.InfoGluePrincipal; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.deliver.applications.databeans.DeliveryContext; import org.infoglue.deliver.controllers.kernel.impl.simple.BaseDeliveryController; import org.infoglue.deliver.controllers.kernel.impl.simple.ExtranetController; import org.infoglue.deliver.controllers.kernel.impl.simple.LanguageDeliveryController; import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController; import org.infoglue.deliver.controllers.kernel.impl.simple.RepositoryDeliveryController; import org.infoglue.deliver.util.CacheController; import org.infoglue.deliver.util.RequestAnalyser; import org.infoglue.deliver.util.Timer; /** * * * @author Lars Borup Jensen (lbj@atira.dk) * @author Mattias Bogeblad (bogeblad@yahoo.com) * */ public class ViewPageFilter implements Filter { public final static Logger logger = Logger.getLogger(ViewPageFilter.class.getName()); private FilterConfig filterConfig = null; private URIMatcher uriMatcher = null; private URIMapperCache uriCache = null; public static String attributeName = null; public static boolean caseSensitive = false; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; String filterURIs = filterConfig.getInitParameter(FilterConstants.FILTER_URIS_PARAMETER); String caseSensitiveString = CmsPropertyHandler.getCaseSensitiveRedirects(); logger.info("caseSensitiveString:" + caseSensitiveString); caseSensitive = Boolean.parseBoolean(caseSensitiveString); uriMatcher = URIMatcher.compilePatterns(splitString(filterURIs, ","), caseSensitive); attributeName = CmsPropertyHandler.getNiceURIAttributeName(); logger.info("attributeName from properties:" + attributeName); if(attributeName == null || attributeName.indexOf("@") > -1) attributeName = filterConfig.getInitParameter(FilterConstants.ATTRIBUTE_NAME_PARAMETER); logger.info("attributeName from web.xml, filter parameters:" + attributeName); if(attributeName == null || attributeName.equals("")) attributeName = "NavigationTitle"; logger.info("attributeName used:" + attributeName); uriCache = new URIMapperCache(); } private static Boolean configurationFinished = null; public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { Timer t = new Timer(); long end, start = System.currentTimeMillis(); HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; httpRequest.setAttribute("originalFullURL", getOriginalFullURL(httpRequest)); /* Enumeration enAttr = httpRequest.getAttributeNames(); while(enAttr.hasMoreElements()){ String attributeName = (String)enAttr.nextElement(); System.out.println("Attribute Name - "+attributeName+", Value - "+(httpRequest.getAttribute(attributeName)).toString()); } System.out.println("To out-put All the request parameters received from request - "); Enumeration enParams = httpRequest.getParameterNames(); while(enParams.hasMoreElements()){ String paramName = (String)enParams.nextElement(); System.out.println("Attribute Name - "+paramName+", Value - "+httpRequest.getParameter(paramName)); } Enumeration headerNames = httpRequest.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); System.out.println(headerName + " = " + httpRequest.getHeader(headerName)); } */ if(httpRequest.getParameter("igEncodingTest") != null && !httpRequest.getParameter("igEncodingTest").equals("")) logger.warn("httpRequest:" + httpRequest.getParameter("name")); if(!CmsPropertyHandler.getIsValidSetup() && (httpRequest.getRequestURI().indexOf("Install") == -1 && httpRequest.getRequestURI().indexOf("/script") == -1 && httpRequest.getRequestURI().indexOf("/css") == -1 && httpRequest.getRequestURI().indexOf("/images") == -1)) httpResponse.sendRedirect("" + httpRequest.getContextPath() + "/Install!input.action"); String enableNiceURI = CmsPropertyHandler.getEnableNiceURI(); if (enableNiceURI == null) enableNiceURI = "false"; validateCmsProperties(httpRequest); String requestURI = URLDecoder.decode(getContextRelativeURI(httpRequest), "UTF-8"); if(logger.isInfoEnabled()) logger.info("requestURI:" + requestURI); try { //System.out.println("requestURI:" + requestURI); if(logger.isInfoEnabled()) logger.info("requestURI before decoding:" + requestURI); requestURI = URLDecoder.decode(requestURI, CmsPropertyHandler.getURIEncoding()); if(logger.isInfoEnabled()) logger.info("requestURI after decoding:" + requestURI); String fromEncoding = CmsPropertyHandler.getURIEncoding(); String toEncoding = "utf-8"; String testRequestURI = new String(requestURI.getBytes(fromEncoding), toEncoding); if(testRequestURI.indexOf((char)65533) == -1) requestURI = testRequestURI; //System.out.println("requestURI:" + requestURI); } catch (Exception e) { logger.warn("Error checking for unicode chars:" + e.getMessage()); } if(logger.isInfoEnabled()) logger.info("requestURI after encoding check:" + requestURI); try { if(requestURI.indexOf(CmsPropertyHandler.getDigitalAssetBaseUrl() + "/protected") > -1) { throw new Exception("Not allowed to view protected assets..."); } String remainingURI = httpRequest.getParameter("remainingURI"); if (enableNiceURI.equalsIgnoreCase("true") && (!uriMatcher.matches(requestURI) || remainingURI != null)) { while(CmsPropertyHandler.getActuallyBlockOnBlockRequests() && RequestAnalyser.getRequestAnalyser().getBlockRequests()) { if(logger.isInfoEnabled()) logger.info("Queing up requests as cache eviction are taking place.."); try { Thread.sleep(10); } catch (Exception e) {} } RequestAnalyser.getRequestAnalyser().incNumberOfCurrentRequests(null); HttpSession httpSession = httpRequest.getSession(true); Set<RepositoryVO> repositoryVOList = null; Integer languageId = null; Database db = CastorDatabaseService.getDatabase(); BaseDeliveryController.beginTransaction(db); try { repositoryVOList = getRepositoryId(httpRequest, db); if(logger.isInfoEnabled()) logger.info("repositoryVOList:" + repositoryVOList.size()); languageId = getLanguageId(httpRequest, httpSession, repositoryVOList, requestURI, db); Integer siteNodeId = null; if(languageId != null) { String[] nodeNames = splitString(requestURI, "/"); logger.info("nodeNames:" + nodeNames.length); List<String> nodeNameList = new ArrayList<String>(); for(int i=0; i<nodeNames.length; i++) { String nodeName = nodeNames[i]; if(nodeName.indexOf(".cid") == -1) { nodeNameList.add(nodeName); } } nodeNames = new String[nodeNameList.size()]; nodeNames = nodeNameList.toArray(nodeNames); //logger.info("RepositoryId.: "+repositoryId); //logger.info("LanguageId...: "+languageId); //logger.info("RequestURI...: "+requestURI); InfoGluePrincipal infoGluePrincipal = (InfoGluePrincipal) httpSession.getAttribute("infogluePrincipal"); if (infoGluePrincipal == null) { try { infoGluePrincipal = (InfoGluePrincipal) CacheController.getCachedObject("userCache", "anonymous"); if (infoGluePrincipal == null) { Map arguments = new HashMap(); arguments.put("j_username", CmsPropertyHandler.getAnonymousUser()); arguments.put("j_password", CmsPropertyHandler.getAnonymousPassword()); infoGluePrincipal = (InfoGluePrincipal)ExtranetController.getController().getAuthenticatedPrincipal(db, arguments); if(infoGluePrincipal != null) CacheController.cacheObject("userCache", "anonymous", infoGluePrincipal); } //this.principal = ExtranetController.getController().getAuthenticatedPrincipal("anonymous", "anonymous"); } catch (Exception e) { BaseDeliveryController.rollbackTransaction(db); throw new SystemException("There was no anonymous user found in the system. There must be - add the user anonymous/anonymous and try again.", e); } } String siteNodeIdString = httpRequest.getParameter("siteNodeId"); if(siteNodeIdString != null && !siteNodeIdString.equals("") && remainingURI != null && !remainingURI.equals("")) { nodeNames = splitString(remainingURI, "/"); logger.info("nodeNames:" + nodeNames.length); nodeNameList = new ArrayList<String>(); for(int i=0; i<nodeNames.length; i++) { String nodeName = nodeNames[i]; if(nodeName.indexOf(".cid") == -1) { nodeNameList.add(nodeName); } } nodeNames = new String[nodeNameList.size()]; nodeNames = nodeNameList.toArray(nodeNames); DeliveryContext deliveryContext = DeliveryContext.getDeliveryContext(); siteNodeId = NodeDeliveryController.getSiteNodeIdFromBaseSiteNodeIdAndPath(db, infoGluePrincipal, nodeNames, attributeName, deliveryContext, httpSession, languageId, siteNodeIdString, remainingURI, httpRequest.getParameter("languageId")); } else { Iterator repositorVOListIterator = repositoryVOList.iterator(); while(repositorVOListIterator.hasNext()) { RepositoryVO repositoryVO = (RepositoryVO)repositorVOListIterator.next(); logger.info("Getting node from:" + repositoryVO.getName()); //TODO DeliveryContext deliveryContext = DeliveryContext.getDeliveryContext(); if(httpSession.getAttribute(FilterConstants.LANGUAGE_ID) != null) { deliveryContext.setSessionLanguageId((Integer)httpSession.getAttribute(FilterConstants.LANGUAGE_ID)); } siteNodeId = NodeDeliveryController.getSiteNodeIdFromPath(db, infoGluePrincipal, repositoryVO, nodeNames, attributeName, deliveryContext, httpSession, languageId, httpRequest.getParameter("languageId"), true); if(httpRequest.getParameter("languageId") == null) { if(deliveryContext.getLanguageId() != null && !deliveryContext.getLanguageId().equals(languageId)) { languageId = deliveryContext.getLanguageId(); httpSession.setAttribute(FilterConstants.LANGUAGE_ID, languageId); } } if(siteNodeId != null) break; } } } BaseDeliveryController.rollbackTransaction(db); end = System.currentTimeMillis(); if(siteNodeId == null) { String redirectUrl = RedirectController.getController().getRedirectUrl(httpRequest); if(redirectUrl != null && redirectUrl.length() > 0) { int redirectStatusCode = CmsPropertyHandler.getRedirectStatusCode(); String encodedRedirectUrl = httpResponse.encodeRedirectURL(redirectUrl); httpResponse.setStatus(redirectStatusCode); httpResponse.setHeader("Location", encodedRedirectUrl); return; } String extraInformation = "Referer: " + httpRequest.getHeader("Referer") + "\n"; extraInformation += "UserAgent: " + httpRequest.getHeader("User-Agent") + "\n"; extraInformation += "User IP: " + httpRequest.getRemoteAddr(); logger.info("Could not map URI " + requestURI + " against any page on this website." + "\n" + extraInformation); throw new PageNotFoundException("Could not map URI " + requestURI + " against any page on this website."); } else logger.info("Mapped URI " + requestURI + " --> " + siteNodeId + " in " + (end - start) + "ms"); Integer contentId = getContentId(httpRequest); HttpServletRequest wrappedHttpRequest = prepareRequest(httpRequest, siteNodeId, languageId, contentId); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("ViewPageFilter before ViewPage", t.getElapsedTime()); wrappedHttpRequest.getRequestDispatcher("/ViewPage.action").forward(wrappedHttpRequest, httpResponse); } catch (SystemException e) { BaseDeliveryController.rollbackTransaction(db); if (e instanceof PageNotFoundException) { logger.info("Failed to resolve siteNodeId: " + e.getMessage()); } else { logger.error("Failed to resolve siteNodeId:" + e.getMessage()); logger.warn("Failed to resolve siteNodeId:" + e.getMessage(), e); } if (handleSystemRedirects(httpRequest, httpResponse)) { return; } else { throw new ServletException(e); } } catch (Exception e) { BaseDeliveryController.rollbackTransaction(db); if (e instanceof PageNotFoundException) { logger.info("Failed to resolve siteNodeId: " + e.getMessage()); } else if (e instanceof ServletException) { logger.error("Failed to resolve siteNodeId: " + e.getMessage()); } else { logger.error("Failed to resolve siteNodeId: " + e.getMessage(), e); } if(logger.isInfoEnabled()) logger.info("Failed to resolve siteNodeId: " + e.getMessage(), e); if (handleSystemRedirects(httpRequest, httpResponse)) { return; } else { throw new ServletException(e); } } finally { try { BaseDeliveryController.closeDatabase(db); } catch (Exception e) { e.printStackTrace(); } RequestAnalyser.getRequestAnalyser().decNumberOfCurrentRequests(-1); } } else { //filterChain.doFilter(httpRequest, httpResponse); if(!httpResponse.isCommitted()) { try { filterChain.doFilter(httpRequest, httpResponse); } catch (Exception e) { logger.error("Response was committed - could not continue filter chains:" + e.getMessage()); } } } } catch (SystemException se) { if(!httpResponse.isCommitted()) { httpRequest.setAttribute("responseCode", "500"); httpRequest.setAttribute("error", se); httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse); } else logger.error("Error and response was committed:" + se.getMessage(), se); } catch (Exception e) { if(!httpResponse.isCommitted()) { httpRequest.setAttribute("responseCode", "404"); httpRequest.setAttribute("error", e); httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse); } else logger.error("Error and response was committed:" + e.getMessage(), e); } if(httpRequest.getRequestURL().indexOf("digitalAssets") == -1) RequestAnalyser.getRequestAnalyser().registerComponentStatistics("ViewPageFilter", t.getElapsedTime()); } private boolean handleSystemRedirects(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws Exception { if (!CmsPropertyHandler.getRedirectUsingSystemRedirect()) { RedirectController.getController().populateRequestWithRedirectSuggestions(httpRequest); } else { String systemRedirectUrl = RedirectController.getController().getSystemRedirectUrl(httpRequest); if ( systemRedirectUrl != null && systemRedirectUrl.length() > 0) { httpResponse.setStatus(301); httpResponse.setHeader("Location", systemRedirectUrl); httpResponse.setHeader("Connection", "close"); return true; } } return false; } public void destroy() { this.filterConfig = null; } private void validateCmsProperties(HttpServletRequest request) { if (CmsPropertyHandler.getServletContext() == null) { CmsPropertyHandler.setServletContext(request.getContextPath()); } } private Set<RepositoryVO> getRepositoryId(HttpServletRequest request, Database db) throws ServletException, SystemException, Exception { /* if (session.getAttribute(FilterConstants.REPOSITORY_ID) != null) { logger.info("Fetching repositoryId from session"); return (Integer) session.getAttribute(FilterConstants.REPOSITORY_ID); } */ logger.info("Trying to lookup repositoryId"); String serverName = request.getServerName(); String portNumber = new Integer(request.getServerPort()).toString(); String repositoryName = request.getParameter("repositoryName"); String requestURI = request.getRequestURI(); logger.info("serverName:" + serverName); logger.info("repositoryName:" + repositoryName); String firstPath = requestURI.replaceAll(request.getContextPath(), "").replaceAll("//", "/"); logger.info("firstPath:" + firstPath); if(firstPath.startsWith("/")) firstPath = firstPath.substring(1); String[] splitPath = firstPath.split("/"); if(splitPath.length > 2) firstPath = "/" + splitPath[0] + "/" + splitPath[1]; String repCacheKey = "" + serverName + "_" + portNumber + "_" + repositoryName + "_" + firstPath; logger.info("repCacheKey:" + repCacheKey); Set<RepositoryVO> repositoryVOList = (Set<RepositoryVO>)CacheController.getCachedObject(uriCache.CACHE_NAME, repCacheKey); if (repositoryVOList != null) { logger.info("Using cached repositoryVOList"); return repositoryVOList; } Set<RepositoryVO> repositories = RepositoryDeliveryController.getRepositoryDeliveryController().getRepositoryVOListFromServerName(db, serverName, portNumber, repositoryName, requestURI); if(logger.isInfoEnabled()) logger.info("repositories:" + repositories); if (repositories.size() == 0) { String redirectUrl = RedirectController.getController().getRedirectUrl(request); logger.info("redirectUrl:" + redirectUrl); if(redirectUrl == null || redirectUrl.length() == 0) { if (repositories.size() == 0) { try { logger.info("Adding master repository instead - is this correct?"); repositories.add(RepositoryDeliveryController.getRepositoryDeliveryController().getMasterRepository(db)); } catch (Exception e1) { logger.error("Failed to lookup master repository"); } } if (repositories.size() == 0) throw new ServletException("Unable to find a repository for server-name " + serverName); } } //t.printElapsedTime("getRepositoryVOListFromServerName took"); CacheController.cacheObject(uriCache.CACHE_NAME, repCacheKey, repositories); //session.setAttribute(FilterConstants.REPOSITORY_ID, repository.getRepositoryId()); return repositories; } private Integer getLanguageId(HttpServletRequest request, HttpSession session, Set<RepositoryVO> repositoryVOList, String requestURI, Database db) throws ServletException, Exception { Integer languageId = null; if(request.getParameter("languageId") != null) { logger.info("Language is explicitely given in request"); try { languageId = Integer.valueOf(request.getParameter("languageId")); session.setAttribute(FilterConstants.LANGUAGE_ID, languageId); } catch (NumberFormatException e) {} } else { Timer t = new Timer(); Iterator repositoryVOListIterator = repositoryVOList.iterator(); outer: while(repositoryVOListIterator.hasNext()) { RepositoryVO repositoryVO = (RepositoryVO)repositoryVOListIterator.next(); String dnsName = repositoryVO.getDnsName(); String serverName = request.getServerName(); int startIndex = dnsName.indexOf(serverName); int lastStartIndex = -1; if(startIndex > -1) { while(startIndex > -1 && lastStartIndex != startIndex) { lastStartIndex = startIndex; String domain = null; int endIndex = dnsName.indexOf(",", startIndex); if(endIndex > -1) domain = dnsName.substring(startIndex, endIndex); else domain = dnsName.substring(startIndex); if(domain.indexOf("[") > -1) { String languageCode = domain.substring(domain.indexOf("[") + 1, domain.length() - 1); LanguageVO languageVO = LanguageDeliveryController.getLanguageDeliveryController().getLanguageWithCode(db, languageCode); if(languageVO != null) { session.setAttribute(FilterConstants.LANGUAGE_ID, languageVO.getId()); languageId = languageVO.getId(); break outer; } } startIndex = dnsName.indexOf(serverName, startIndex + 1); } } } } if (languageId != null) return languageId; if (session.getAttribute(FilterConstants.LANGUAGE_ID) != null) { logger.info("Fetching languageId from session"); return (Integer) session.getAttribute(FilterConstants.LANGUAGE_ID); } Integer repositoryId = null; if(repositoryVOList != null && repositoryVOList.size() > 0) repositoryId = ((RepositoryVO)repositoryVOList.toArray()[0]).getId(); logger.info("Looking for languageId for repository " + repositoryId); if(repositoryId == null) return null; Locale requestLocale = request.getLocale(); try { List availableLanguagesForRepository = LanguageDeliveryController.getLanguageDeliveryController().getAvailableLanguagesForRepository(db, repositoryId); String useBrowserLanguage = CmsPropertyHandler.getUseBrowserLanguage(); logger.info("useBrowserLanguage:" + useBrowserLanguage); if (requestLocale != null && useBrowserLanguage != null && useBrowserLanguage.equals("true")) { for (int i = 0; i < availableLanguagesForRepository.size(); i++) { LanguageVO language = (LanguageVO) availableLanguagesForRepository.get(i); logger.info("language:" + language.getLanguageCode()); logger.info("browserLanguage:" + requestLocale.getLanguage()); if (language.getLanguageCode().equalsIgnoreCase(requestLocale.getLanguage())) { languageId = language.getLanguageId(); } } } if (languageId == null && availableLanguagesForRepository.size() > 0) { languageId = ((LanguageVO) availableLanguagesForRepository.get(0)).getLanguageId(); } } catch (Exception e) { logger.error("Failed to fetch available languages for repository " + repositoryId); } if (languageId == null) throw new ServletException("Unable to determine language for repository " + repositoryId); session.setAttribute(FilterConstants.LANGUAGE_ID, languageId); return languageId; } private Integer getContentId(HttpServletRequest request) throws ServletException, Exception { Integer contentId = null; String contentIdString = null; if (request.getParameter("contentId") != null) { contentIdString = request.getParameter("contentId"); } else { int cidIndex = request.getRequestURL().indexOf(".cid"); int cidIndexEnd = request.getRequestURL().indexOf("?", cidIndex); if(cidIndexEnd == -1) cidIndexEnd = request.getRequestURL().indexOf("/", cidIndex); if(cidIndex > -1) { if(cidIndexEnd == -1) contentIdString = request.getRequestURL().substring(cidIndex + 4); else contentIdString = request.getRequestURL().substring(cidIndex + 4, cidIndexEnd); } } try { contentId = Integer.valueOf(contentIdString); } catch (NumberFormatException e) {} return contentId; } // @TODO should I URLDecode the strings first? (incl. context path) private String getContextRelativeURI(HttpServletRequest request) { String requestURI = request.getRequestURI(); String contextPath = request.getContextPath(); if (contextPath != null && requestURI.length() > 0) { requestURI = requestURI.substring(contextPath.length(), requestURI.length()); } if (requestURI.length() == 0) return "/"; return requestURI; } private String[] splitString(String str, String delimiter) { List list = new ArrayList(); StringTokenizer st = new StringTokenizer(str, delimiter); while (st.hasMoreTokens()) { // Updated to handle portal-url:s String t = st.nextToken(); if (t.startsWith("_")) { break; } else { // Not related to portal - add list.add(t.trim()); } } return (String[]) list.toArray(new String[list.size()]); } private HttpServletRequest prepareRequest(HttpServletRequest request, Integer siteNodeId, Integer languageId, Integer contentId) { HttpServletRequest wrappedRequest = new IGHttpServletRequest(request, siteNodeId, languageId, contentId); return wrappedRequest; } private class IGHttpServletRequest extends HttpServletRequestWrapper { Map requestParameters = new HashMap(); public IGHttpServletRequest(HttpServletRequest httpServletRequest, Integer siteNodeId, Integer languageId, Integer contentId) { super(httpServletRequest); requestParameters.putAll(httpServletRequest.getParameterMap()); requestParameters.put("siteNodeId", new String[] { String.valueOf(siteNodeId)}); requestParameters.put("languageId", new String[] { String.valueOf(languageId)}); if(contentId != null) requestParameters.put("contentId", new String[] { String.valueOf(contentId)}); else { if (requestParameters.get("contentId") == null) requestParameters.put("contentId", new String[] { String.valueOf(-1)}); } String originalServletPath = ((HttpServletRequest)httpServletRequest).getServletPath(); String originalRequestURL = ((HttpServletRequest)httpServletRequest).getRequestURL().toString(); String originalRequestURI = ((HttpServletRequest)httpServletRequest).getRequestURI(); String originalQueryString = ((HttpServletRequest)httpServletRequest).getQueryString(); requestParameters.put("originalServletPath", new String[] { originalServletPath }); requestParameters.put("originalRequestURL", new String[] { originalRequestURL }); requestParameters.put("originalRequestURI", new String[] { originalRequestURI }); if(originalQueryString != null && originalQueryString.length() > 0) requestParameters.put("originalQueryString", new String[] { originalQueryString }); //logger.info("siteNodeId:" + siteNodeId); //logger.info("languageId:" + languageId); //logger.info("contentId:" + requestParameters.get("contentId")); } public String getParameter(String s) { String[] array = (String[]) requestParameters.get(s); if (array != null && array.length > 0) return array[0]; return null; } public Map getParameterMap() { return Collections.unmodifiableMap(requestParameters); } public Enumeration getParameterNames() { return new ParameterNamesEnumeration(requestParameters.keySet().iterator()); } public String[] getParameterValues(String s) { String[] array = (String[]) requestParameters.get(s); if (array != null && array.length > 0) return array; return null; } } private class ParameterNamesEnumeration implements Enumeration { Iterator it = null; public ParameterNamesEnumeration(Iterator it) { this.it = it; } public boolean hasMoreElements() { return it.hasNext(); } public Object nextElement() { return it.next(); } } /** * This method returns the exact full url from the original request - not modified * @return */ public String getOriginalFullURL(HttpServletRequest request) { String originalRequestURL = request.getRequestURL().toString(); String originalQueryString = request.getQueryString(); return originalRequestURL + (originalQueryString == null ? "" : "?" + originalQueryString); } }