/** * method to return the Localized version of the file whose name is passed as an argument. The * localization is done based on localization subdirectories under the docBase. * * <p>The method performs a resource lookup in a manner similar to the one used for JavaHelp * resources. * * <p>Search for localized versions of the file are looked for: * * <p><docBase> + "/" + language1 + "_" + country1 + "_" + variant1 + file <docBase> + "/" + * language1 + "_" + country1 + file <docBase> + "/" + language1 + file <docBase> + "/" + * language2 + "_" + country2 + "_" + variant1 + file <docBase> + "/" + language2 + "_" + country2 * + file <docBase> + "/" + language2 + file <docBase> + file * * <p>Where language1, country1, variant1 are associated with the Locale passed as an argument and * language2, country2, variant are associated with the fallback Locale passed as argument. * * @param path the pathname for the resource whose localized version we are seeking * @param loc the Locale we are interested in. * @param fbLoc the fallback Locale to use if unsuccessful * @param locType the type of localization required "file", "docbase" * @return a String with the path of the "best localized match" for the file whose path has been * passed as argument. */ public String getRealPath(String path, Locale reqLocale, Locale fbLocale, String locType) { String base = getAbsolutePath(); if (path == null) path = ""; String realPath = null; if ("file".equals(locType)) realPath = FileUtil.getLocalizedFile(base, path, reqLocale, fbLocale); else if ("docbase".equals(locType)) realPath = FileUtil.getDocBaseLocalizedFile(base, path, reqLocale, fbLocale); if (debug > 5) { log( "Get real path " + path + " " + realPath + " " + base + reqLocale.toString() + " " + fbLocale.toString()); } return realPath; }
public MutableHttpServletRequest() { attributeMap = new HashMap<String, Object>(); headerMap = new HashMap<String, String[]>(); parameterMap = new HashMap<String, String[]>(); fileItemMap = new HashMap<String, FileItem[]>(); locales = new ArrayList<Locale>(); locales.add(Locale.getDefault()); }
// The tck uses only get & post requests protected void processTCKReq(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { LOGGER.entering(LOG_CLASS, "servlet entry"); PortletRequest portletReq = (PortletRequest) request.getAttribute("javax.portlet.request"); PortletResponse portletResp = (PortletResponse) request.getAttribute("javax.portlet.response"); PortletConfig portletConfig = (PortletConfig) request.getAttribute("javax.portlet.config"); long svtTid = Thread.currentThread().getId(); long reqTid = (Long) portletReq.getAttribute(THREADID_ATTR); PrintWriter writer = ((MimeResponse) portletResp).getWriter(); JSR286DispatcherReqRespTestCaseDetails tcd = new JSR286DispatcherReqRespTestCaseDetails(); // Create result objects for the tests /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_containsHeader */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.containsHeader must return false" */ TestResult tr0 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_CONTAINSHEADER); try { boolean ok = response.containsHeader("Accept"); tr0.setTcSuccess(ok == false); } catch (Exception e) { tr0.appendTcDetail(e.toString()); } tr0.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_encodeRedirectURL1 */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.encodeRedirectURL must return null" */ TestResult tr1 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_ENCODEREDIRECTURL1); try { String isval = response.encodeRedirectURL("http://www.cnn.com/"); CompareUtils.stringsEqual(isval, null, tr1); } catch (Exception e) { tr1.appendTcDetail(e.toString()); } tr1.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_encodeRedirectUrl */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.encodeRedirectUrl must return null" */ TestResult tr2 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_ENCODEREDIRECTURL); try { String isval = response.encodeRedirectUrl("http://www.cnn.com/"); CompareUtils.stringsEqual(isval, null, tr2); } catch (Exception e) { tr2.appendTcDetail(e.toString()); } tr2.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_encodeURL1 */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.encodeURL must provide the same */ /* functionality as ResourceResponse.encodeURL" */ TestResult tr3 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_ENCODEURL1); try { String turl = "http://www.apache.org/"; String hval = (String) response.encodeURL(turl); String pval = (String) portletResp.encodeURL(turl); CompareUtils.stringsEqual("HttpServletResponse", hval, "ResourceResponse", pval, tr3); } catch (Exception e) { tr3.appendTcDetail(e.toString()); } tr3.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_encodeUrl */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.encodeUrl must provide the same */ /* functionality as ResourceResponse.encodeURL" */ TestResult tr4 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_ENCODEURL); try { String turl = "http://www.apache.org/"; String hval = (String) response.encodeUrl(turl); String pval = (String) portletResp.encodeURL(turl); CompareUtils.stringsEqual("HttpServletResponse", hval, "ResourceResponse", pval, tr4); } catch (Exception e) { tr4.appendTcDetail(e.toString()); } tr4.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_getBufferSize */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.getBufferSize must provide the same */ /* functionality as ResourceResponse.getBufferSize" */ TestResult tr5 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_GETBUFFERSIZE); try { int hval = response.getBufferSize(); int pval = ((ResourceResponse) portletResp).getBufferSize(); String str = "Value " + hval + " from " + "HttpServletResponse" + " does not equal value " + pval + " + ResourceResponse"; if (hval != pval) { tr5.appendTcDetail(str); } tr5.setTcSuccess(hval == pval); } catch (Exception e) { tr5.appendTcDetail(e.toString()); } tr5.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_getCharacterEncoding */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.getCharacterEncoding must provide */ /* the same functionality as ResourceResponse.getCharacterEncoding" */ TestResult tr6 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_GETCHARACTERENCODING); try { String hval = response.getCharacterEncoding(); String pval = ((ResourceResponse) portletResp).getCharacterEncoding(); CompareUtils.stringsEqual("HttpServletResponse", hval, "ResourceResponse", pval, tr6); } catch (Exception e) { tr6.appendTcDetail(e.toString()); } tr6.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_getContentType */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.getContentType must provide the */ /* same functionality as ResourceResponse.getContentType" */ TestResult tr7 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_GETCONTENTTYPE); try { String hval = response.getContentType(); String pval = ((ResourceResponse) portletResp).getContentType(); CompareUtils.stringsEqual("HttpServletResponse", hval, "ResourceResponse", pval, tr7); } catch (Exception e) { tr7.appendTcDetail(e.toString()); } tr7.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_getLocale */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.getLocale must provide the same */ /* functionality as ResourceResponse.getLocale" */ TestResult tr8 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_GETLOCALE); try { Locale hl = response.getLocale(); Locale pl = ((MimeResponse) portletResp).getLocale(); String hval = hl.getDisplayName(); String pval = pl.getDisplayName(); CompareUtils.stringsEqual("HttpServletResponse", hval, "ResourceResponse", pval, tr8); } catch (Exception e) { tr8.appendTcDetail(e.toString()); } tr8.writeTo(writer); /* TestCase: V2DispatcherReqRespTests4_SPEC2_19_IncludeServletResourceResponse_isCommitted */ /* Details: "In a target servlet of a include in the Resource phase, */ /* the method HttpServletResponse.isCommitted must provide the same */ /* functionality as ResourceResponse.isCommitted" */ TestResult tr9 = tcd.getTestResultFailed( V2DISPATCHERREQRESPTESTS4_SPEC2_19_INCLUDESERVLETRESOURCERESPONSE_ISCOMMITTED); try { boolean hval = response.isCommitted(); boolean pval = ((ResourceResponse) portletResp).isCommitted(); String str = "Value " + hval + " from " + "HttpServletResponse" + " does not equal value " + pval + " + ResourceResponse"; if (hval != pval) { tr9.appendTcDetail(str); } tr9.setTcSuccess(hval == pval); } catch (Exception e) { tr9.appendTcDetail(e.toString()); } tr9.writeTo(writer); }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // create input/output dir patterns String contextPath = httpRequest.getContextPath(); if (this.inDirPattern == null) { // NOTE: Have to do this here because the context path is not // available in init(). this.inDirPattern = Pattern.compile("^" + escape(contextPath) + escape(this.inDirName) + "/(.*)"); this.outDirPattern = Pattern.compile("^" + escape(contextPath) + "/help/[a-z]{2}(?:_[A-Z]{2})?/.*"); if (ZimbraLog.webclient.isDebugEnabled()) { ZimbraLog.webclient.debug("### indir pattern: " + this.inDirPattern.pattern()); ZimbraLog.webclient.debug("### outdir pattern: " + this.outDirPattern.pattern()); } } // check to see if we need to redirect this request String requestUri = httpRequest.getRequestURI(); if (this.outDirPattern.matcher(requestUri).matches()) { // allow it to go through chain.doFilter(request, response); return; } // make list of potential locales to check Locale preferredLocale = getLocale(httpRequest); String language = preferredLocale.getLanguage(); String country = preferredLocale.getCountry(); Locale[] locales = {preferredLocale, country != null ? new Locale(language) : null, Locale.US}; if (ZimbraLog.webclient.isDebugEnabled()) { for (Locale locale : locales) { ZimbraLog.webclient.debug("locale: " + locale); } } // find out which version of the requested file exists Locale actualLocale = preferredLocale; Matcher matcher = this.inDirPattern.matcher(requestUri); if (!matcher.matches()) { httpResponse.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Help URL doesn't match input pattern."); return; } if (ZimbraLog.webclient.isDebugEnabled()) { ZimbraLog.webclient.debug("### filename: " + matcher.group(1)); } String filename = decode(matcher.group(1)).replace('/', File.separatorChar); if (ZimbraLog.webclient.isDebugEnabled()) { ZimbraLog.webclient.debug("### filename: " + filename); } File baseDir = new File(this.context.getRealPath("/")); if (ZimbraLog.webclient.isDebugEnabled()) { ZimbraLog.webclient.debug("### basedir: " + baseDir); } for (Locale locale : locales) { if (locale == null) continue; File file = new File( baseDir, this.outDirName.replaceAll("\\{locale\\}", locale.toString()) + File.separatorChar + filename); if (file.exists()) { actualLocale = locale; break; } } // redirect String redirectUrl = contextPath + this.outDirName.replaceAll("\\{locale\\}", actualLocale.toString()) + "/" + filename; if (ZimbraLog.webclient.isDebugEnabled()) { ZimbraLog.webclient.debug("redirecting to: " + redirectUrl); } httpResponse.sendRedirect(redirectUrl); }