Doclava.java revision 9b316c84e2e15268db79772d9cef60da1df488ec
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 boolean devsite = false; 739b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty public static final String devsiteRoot = "en/"; 749b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty public static String javadocDir = "reference/"; 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static String htmlExtension; 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static RootDoc root; 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static ArrayList<String[]> mHDFData = new ArrayList<String[]>(); 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static Map<Character, String> escapeChars = new HashMap<Character, String>(); 80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static String title = ""; 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static SinceTagger sinceTagger = new SinceTagger(); 827a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato public static HashSet<String> knownTags = new HashSet<String>(); 83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static FederationTagger federationTagger = new FederationTagger(); 849b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty public static Set<String> showAnnotations = new HashSet<String>(); 859b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty public static boolean includeDefaultAssets = true; 869ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson private static boolean generateDocs = true; 879ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson private static boolean parseComments = false; 8818b25554072c36d4d9652523ec15e0c5306101ceChirag Shah private static String yamlNavFile = null; 893c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main 90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static JSilver jSilver = null; 91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 925ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly private static boolean gmsRef = false; 935ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly private static boolean gcmRef = 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 devsite = true; 2519b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty // Don't copy the doclava assets to devsite output (ie use proj assets only) 2529b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty includeDefaultAssets = false; 2539b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty outputPathHtmlDirs = outputPathHtmlDirs + "/" + devsiteRoot; 254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2577a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (!readKnownTagsFiles(knownTags, knownTagsFiles)) { 2587a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato return false; 2597a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Set up the data structures 262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Converter.makeInfo(r); 263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2649ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson if (generateDocs) { 265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.addBundledTemplateDir("assets/customizations"); 266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.addBundledTemplateDir("assets/templates"); 267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson List<ResourceLoader> resourceLoaders = new ArrayList<ResourceLoader>(); 269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson List<String> templates = ClearPage.getTemplateDirs(); 270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String tmpl : templates) { 271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson resourceLoaders.add(new FileSystemResourceLoader(tmpl)); 272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson templates = ClearPage.getBundledTemplateDirs(); 275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String tmpl : templates) { 276f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein // TODO - remove commented line - it's here for debugging purposes 277f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein // resourceLoaders.add(new FileSystemResourceLoader("/Volumes/Android/master/external/doclava/res/" + tmpl)); 278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson resourceLoaders.add(new ClassResourceLoader(Doclava.class, '/'+tmpl)); 279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ResourceLoader compositeResourceLoader = new CompositeResourceLoader(resourceLoaders); 282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson jSilver = new JSilver(compositeResourceLoader); 283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!Doclava.readTemplateSettings()) { 285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 288f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein //startTime = System.nanoTime(); 289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Apply @since tags from the XML file 291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson sinceTagger.tagAll(Converter.rootClasses()); 2923c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main 293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Apply details of federated documentation 294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson federationTagger.tagAll(Converter.rootClasses()); 295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Files for proofreading 297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (proofreadFile != null) { 298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Proofread.initProofread(proofreadFile); 299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (todoFile != null) { 301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TodoFile.writeTodoFile(todoFile); 302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 3049b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty // HTML2 Pages -- Generate Pages from optional secondary dir 3059b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (!inputPathHtmlDir2.isEmpty()) { 3069b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (!outputPathHtmlDir2.isEmpty()) { 3079b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.outputDir = outputPathBase + "/" + outputPathHtmlDir2; 3089b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 3099b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.htmlDirs = inputPathHtmlDir2; 3109b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty writeHTMLPages(); 3119b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.htmlDirs = inputPathHtmlDirs; 3129b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 3139b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // HTML Pages 3154bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier if (!ClearPage.htmlDirs.isEmpty()) { 3169b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.htmlDirs = inputPathHtmlDirs; 3179b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.outputDir = outputPathHtmlDirs; 318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeHTMLPages(); 319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeAssets(); 322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Navigation tree 3245ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly String refPrefix = new String(); 3255ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly if(gmsRef){ 3265ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly refPrefix = "gms-"; 3275ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } else if(gcmRef){ 3285ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly refPrefix = "gcm-"; 3295ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } 3305ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly NavTree.writeNavTree(javadocDir, refPrefix); 331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 33218b25554072c36d4d9652523ec15e0c5306101ceChirag Shah // Write yaml tree. 33318b25554072c36d4d9652523ec15e0c5306101ceChirag Shah if (yamlNavFile != null){ 33418b25554072c36d4d9652523ec15e0c5306101ceChirag Shah NavTree.writeYamlTree(javadocDir, yamlNavFile); 33518b25554072c36d4d9652523ec15e0c5306101ceChirag Shah } 33618b25554072c36d4d9652523ec15e0c5306101ceChirag Shah 337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Packages Pages 3385ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly writePackages(javadocDir + refPrefix + "packages" + htmlExtension); 339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Classes 341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeClassLists(); 342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeClasses(); 343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeHierarchy(); 344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // writeKeywords(); 345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Lists for JavaScript 347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeLists(); 348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (keepListFile != null) { 349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeKeepList(keepListFile); 350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 351920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Sample Code 353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (SampleCode sc : sampleCodes) { 354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson sc.write(offlineMode); 355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Index page 358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeIndex(); 359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Proofread.finishProofread(proofreadFile); 361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (sdkValuePath != null) { 363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeSdkValues(sdkValuePath); 364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Stubs 368970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton if (stubsDir != null || apiFile != null || proguardFile != null) { 369970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages); 370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.printErrors(); 3733c1a6b2a6d80f02fa5460d9d8de356be5508de29Scott Main 374f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein long time = System.nanoTime() - startTime; 375f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein System.out.println("DroidDoc took " + (time / 1000000000) + " sec. to write docs to " 3769b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty + outputPathBase ); 377f959ed158599686910af990654d6c84d262868ffAndrew Sapperstein 378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return !Errors.hadError; 379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static void writeIndex() { 382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = makeHDF(); 383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.write(data, "index.cs", javadocDir + "index" + htmlExtension); 384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static boolean readTemplateSettings() { 387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = makeHDF(); 388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // The .html extension is hard-coded in several .cs files, 390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // and so you cannot currently set it as a property. 391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlExtension = ".html"; 392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // htmlExtension = data.getValue("template.extension", ".html"); 393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i = 0; 394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (true) { 395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String k = data.getValue("template.escape." + i + ".key", ""); 396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String v = data.getValue("template.escape." + i + ".value", ""); 397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ("".equals(k)) { 398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (k.length() != 1) { 401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson System.err.println("template.escape." + i + ".key must have a length of 1: " + k); 402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson escapeChars.put(k.charAt(0), v); 405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 4107a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato private static boolean readKnownTagsFiles(HashSet<String> knownTags, 4117a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato ArrayList<String> knownTagsFiles) { 4127a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato for (String fn: knownTagsFiles) { 4137a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato BufferedReader in = null; 4147a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato try { 4157a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato in = new BufferedReader(new FileReader(fn)); 4167a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato int lineno = 0; 4177a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato boolean fail = false; 4187a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato while (true) { 4197a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato lineno++; 4207a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato String line = in.readLine(); 4217a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (line == null) { 4227a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato break; 4237a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4247a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato line = line.trim(); 4257a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (line.length() == 0) { 4267a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato continue; 4277a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } else if (line.charAt(0) == '#') { 4287a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato continue; 4297a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4307a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato String[] words = line.split("\\s+", 2); 4317a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (words.length == 2) { 4327a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (words[1].charAt(0) != '#') { 4337a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato System.err.println(fn + ":" + lineno 4347a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato + ": Only one tag allowed per line: " + line); 4357a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato fail = true; 4367a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato continue; 4377a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4387a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4397a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato knownTags.add(words[0]); 4407a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4417a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (fail) { 4427a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato return false; 4437a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4447a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } catch (IOException ex) { 4457a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato System.err.println("Error reading file: " + fn + " (" + ex.getMessage() + ")"); 4467a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato return false; 4477a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } finally { 4487a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (in != null) { 4497a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato try { 4507a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato in.close(); 4517a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } catch (IOException e) { 4527a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4537a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4547a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4557a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4567a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato return true; 4577a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 4587a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato 459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static String escape(String s) { 460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (escapeChars.size() == 0) { 461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return s; 462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson StringBuffer b = null; 464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int begin = 0; 465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson final int N = s.length(); 466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < N; i++) { 467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson char c = s.charAt(i); 468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String mapped = escapeChars.get(c); 469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mapped != null) { 470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (b == null) { 471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson b = new StringBuffer(s.length() + mapped.length()); 472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (begin != i) { 474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson b.append(s.substring(begin, i)); 475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson b.append(mapped); 477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson begin = i + 1; 478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (b != null) { 481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (begin != N) { 482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson b.append(s.substring(begin, N)); 483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return b.toString(); 485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return s; 487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 488920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void setPageTitle(Data data, String title) { 490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String s = title; 491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.title.length() > 0) { 492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s += " - " + Doclava.title; 493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("page.title", s); 495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static LanguageVersion languageVersion() { 499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return LanguageVersion.JAVA_1_5; 500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static int optionLength(String option) { 504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-d")) { 505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-templatedir")) { 508920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 509920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-hdf")) { 511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 3; 512920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 5137a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato if (option.equals("-knowntags")) { 5147a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato return 2; 5157a6456cec94b5d3107f36b61e9c9f303c68e9392Joe Onorato } 516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-toroot")) { 517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-samplecode")) { 520920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 4; 521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-htmldir")) { 523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 524920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 5259b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (option.equals("-htmldir2")) { 5269b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty return 3; 5279b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-title")) { 529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 531920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-werror")) { 532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-hide")) { 535920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-warning")) { 538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 539920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 540920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-error")) { 541920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 542920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 543920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-keeplist")) { 544920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 545920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 5469b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (option.equals("-showAnnotation")) { 5479b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty return 2; 5489b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 549970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton if (option.equals("-proguard")) { 550970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton return 2; 551970f13f08e404fa1e265e7ab24050f5a8c6e4603Jeff Hamilton } 552920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-proofread")) { 553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-todo")) { 556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-public")) { 559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 561920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-protected")) { 562920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 563920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 564920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-package")) { 565920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 566920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 567920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-private")) { 568920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 569920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 570920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-hidden")) { 571920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 572920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 573920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-stubs")) { 574920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 575920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 576920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-stubpackages")) { 577920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 578920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 579920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-sdkvalues")) { 580920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 581920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 582040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato if (option.equals("-api")) { 583920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 2; 584920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 585920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-nodocs")) { 586920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 587920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 5889ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson if (option.equals("-parsecomments")) { 5899ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson return 1; 5909ccd9e3a9df835dc134e7edd2e4236220aed401eBen Dodson } 591920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-since")) { 592920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 3; 593920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-offlinemode")) { 595920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 1; 596920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 597920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (option.equals("-federate")) { 598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 3; 599920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 6001e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton if (option.equals("-federationapi")) { 6011e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton return 3; 6021e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton } 60318b25554072c36d4d9652523ec15e0c5306101ceChirag Shah if (option.equals("-yaml")) { 60418b25554072c36d4d9652523ec15e0c5306101ceChirag Shah return 2; 60518b25554072c36d4d9652523ec15e0c5306101ceChirag Shah } 6069b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (option.equals("-devsite")) { 6079b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty return 1; 6089b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 6095ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly if (option.equals("-gmsref")) { 6105ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly gmsRef = true; 6115ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly return 1; 6125ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } 6135ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly if (option.equals("-gcmref")) { 6145ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly gcmRef = true; 6155ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly return 1; 6165ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } 617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return 0; 618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 619920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static boolean validOptions(String[][] options, DocErrorReporter r) { 620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String[] a : options) { 621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (a[0].equals("-error") || a[0].equals("-warning") || a[0].equals("-hide")) { 622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson try { 623920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Integer.parseInt(a[1]); 624920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } catch (NumberFormatException e) { 625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson r.printError("bad -" + a[0] + " value must be a number: " + a[1]); 626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 628920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 629920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 630920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 631920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 632920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 633920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 634920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static Data makeHDF() { 635920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = jSilver.createData(); 636920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 637920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String[] p : mHDFData) { 638920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(p[0], p[1]); 639920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 640920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 641920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return data; 642920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 643920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static Data makePackageHDF() { 647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = makeHDF(); 648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo[] classes = Converter.rootClasses(); 649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson SortedMap<String, PackageInfo> sorted = new TreeMap<String, PackageInfo>(); 651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : classes) { 652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson PackageInfo pkg = cl.containingPackage(); 653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String name; 654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (pkg == null) { 655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson name = ""; 656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson name = pkg.name(); 658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 659920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson sorted.put(name, pkg); 660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i = 0; 663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String s : sorted.keySet()) { 664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson PackageInfo pkg = sorted.get(s); 665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (pkg.isHidden()) { 667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson continue; 668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 669920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Boolean allHidden = true; 670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int pass = 0; 671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo[] classesToCheck = null; 672920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (pass < 5) { 673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson switch (pass) { 674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson case 0: 675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classesToCheck = pkg.ordinaryClasses(); 676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 677920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson case 1: 678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classesToCheck = pkg.enums(); 679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson case 2: 681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classesToCheck = pkg.errors(); 682920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson case 3: 684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classesToCheck = pkg.exceptions(); 685920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson case 4: 687920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson classesToCheck = pkg.interfaces(); 688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson default: 690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson System.err.println("Error reading package: " + pkg.name()); 691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : classesToCheck) { 694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!cl.isHidden()) { 695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson allHidden = false; 696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!allHidden) { 700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson pass++; 703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (allHidden) { 705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson continue; 706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 7075ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly if(gmsRef){ 7085ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly data.setValue("reference.gms", "true"); 7095ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } else if(gcmRef){ 7105ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly data.setValue("reference.gcm", "true"); 7115ab9cb535d77c7d83fabac028bbf13b2d27e0e63Robert Ly } 712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("reference", "1"); 713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("reference.apilevels", sinceTagger.hasVersions() ? "1" : "0"); 714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("docs.packages." + i + ".name", s); 715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("docs.packages." + i + ".link", pkg.htmlPage()); 716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("docs.packages." + i + ".since", pkg.getSince()); 717920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, "docs.packages." + i + ".shortDescr", pkg.firstSentenceTags()); 718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 720920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 721920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson sinceTagger.writeVersionNames(data); 722920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return data; 723920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static void writeDirectory(File dir, String relative, JSilver js) { 726920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson File[] files = dir.listFiles(); 727920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i, count = files.length; 728920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (i = 0; i < count; i++) { 729920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson File f = files[i]; 730920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.isFile()) { 731920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String templ = relative + f.getName(); 732920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int len = templ.length(); 733920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (len > 3 && ".cs".equals(templ.substring(len - 3))) { 734920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Data data = makeHDF(); 735920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String filename = templ.substring(0, len - 3) + htmlExtension; 736920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.write(data, templ, filename, js); 737920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (len > 3 && ".jd".equals(templ.substring(len - 3))) { 738920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String filename = templ.substring(0, len - 3) + htmlExtension; 739920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson DocFile.writePage(f.getAbsolutePath(), relative, filename); 740920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 741920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClearPage.copyFile(f, templ); 742920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 743920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (f.isDirectory()) { 744920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeDirectory(f, relative + f.getName() + "/", js); 745920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 746920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void writeHTMLPages() { 7504bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier for (String htmlDir : ClearPage.htmlDirs) { 7514bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier File f = new File(htmlDir); 7524bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier if (!f.isDirectory()) { 7534bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier System.err.println("htmlDir not a directory: " + htmlDir); 7544bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier continue; 7554bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier } 756920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 7574bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier ResourceLoader loader = new FileSystemResourceLoader(f); 7584bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier JSilver js = new JSilver(loader); 7594bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier writeDirectory(f, "", js); 7604bac50adef51d339bb967369f9aca0de7f6c1b2fBill Napier } 761920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 762920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 763920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void writeAssets() { 764920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson JarFile thisJar = JarUtils.jarForClass(Doclava.class, null); 7659b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if ((thisJar != null) && (includeDefaultAssets)) { 766920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson try { 767920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson List<String> templateDirs = ClearPage.getBundledTemplateDirs(); 768920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String templateDir : templateDirs) { 769920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String assetsDir = templateDir + "/assets"; 770920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson JarUtils.copyResourcesToDirectory(thisJar, assetsDir, ClearPage.outputDir + "/assets"); 771920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 772920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } catch (IOException e) { 773920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson System.err.println("Error copying assets directory."); 774920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson e.printStackTrace(); 775920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return; 776920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 777920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 778920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 7799b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty //write the project-specific assets 780920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson List<String> templateDirs = ClearPage.getTemplateDirs(); 781920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (String templateDir : templateDirs) { 782920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson File assets = new File(templateDir + "/assets"); 783920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (assets.isDirectory()) { 784920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson writeDirectory(assets, "assets/", null); 785920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 786920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 7879b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 7889b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty // Create the timestamp.js file based on .cs file 7899b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty if (devsite) { 7909b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty Data timedata = Doclava.makeHDF(); 7919b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty ClearPage.write(timedata, "timestamp.cs", "timestamp.js"); 7929b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty } 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 } 833920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 834920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 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("&", "&"); 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 += " "; 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