📄 driver.java
字号:
/* gnu.classpath.tools.doclets.xmldoclet.Driver
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
package gnu.classpath.tools.doclets.xmldoclet;
import com.sun.javadoc.*;
import java.io.*;
import com.sun.tools.doclets.Taglet;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;
import java.util.SortedSet;
import java.util.StringTokenizer;
import java.util.TreeMap;
import gnu.classpath.tools.gjdoc.TemporaryStore;
import gnu.classpath.tools.gjdoc.GjdocPackageDoc;
import gnu.classpath.tools.doclets.PackageGroup;
import gnu.classpath.tools.doclets.PackageMatcher;
import gnu.classpath.tools.doclets.InvalidPackageWildcardException;
import gnu.classpath.tools.doclets.xmldoclet.doctranslet.DocTranslet;
import gnu.classpath.tools.doclets.xmldoclet.doctranslet.DocTransletOptions;
import gnu.classpath.tools.taglets.AuthorTaglet;
import gnu.classpath.tools.taglets.VersionTaglet;
import gnu.classpath.tools.taglets.SinceTaglet;
import gnu.classpath.tools.taglets.DeprecatedTaglet;
import gnu.classpath.tools.taglets.GenericTaglet;
import gnu.classpath.tools.doclets.StandardTaglet;
import gnu.classpath.tools.java2xhtml.Java2xhtml;
import gnu.classpath.tools.IOToolkit;
import gnu.classpath.tools.FileSystemClassLoader;
/**
* A Doclet which retrieves all information presented by the Doclet
* API, dumping it to stdout in XML format.
*
* @author Julian Scheid
*/
public class Driver {
public static final String XMLDOCLET_VERSION = "0.6.1";
/**
* Used for redirecting error messages to <code>/dev/null</code>.
*/
private static class NullErrorReporter implements DocErrorReporter {
public void printError(String ignore) {}
public void printWarning(String ignore) {}
public void printNotice(String ignore) {}
}
/*
* Taglet context constants.
*/
private static final int CONTEXT_CONSTRUCTOR = 1;
private static final int CONTEXT_FIELD = 2;
private static final int CONTEXT_METHOD = 3;
private static final int CONTEXT_OVERVIEW = 4;
private static final int CONTEXT_PACKAGE = 5;
private static final int CONTEXT_TYPE = 6;
/**
* All XML output will go to this stream.
*/
private PrintWriter out;
/**
* How many spaces to indent each XML node level,
* i.e. Tab size for output.
*/
private static int indentStep = 1;
/**
* Won't output superfluous spaces if set to true.
* If set to false, output will be more legible.
*/
private boolean compress = false;
/**
* Won't output warning messages while fixing
* HTML code if set to true.
*/
private boolean noHTMLWarn = false;
/**
* Won't output warning messages when encountering tags
* that look like an email address if set to true.
*/
private boolean noEmailWarn = false;
/**
* Will fix HTML if necessary so that each comment
* contains valid XML code if set to true. If set
* to false, HTML code will not be modified and
* instead encapsulated in a CDATA section.
*/
private boolean fixHTML = true;
/**
* User-specified name of the directory where the final version of
* the generated files will be written to.
*
* If no XSLT sheet is given, the XML output will go directly into
* this directory. Otherwise, XML output will go to a temporary
* directory and XSLT output will go to this directory.
*/
private File targetDirectory = null;
/**
* Directory where XML output will be written to. If no XSLT
* sheet was given, this is the target directory specified
* by the user. Otherwise, this is a temporary directory.
*/
private File xmlTargetDirectory;
/**
* Contains a number of TargetContexts which describe which XSLT
* sheet to apply to the output of this doclet, to what directory
* the XSLT output is written, and which postprocess driver to use
* to process XSLT output.
*/
private List targets = new ArrayList();
/**
* XML text to include at the end of every generated page. Read
* from the file specified on the command line using -bottomnote.
* If present, this will be written to the main output file
* (index.xml) in node /gjdoc:rootDoc/gjdoc:bottomnote.
*/
private String bottomNote;
/**
* Brief description of the package set. Can be specified on the
* command line using -title. This will be written to the main
* output file (index.xml) in node
* /gjdoc:rootDoc/gjdoc:title. The HTML generating XSLT sheet
* uses this for example in window titles.
*/
private String title;
/**
* Path to the directory where temporary files should be stored.
* Defaults to system tempdir, but can be overridden by user
* with -workpath.
*/
private String workingPath = System.getProperty("java.io.tmpdir");
/**
* Temporary directory created by this doclet where all
* temporary files will be stored in. If no temporary
* files are needed (i.e. no XSLT postprocessing stage
* specified by user), this is <code>null</code>.
*/
private File workingDirectory;
/**
* Whether to deep-copy the doc-files subdirectory.
*/
private boolean docFilesSubdirsEnabled = false;
/**
* Which direct subdirectories of the doc-files directories to exclude.
* Set of String.
*/
private Set excludeDocFilesSubDirs = new HashSet();
/**
* Stores the Doclet API RootDoc we are operating on.
*/
private RootDoc rootDoc;
/**
* XML namespace prefix used for all tags, except for HTML
* tags copied from Javadoc comments. Excluding colon.
*/
public static final String tagPrefix = "gjdoc";
/**
* Classpath for loading Taglet classes.
*/
private String tagletPath = null;
/**
* The current class that is being processed.
* Set in outputClassDoc().
*/
private ClassDoc currentClass;
/**
* The current member that is being processed.
* Set in outputMemberDoc().
*/
private MemberDoc currentMember;
/**
* The current constructor/method that is being processed.
* Set in outputExecutableMemberDoc().
*/
private ExecutableMemberDoc currentExecMember;
/**
* Mapping from tag type to Taglet for user Taglets specified on
* the command line.
*/
private Map tagletMap = new LinkedHashMap();
/**
* Keeps track of the tags mentioned by the user during option
* processiong so that an error can be emitted if a tag is
* mentioned more than once.
*/
private List mentionedTags = new LinkedList();
/**
* Stores options to be passed to the DocTranslet.
*/
private DocTransletOptions docTransletOptions = new DocTransletOptions();
/**
* Stores the package groups specified in the user
* options. Contains objects of type PackageGroup.
*/
private List packageGroups = new LinkedList();
private HtmlRepairer htmlRepairer;
public static boolean start(TemporaryStore _rootDocWrapper) {
return new Driver().instanceStart((RootDoc)_rootDocWrapper.getAndClear());
}
/**
* Official Doclet entry point.
*/
public static boolean start(RootDoc _rootDoc) {
// Create a new XmlDoclet instance and delegate control.
TemporaryStore tstore = new TemporaryStore(_rootDoc);
_rootDoc = null;
return new Driver().instanceStart((RootDoc)tstore.getAndClear());
}
/**
* Output an XML tag describing a com.sun.javadoc.Type object.
* Assumes that the tag does not have subtags.
*
* @param level Level of indentation. Will be multiplied by
* <code>indentStep</code> to yield actual amount
* of whitespace inserted at start of line.
* @param tag Identifier for the XML tag being output.
* @param type The Javadoc Type to be output.
*/
protected void outputType(int level, String tag, Type type) {
outputType(level, tag, type, true);
}
protected void outputType(int level, String tag, Type type, boolean atomic) {
boolean isIncluded = false;
ClassDoc typeAsClassDoc = type.asClassDoc();
String packageName = null;
if (null != typeAsClassDoc) {
isIncluded = typeAsClassDoc.isIncluded();
packageName = typeAsClassDoc.containingPackage().name();
}
println(level, "<"+tagPrefix+":"+tag + " typename=\""+type.typeName()+"\""+
" qualifiedtypename=\""+type.qualifiedTypeName()+"\""
+(type.dimension().length()==0?"":" dimension=\""+type.dimension()+"\"")
+(isIncluded?" isIncluded=\"true\"" : "")
+((null != packageName)?" package=\"" + packageName + "\"" : "")
+(atomic?"/":"")+">");
}
protected void outputExecutableMemberDocBody(int level, ExecutableMemberDoc memberDoc) {
currentExecMember = memberDoc;
outputMemberDocBody(level, memberDoc);
Parameter[] parameters = memberDoc.parameters();
for (int i=0, ilim=parameters.length; i<ilim; ++i) {
Parameter parameter = parameters[i];
outputType(level, "parameter name=\""+parameter.name()+"\"", parameter.type());
}
ClassDoc[] exceptions = memberDoc.thrownExceptions();
for (int i=0, ilim=exceptions.length; i<ilim; ++i) {
ClassDoc exception = exceptions[i];
outputType(level, "thrownException", exception);
}
printAtomTag(level, "signature full=\""+memberDoc.signature()+"\" flat=\""+memberDoc.flatSignature()+"\"");
if (memberDoc.isNative()) {
printAtomTag(level, "isNative");
}
if (memberDoc.isSynchronized()) {
printAtomTag(level, "isSynchronized");
}
}
protected void outputMethodDoc(int level, MethodDoc methodDoc) {
println();
printOpenTag(level, "methoddoc name=\""+methodDoc.name()+"\"");
outputExecutableMemberDocBody(level+1, methodDoc);
outputType(level+1, "returns", methodDoc.returnType());
printCloseTag(level, "methoddoc");
}
protected void outputMemberDocBody(int level, MemberDoc memberDoc) {
currentMember = memberDoc;
outputProgramElementDocBody(level, memberDoc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -