196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff;
296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.*;
496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*;
596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/**
796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The internal representation of an API.
896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * RootDoc could have been used for representing this, but
1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * you cannot serialize a RootDoc object - see
1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *  http://developer.java.sun.com/developer/bugParade/bugs/4125581.html
1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * You might be able use Javadoc.Main() to create another RootDoc, but the
1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * methods are package private. You can run javadoc in J2SE1.4, see:
1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *  http://java.sun.com/j2se/1.4/docs/tooldocs/javadoc/standard-doclet.html#runningprogrammatically
1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * but you still can't get the RootDoc object.
1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The advantage of writing out an XML representation of each API is that
1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * later runs of JDiff don't have to have Javadoc scan all the files again,
1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * a possibly lengthy process. XML also permits other source code in
2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * languages other than Java to be scanned to produce XML, and then versions
2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * of JDiff can be used to create documents describing the difference in those
2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * APIs.
2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details.
2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com
2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */
2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic class API {
2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * The list of all the top-level packages.
3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Each package contains classes, each class contains members, and so on.
3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List packages_; // PackageAPI[]
3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * The list of all the classes.
3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * This is used to generate the methods and fields which are inherited,
3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * rather than storing them in the XML file.
3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public Hashtable classes_;
4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * The String which identifies this API, e.g. &quotSuperProduct 1.3".
4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public String name_ = null;
4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current package being added to during parsing. */
4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public PackageAPI currPkg_ = null;
4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current class being added to during parsing. */
5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public ClassAPI currClass_ = null;
5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current constructor being added to during parsing. */
5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public ConstructorAPI currCtor_ = null;
5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current method being added to during parsing. */
5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public MethodAPI currMethod_ = null;
5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current field being added to during parsing. */
5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public FieldAPI currField_ = null;
5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Default constructor. */
5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public API() {
6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        packages_ = new ArrayList(); //PackageAPI[]
6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        classes_ = new Hashtable(); //ClassAPI
6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Methods to display the contents of an API object.
6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Amount by which to increment each indentation. */
6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static final int indentInc = 2;
7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Display the contents of the API object. */
7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void dump() {
7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int indent = 0;
7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = packages_.iterator();
7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpPackage((PackageAPI)(iter.next()), indent);
7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a PackageAPI object.
8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param pkg The given PackageAPI object.
8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void dumpPackage(PackageAPI pkg, int indent) {
8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Package Name: " + pkg.name_);
8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = pkg.classes_.iterator();
9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpClass((ClassAPI)(iter.next()), indent + indentInc);
9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display documentation
9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (pkg.doc_ != null) {
9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("Package doc block:");
9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("\"" + pkg.doc_ + "\"");
9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a ClassAPI object.
10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param c The given ClassAPI object.
10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpClass(ClassAPI c, int indent) {
10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.isInterface_)
10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Interface name: " + c.name_);
11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        else
11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Class Name: " + c.name_);
11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.extends_ != null) {
11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            for (int i = 0; i < indent; i++) System.out.print(" ");
11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Extends: " + c.extends_);
11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.implements_.size() != 0) {
11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            for (int i = 0; i < indent; i++) System.out.print(" ");
11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Implements: ");
11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            Iterator iter = c.implements_.iterator();
12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            while (iter.hasNext()) {
12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                String interfaceImpl = (String)(iter.next());
12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                for (int i = 0; i < indent + 2; i++) System.out.print(" ");
12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("  " + interfaceImpl);
12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers specific to a class
12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.isAbstract_)
12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("abstract ");
12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers common to all
13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        dumpModifiers(c.modifiers_, indent);
13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump ctors
13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = c.ctors_.iterator();
13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpCtor((ConstructorAPI)(iter.next()), indent + indentInc);
13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump methods
13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        iter = c.methods_.iterator();
13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpMethod((MethodAPI)(iter.next()), indent + indentInc);
14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump fields
14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        iter = c.fields_.iterator();
14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpField((FieldAPI)(iter.next()), indent + indentInc);
14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display documentation
14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.doc_ != null) {
14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("Class doc block:");
14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("\"" + c.doc_ + "\"");
15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else
15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println();
15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of the Modifiers object.
15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param c The given Modifiers object.
15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpModifiers(Modifiers m, int indent) {
16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.isStatic)
16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("static ");
16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.isFinal)
16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("final ");
16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.visibility != null)
16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("visibility = " + m.visibility + " ");
16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Flush the line
16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println();
17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a constructor.
17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param c The given constructor object.
17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpCtor(ConstructorAPI c, int indent) {
17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Ctor type: " + c.type_);
18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display exceptions
18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.print("exceptions: " + c.exceptions_ + " ");
18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers common to all
18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        dumpModifiers(c.modifiers_, indent);
18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display documentation
18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (c.doc_ != null) {
18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("Ctor doc block:");
18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("\"" + c.doc_ + "\"");
18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a MethodAPI object.
19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param m The given MethodAPI object.
19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpMethod(MethodAPI m, int indent) {
19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.inheritedFrom_ != null)
20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return;
20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.print("Method Name: " + m.name_);
20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.inheritedFrom_ != null)
20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println(", inherited from: " + m.inheritedFrom_);
20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.returnType_ != null)
20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println(", return type: " + m.returnType_);
20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        else
20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println();
20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers specific to a method
21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.isAbstract_)
21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("abstract ");
21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.isNative_)
21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("native ");
21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.isSynchronized_)
21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("synchronized ");
21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display exceptions
21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.print("exceptions: " + m.exceptions_ + " ");
21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers common to all
21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        dumpModifiers(m.modifiers_, indent);
22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = m.params_.iterator();
22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            dumpParam((ParamAPI)(iter.next()), indent + indentInc);
22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display documentation
22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (m.doc_ != null) {
22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("Method doc block:");
22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("\"" + m.doc_ + "\"");
22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a field.
23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Does not show inherited fields.
23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param f The given field object.
23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpField(FieldAPI f, int indent) {
24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (f.inheritedFrom_ != null)
24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return;
24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Field Name: " + f.name_ + ", type: " + f.type_);
24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (f.inheritedFrom_ != null)
24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println(", inherited from: " + f.inheritedFrom_);
24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (f.isTransient_)
24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("transient ");
24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (f.isVolatile_)
24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("volatile ");
25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Dump modifiers common to all
25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        dumpModifiers(f.modifiers_, indent);
25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Display documentation
25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (f.doc_ != null)
25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.print("Field doc block:");
25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("\"" + f.doc_ + "\"");
25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Display the contents of a parameter.
26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param p The given parameter object.
26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param indent The number of spaces to indent the output.
26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void dumpParam(ParamAPI p, int indent) {
26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < indent; i++) System.out.print(" ");
26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Param Name: " + p.name_ + ", type: " + p.type_);
26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Convert all HTML tags to text by placing them inside a CDATA element.
27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Characters still have to be valid Unicode characters as defined by the
27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * parser.
27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String stuffHTMLTags(String htmlText) {
27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (htmlText.indexOf("]]>") != -1) {
27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Warning: illegal string ]]> found in text. Ignoring the comment.");
27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return "";
27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return "<![CDATA[" + htmlText + "]]>";
28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Convert all HTML tags to text by stuffing text into the HTML tag
28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * to stop it being an HTML or XML tag. E.g. &quot;<code>foo</code>&quot;
28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * becomes &quot;lEsS_tHaNcode>foolEsS_tHaN/code>&quot;. Replace all &lt;
28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * characters
28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * with the string "lEsS_tHaN". Also replace &amp; character with the
28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * string "aNd_cHaR" to avoid text entities. Also replace &quot;
28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * character with the
29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * string "qUoTe_cHaR".
29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String hideHTMLTags(String htmlText) {
29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer sb = new StringBuffer(htmlText);
29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int i = 0;
29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (i < sb.length()) {
29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (sb.charAt(i) == '<') {
29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.setCharAt(i ,'l');
29896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.insert(i+1, "EsS_tHaN");
29996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else if (sb.charAt(i) == '&') {
30096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.setCharAt(i ,'a');
30196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.insert(i+1, "Nd_cHaR");
30296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else if (sb.charAt(i) == '"') {
30396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.setCharAt(i ,'q');
30496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.insert(i+1, "uote_cHaR");
30596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
30696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            i++;
30796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
30896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return sb.toString();
30996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
31096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
31196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
31296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Convert text with stuffed HTML tags ("lEsS_tHaN", etc) into HTML text.
31396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
31496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String showHTMLTags(String text) {
31596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer sb = new StringBuffer(text);
31696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer res = new StringBuffer();
31796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int len = sb.length();
31896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        res.setLength(len);
31996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int i = 0;
32096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int resIdx = 0;
32196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (i < len) {
32296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            char c = sb.charAt(i);
32396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (len - i > 8 && c == 'l' &&
32496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+1) == 'E' &&
32596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+2) == 's' &&
32696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+3) == 'S' &&
32796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+4) == '_' &&
32896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+5) == 't' &&
32996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+6) == 'H' &&
33096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+7) == 'a' &&
33196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+8) == 'N') {
33296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res.setCharAt(resIdx ,'<');
33396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                i += 8;
33496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else if (len - i > 9 && c == 'q' &&
33596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+1) == 'U' &&
33696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+2) == 'o' &&
33796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+3) == 'T' &&
33896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+4) == 'e' &&
33996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+5) == '_' &&
34096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+6) == 'c' &&
34196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+7) == 'H' &&
34296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+8) == 'a' &&
34396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+9) == 'R') {
34496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res.setCharAt(resIdx ,'"');
34596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                i += 9;
34696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else if (len - i > 7 && c == 'a' &&
34796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+1) == 'N' &&
34896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+2) == 'd' &&
34996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+3) == '_' &&
35096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+4) == 'c' &&
35196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+5) == 'H' &&
35296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+6) == 'a' &&
35396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                sb.charAt(i+7) == 'R') {
35496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res.setCharAt(resIdx ,'&');
35596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                i += 7;
35696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else {
35796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                res.setCharAt(resIdx, c);
35896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
35996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            i++;
36096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            resIdx++;
36196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
36296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        res.setLength(resIdx);
36396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return res.toString();
36496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
36596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
36696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
36796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * <b>NOT USED</b>.
36896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
36996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Replace all instances of <p> with <p/>. Just for the small number
37096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * of HMTL tags which don't require a matching end tag.
37196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Also make HTML conform to the simple HTML requirements such as
37296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * no double hyphens. Double hyphens are replaced by - and the character
37396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * entity for a hyphen.
37496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
37596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Cases where this fails and has to be corrected in the XML by hand:
37696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *  Attributes' values missing their double quotes , e.g. size=-2
37796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *  Mangled HTML tags e.g. &lt;ttt>
37896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
37996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * <p><b>NOT USED</b>. There is often too much bad HTML in
38096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * doc blocks to try to handle every case correctly. Better just to
38196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * stuff the *lt; and &amp: characters with stuffHTMLTags(). Though
38296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * the resulting XML is not as elegant, it does the job with less
38396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * intervention by the user.
38496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
38596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String convertHTMLTagsToXHTML(String htmlText) {
38696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer sb = new StringBuffer(htmlText);
38796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int i = 0;
38896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        boolean inTag = false;
38996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String tag = null;
39096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Needs to re-evaluate this length at each loop
39196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (i < sb.length()) {
39296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            char c = sb.charAt(i);
39396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (inTag) {
39496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (c == '>') {
39596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // OPTION Could fail at or fix some errorneous tags here
39696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // Make the best guess as to whether this tag is terminated
39796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    if (Comments.isMinimizedTag(tag) &&
39896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        htmlText.indexOf("</" + tag + ">", i) == -1)
39996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        sb.insert(i, "/");
40096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    inTag = false;
40196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                } else {
40296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // OPTION could also make sure that attribute values are
40396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // surrounded by quotes.
40496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    tag += c;
40596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
40696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
40796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (c == '<') {
40896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                inTag = true;
40996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                tag = "";
41096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
41196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // -- is not allowed in XML, but !-- is part of an comment,
41296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // and --> is also part of a comment
41396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (c == '-' && i > 0 && sb.charAt(i-1) == '-') {
41496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (!(i > 1 && sb.charAt(i-2) == '!')) {
41596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    sb.setCharAt(i, '&');
41696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    sb.insert(i+1, "#045;");
41796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    i += 5;
41896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
41996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
42096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            i++;
42196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
42296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (inTag) {
42396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // Oops. Someone forgot to close their HTML tag, e.g. "<code."
42496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // Close it for them.
42596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            sb.insert(i, ">");
42696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
42796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return sb.toString();
42896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
42996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project}
430