package gov.fnal.XMLList; import java.io.File; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.MalformedURLException; import java.util.Iterator; import java.util.Map; public class XMLLister extends PrintWriter { protected final String ianaEncoding; public XMLLister(OutputStreamWriter out) { super(out); ianaEncoding = toIANAName(out.getEncoding()); } private static final String toIANAName(String encoding) { if(encoding.equals("UTF8")) return "UTF-8"; else if(encoding.equals("ISO8859_1")) return "ISO-8859-1"; else return encoding; } public void writeStartList() { printXmlPI(); printDoctype("srmls:dirlisting", "http://www-isd.fnal.gov/srm/XML/dirlisting.dtd"); println("<srmls:dirlisting xmlns:srmls=\"http://www-isd.fnal.gov/srm/XML/dirlisting\">"); } public void writeEndList() { println("</srmls:dirlisting>"); } public void writeDirList(File[] dirList, int nbDir, String dirABS) {} public void writeStartDir(File dir) { print(" <srmls:directory"); printAttribute("name", dir.getName()); try { printAttribute("url", dir.toURL().toString()); } catch(MalformedURLException e) { } finally { println(">"); } } public void writeEndDir(File dir) { println(" </srmls:directory>"); } public void writeStartFile(File file) { print(" <srmls:file"); printAttribute("name", file.getName()); printAttribute("size", Long.toString(file.length())); // printAttribute("type", type); try { printAttribute("url", file.toURL().toString()); } catch(MalformedURLException e) { } finally { println(">"); } } public void writeEndFile(File file) { println(" </srmls:file>"); } public void writeAttributes(Map attributes) { Iterator iter = attributes.keySet().iterator(); while(iter.hasNext()) { String name = iter.next().toString(); String value = attributes.get(name).toString(); print(" <srmls:attribute"); printAttribute("name", name); printAttribute("value", value); println("/>"); } } protected final void printXmlPI() { println("<?xml version=\"1.0\" encoding=\""+ianaEncoding+"\"?>"); } protected final void printDoctype(String name, String publicId, String systemId) { print("<!DOCTYPE "); print(name); print(" PUBLIC \""); print(publicId); print("\"\n \""); print(systemId); println("\">"); } protected final void printDoctype(String name, String systemId) { print("<!DOCTYPE "); print(name); print(" SYSTEM \""); print(systemId); println("\">"); } protected final void printAttribute(String name, String value) { print(" "); print(name); print("=\""); print(xmlEncode(value)); print("\""); } protected static final String xmlEncode(String str) { final int len = str.length(); StringBuffer buf = new StringBuffer(str); for(int i=len-1; i>=0; i--) { switch(str.charAt(i)) { case '&' : buf.insert(i+1, "amp;"); break; case '<' : buf.setCharAt(i, '&'); buf.insert(i+1, "lt;"); break; case '>' : buf.setCharAt(i, '&'); buf.insert(i+1, "gt;"); break; case '\"' : buf.setCharAt(i, '&'); buf.insert(i+1, "quot;"); break; } } return buf.toString(); } }