Index: java/org/apache/catalina/servlets/DefaultServlet.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- java/org/apache/catalina/servlets/DefaultServlet.java (revision 1642802) +++ java/org/apache/catalina/servlets/DefaultServlet.java (revision ) @@ -16,50 +16,6 @@ */ package org.apache.catalina.servlets; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.RandomAccessFile; -import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; -import java.security.AccessController; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Locale; -import java.util.StringTokenizer; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletResponse; -import javax.servlet.ServletResponseWrapper; -import javax.servlet.UnavailableException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - import org.apache.catalina.Context; import org.apache.catalina.Globals; import org.apache.catalina.WebResource; @@ -77,7 +33,25 @@ import org.xml.sax.SAXException; import org.xml.sax.ext.EntityResolver2; +import javax.servlet.*; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; +import java.security.AccessController; +import java.util.*; + /** *

The default resource-serving servlet for most web applications, * used to serve static resources such as HTML pages and images. @@ -259,7 +233,10 @@ */ protected boolean showServerInfo = true; - + /** + * File list sorting parameters. + */ + protected String sortingParams = null; // --------------------------------------------------------- Public Methods /** @@ -701,7 +678,7 @@ throws IOException, ServletException { boolean serveContent = content; - + sortingParams=request.getQueryString(); // Identify the requested resource path String path = getRelativePath(request); if (debug > 0) { @@ -1281,7 +1258,6 @@ // rewriteUrl(contextPath) is expensive. cache result for later reuse String rewrittenContextPath = rewriteUrl(contextPath); String directoryWebappPath = resource.getWebappPath(); - for (String entry : entries) { if (entry.equalsIgnoreCase("WEB-INF") || @@ -1455,7 +1431,24 @@ sb.append(""); boolean shade = false; + Comparator cic = null; + if (sortingParams == null) { + cic = new NameAscComparator(); + } else { + cic = getComparator(sortingParams); + } + ArrayList resourceList = new ArrayList(); for (String entry : entries) { + WebResource childResource = + resources.getResource(directoryWebappPath + entry); + resourceList.add(childResource); + } + WebResource[] resourceArray = resourceList.toArray(new WebResource[resourceList.size()]); + Arrays.sort(resourceArray, cic); + for (int i = 0; i < entries.length; i++) { + entries[i] = resourceArray[i].getName(); + } + for (String entry : entries) { if (entry.equalsIgnoreCase("WEB-INF") || entry.equalsIgnoreCase("META-INF")) continue; @@ -2229,6 +2222,104 @@ IOException { throw new SAXException(sm.getString("defaultServlet.blockExternalEntity2", name, publicId, baseURI, systemId)); + } + } + private Comparator getComparator(String sortingParams) { + if (sortingParams.equals("size=asc")) { + return new SizeAscComparator(); + } else if (sortingParams.equals("size=dsc")) { + return new SizeDscComparator(); + } else if (sortingParams.equals("name=asc")) { + return new NameAscComparator(); + } else if (sortingParams.equals("name=dsc")) { + return new NameDscComparator(); + } else if (sortingParams.equals("modify=asc")) { + return new ModifyAscComparator(); + } else if (sortingParams.equals("modify=dsc")) { + return new ModifyDscComparator(); + } else return new NameAscComparator(); + } + + class NameAscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory() && strB.isDirectory()) { + return 1; + } else + return strA.getName().compareToIgnoreCase(strB.getName()); + } + } + + class NameDscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory() && strB.isDirectory()) { + return 1; + } else + return strB.getName().compareToIgnoreCase(strA.getName()); + } + } + + class SizeAscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory() && strB.isDirectory()) { + return 1; + } else if (strA.getContentLength() > strB.getContentLength()) { + return 1; + } else if (strA.getContentLength() < strB.getContentLength()) { + return -1; + } else + return 0; + } + } + + class SizeDscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory()&& strB.isDirectory()) { + return 1; + } else if (strA.getContentLength() > strB.getContentLength()) { + return -1; + } else if (strA.getContentLength() < strB.getContentLength()) { + return 1; + } else + return 0; + } + } + + class ModifyAscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory() && strB.isDirectory()) { + return 1; + } else if (strA.getLastModified() > strB.getLastModified()) { + return 1; + } else if (strA.getLastModified() < strB.getLastModified()) { + return -1; + } else + return 0; + } + } + + class ModifyDscComparator implements Comparator { + public int compare(WebResource strA, WebResource strB) { + if (strA.isDirectory() && !strB.isDirectory()) { + return -1; + } else if (!strA.isDirectory() && strB.isDirectory()) { + return 1; + } else if (strA.getLastModified() > strB.getLastModified()) { + return -1; + } else if (strA.getLastModified() < strB.getLastModified()) { + return 1; + } else + return 0; } } }