package org.apache.maven.javadoc; import java.io.PrintWriter; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.apache.commons.collections.set.ListOrderedSet; import org.apache.commons.lang.StringEscapeUtils; /** * @author Steven Caswell */ public class StandardDocletDefaultXmlBuilder implements XmlBuilder { /** XML padding. */ private static final int PADDING = 10; private String outputEncoding; private boolean verbose; /** * {@inheritDoc} */ public boolean isVerbose() { return verbose; } /** * {@inheritDoc} */ public String getOutputEncoding() { return this.outputEncoding; } /** * {@inheritDoc} */ public void setOutputEncoding(String outputEncoding) { this.outputEncoding = outputEncoding; } /** * {@inheritDoc} */ public void setVerbose(boolean verbose) { this.verbose = verbose; } /** * {@inheritDoc} */ public Map buildMap(String[] input) { if(this.isVerbose()) { System.out.println("Building map from " + input.length + " input line(s)"); } Map files = new TreeMap(); for (int i = 0; i < input.length; i++) { String line = input[i]; if(this.isVerbose()) { System.out.println("Parsing line " + line); } try { // Break up line into pieces int javaDocStart = line.indexOf("[javadoc]"); int fileNameStart = javaDocStart += PADDING; int warningStart = line.indexOf("warning - "); int fileNameEnd = warningStart - 1; String fileNameAndLineNumber = line.substring(fileNameStart, fileNameEnd); int lastColon = fileNameAndLineNumber.lastIndexOf(':'); int nextToLastColon = fileNameAndLineNumber.lastIndexOf(':', lastColon - 1); String fileName = fileNameAndLineNumber.substring(0, nextToLastColon); String lineNumber = fileNameAndLineNumber.substring(nextToLastColon + 1, lastColon); int msgStart = warningStart + PADDING; String msg = line.substring(msgStart); // Get the messages for the file Map fileMessages = (Map) files.get(fileName); if(fileMessages == null) { fileMessages = new TreeMap(); files.put(fileName, fileMessages); } // Get the messages for the line Set lineMessages = (Set) fileMessages.get(new Integer( lineNumber)); if (lineMessages == null) { lineMessages = new ListOrderedSet(); fileMessages.put(new Integer(lineNumber), lineMessages); } // Put the message into the line messages set lineMessages.add(msg); } catch (Throwable t) { System.err.println("*** WARNING: exception parsing line '" + line + "': " + t.getMessage()); if (this.isVerbose()) { t.printStackTrace(); } } } // for return files; } /** * {@inheritDoc} */ public void writeOutput(Map fileMap, PrintWriter out) { out.println(""); out.println(""); for (Iterator fileMapIterator = fileMap.keySet().iterator(); fileMapIterator.hasNext();) { String fileName = (String) fileMapIterator.next(); out.println(""); Map fileMessages = (Map) fileMap.get(fileName); for (Iterator fileMessagesIterator = fileMessages.entrySet() .iterator(); fileMessagesIterator.hasNext();) { Map.Entry entry = (Map.Entry) fileMessagesIterator.next(); Integer lineNumber = (Integer) entry.getKey(); Set lineMessages = (Set) entry.getValue(); for (Iterator lineMessagesIterator = lineMessages.iterator(); lineMessagesIterator.hasNext();) { String msg = (String) lineMessagesIterator.next(); out.println(""); } } out.println(""); } out.println(""); } }