Hi folks,
I found the format produced by the DirectoryGenerator somewhat
limited. I particular I missed the size attribute.
Therefore I added the size attribute and additionally included
sorted output in different formats.
I'm still a Java neophyte, therefore please review my changes and
integrate them if you feel them appropiate. I've updated the
documentation accordingly.
Index: src/documentation/xdocs/userdocs/generators/directory-generator.xml
===================================================================
RCS file:
/home/cvspublic/xml-cocoon2/src/documentation/xdocs/userdocs/generators/directory-generator.xml,v
retrieving revision 1.1
diff -u -r1.1 directory-generator.xml
--- src/documentation/xdocs/userdocs/generators/directory-generator.xml 3 Jan 2002
12:31:04 -0000 1.1
+++ src/documentation/xdocs/userdocs/generators/directory-generator.xml 25 Apr 2002
+07:40:59 -0000
@@ -24,12 +24,15 @@
<li>name : the name of the file or directory</li>
<li>lastModified : the time the file was last modified, measured as the
number of
milliseconds since the epoch (as in java.io.File.lastModified)</li>
+ <li>size : the file size in bytes (as returned by java.io.File.length)</li>
<li>date (optional) : the time the file was last modified in human-readable
form</li>
</ul>
<p>All generated elements have the namespace
<code>http://apache.org/cocoon/directory/2.0</code>.
The root <code>directory</code>
- node has the attribute <code>requested</code> with the value
<code>true</code>.
+ node has the attribute <code>requested</code> with the value
+<code>true</code>. The sort
+ order is described by the attribute <code>sort</code>, which defaults to
+sorting according
+ to <code>name</code>.
</p>
<ul>
<li>Name : directory</li>
@@ -51,9 +54,16 @@
<li>dateFormat (optional) : Sets the format for the date attribute of each
node, as
described in java.text.SimpleDateFormat. If unset, the default
format for the current locale will be used.</li>
- <li>root (optional) : The root pattern</li>
- <li>include (optional) : The include pattern</li>
- <li>exclude (optional) : The exclude pattern</li>
+ <li>root (optional) : The root pattern. This is a regular expression as
+described in
+ <link
+href="http://jakarta.apache.org/regexp/apidocs/org/apache/regexp/RE.html">
+
+http://jakarta.apache.org/regexp/apidocs/org/apache/regexp/RE.html</link></li>
+ <li>include (optional) : The include pattern. Also a regular expression.</li>
+ <li>exclude (optional) : The exclude pattern. Also a regular expression.</li>
+ <li>sort (optional): This parameter determines the order, in which the
+<code>file</code>
+ and <code>directory</code> nodes are returned. Default sort order is by
+name.
+ Possible values are "name", "name-reverse", "size", "size-reverse", "time",
+ "time-reverse" and "directory". "directory" is the same as "name", except
+that directory
+ entries come first.</li>
</ul>
</s1>
<s1 title="DTD">
@@ -67,13 +77,16 @@
name CDATA #REQUIRED
lastModified CDATA #REQUIRED
date CDATA #IMPLIED
+ size CDATA #IMPLIED
+ sort CDATA #IMPLIED
requested CDATA #IMPLIED>
- <!ELEMENt file #EMPTY>
+ <!ELEMENT file #EMPTY>
<!ATTLIST file
name CDATA #REQUIRED
lastModified CDATA #REQUIRED
- date CDATA #IMPLIED>
+ date CDATA #IMPLIED
+ size CDATA #IMPLIED>
]]></source>
</s1>
<s1 title="Example">
@@ -81,18 +94,20 @@
The current directory generator may generate following xml:
</p>
<source><![CDATA[
-<directory xmlns="http://apache.org/cocoon/directory/2.0"
- name="stylesheets" lastModified="999425490000"
- date="02.09.01 12:11"
- requested="true">
- <directory name="sites"
- lastModified="999425490000" date="02.09.01 12:11"/>
- <file name="dynamic-page2html.xsl"
- lastModified="999425490000" date="02.09.01 12:11"/>
- <file name="simple-xml2html.xsl"
- lastModified="999425490000" date="02.09.01 12:11"/>
-</directory>
+<dir:directory xmlns:dir="http://apache.org/cocoon/directory/2.0"
+ name="stylesheets" lastModified="1019666489000"
+ date="24.04.02 18:41"
+ size="461"
+ requested="true"
+ sort="name">
+ <dir:directory name="sites"
+ lastModified="1019666489000" date="24.04.02 18:41" size="118"/>
+ <dir:file name="dynamic-page2html.xsl"
+ lastModified="1019666489000" date="24.04.02 18:41" size="1832"/>
+ <dir:file name="simple-xml2html.xsl"
+ lastModified="1019666489000" date="24.04.02 18:41" size="12676"/>
+ </dir:directory>
]]></source>
</s1>
-</body>
+</body>
</document>
Index: src/java/org/apache/cocoon/generation/DirectoryGenerator.java
===================================================================
RCS file:
/home/cvspublic/xml-cocoon2/src/java/org/apache/cocoon/generation/DirectoryGenerator.java,v
retrieving revision 1.7
diff -u -r1.7 DirectoryGenerator.java
--- src/java/org/apache/cocoon/generation/DirectoryGenerator.java 22 Feb 2002
07:03:51 -0000 1.7
+++ src/java/org/apache/cocoon/generation/DirectoryGenerator.java 25 Apr 2002
+07:40:59 -0000
@@ -67,6 +67,8 @@
import java.util.Date;
import java.util.Map;
import java.util.Stack;
+import java.util.Arrays;
+import java.util.Comparator;
/**
* Generates an XML directory listing.
@@ -82,6 +84,8 @@
* <dt> lastModified
* <dd> the time the file was last modified, measured as the number of
* milliseconds since the epoch (as in java.io.File.lastModified)
+ * <dt> size
+ * <dd> the file size in bytes (as returned by java.io.File.length)
* <dt> date (optional)
* <dd> the time the file was last modified in human-readable form
* </dl>
@@ -93,6 +97,11 @@
* <dd> Sets how deep DirectoryGenerator should delve into the
* directory structure. If set to 1 (the default), only the starting
* directory's immediate contents will be returned.
+ * <dt> <i>sort</i>
+ * <dd> Sort order in which the nodes are returned. Default is name.
+ * Possible values are name, name-reverse, size, size-reverse,
+ * time, time-reverse and directory. directory is the same as
+ * name, except that the directory entries are listed first.
* <dt> <i>dateFormat</i> (optional)
* <dd> Sets the format for the date attribute of each node, as
* described in java.text.SimpleDateFormat. If unset, the default
@@ -122,6 +131,7 @@
protected static final String FILENAME_ATTR_NAME = "name";
protected static final String LASTMOD_ATTR_NAME = "lastModified";
protected static final String DATE_ATTR_NAME = "date";
+ protected static final String SIZE_ATTR_NAME = "size";
/*
* Variables set per-request
@@ -131,6 +141,7 @@
protected int depth;
protected AttributesImpl attributes = new AttributesImpl();
protected SimpleDateFormat dateFormatter;
+ protected String sort;
protected RE rootRE;
protected RE includeRE;
@@ -166,6 +177,9 @@
this.depth = par.getParameterAsInteger("depth", 1);
getLogger().debug("depth: " + this.depth);
+ this.sort = par.getParameter("sort", "name");
+ getLogger().debug("sort: " + this.sort);
+
String rePattern = par.getParameter("root", null);
try {
getLogger().debug("root pattern: " + rePattern);
@@ -288,6 +302,27 @@
startNode(DIR_NODE_NAME, path);
if (depth>0) {
File contents[] = path.listFiles();
+ if (sort.equals("name")) {
+ Arrays.sort(contents, new SortByName());
+ }
+ if (sort.equals("name-reverse")) {
+ Arrays.sort(contents, new SortByName(true));
+ }
+ if (sort.equals("size")) {
+ Arrays.sort(contents, new SortBySize());
+ }
+ if (sort.equals("size-reverse")) {
+ Arrays.sort(contents, new SortBySize(true));
+ }
+ if (sort.equals("lastmodified")) {
+ Arrays.sort(contents, new SortByLastmodified());
+ }
+ if (sort.equals("lastmodified-reverse")) {
+ Arrays.sort(contents, new SortByLastmodified(true));
+ }
+ if (sort.equals("directory")) {
+ Arrays.sort(contents, new SortByDirectory());
+ }
for (int i=0; i<contents.length; i++) {
if (isIncluded(contents[i]) && !isExcluded(contents[i])) {
addPath(contents[i], depth-1);
@@ -346,10 +381,15 @@
attributes.addAttribute("", DATE_ATTR_NAME,
DATE_ATTR_NAME, "CDATA",
dateFormatter.format(new Date(lastModified)));
+ attributes.addAttribute("", SIZE_ATTR_NAME,
+ SIZE_ATTR_NAME, "CDATA",
+ Long.toString(path.length()));
if (this.isRequestedDirectory) {
attributes.addAttribute("", "requested", "requested", "CDATA",
"true");
+ attributes.addAttribute("", "sort", "sort", "CDATA",
+ this.sort);
this.isRequestedDirectory = false;
}
}
@@ -434,3 +474,86 @@
}
}
+
+class SortByName implements Comparator {
+ boolean sortReverse = false;
+
+ SortByName () {
+ }
+
+ SortByName(boolean order) {
+ this.sortReverse = order;
+ }
+
+ public int compare (Object o1, Object o2) {
+ File f1 = (File) o1;
+ File f2 = (File) o2;
+
+ if (sortReverse) {
+ return f2.getName().compareTo(f1.getName());
+ } else {
+ return f1.getName().compareTo(f2.getName());
+ }
+ }
+}
+
+class SortByDirectory implements Comparator {
+
+ public int compare (Object o1, Object o2) {
+ File f1 = (File) o1;
+ File f2 = (File) o2;
+
+ if (f1.isDirectory() && f2.isFile()) {
+ return -1;
+ } else if (f1.isFile() && f2.isDirectory()) {
+ return 1;
+ } else {
+ return f1.getName().compareTo(f2.getName());
+ }
+ }
+}
+
+class SortBySize implements Comparator {
+ boolean sortReverse = false;
+
+ SortBySize() {
+ }
+
+ SortBySize(boolean order) {
+ this.sortReverse = order;
+ }
+
+ public int compare (Object o1, Object o2) {
+ Long s1 = new Long(((File)o1).length());
+ Long s2 = new Long(((File)o2).length());
+
+ if (sortReverse) {
+ return s2.compareTo(s1);
+ } else {
+ return s1.compareTo(s2);
+ }
+ }
+}
+
+class SortByLastmodified implements Comparator {
+ boolean sortReverse = false;
+
+ SortByLastmodified() {
+ }
+
+ SortByLastmodified(boolean order) {
+ this.sortReverse = order;
+ }
+
+ public int compare (Object o1, Object o2) {
+ Long s1 = new Long(((File)o1).lastModified());
+ Long s2 = new Long(((File)o2).lastModified());
+
+ if (sortReverse) {
+ return s2.compareTo(s1);
+ } else {
+ return s1.compareTo(s2);
+ }
+ }
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]