Doclava.java revision 57657b935a6aefc36b2a7f5704665e4da818c3e6
1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.JSilver;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.resourceloader.ClassResourceLoader;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.resourceloader.CompositeResourceLoader;
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.resourceloader.FileSystemResourceLoader;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.resourceloader.ResourceLoader;
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.sun.javadoc.*;
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.*;
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.jar.JarFile;
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.io.*;
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.lang.reflect.Proxy;
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.lang.reflect.Array;
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.lang.reflect.InvocationHandler;
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.lang.reflect.InvocationTargetException;
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.lang.reflect.Method;
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.net.MalformedURLException;
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.net.URL;
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class Doclava {
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_ANNOTATION = "android.annotation.SdkConstant";
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_TYPE_ACTIVITY_ACTION =
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      "android.annotation.SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION";
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_TYPE_BROADCAST_ACTION =
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      "android.annotation.SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION";
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_TYPE_SERVICE_ACTION =
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      "android.annotation.SdkConstant.SdkConstantType.SERVICE_INTENT_ACTION";
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_TYPE_CATEGORY =
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      "android.annotation.SdkConstant.SdkConstantType.INTENT_CATEGORY";
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_CONSTANT_TYPE_FEATURE =
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      "android.annotation.SdkConstant.SdkConstantType.FEATURE";
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_WIDGET_ANNOTATION = "android.annotation.Widget";
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final String SDK_LAYOUT_ANNOTATION = "android.annotation.Layout";
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final int TYPE_NONE = 0;
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final int TYPE_WIDGET = 1;
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final int TYPE_LAYOUT = 2;
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final int TYPE_LAYOUT_PARAM = 3;
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final int SHOW_PUBLIC = 0x00000001;
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final int SHOW_PROTECTED = 0x00000003;
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final int SHOW_PACKAGE = 0x00000007;
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final int SHOW_PRIVATE = 0x0000000f;
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final int SHOW_HIDDEN = 0x0000001f;
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static int showLevel = SHOW_PROTECTED;
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
679b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static String outputPathBase = "/";
689b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static ArrayList<String> inputPathHtmlDirs = new ArrayList<String>();
699b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static ArrayList<String> inputPathHtmlDir2 = new ArrayList<String>();
709b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static String outputPathHtmlDirs;
719b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static String outputPathHtmlDir2;
729b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static final String devsiteRoot = "en/";
739b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static String javadocDir = "reference/";
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String htmlExtension;
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static RootDoc root;
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static ArrayList<String[]> mHDFData = new ArrayList<String[]>();
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static Map<Character, String> escapeChars = new HashMap<Character, String>();
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String title = "";
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static SinceTagger sinceTagger = new SinceTagger();
817a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato  public static HashSet<String> knownTags = new HashSet<String>();
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static FederationTagger federationTagger = new FederationTagger();
839b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static Set<String> showAnnotations = new HashSet<String>();
849b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty  public static boolean includeDefaultAssets = true;
859ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  private static boolean generateDocs = true;
869ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  private static boolean parseComments = false;
8718b25554072c36d4d9652523ec15e0c5306101ceChirag Shah  private static String yamlNavFile = null;
883c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static JSilver jSilver = null;
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
915ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly  private static boolean gmsRef = false;
925ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly  private static boolean gcmRef = false;
9388c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly  private static boolean sac = false;
945ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean checkLevel(int level) {
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (showLevel & level) == level;
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
983c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1009ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson   * Returns true if we should parse javadoc comments,
1019ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson   * reporting errors in the process.
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1039ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson  public static boolean parseComments() {
1049ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson    return generateDocs || parseComments;
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean checkLevel(boolean pub, boolean prot, boolean pkgp, boolean priv,
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean hidden) {
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int level = 0;
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (hidden && !checkLevel(SHOW_HIDDEN)) {
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return false;
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (pub && checkLevel(SHOW_PUBLIC)) {
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return true;
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (prot && checkLevel(SHOW_PROTECTED)) {
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return true;
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (pkgp && checkLevel(SHOW_PACKAGE)) {
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return true;
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (priv && checkLevel(SHOW_PRIVATE)) {
123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return true;
124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void main(String[] args) {
129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    com.sun.tools.javadoc.Main.execute(args);
130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean start(RootDoc r) {
133f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein    long startTime = System.nanoTime();
134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String keepListFile = null;
135970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton    String proguardFile = null;
136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String proofreadFile = null;
137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String todoFile = null;
138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String sdkValuePath = null;
139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<SampleCode> sampleCodes = new ArrayList<SampleCode>();
140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String stubsDir = null;
14141d8656cf17e04b25a058d0874e401654ea547b4Dirk Dougherty    // Create the dependency graph for the stubs  directory
142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    boolean offlineMode = false;
143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String apiFile = null;
144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String debugStubsFile = "";
145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    HashSet<String> stubPackages = null;
1467a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    ArrayList<String> knownTagsFiles = new ArrayList<String>();
147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    root = r;
149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String[][] options = r.options();
151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String[] a : options) {
152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (a[0].equals("-d")) {
1539b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        outputPathBase = outputPathHtmlDirs = ClearPage.outputDir = a[1];
154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-templatedir")) {
155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ClearPage.addTemplateDir(a[1]);
156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-hdf")) {
157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        mHDFData.add(new String[] {a[1], a[2]});
1587a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato      } else if (a[0].equals("-knowntags")) {
1597a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato        knownTagsFiles.add(a[1]);
160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-toroot")) {
161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ClearPage.toroot = a[1];
162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-samplecode")) {
163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        sampleCodes.add(new SampleCode(a[1], a[2], a[3]));
1649b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      //the destination output path for main htmldir
165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-htmldir")) {
1669b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        inputPathHtmlDirs.add(a[1]);
1679b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        ClearPage.htmlDirs = inputPathHtmlDirs;
1689b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      //the destination output path for additional htmldir
1699b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      } else if (a[0].equals("-htmldir2")) {
1709b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty          if (a[2].equals("default")) {
1719b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty          inputPathHtmlDirs.add(a[1]);
1729b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        } else {
1739b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty          inputPathHtmlDir2.add(a[1]);
1749b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty          outputPathHtmlDir2 = a[2];
1759b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        }
176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-title")) {
177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Doclava.title = a[1];
178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-werror")) {
179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.setWarningsAreErrors(true);
180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-error") || a[0].equals("-warning") || a[0].equals("-hide")) {
181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        try {
182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          int level = -1;
183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          if (a[0].equals("-error")) {
184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            level = Errors.ERROR;
185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          } else if (a[0].equals("-warning")) {
186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            level = Errors.WARNING;
187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          } else if (a[0].equals("-hide")) {
188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            level = Errors.HIDDEN;
189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Errors.setErrorLevel(Integer.parseInt(a[1]), level);
191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        } catch (NumberFormatException e) {
192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          // already printed below
193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          return false;
194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-keeplist")) {
196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keepListFile = a[1];
1979b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      } else if (a[0].equals("-showAnnotation")) {
1989b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        showAnnotations.add(a[1]);
199970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton      } else if (a[0].equals("-proguard")) {
2005ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly        proguardFile = a[1];
201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-proofread")) {
202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        proofreadFile = a[1];
203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-todo")) {
204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        todoFile = a[1];
205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-public")) {
206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        showLevel = SHOW_PUBLIC;
207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-protected")) {
208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        showLevel = SHOW_PROTECTED;
209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-package")) {
210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        showLevel = SHOW_PACKAGE;
211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-private")) {
212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        showLevel = SHOW_PRIVATE;
213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-hidden")) {
214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        showLevel = SHOW_HIDDEN;
215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-stubs")) {
216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        stubsDir = a[1];
217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-stubpackages")) {
218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        stubPackages = new HashSet<String>();
219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (String pkg : a[1].split(":")) {
220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          stubPackages.add(pkg);
221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-sdkvalues")) {
223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        sdkValuePath = a[1];
224040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      } else if (a[0].equals("-api")) {
225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        apiFile = a[1];
226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-nodocs")) {
2279ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson        generateDocs = false;
2289ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson      } else if (a[0].equals("-parsecomments")) {
2299ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson        parseComments = true;
230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-since")) {
231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        sinceTagger.addVersion(a[1], a[2]);
232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-offlinemode")) {
233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        offlineMode = true;
234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (a[0].equals("-federate")) {
235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        try {
236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String name = a[1];
237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          URL federationURL = new URL(a[2]);
2381e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton          federationTagger.addSiteUrl(name, federationURL);
239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        } catch (MalformedURLException e) {
240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          System.err.println("Could not parse URL for federation: " + a[1]);
241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          return false;
242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
2431e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      } else if (a[0].equals("-federationapi")) {
2441e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton        String name = a[1];
2451e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton        String file = a[2];
2461e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton        federationTagger.addSiteApi(name, file);
24718b25554072c36d4d9652523ec15e0c5306101ceChirag Shah      } else if (a[0].equals("-yaml")) {
24818b25554072c36d4d9652523ec15e0c5306101ceChirag Shah        yamlNavFile = a[1];
2499b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      } else if (a[0].equals("-devsite")) {
2509b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        // Don't copy the doclava assets to devsite output (ie use proj assets only)
2519b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        includeDefaultAssets = false;
2529b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        outputPathHtmlDirs = outputPathHtmlDirs + "/" + devsiteRoot;
253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
2567a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    if (!readKnownTagsFiles(knownTags, knownTagsFiles)) {
2577a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato      return false;
2587a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    }
259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Set up the data structures
261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Converter.makeInfo(r);
262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
2639ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson    if (generateDocs) {
264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClearPage.addBundledTemplateDir("assets/customizations");
265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClearPage.addBundledTemplateDir("assets/templates");
266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      List<ResourceLoader> resourceLoaders = new ArrayList<ResourceLoader>();
268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      List<String> templates = ClearPage.getTemplateDirs();
269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (String tmpl : templates) {
270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        resourceLoaders.add(new FileSystemResourceLoader(tmpl));
271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      templates = ClearPage.getBundledTemplateDirs();
274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (String tmpl : templates) {
275f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein          // TODO - remove commented line - it's here for debugging purposes
276f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein        //  resourceLoaders.add(new FileSystemResourceLoader("/Volumes/Android/master/external/doclava/res/" + tmpl));
277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        resourceLoaders.add(new ClassResourceLoader(Doclava.class, '/'+tmpl));
278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ResourceLoader compositeResourceLoader = new CompositeResourceLoader(resourceLoaders);
281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      jSilver = new JSilver(compositeResourceLoader);
282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!Doclava.readTemplateSettings()) {
284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return false;
285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
287f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein      //startTime = System.nanoTime();
288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Apply @since tags from the XML file
290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sinceTagger.tagAll(Converter.rootClasses());
2913c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main
292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Apply details of federated documentation
293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      federationTagger.tagAll(Converter.rootClasses());
294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Files for proofreading
296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (proofreadFile != null) {
297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Proofread.initProofread(proofreadFile);
298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (todoFile != null) {
300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        TodoFile.writeTodoFile(todoFile);
301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
3039b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      // HTML2 Pages -- Generate Pages from optional secondary dir
3049b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      if (!inputPathHtmlDir2.isEmpty()) {
3059b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        if (!outputPathHtmlDir2.isEmpty()) {
3069b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty          ClearPage.outputDir = outputPathBase + "/" + outputPathHtmlDir2;
3079b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        }
3089b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        ClearPage.htmlDirs = inputPathHtmlDir2;
3099b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        writeHTMLPages();
3109b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        ClearPage.htmlDirs = inputPathHtmlDirs;
3119b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      }
3129b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty
313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // HTML Pages
3144bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      if (!ClearPage.htmlDirs.isEmpty()) {
3159b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        ClearPage.htmlDirs = inputPathHtmlDirs;
3169b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        ClearPage.outputDir = outputPathHtmlDirs;
317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeHTMLPages();
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeAssets();
321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Navigation tree
3235ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly       String refPrefix = new String();
3245ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      if(gmsRef){
3255ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly        refPrefix = "gms-";
3265ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      } else if(gcmRef){
3275ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly        refPrefix = "gcm-";
3285ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      }
3295ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      NavTree.writeNavTree(javadocDir, refPrefix);
330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
33118b25554072c36d4d9652523ec15e0c5306101ceChirag Shah      // Write yaml tree.
33218b25554072c36d4d9652523ec15e0c5306101ceChirag Shah      if (yamlNavFile != null){
33318b25554072c36d4d9652523ec15e0c5306101ceChirag Shah        NavTree.writeYamlTree(javadocDir, yamlNavFile);
33418b25554072c36d4d9652523ec15e0c5306101ceChirag Shah      }
33518b25554072c36d4d9652523ec15e0c5306101ceChirag Shah
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Packages Pages
3375ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      writePackages(javadocDir + refPrefix + "packages" + htmlExtension);
338920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Classes
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeClassLists();
341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeClasses();
342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeHierarchy();
343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // writeKeywords();
344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Lists for JavaScript
346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeLists();
347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (keepListFile != null) {
348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeKeepList(keepListFile);
349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
351920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Sample Code
352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (SampleCode sc : sampleCodes) {
353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        sc.write(offlineMode);
354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Index page
357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writeIndex();
358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Proofread.finishProofread(proofreadFile);
360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (sdkValuePath != null) {
362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeSdkValues(sdkValuePath);
363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Stubs
367970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton    if (stubsDir != null || apiFile != null || proguardFile != null) {
368970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton      Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages);
369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Errors.printErrors();
3723c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main
373f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein    long time = System.nanoTime() - startTime;
374f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein    System.out.println("DroidDoc took " + (time / 1000000000) + " sec. to write docs to "
3759b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty        + outputPathBase );
376f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein
377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return !Errors.hadError;
378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeIndex() {
381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makeHDF();
382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "index.cs", javadocDir + "index" + htmlExtension);
383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static boolean readTemplateSettings() {
386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makeHDF();
387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // The .html extension is hard-coded in several .cs files,
389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // and so you cannot currently set it as a property.
390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    htmlExtension = ".html";
391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // htmlExtension = data.getValue("template.extension", ".html");
392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i = 0;
393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (true) {
394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String k = data.getValue("template.escape." + i + ".key", "");
395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String v = data.getValue("template.escape." + i + ".value", "");
396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if ("".equals(k)) {
397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        break;
398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (k.length() != 1) {
400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println("template.escape." + i + ".key must have a length of 1: " + k);
401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return false;
402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      escapeChars.put(k.charAt(0), v);
404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i++;
405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return true;
407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
4097a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    private static boolean readKnownTagsFiles(HashSet<String> knownTags,
4107a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato            ArrayList<String> knownTagsFiles) {
4117a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato        for (String fn: knownTagsFiles) {
4127a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato           BufferedReader in = null;
4137a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato           try {
4147a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               in = new BufferedReader(new FileReader(fn));
4157a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               int lineno = 0;
4167a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               boolean fail = false;
4177a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               while (true) {
4187a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   lineno++;
4197a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   String line = in.readLine();
4207a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   if (line == null) {
4217a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       break;
4227a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   }
4237a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   line = line.trim();
4247a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   if (line.length() == 0) {
4257a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       continue;
4267a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   } else if (line.charAt(0) == '#') {
4277a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       continue;
4287a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   }
4297a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   String[] words = line.split("\\s+", 2);
4307a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   if (words.length == 2) {
4317a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       if (words[1].charAt(0) != '#') {
4327a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                           System.err.println(fn + ":" + lineno
4337a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                                   + ": Only one tag allowed per line: " + line);
4347a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                           fail = true;
4357a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                           continue;
4367a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       }
4377a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   }
4387a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   knownTags.add(words[0]);
4397a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               }
4407a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               if (fail) {
4417a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   return false;
4427a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               }
4437a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato           } catch (IOException ex) {
4447a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               System.err.println("Error reading file: " + fn + " (" + ex.getMessage() + ")");
4457a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               return false;
4467a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato           } finally {
4477a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               if (in != null) {
4487a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   try {
4497a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                       in.close();
4507a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   } catch (IOException e) {
4517a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato                   }
4527a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato               }
4537a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato           }
4547a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato        }
4557a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato        return true;
4567a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    }
4577a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato
458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String escape(String s) {
459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (escapeChars.size() == 0) {
460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return s;
461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    StringBuffer b = null;
463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int begin = 0;
464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    final int N = s.length();
465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < N; i++) {
466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      char c = s.charAt(i);
467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String mapped = escapeChars.get(c);
468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (mapped != null) {
469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (b == null) {
470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          b = new StringBuffer(s.length() + mapped.length());
471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (begin != i) {
473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          b.append(s.substring(begin, i));
474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        b.append(mapped);
476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        begin = i + 1;
477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (b != null) {
480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (begin != N) {
481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        b.append(s.substring(begin, N));
482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return b.toString();
484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s;
486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
488920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void setPageTitle(Data data, String title) {
489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String s = title;
490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (Doclava.title.length() > 0) {
491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      s += " - " + Doclava.title;
492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue("page.title", s);
494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static LanguageVersion languageVersion() {
498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return LanguageVersion.JAVA_1_5;
499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static int optionLength(String option) {
503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-d")) {
504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-templatedir")) {
507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
508920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
509920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-hdf")) {
510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 3;
511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
5127a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    if (option.equals("-knowntags")) {
5137a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato      return 2;
5147a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato    }
515920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-toroot")) {
516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-samplecode")) {
519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 4;
520920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-htmldir")) {
522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
5249b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    if (option.equals("-htmldir2")) {
5259b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      return 3;
5269b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    }
527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-title")) {
528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-werror")) {
531920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-hide")) {
534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
535920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-warning")) {
537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
539920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-error")) {
540920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
541920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
542920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-keeplist")) {
543920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
544920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
5459b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    if (option.equals("-showAnnotation")) {
5469b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      return 2;
5479b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    }
548970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton    if (option.equals("-proguard")) {
549970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton      return 2;
550970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton    }
551920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-proofread")) {
552920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-todo")) {
555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-public")) {
558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-protected")) {
561920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
562920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
563920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-package")) {
564920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
565920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
566920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-private")) {
567920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
568920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
569920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-hidden")) {
570920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
571920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
572920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-stubs")) {
573920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
574920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
575920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-stubpackages")) {
576920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
577920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
578920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-sdkvalues")) {
579920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
580920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
581040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    if (option.equals("-api")) {
582920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 2;
583920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
584920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-nodocs")) {
585920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
586920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
5879ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson    if (option.equals("-parsecomments")) {
5889ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson      return 1;
5899ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson    }
590920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-since")) {
591920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 3;
592920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
593920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-offlinemode")) {
594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 1;
595920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
596920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (option.equals("-federate")) {
597920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return 3;
598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
5991e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton    if (option.equals("-federationapi")) {
6001e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      return 3;
6011e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton    }
60218b25554072c36d4d9652523ec15e0c5306101ceChirag Shah    if (option.equals("-yaml")) {
60318b25554072c36d4d9652523ec15e0c5306101ceChirag Shah      return 2;
60418b25554072c36d4d9652523ec15e0c5306101ceChirag Shah    }
6059b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    if (option.equals("-devsite")) {
6069b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty      return 1;
6079b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    }
6085ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly    if (option.equals("-gmsref")) {
6095ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      gmsRef = true;
6105ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      return 1;
6115ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly    }
6125ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly    if (option.equals("-gcmref")) {
6135ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      gcmRef = true;
6145ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      return 1;
6155ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly    }
616920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return 0;
617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean validOptions(String[][] options, DocErrorReporter r) {
619920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String[] a : options) {
620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (a[0].equals("-error") || a[0].equals("-warning") || a[0].equals("-hide")) {
621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        try {
622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Integer.parseInt(a[1]);
623920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        } catch (NumberFormatException e) {
624920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          r.printError("bad -" + a[0] + " value must be a number: " + a[1]);
625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          return false;
626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
628920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
629920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
630920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return true;
631920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
632920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
633920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static Data makeHDF() {
634920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = jSilver.createData();
635920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
636920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String[] p : mHDFData) {
637920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue(p[0], p[1]);
638920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
639920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
640920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return data;
641920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
642920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
643920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static Data makePackageHDF() {
646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makeHDF();
647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.rootClasses();
648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    SortedMap<String, PackageInfo> sorted = new TreeMap<String, PackageInfo>();
650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageInfo pkg = cl.containingPackage();
652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name;
653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (pkg == null) {
654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = "";
655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = pkg.name();
657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sorted.put(name, pkg);
659920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i = 0;
662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String s : sorted.keySet()) {
663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageInfo pkg = sorted.get(s);
664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (pkg.isHidden()) {
666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        continue;
667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Boolean allHidden = true;
669920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int pass = 0;
670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo[] classesToCheck = null;
671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      while (pass < 5) {
672920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        switch (pass) {
673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 0:
674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.ordinaryClasses();
675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 1:
677920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.enums();
678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 2:
680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.errors();
681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
682920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 3:
683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.exceptions();
684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
685920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 4:
686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.interfaces();
687920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          default:
689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            System.err.println("Error reading package: " + pkg.name());
690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (ClassInfo cl : classesToCheck) {
693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          if (!cl.isHidden()) {
694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            allHidden = false;
695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (!allHidden) {
699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        pass++;
702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (allHidden) {
704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        continue;
705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
7065ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      if(gmsRef){
7075ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly          data.setValue("reference.gms", "true");
7085ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      } else if(gcmRef){
7095ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly          data.setValue("reference.gcm", "true");
7105ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly      }
711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("reference", "1");
712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("reference.apilevels", sinceTagger.hasVersions() ? "1" : "0");
713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.packages." + i + ".name", s);
714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.packages." + i + ".link", pkg.htmlPage());
715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.packages." + i + ".since", pkg.getSince());
716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      TagInfo.makeHDF(data, "docs.packages." + i + ".shortDescr", pkg.firstSentenceTags());
717920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i++;
718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
720920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    sinceTagger.writeVersionNames(data);
721920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return data;
722920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
723920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeDirectory(File dir, String relative, JSilver js) {
725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    File[] files = dir.listFiles();
726920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i, count = files.length;
727920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (i = 0; i < count; i++) {
728920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      File f = files[i];
729920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (f.isFile()) {
730920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        String templ = relative + f.getName();
731920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int len = templ.length();
732920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (len > 3 && ".cs".equals(templ.substring(len - 3))) {
733920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Data data = makeHDF();
734920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String filename = templ.substring(0, len - 3) + htmlExtension;
735920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          ClearPage.write(data, templ, filename, js);
736920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        } else if (len > 3 && ".jd".equals(templ.substring(len - 3))) {
737920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String filename = templ.substring(0, len - 3) + htmlExtension;
738920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          DocFile.writePage(f.getAbsolutePath(), relative, filename);
73988c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly        } else if(!f.getName().equals(".DS_Store")){
74088c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly              Data data = makeHDF();
74188c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly              String hdfValue = data.getValue("sac") == null ? "" : data.getValue("sac");
74288c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly              boolean allowExcepted = hdfValue.equals("true") ? true : false;
74388c435bb4d6c81c41107e23503b59af2e08acd8dRobert Ly              ClearPage.copyFile(allowExcepted, f, templ);
744920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
745920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (f.isDirectory()) {
746920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeDirectory(f, relative + f.getName() + "/", js);
747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
750920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
751920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeHTMLPages() {
7524bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier    for (String htmlDir : ClearPage.htmlDirs) {
7534bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      File f = new File(htmlDir);
7544bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      if (!f.isDirectory()) {
7554bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier        System.err.println("htmlDir not a directory: " + htmlDir);
7564bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier        continue;
7574bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      }
758920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
7594bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      ResourceLoader loader = new FileSystemResourceLoader(f);
7604bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      JSilver js = new JSilver(loader);
7614bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier      writeDirectory(f, "", js);
7624bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier    }
763920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
764920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
765920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeAssets() {
766920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    JarFile thisJar = JarUtils.jarForClass(Doclava.class, null);
7679b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    if ((thisJar != null) && (includeDefaultAssets)) {
768920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
769920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        List<String> templateDirs = ClearPage.getBundledTemplateDirs();
770920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (String templateDir : templateDirs) {
771920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String assetsDir = templateDir + "/assets";
772920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          JarUtils.copyResourcesToDirectory(thisJar, assetsDir, ClearPage.outputDir + "/assets");
773920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
774920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (IOException e) {
775920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println("Error copying assets directory.");
776920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        e.printStackTrace();
777920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return;
778920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
779920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
780920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
7819b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    //write the project-specific assets
782920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    List<String> templateDirs = ClearPage.getTemplateDirs();
783920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String templateDir : templateDirs) {
784920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      File assets = new File(templateDir + "/assets");
785920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (assets.isDirectory()) {
786920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeDirectory(assets, "assets/", null);
787920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
788920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
7899b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty
7909b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    // Create the timestamp.js file based on .cs file
791460dd2aa33a4e4666eb05f7a26f335e2a012dbb7Scott Main    Data timedata = Doclava.makeHDF();
792460dd2aa33a4e4666eb05f7a26f335e2a012dbb7Scott Main    ClearPage.write(timedata, "timestamp.cs", "timestamp.js");
793920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
794920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
795920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeLists() {
796920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makeHDF();
797920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
798920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.rootClasses();
799920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
800920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    SortedMap<String, Object> sorted = new TreeMap<String, Object>();
801920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
802920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (cl.isHidden()) {
803920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        continue;
804920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
805920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sorted.put(cl.qualifiedName(), cl);
806920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageInfo pkg = cl.containingPackage();
807920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name;
808920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (pkg == null) {
809920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = "";
810920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
811920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = pkg.name();
812920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
813920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sorted.put(name, pkg);
814920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
815920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
816920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i = 0;
817920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String s : sorted.keySet()) {
818920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.pages." + i + ".id", "" + i);
819920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.pages." + i + ".label", s);
820920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
821920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Object o = sorted.get(s);
822920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (o instanceof PackageInfo) {
823920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        PackageInfo pkg = (PackageInfo) o;
824920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue("docs.pages." + i + ".link", pkg.htmlPage());
825920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue("docs.pages." + i + ".type", "package");
826920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (o instanceof ClassInfo) {
827920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ClassInfo cl = (ClassInfo) o;
828920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue("docs.pages." + i + ".link", cl.htmlPage());
829920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue("docs.pages." + i + ".type", "class");
830920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
831920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i++;
832920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
83357657b935a6aefc36b2a7f5704665e4da818c3e6Robert Ly
83457657b935a6aefc36b2a7f5704665e4da818c3e6Robert Ly    ClearPage.write(data, "lists.cs", javadocDir + "lists.js");
835920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
836920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
837920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void cantStripThis(ClassInfo cl, HashSet<ClassInfo> notStrippable) {
838920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!notStrippable.add(cl)) {
839920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // slight optimization: if it already contains cl, it already contains
840920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // all of cl's parents
841920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return;
842920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
843920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo supr = cl.superclass();
844920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (supr != null) {
845920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cantStripThis(supr, notStrippable);
846920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
847920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo iface : cl.interfaces()) {
848920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cantStripThis(iface, notStrippable);
849920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
850920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
851920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
852920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static String getPrintableName(ClassInfo cl) {
853920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo containingClass = cl.containingClass();
854920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (containingClass != null) {
855920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // This is an inner class.
856920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String baseName = cl.name();
857920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      baseName = baseName.substring(baseName.lastIndexOf('.') + 1);
858920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return getPrintableName(containingClass) + '$' + baseName;
859920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
860920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return cl.qualifiedName();
861920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
862920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
863920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
864920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Writes the list of classes that must be present in order to provide the non-hidden APIs known
865920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * to javadoc.
8663c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
867920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param filename the path to the file to write the list to
868920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
869920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeKeepList(String filename) {
870920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    HashSet<ClassInfo> notStrippable = new HashSet<ClassInfo>();
871920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] all = Converter.allClasses();
872920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Arrays.sort(all); // just to make the file a little more readable
873920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
874920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // If a class is public and not hidden, then it and everything it derives
875920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // from cannot be stripped. Otherwise we can strip it.
876920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : all) {
877920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (cl.isPublic() && !cl.isHidden()) {
878920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        cantStripThis(cl, notStrippable);
879920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
880920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
881920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    PrintStream stream = null;
882920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    try {
883ed8f79791885c3ac15401d88a147aee551e1039eBrian Carlstrom      stream = new PrintStream(new BufferedOutputStream(new FileOutputStream(filename)));
884920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (ClassInfo cl : notStrippable) {
885920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        stream.println(getPrintableName(cl));
886920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
887920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } catch (FileNotFoundException e) {
888920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.err.println("error writing file: " + filename);
889920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } finally {
890920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (stream != null) {
891920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        stream.close();
892920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
893920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
894920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
895920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
896920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static PackageInfo[] sVisiblePackages = null;
897920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
898920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static PackageInfo[] choosePackages() {
899920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (sVisiblePackages != null) {
900920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return sVisiblePackages;
901920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
902920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
903920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.rootClasses();
904920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    SortedMap<String, PackageInfo> sorted = new TreeMap<String, PackageInfo>();
905920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
906920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageInfo pkg = cl.containingPackage();
907920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name;
908920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (pkg == null) {
909920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = "";
910920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
911920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        name = pkg.name();
912920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
913920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sorted.put(name, pkg);
914920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
915920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
916920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<PackageInfo> result = new ArrayList<PackageInfo>();
917920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
918920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String s : sorted.keySet()) {
919920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageInfo pkg = sorted.get(s);
920920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
921920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (pkg.isHidden()) {
922920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        continue;
923920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
924920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Boolean allHidden = true;
925920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int pass = 0;
926920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo[] classesToCheck = null;
927920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      while (pass < 5) {
928920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        switch (pass) {
929920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 0:
930920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.ordinaryClasses();
931920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
932920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 1:
933920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.enums();
934920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
935920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 2:
936920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.errors();
937920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
938920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 3:
939920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.exceptions();
940920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
941920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case 4:
942920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            classesToCheck = pkg.interfaces();
943920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
944920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          default:
945920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            System.err.println("Error reading package: " + pkg.name());
946920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
947920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
948920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (ClassInfo cl : classesToCheck) {
949920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          if (!cl.isHidden()) {
950920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            allHidden = false;
951920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
952920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
953920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
954920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (!allHidden) {
955920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
956920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
957920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        pass++;
958920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
959920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (allHidden) {
960920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        continue;
961920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
962920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
963920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.add(pkg);
964920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
965920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
966920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    sVisiblePackages = result.toArray(new PackageInfo[result.size()]);
967920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return sVisiblePackages;
968920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
969920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
970920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writePackages(String filename) {
971920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makePackageHDF();
972920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
973920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i = 0;
974920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (PackageInfo pkg : choosePackages()) {
975920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writePackage(pkg);
976920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
977920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.packages." + i + ".name", pkg.name());
978920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue("docs.packages." + i + ".link", pkg.htmlPage());
979920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      TagInfo.makeHDF(data, "docs.packages." + i + ".shortDescr", pkg.firstSentenceTags());
980920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
981920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i++;
982920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
983920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
984920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setPageTitle(data, "Package Index");
985920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
986920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, "root.descr", Converter.convertTags(root.inlineTags(), null));
987920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
988920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "packages.cs", filename);
989920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "package-list.cs", javadocDir + "package-list");
990920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
991920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Proofread.writePackages(filename, Converter.convertTags(root.inlineTags(), null));
992920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
993920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
994920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writePackage(PackageInfo pkg) {
995920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // these this and the description are in the same directory,
996920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // so it's okay
997920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makePackageHDF();
998920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
999920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = pkg.name();
1000920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1001920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue("package.name", name);
1002920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue("package.since", pkg.getSince());
1003920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue("package.descr", "...description...");
1004920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    pkg.setFederatedReferences(data, "package");
1005920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1006920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    makeClassListHDF(data, "package.interfaces", ClassInfo.sortByName(pkg.interfaces()));
1007920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    makeClassListHDF(data, "package.classes", ClassInfo.sortByName(pkg.ordinaryClasses()));
1008920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    makeClassListHDF(data, "package.enums", ClassInfo.sortByName(pkg.enums()));
1009920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    makeClassListHDF(data, "package.exceptions", ClassInfo.sortByName(pkg.exceptions()));
1010920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    makeClassListHDF(data, "package.errors", ClassInfo.sortByName(pkg.errors()));
1011920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, "package.shortDescr", pkg.firstSentenceTags());
1012920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, "package.descr", pkg.inlineTags());
1013920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1014920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String filename = pkg.htmlPage();
1015920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setPageTitle(data, name);
1016920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "package.cs", filename);
1017920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1018920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Proofread.writePackage(filename, pkg.inlineTags());
1019920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1020920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1021920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeClassLists() {
1022920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int i;
1023920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makePackageHDF();
1024920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1025920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = PackageInfo.filterHidden(Converter.convertClasses(root.classes()));
1026920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (classes.length == 0) {
1027920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return;
1028920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1029920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1030920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Sorter[] sorted = new Sorter[classes.length];
1031920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (i = 0; i < sorted.length; i++) {
1032920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo cl = classes[i];
1033920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name = cl.name();
1034920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      sorted[i] = new Sorter(name, cl);
1035920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1036920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1037920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Arrays.sort(sorted);
1038920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1039920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // make a pass and resolve ones that have the same name
1040920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int firstMatch = 0;
1041920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String lastName = sorted[0].label;
1042920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (i = 1; i < sorted.length; i++) {
1043920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String s = sorted[i].label;
1044920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!lastName.equals(s)) {
1045920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (firstMatch != i - 1) {
1046920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          // there were duplicates
1047920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (int j = firstMatch; j < i; j++) {
1048920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            PackageInfo pkg = ((ClassInfo) sorted[j].data).containingPackage();
1049920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (pkg != null) {
1050920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              sorted[j].label = sorted[j].label + " (" + pkg.name() + ")";
1051920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
1052920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
1053920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1054920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        firstMatch = i;
1055920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        lastName = s;
1056920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1057920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1058920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1059920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // and sort again
1060920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Arrays.sort(sorted);
1061920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1062920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (i = 0; i < sorted.length; i++) {
1063920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String s = sorted[i].label;
1064920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo cl = (ClassInfo) sorted[i].data;
1065920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      char first = Character.toUpperCase(s.charAt(0));
1066920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cl.makeShortDescrHDF(data, "docs.classes." + first + '.' + i);
1067920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1068920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1069920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setPageTitle(data, "Class Index");
1070920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "classes.cs", javadocDir + "classes" + htmlExtension);
1071920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1072920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1073920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // we use the word keywords because "index" means something else in html land
1074920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // the user only ever sees the word index
1075920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /*
1076920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * public static void writeKeywords() { ArrayList<KeywordEntry> keywords = new
1077920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * ArrayList<KeywordEntry>();
10783c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1079920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * ClassInfo[] classes = PackageInfo.filterHidden(Converter.convertClasses(root.classes()));
10803c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1081920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * for (ClassInfo cl: classes) { cl.makeKeywordEntries(keywords); }
10823c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1083920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * HDF data = makeHDF();
10843c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1085920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Collections.sort(keywords);
10863c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1087920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * int i=0; for (KeywordEntry entry: keywords) { String base = "keywords." + entry.firstChar() +
1088920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * "." + i; entry.makeHDF(data, base); i++; }
10893c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1090920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * setPageTitle(data, "Index"); ClearPage.write(data, "keywords.cs", javadocDir + "keywords" +
1091920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * htmlExtension); }
1092920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1093920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1094920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeHierarchy() {
1095920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.rootClasses();
1096920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<ClassInfo> info = new ArrayList<ClassInfo>();
1097920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
1098920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!cl.isHidden()) {
1099920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        info.add(cl);
1100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data data = makePackageHDF();
1103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Hierarchy.makeHierarchy(data, info.toArray(new ClassInfo[info.size()]));
1104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setPageTitle(data, "Class Hierarchy");
1105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(data, "hierarchy.cs", javadocDir + "hierarchy" + htmlExtension);
1106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeClasses() {
1109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.rootClasses();
1110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classes) {
1112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Data data = makePackageHDF();
1113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!cl.isHidden()) {
1114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeClass(cl, data);
1115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writeClass(ClassInfo cl, Data data) {
1120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    cl.makeHDF(data);
1121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setPageTitle(data, cl.name());
11229b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    String outfile = cl.htmlPage();
11239b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty    ClearPage.write(data, "class.cs", outfile);
1124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Proofread.writeClass(cl.htmlPage(), cl);
1125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void makeClassListHDF(Data data, String base, ClassInfo[] classes) {
1128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < classes.length; i++) {
1129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo cl = classes[i];
1130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!cl.isHidden()) {
1131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        cl.makeShortDescrHDF(data, base + "." + i);
1132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String linkTarget(String source, String target) {
1137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String[] src = source.split("/");
1138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String[] tgt = target.split("/");
1139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int srclen = src.length;
1141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int tgtlen = tgt.length;
1142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int same = 0;
1144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (same < (srclen - 1) && same < (tgtlen - 1) && (src[same].equals(tgt[same]))) {
1145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      same++;
1146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String s = "";
1149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int up = srclen - same - 1;
1151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < up; i++) {
1152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      s += "../";
1153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int N = tgtlen - 1;
1157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = same; i < N; i++) {
1158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      s += tgt[i] + '/';
1159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    s += tgt[tgtlen - 1];
1161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s;
1163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Returns true if the given element has an @hide or @pending annotation.
1167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static boolean hasHideAnnotation(Doc doc) {
1169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String comment = doc.getRawCommentText();
1170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return comment.indexOf("@hide") != -1 || comment.indexOf("@pending") != -1;
1171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Returns true if the given element is hidden.
1175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static boolean isHidden(Doc doc) {
1177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Methods, fields, constructors.
1178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (doc instanceof MemberDoc) {
1179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return hasHideAnnotation(doc);
1180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Classes, interfaces, enums, annotation types.
1183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (doc instanceof ClassDoc) {
1184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassDoc classDoc = (ClassDoc) doc;
1185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Check the containing package.
1187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (hasHideAnnotation(classDoc.containingPackage())) {
1188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
1189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Check the class doc and containing class docs if this is a
1192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // nested class.
1193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassDoc current = classDoc;
1194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      do {
1195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (hasHideAnnotation(current)) {
1196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          return true;
1197920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        current = current.containingClass();
1200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } while (current != null);
1201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
1204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Filters out hidden elements.
1208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Object filterHidden(Object o, Class<?> expected) {
1210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (o == null) {
1211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return null;
1212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Class type = o.getClass();
1215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (type.getName().startsWith("com.sun.")) {
1216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // TODO: Implement interfaces from superclasses, too.
1217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return Proxy
1218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          .newProxyInstance(type.getClassLoader(), type.getInterfaces(), new HideHandler(o));
1219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (o instanceof Object[]) {
1220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Class<?> componentType = expected.getComponentType();
1221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Object[] array = (Object[]) o;
1222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      List<Object> list = new ArrayList<Object>(array.length);
1223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (Object entry : array) {
1224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if ((entry instanceof Doc) && isHidden((Doc) entry)) {
1225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          continue;
1226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        list.add(filterHidden(entry, componentType));
1228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return list.toArray((Object[]) Array.newInstance(componentType, list.size()));
1230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
1231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return o;
1232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Filters hidden elements out of method return values.
1237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1238920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static class HideHandler implements InvocationHandler {
1239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    private final Object target;
1241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public HideHandler(Object target) {
1243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.target = target;
1244920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
1247920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String methodName = method.getName();
1248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (args != null) {
1249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (methodName.equals("compareTo") || methodName.equals("equals")
1250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            || methodName.equals("overrides") || methodName.equals("subclassOf")) {
1251920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          args[0] = unwrap(args[0]);
1252920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (methodName.equals("getRawCommentText")) {
1256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return filterComment((String) method.invoke(target, args));
1257920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // escape "&" in disjunctive types.
1260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (proxy instanceof Type && methodName.equals("toString")) {
1261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return ((String) method.invoke(target, args)).replace("&", "&amp;");
1262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
1265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return filterHidden(method.invoke(target, args), method.getReturnType());
1266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (InvocationTargetException e) {
1267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        throw e.getTargetException();
1268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    private String filterComment(String s) {
1272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (s == null) {
1273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return null;
1274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      s = s.trim();
1277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Work around off by one error
1279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      while (s.length() >= 5 && s.charAt(s.length() - 5) == '{') {
1280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        s += "&nbsp;";
1281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return s;
1284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    private static Object unwrap(Object proxy) {
1287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (proxy instanceof Proxy) return ((HideHandler) Proxy.getInvocationHandler(proxy)).target;
1288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return proxy;
1289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Collect the values used by the Dev tools and write them in files packaged with the SDK
12943c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param output the ouput directory for the files.
1296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeSdkValues(String output) {
1298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<String> activityActions = new ArrayList<String>();
1299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<String> broadcastActions = new ArrayList<String>();
1300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<String> serviceActions = new ArrayList<String>();
1301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<String> categories = new ArrayList<String>();
1302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<String> features = new ArrayList<String>();
1303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<ClassInfo> layouts = new ArrayList<ClassInfo>();
1305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<ClassInfo> widgets = new ArrayList<ClassInfo>();
1306920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<ClassInfo> layoutParams = new ArrayList<ClassInfo>();
1307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1308920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] classes = Converter.allClasses();
1309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Go through all the fields of all the classes, looking SDK stuff.
1311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo clazz : classes) {
1312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // first check constant fields for the SdkConstant annotation.
1314d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ArrayList<FieldInfo> fields = clazz.allSelfFields();
1315920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (FieldInfo field : fields) {
1316920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Object cValue = field.constantValue();
1317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (cValue != null) {
1318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            ArrayList<AnnotationInstanceInfo> annotations = field.annotations();
1319d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          if (!annotations.isEmpty()) {
1320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            for (AnnotationInstanceInfo annotation : annotations) {
1321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              if (SDK_CONSTANT_ANNOTATION.equals(annotation.type().qualifiedName())) {
1322d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                if (!annotation.elementValues().isEmpty()) {
1323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                  String type = annotation.elementValues().get(0).valueString();
1324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  if (SDK_CONSTANT_TYPE_ACTIVITY_ACTION.equals(type)) {
1325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    activityActions.add(cValue.toString());
1326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  } else if (SDK_CONSTANT_TYPE_BROADCAST_ACTION.equals(type)) {
1327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    broadcastActions.add(cValue.toString());
1328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  } else if (SDK_CONSTANT_TYPE_SERVICE_ACTION.equals(type)) {
1329920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    serviceActions.add(cValue.toString());
1330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  } else if (SDK_CONSTANT_TYPE_CATEGORY.equals(type)) {
1331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    categories.add(cValue.toString());
1332920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  } else if (SDK_CONSTANT_TYPE_FEATURE.equals(type)) {
1333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    features.add(cValue.toString());
1334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  }
1335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
1336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                break;
1337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              }
1338920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
1339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
1340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // Now check the class for @Widget or if its in the android.widget package
1344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // (unless the class is hidden or abstract, or non public)
1345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (clazz.isHidden() == false && clazz.isPublic() && clazz.isAbstract() == false) {
1346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        boolean annotated = false;
1347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ArrayList<AnnotationInstanceInfo> annotations = clazz.annotations();
1348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (!annotations.isEmpty()) {
1349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (AnnotationInstanceInfo annotation : annotations) {
1350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (SDK_WIDGET_ANNOTATION.equals(annotation.type().qualifiedName())) {
1351920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              widgets.add(clazz);
1352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              annotated = true;
1353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break;
1354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            } else if (SDK_LAYOUT_ANNOTATION.equals(annotation.type().qualifiedName())) {
1355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              layouts.add(clazz);
1356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              annotated = true;
1357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break;
1358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
1359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
1360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (annotated == false) {
1363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          // lets check if this is inside android.widget
1364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          PackageInfo pckg = clazz.containingPackage();
1365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String packageName = pckg.name();
1366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          if ("android.widget".equals(packageName) || "android.view".equals(packageName)) {
1367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            // now we check what this class inherits either from android.view.ViewGroup
1368920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            // or android.view.View, or android.view.ViewGroup.LayoutParams
1369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            int type = checkInheritance(clazz);
1370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            switch (type) {
1371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              case TYPE_WIDGET:
1372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                widgets.add(clazz);
1373920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                break;
1374920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              case TYPE_LAYOUT:
1375920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                layouts.add(clazz);
1376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                break;
1377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              case TYPE_LAYOUT_PARAM:
1378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                layoutParams.add(clazz);
1379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                break;
1380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
1381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
1382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
1383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // now write the files, whether or not the list are empty.
1387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // the SDK built requires those files to be present.
1388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Collections.sort(activityActions);
1390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeValues(output + "/activity_actions.txt", activityActions);
1391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Collections.sort(broadcastActions);
1393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeValues(output + "/broadcast_actions.txt", broadcastActions);
1394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Collections.sort(serviceActions);
1396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeValues(output + "/service_actions.txt", serviceActions);
1397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Collections.sort(categories);
1399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeValues(output + "/categories.txt", categories);
1400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Collections.sort(features);
1402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeValues(output + "/features.txt", features);
1403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // before writing the list of classes, we do some checks, to make sure the layout params
1405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // are enclosed by a layout class (and not one that has been declared as a widget)
1406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < layoutParams.size();) {
1407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo layoutParamClass = layoutParams.get(i);
1408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo containingClass = layoutParamClass.containingClass();
1409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (containingClass == null || layouts.indexOf(containingClass) == -1) {
1410920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        layoutParams.remove(i);
1411920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
1412920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        i++;
1413920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1414920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1415920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writeClasses(output + "/widgets.txt", widgets, layouts, layoutParams);
1417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Writes a list of values into a text files.
14213c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1422920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param pathname the absolute os path of the output file.
1423920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param values the list of values to write.
1424920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1425920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeValues(String pathname, ArrayList<String> values) {
1426920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    FileWriter fw = null;
1427920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    BufferedWriter bw = null;
1428920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    try {
1429920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      fw = new FileWriter(pathname, false);
1430920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      bw = new BufferedWriter(fw);
1431920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1432920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (String value : values) {
1433920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        bw.append(value).append('\n');
1434920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1435920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } catch (IOException e) {
1436920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // pass for now
1437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } finally {
1438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
1439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (bw != null) bw.close();
1440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (IOException e) {
1441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // pass for now
1442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1443920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
1444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (fw != null) fw.close();
1445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (IOException e) {
1446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // pass for now
1447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1448920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1449920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Writes the widget/layout/layout param classes into a text files.
14533c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param pathname the absolute os path of the output file.
1455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param widgets the list of widget classes to write.
1456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param layouts the list of layout classes to write.
1457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param layoutParams the list of layout param classes to write.
1458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeClasses(String pathname, ArrayList<ClassInfo> widgets,
1460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ArrayList<ClassInfo> layouts, ArrayList<ClassInfo> layoutParams) {
1461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    FileWriter fw = null;
1462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    BufferedWriter bw = null;
1463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    try {
1464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      fw = new FileWriter(pathname, false);
1465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      bw = new BufferedWriter(fw);
1466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // write the 3 types of classes.
1468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (ClassInfo clazz : widgets) {
1469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeClass(bw, clazz, 'W');
1470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (ClassInfo clazz : layoutParams) {
1472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeClass(bw, clazz, 'P');
1473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (ClassInfo clazz : layouts) {
1475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        writeClass(bw, clazz, 'L');
1476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } catch (IOException e) {
1478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // pass for now
1479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } finally {
1480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
1481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (bw != null) bw.close();
1482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (IOException e) {
1483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // pass for now
1484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      try {
1486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (fw != null) fw.close();
1487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } catch (IOException e) {
1488920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // pass for now
1489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
1490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Writes a class name and its super class names into a {@link BufferedWriter}.
14953c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param writer the BufferedWriter to write into
1497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param clazz the class to write
1498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param prefix the prefix to put at the beginning of the line.
1499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @throws IOException
1500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void writeClass(BufferedWriter writer, ClassInfo clazz, char prefix)
1502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      throws IOException {
1503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writer.append(prefix).append(clazz.qualifiedName());
1504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo superClass = clazz;
1505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while ((superClass = superClass.superclass()) != null) {
1506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      writer.append(' ').append(superClass.qualifiedName());
1507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1508920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    writer.append('\n');
1509920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
1512920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Checks the inheritance of {@link ClassInfo} objects. This method return
1513920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <ul>
1514920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <li>{@link #TYPE_LAYOUT}: if the class extends <code>android.view.ViewGroup</code></li>
1515920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <li>{@link #TYPE_WIDGET}: if the class extends <code>android.view.View</code></li>
1516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <li>{@link #TYPE_LAYOUT_PARAM}: if the class extends
1517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <code>android.view.ViewGroup$LayoutParams</code></li>
1518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * <li>{@link #TYPE_NONE}: in all other cases</li>
1519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * </ul>
15203c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main   *
1521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param clazz the {@link ClassInfo} to check.
1522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
1523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static int checkInheritance(ClassInfo clazz) {
1524920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if ("android.view.ViewGroup".equals(clazz.qualifiedName())) {
1525920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return TYPE_LAYOUT;
1526920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if ("android.view.View".equals(clazz.qualifiedName())) {
1527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return TYPE_WIDGET;
1528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if ("android.view.ViewGroup.LayoutParams".equals(clazz.qualifiedName())) {
1529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return TYPE_LAYOUT_PARAM;
1530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1531920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo parent = clazz.superclass();
1533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (parent != null) {
1534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return checkInheritance(parent);
1535920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
1536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
1537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return TYPE_NONE;
1538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
153918b25554072c36d4d9652523ec15e0c5306101ceChirag Shah
154018b25554072c36d4d9652523ec15e0c5306101ceChirag Shah  /**
154118b25554072c36d4d9652523ec15e0c5306101ceChirag Shah   * Ensures a trailing '/' at the end of a string.
154218b25554072c36d4d9652523ec15e0c5306101ceChirag Shah   */
154318b25554072c36d4d9652523ec15e0c5306101ceChirag Shah  static String ensureSlash(String path) {
154418b25554072c36d4d9652523ec15e0c5306101ceChirag Shah    return path.endsWith("/") ? path : path + "/";
154518b25554072c36d4d9652523ec15e0c5306101ceChirag Shah  }
1546920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
1547