package cn.inkfish.app.cmd.doclist; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import java.util.Map.Entry; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import cn.inkfish.tools.xml.XPathTool; public class DocListGener { private File rootdir = new File("E:\\2011.4.5\\API\\lib_doc"); private static String[] docDirs = new String[] { "\\javadoc", "\\javadocs", "\\apidocs", "\\api", "\\docs", "\\doc", "\\docs\\api", "\\doc\\api", "\\docs\\apidocs", "\\docs\\javadocs", "\\docs\\javadoc", "\\doc\\javadocs", "\\doc\\javadoc", "\\site\\javadocs", "\\site\\apidocs", "\\docs\\javadoc-api" }; private static String[] indexFiles = new String[] { "index.html", "index.htm" }; private int colNum = 3; private int maxRow = 30; private StringBuffer sb = new StringBuffer(); public static void main(String[] args) throws IOException { DocListGener gener = new DocListGener(); File dest = new File(gener.rootdir, "index.html"); if (dest.exists()) { dest.delete(); } gener.generateHead(); gener.generateLibUrl(); gener.generateCommonUrl(); gener.generateEnd(); String content = gener.sb.toString(); content = content.replaceAll("COL_WIDTH", (100 / gener.colNum) + "%"); FileUtils.writeStringToFile(dest, content, "UTF-8"); } private void generateLibUrl() { sb.append("\t\t\t<td width=\"COL_WIDTH\" valign=\"top\">\n"); sb.append("\t\t\t\t<ul>\n"); File[] dirs = rootdir.listFiles(); Arrays.sort(dirs); int counter = 0; for (File dir : dirs) { // 过滤掉非文件夹 if (!dir.isDirectory()) { continue; } label: for (int i = 0; i < docDirs.length; i++) { for (String indexFile : indexFiles) { File file = new File(new File(dir, docDirs[i]), indexFile); if (file.exists()) { counter++; if (counter > maxRow) { sb.append("\t\t\t\t</ul>\n"); sb.append("\t\t\t</td>\n"); sb.append("\t\t\t<td width=\"COL_WIDTH\" valign=\"top\">\n"); sb.append("\t\t\t\t<ul>\n"); counter = 0; colNum++; } sb.append("\t\t\t\t\t<li>"); sb.append("<a target=\"_blank\" href=\"").append(file.toURI().toString()) .append("\">"); sb.append(FilenameUtils.getName(dir.toString())); sb.append("</a>"); sb.append("</li>\n"); break label; } } } } sb.append("\t\t\t\t</ul>\n"); sb.append("\t\t\t</td>\n"); } private void generateHead() { sb.append("<html>\n"); sb.append("<head profile=\"http://www.w3.org/2005/10/profile\">\n"); sb.append("\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n"); // sb.append("\t<meta name=\"author\" content=\"wuqiming\">\n"); // sb.append("\t<title>Java Docs</title>\n"); sb.append("\t<style>ul{margin-top:5px;}</style>\n"); sb.append("\t<!--<link rel=\"icon\" href=\"http://hi.csdn.net/attachment/201011/8/7093_128919873175yk.png\" type=\"image/png\">-->\n"); sb.append("\t<link rel=\"icon\" href=\"./favicon.png\" type=\"image/png\">\n"); sb.append("</head>\n"); sb.append("<body>\n"); //sb.append("\t<center><h2>Java Docs Collection(Wu Qiming)</h2></center>\n"); sb.append("\t<table style=\"font-size:14px;\" width=\"90%\" align=\"center\" cellspadding=\"0\" cellspacing=\"0\" border=\"1\">\n"); sb.append("\t\t<tr>\n"); } private void generateCommonUrl() { Map<String, Map<String, Properties>> map = getSites(); int counter = 0; for (String category : map.keySet()) { if (counter + 2 + map.get(category).size() >= maxRow) { counter = 0; sb.append("\t\t\t</td>\n"); } if (counter == 0) { sb.append("\t\t\t<td width=\"COL_WIDTH\" valign=\"top\">\n"); } sb.append("\t\t\t\t").append(category).append("<br />\n"); counter += 2; sb.append("\t\t\t\t<ul>\n"); Map<String, Properties> subMap = map.get(category); for (Entry<String, Properties> entry : subMap.entrySet()) { Properties prop = entry.getValue(); if (prop.containsKey("name") && prop.containsKey("url")) { String[] names = StringUtils.split(prop.getProperty("name"), ' '); String[] urls = StringUtils.split(prop.getProperty("url"), ' '); String target = prop.getProperty("target", "_blank"); sb.append("\t\t\t\t\t<li>\n"); if (names.length == urls.length) { for (int i = 0; i < names.length; i++) { sb.append("\t\t\t\t\t\t<a target=\"").append(target).append("\" "); sb.append("href=\"").append(urls[i]).append("\">"); sb.append(names[i]).append("</a> "); } } else { sb.append("\t\t\t\t\t\t<a target=\"").append(target).append("\" "); sb.append("href=\"").append(prop.getProperty("url")).append("\">"); sb.append(prop.getProperty("name")).append("</a>"); } sb.append("\t\t\t\t\t</li>\n"); counter++; System.out.println(counter + "\t" + prop.getProperty("name")); } } sb.append("\t\t\t\t</ul>\n"); } sb.append("\t\t\t</td>\n"); sb.append("\t\t</tr>\n"); } private void generateEnd() { sb.append("\t\t<tr>\n"); sb.append("\t\t\t<td colspan=\"" + colNum + "\">\n"); sb.append("Infos here<br>"); sb.append("\t\t\t</td>\n"); sb.append("\t\t</tr>\n"); sb.append("\t</table>\n"); sb.append("</body>\n"); sb.append("</html>"); } private Map<String, Map<String, Properties>> getSites() { Map<String, Map<String, Properties>> map = new LinkedHashMap<String, Map<String, Properties>>(); try { InputStream is = this.getClass().getResourceAsStream("sites.xml"); XPathTool xpath = new XPathTool(is); IOUtils.closeQuietly(is); NodeList categories = xpath.getNodeSetValue("/sites/catagory/@name"); for (int i = 0; i < categories.getLength(); i++) { Map<String, Properties> subMap = new LinkedHashMap<String, Properties>(); String cateName = categories.item(i).getNodeValue(); NodeList subSites = xpath.getNodeSetValue("/sites/catagory[@name='" + cateName + "']/site"); for (int j = 0; j < subSites.getLength(); j++) { Properties prop = new Properties(); NamedNodeMap attributes = subSites.item(j).getAttributes(); for (int k = 0; k < attributes.getLength(); k++) { prop.put(attributes.item(k).getNodeName(), attributes.item(k) .getNodeValue()); } subMap.put(prop.getProperty("name"), prop); } map.put(cateName, subMap); } } catch (SAXException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } catch (ParserConfigurationException ex) { ex.printStackTrace(); } catch (XPathExpressionException ex) { ex.printStackTrace(); } return map; } }
<?xml version="1.0" encoding="UTF-8"?> <sites> <catagory name="API"> <site name="JDK_API" url="E:\API\JDK_API_1_6_中文版.CHM" /> <site url="D:\" name="D" /> <site url="E:\" name="E" /> <site url="E:\API\JDK_API_1_6_中文版.CHM" name="JDK_API" /> <site url="E:\API\[Java参考文档].J2EE1.5.chm" name="J2EE.chm" /> <site url="E:\API\Hibernate3.2官方中文参考手册.pdf" name="Hibernate" /> <site url="E:\Workspaces" name="Workspaces" /> <site url="E:\API" name="API" /> <site url="E:\API\jQueryAPI-100214.chm" name="jQueryAPI" /> <site url="E:\API\程序员常用js.chm" name="js" /> <site url="C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps" name="Tomcat_webapps" /> <site url="E:\我的XP环境配置" name="我的XP环境配置" /> <site url="http://zhangyulong.iteye.com" name="ITeye" /> <site url="http://localhost:8080" name="tomcat" /> <site url="http://zyl1221.download.csdn.net" name="csdn" /> <site url="http://w3school.com.cn" name="w3c" /> <site url="http://user.qzone.qq.com/574893508" name="qzone" /> <site url="http://www.renren.com/home" name="renren" /> <site url="http://detail.zol.com.cn/" name="zol" /> <site url="http://appimg2.qq.com/card/index_v3.html?qzone=1" name="card" /> </catagory> </sites > apache-mime4j-0.6.jar commons-logging-1.1.1.jar httpclient-4.0.jar httpcore-4.0.1.jar httpmime-4.0.jar commons-codec-1.4.jar jaxp.jar oscore-2.2.1.jar propertyset-1.3.jar trove-2.1.0.jar xalan.jar xercesImpl.jar jtidy-r918.jar commons-io-2.0.jar lombok.jar commons-lang-2.5.jar rome-1.0.jar jdom.jar poi-3.8-beta1-20110307.jar poi-excelant-3.8-beta1-20110307.jar poi-ooxml-3.8-beta1-20110307.jar poi-ooxml-schemas-3.8-beta1-20110307.jar poi-scratchpad-3.8-beta1-20110307.jar