resourcehandlerimpl.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 748 行 · 第 1/2 页
JAVA
748 行
else if ((parts.length > start + 2) && (parts[start + 1]).equals(rnParts[0])) matchStart = start + 1; else { matchStart = -1; } if (matchStart != -1 && rnParts.length > 1) { for (int k = 1; k < rnParts.length; k++) { if (parts.length < matchStart + k + 1 || !rnParts[k].equals(parts[matchStart + k])) { matchStart = -1; break; } } } } if (matchStart == -1) continue; if (extaPartsCount == 2) { String lver = parts[matchStart - 1]; String rver = parts[matchStart + rnParts.length]; if ((entryLibVer == null || (compareVersions(lver, entryLibVer)) > 0) && (entryResVer == null || (compareVersions(rver, entryResVer)) > 0)) { entryLibVer = lver; entryResVer = rver; entryJarEntry = jarEntry; entryUrl = url; } } else if (extaPartsCount == 1) { if ((matchStart + rnParts.length) == parts.length) { String lver = parts[matchStart - 1]; if (entryLibVer == null || (compareVersions(lver, entryLibVer) > 0)) { entryLibVer = lver; entryResVer = null; entryJarEntry = jarEntry; entryUrl = url; } } else { String rver = parts[parts.length - 1]; if (entryLibVer == null && (entryResVer == null || compareVersions(rver, entryResVer) > 0) ) { entryLibVer = null; entryResVer = rver; entryJarEntry = jarEntry; entryUrl = url; } } } else if (extaPartsCount == 0) { if (entryJarEntry == null) { entryLibVer = null; entryResVer = null; entryJarEntry = jarEntry; entryUrl = url; } } } } if (entryJarEntry != null) { if (path != null && entryUrl.equals(urls[0])) result = Vfs.lookup(entryUrl); else result = Vfs.lookup(entryUrl + "/" + entryJarEntry); } return result; } private Path locateResource(final Path root, String resourceName, String libraryName, String locale) throws IOException { Path result = null; if (libraryName != null) { Path libPath = root.lookup((locale == null ? "./" : "./" + locale + "/") + libraryName); if (libPath.exists()) { String []paths = libPath.list(); String version = null; Path base = null; for (String s : paths) { Path test = libPath.lookup("./" + s + "/" + resourceName); if (test.exists() && (test.isFile() || test.list().length > 0)) { if (version == null || compareVersions(s, version) > 0) { base = test; version = s; } } } if (base == null) { Path temp = libPath.lookup("./" + resourceName); if (temp.exists() && temp.isFile()) result = temp; else base = temp; } else if (base.isFile()) { result = base; } if (result == null && base != null && base.isDirectory()) { paths = base.list(); version = null; for (String s : paths) { Path test = base.lookup("./" + s); if (test.isFile() && (version == null || compareVersions(s, version) > 0)) { result = test; version = s; } } } } } else { Path base = root.lookup((locale == null ? "./" : "./" + locale + "/") + resourceName); if (base.isDirectory()) { String []paths = base.list(); String version = null; for (String s : paths) { Path test = base.lookup("./" + s); if (test.isFile() && (version == null || compareVersions(s, version) > 0)) { result = test; version = s; } } } else if (base.isFile()) { result = base; } } return result; } private int compareVersions(String ver1, String ver2) { String []ver1Parts = _versionPattern.split(ver1); String []ver2Parts = _versionPattern.split(ver2); int len; if (ver1Parts.length > ver2Parts.length) len = ver2Parts.length; else len = ver1Parts.length; for (int i = 0; i < len; i++) { char []ver1Part = ver1Parts[i].toCharArray(); char []ver2Part = ver2Parts[i].toCharArray(); if (ver1Part.length == ver2Part.length) { for (int j = 0; j < ver2Part.length; j++) { char c1 = ver1Part[j]; char c2 = ver2Part[j]; if (c1 != c2) return c1 - c2; } } else { return ver1Part.length - ver2Part.length; } } return ver1Parts.length - ver2Parts.length; } public boolean isResourceRequest(FacesContext context) { ExternalContext extContext = context.getExternalContext(); String pathInfo = extContext.getRequestPathInfo(); if (pathInfo != null) return pathInfo.indexOf(RESOURCE_IDENTIFIER) > -1; else return extContext.getRequestServletPath().indexOf(RESOURCE_IDENTIFIER) > -1; } public void handleResourceRequest(FacesContext context) throws IOException { ExternalContext extContext = context.getExternalContext(); HttpServletRequest request = (HttpServletRequest) extContext.getRequest(); HttpServletResponse response = (HttpServletResponse) extContext.getResponse(); String method = request.getMethod(); if (!method.equalsIgnoreCase("GET") && !method.equalsIgnoreCase("POST") && !method.equalsIgnoreCase("HEAD")) { response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "Method not implemented"); return; } String resourceName; String pathInfo = request.getPathInfo(); String servletPath = request.getServletPath(); if (pathInfo == null) { int extIdx = servletPath.lastIndexOf('.'); resourceName = servletPath.substring(servletPath.indexOf( RESOURCE_IDENTIFIER) + RESOURCE_IDENTIFIER.length(), extIdx); } else { if ("".equals(servletPath)) { String suffix = extContext.getInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME); if (suffix == null) suffix = ViewHandler.DEFAULT_SUFFIX; if (pathInfo.endsWith(suffix)) { resourceName = pathInfo.substring(pathInfo.indexOf(RESOURCE_IDENTIFIER) + RESOURCE_IDENTIFIER.length(), pathInfo.length() - suffix.length()); } else { resourceName = pathInfo.substring(pathInfo.indexOf(RESOURCE_IDENTIFIER) + RESOURCE_IDENTIFIER.length()); } } else { resourceName = pathInfo.substring(pathInfo.indexOf(RESOURCE_IDENTIFIER) + RESOURCE_IDENTIFIER.length()); } } String temp = request.getParameter("ln"); String libraryName; String locale; if (temp != null && !"".equals(temp)) libraryName = temp; else libraryName = null; temp = request.getParameter("loc"); if (temp != null && !"".equals(temp)) locale = temp; else locale = null; final Resource resource; if (locale != null) resource = createResource(context, resourceName, libraryName, null, locale); else resource = createResource(resourceName, libraryName); if (resource != null) { Map<String, String> headers = resource.getResponseHeaders(); for (Map.Entry<String, String> entry : headers.entrySet()) { response.setHeader(entry.getKey(), entry.getValue()); } response.setContentType(resource.getContentType()); if (resource.userAgentNeedsUpdate(context)) { if (! method.equalsIgnoreCase("HEAD")) { InputStream is = resource.getInputStream(); OutputStream os = response.getOutputStream(); TempBuffer tempBuffer = TempBuffer.allocate(); try { byte []buffer = tempBuffer.getBuffer(); int length = buffer.length; int len; while ((len = is.read(buffer, 0, length)) > 0) os.write(buffer, 0, len); } finally { TempBuffer.free(tempBuffer); tempBuffer = null; is.close(); } } } else { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } @Override public String getRendererTypeForResourceName(String resourceName) { if (resourceName == null) return null; int suffixIdx = resourceName.lastIndexOf('.'); if (suffixIdx == -1) return null; String suffix = resourceName.substring(suffixIdx); if (".js".equalsIgnoreCase(suffix)) return ("javax.faces.resource.Script"); else if (".css".equalsIgnoreCase(suffix)) return "javax.faces.resource.Stylesheet"; else return null; } public String toString() { return "ResourceHandlerImpl[]"; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?