You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AbstractSubWriter.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. /* -*- Mode: JDE; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2. *
  3. * This file is part of the debugger and core tools for the AspectJ(tm)
  4. * programming language; see http://aspectj.org
  5. *
  6. * The contents of this file are subject to the Mozilla Public License
  7. * Version 1.1 (the "License"); you may not use this file except in
  8. * compliance with the License. You may obtain a copy of the License at
  9. * either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
  10. *
  11. * Software distributed under the License is distributed on an "AS IS" basis,
  12. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. * for the specific language governing rights and limitations under the
  14. * License.
  15. *
  16. * The Original Code is AspectJ.
  17. *
  18. * The Initial Developer of the Original Code is Xerox Corporation. Portions
  19. * created by Xerox Corporation are Copyright (C) 1999-2002 Xerox Corporation.
  20. * All Rights Reserved.
  21. */
  22. package org.aspectj.tools.doclets.standard;
  23. import org.aspectj.ajdoc.IntroducedDoc;
  24. import org.aspectj.tools.ajdoc.Access;
  25. import com.sun.javadoc.ClassDoc;
  26. import com.sun.javadoc.ProgramElementDoc;
  27. import java.lang.reflect.Constructor;
  28. import java.lang.reflect.Method;
  29. import java.util.ArrayList;
  30. import java.util.Collections;
  31. import java.util.HashMap;
  32. import java.util.Iterator;
  33. import java.util.List;
  34. import java.util.Map;
  35. public class AbstractSubWriter
  36. extends com.sun.tools.doclets.standard.AbstractSubWriter
  37. implements AbstractSubWriterAJ
  38. {
  39. public AbstractSubWriter
  40. (com.sun.tools.doclets.standard.SubWriterHolderWriter writer,
  41. ClassDoc classdoc)
  42. {
  43. super(writer, classdoc);
  44. }
  45. public AbstractSubWriter
  46. (com.sun.tools.doclets.standard.SubWriterHolderWriter writer)
  47. {
  48. super(writer);
  49. }
  50. public final void printSummaryMember(ClassDoc cd, ProgramElementDoc member) {
  51. writer.printSummaryLinkType(this, member);
  52. printSummaryLink(cd, member);
  53. printSummaryLinkComment(member);
  54. }
  55. protected final void printCrosscuts(ProgramElementDoc member) {
  56. if (hasCrosscuts(classdoc, member)) {
  57. writer.dl();
  58. writer.dd();
  59. printCrosscuts(classdoc, member);
  60. writer.ddEnd();
  61. writer.dlEnd();
  62. }
  63. }
  64. protected /*abstract*/ Class delegateClass() { throw new RuntimeException(""); }
  65. /*final*/ private com.sun.tools.doclets.standard.AbstractSubWriter del;
  66. { setDelegator(); }
  67. protected final void setDelegator() {
  68. com.sun.tools.doclets.standard.AbstractSubWriter mw = null;
  69. try {
  70. List list = new ArrayList();
  71. if (writer != null) list.add(writer);
  72. if (classdoc != null) list.add(classdoc);
  73. setDelegator(mw = findDelegate
  74. (list.toArray
  75. (new Object[list.size()])));
  76. } finally {
  77. del = mw;
  78. }
  79. }
  80. public final com.sun.tools.doclets.standard.AbstractSubWriter del() {
  81. return del;
  82. }
  83. private final void setDelegator(Object o) {
  84. if (o == null) return;
  85. try {
  86. Method[] ms = o.getClass().getMethods();
  87. for (int i = 0; i < ms.length; i++) {
  88. if (ms[i].getName().equals("setDelegator")) {
  89. ms[i].invoke(o, new Object[]{this});
  90. }
  91. }
  92. } catch (Exception e) {
  93. Standard.configuration().standardmessage.
  94. error("doclet.exception_encountered", e+"");
  95. }
  96. }
  97. private final com.sun.tools.doclets.standard.AbstractSubWriter
  98. findDelegate(Object[] params) {
  99. if (delegateClass() == null) {
  100. return this;
  101. }
  102. try {
  103. Constructor[] cs = delegateClass().getConstructors();
  104. for (int i = 0; i < cs.length; i++) {
  105. if (cs[i].getParameterTypes().length == params.length) {
  106. return (com.sun.tools.doclets.standard.AbstractSubWriter)
  107. cs[i].newInstance(params);
  108. }
  109. }
  110. } catch (Exception e) {
  111. Standard.configuration().standardmessage.
  112. error("doclet.exception_encountered", e+"");
  113. }
  114. return null;
  115. }
  116. public int getMemberKind() {
  117. return -1;
  118. }
  119. public void printSummaryLabel(ClassDoc cd) {
  120. if (keyName() != null) {
  121. summaryLabel(keyName());
  122. } else {
  123. del.printSummaryLabel(cd);
  124. }
  125. }
  126. public void printSummaryAnchor(ClassDoc cd) {
  127. if (keyName() != null) {
  128. summaryAnchor(keyName());
  129. } else {
  130. del.printSummaryAnchor(cd);
  131. }
  132. }
  133. public void printInheritedSummaryAnchor(ClassDoc cd) {
  134. del.printInheritedSummaryAnchor(cd);
  135. }
  136. protected void printSummaryType(ProgramElementDoc member) {
  137. Access.printSummaryType(this, member);
  138. }
  139. protected void printSummaryLink(ClassDoc cd,
  140. ProgramElementDoc member) {
  141. Access.printSummaryLink(this, cd, member);
  142. }
  143. protected void printInheritedSummaryLink(ClassDoc cd,
  144. ProgramElementDoc member) {
  145. Access.printInheritedSummaryLink(this, cd, member);
  146. }
  147. protected void printHeader(ClassDoc cd) {
  148. if (keyName() != null) {
  149. header(keyName());
  150. } else {
  151. Access.printHeader(this, cd);
  152. }
  153. }
  154. protected void printBodyHtmlEnd(ClassDoc cd) {
  155. Access.printBodyHtmlEnd(this, cd);
  156. }
  157. protected final void printMember(ProgramElementDoc elem) {
  158. nonfinalPrintMember(elem);
  159. printCrosscuts(elem);
  160. }
  161. protected void nonfinalPrintMember(ProgramElementDoc elem) {
  162. Access.printMember(this, elem);
  163. }
  164. protected void printDeprecatedLink(ProgramElementDoc member) {
  165. Access.printDeprecatedLink(this, member);
  166. }
  167. protected void printNavSummaryLink(ClassDoc cd, boolean link) {
  168. if (keyName() != null) {
  169. navSummaryLink(cd, keyName(), link);
  170. } else {
  171. Access.printNavSummaryLink(this, cd, link);
  172. }
  173. }
  174. protected void printNavDetailLink(boolean link) {
  175. if (keyName() != null) {
  176. navDetailLink(keyName(), link);
  177. } else {
  178. Access.printNavDetailLink(this, link);
  179. }
  180. }
  181. protected /*abstract*/ String propertyName() { return keyName(); }
  182. protected /*abstract*/ String keyName() { return null; }
  183. protected final String lowercase() {
  184. String str = propertyName();
  185. return str == null || str.length() == 0 ? "" :
  186. Character.toLowerCase(str.charAt(0)) +
  187. str.substring(1);
  188. }
  189. public void printInheritedSummaryLabel(ClassDoc cd) {
  190. summaryLabel("Inherited_From", cd);
  191. }
  192. public void printIntroducedSummaryLabel(ClassDoc cd) {
  193. summaryLabel("Introduced_From", cd);
  194. }
  195. public void printIntroducedSummaryAnchor(ClassDoc cd) {
  196. summaryAnchor("introduced_from_class", cd);
  197. }
  198. protected final void summaryLabel(String keyName) {
  199. writer.boldText("doclet." + keyName + "_Summary");
  200. }
  201. protected final void summaryAnchor(String keyName) {
  202. writer.anchor(keyName.toLowerCase() + "_summary");
  203. }
  204. protected final void summaryLabel(String type, ClassDoc cd) {
  205. writer.bold();
  206. writer.printText("doclet." + propertyName() + "s_" + type,
  207. Statics.type(cd),
  208. writer.getPreQualifiedClassLink(cd));
  209. writer.boldEnd();
  210. }
  211. protected final void summaryAnchor(String type, ClassDoc cd) {
  212. writer.anchor(lowercase() + "s_" + type + "_" + cd.qualifiedName());
  213. }
  214. protected final String navKey(String keyName) {
  215. return "doclet.nav" + keyName;
  216. }
  217. protected final String navKey() {
  218. return navKey(keyName());
  219. }
  220. protected final void navLink(ClassDoc cd, String keyName,
  221. boolean link, String kind) {
  222. if (link) {
  223. writer.printHyperLink
  224. ("",
  225. cd == null ?
  226. keyName.toLowerCase() + "_" + kind :
  227. keyName.toLowerCase() + "s_inherited_from_class_" +
  228. cd.qualifiedName(),
  229. writer.getText(navKey(keyName)));
  230. } else {
  231. writer.printText(navKey(keyName));
  232. }
  233. }
  234. protected final void navSummaryLink(ClassDoc cd, String keyName, boolean link) {
  235. navLink(cd, keyName, link, "summary");
  236. }
  237. protected final void navDetailLink(String keyName, boolean link) {
  238. navLink(null, keyName, link, "detail");
  239. }
  240. protected final void header(String keyName) {
  241. writer.anchor(keyName.toLowerCase() + "_detail");
  242. writer.printTableHeadingBackground
  243. (writer.getText("doclet." + keyName + "_Detail"));
  244. }
  245. public void printCrosscuts(ClassDoc cd, ProgramElementDoc member) {}
  246. public void printSummaryCrosscuts(ClassDoc cd, ProgramElementDoc member) {}
  247. public boolean hasCrosscuts(ClassDoc cd,ProgramElementDoc member) {
  248. return false;
  249. }
  250. protected void printHead(String name) {
  251. writer.h3();
  252. writer.print(name);
  253. writer.h3End();
  254. }
  255. protected List nointros(List members) {
  256. List list = new ArrayList();
  257. for (Iterator i = members.iterator(); i.hasNext();) {
  258. Object o = i.next();
  259. if (o instanceof org.aspectj.ajdoc.MemberDoc) {
  260. IntroducedDoc intro =
  261. ((org.aspectj.ajdoc.MemberDoc)o).introduced();
  262. if (intro == null || intro.containingClass().equals(classdoc)) {
  263. list.add(o);
  264. }
  265. } else {
  266. list.add(o);
  267. }
  268. }
  269. return list;
  270. }
  271. public void printMembersSummary() {
  272. nointros = true;
  273. super.printMembersSummary();
  274. nointros = false;
  275. }
  276. protected final void printSummaryLinkComment(ProgramElementDoc member) {
  277. writer.codeEnd();
  278. writer.println();
  279. writer.br();
  280. Access.printCommentDef(this, member);
  281. boolean newline = member.tags("deprecated").length +
  282. member.firstSentenceTags().length > 0;
  283. if (classdoc != null || true) { // ?? always
  284. if (hasCrosscuts(classdoc, member)) {
  285. if (newline) {
  286. writer.br();
  287. writer.printNbsps();
  288. }
  289. printSummaryCrosscuts(classdoc, member);
  290. }
  291. }
  292. writer.summaryRowEnd();
  293. writer.trEnd();
  294. }
  295. public void printIntroducedSummaryHeader(ClassDoc cd) {
  296. printIntroducedSummaryAnchor(cd);
  297. writer.tableIndexSummary();
  298. writer.tableInheritedHeaderStart("#EEEEFF");
  299. printIntroducedSummaryLabel(cd);
  300. writer.tableInheritedHeaderEnd();
  301. writer.trBgcolorStyle("white", "TableRowColor");
  302. writer.summaryRow(0);
  303. writer.code();
  304. }
  305. public void printIntroducedSummaryFooter(ClassDoc cd) {
  306. writer.codeEnd();
  307. writer.summaryRowEnd();
  308. writer.trEnd();
  309. writer.tableEnd();
  310. writer.space();
  311. }
  312. public void printIntroducedSummaryMember(ClassDoc cd,
  313. ProgramElementDoc member) {
  314. printIntroducedSummaryLink(cd, member);
  315. }
  316. public void printIntroducedSummaryLink(ClassDoc cd,
  317. ProgramElementDoc member) {}
  318. public void printIntroducedMembersSummary() {
  319. Map typesToMembers = new HashMap();
  320. for (Iterator i = members(classdoc).iterator(); i.hasNext();) {
  321. Object o = i.next();
  322. if (!(o instanceof org.aspectj.ajdoc.MemberDoc)) continue;
  323. org.aspectj.ajdoc.MemberDoc md = (org.aspectj.ajdoc.MemberDoc)o;
  324. if (md.introduced() != null) {
  325. ClassDoc cd = md.introduced().containingClass();
  326. List members = (List)typesToMembers.get(cd);
  327. if (members == null) members = new ArrayList();
  328. members.add(md);
  329. typesToMembers.put(cd, members);
  330. }
  331. }
  332. for (Iterator i = typesToMembers.keySet().iterator(); i.hasNext();) {
  333. ClassDoc cd = (ClassDoc)i.next();
  334. printIntroducedSummaryHeader(cd);
  335. List members = (List)typesToMembers.get(cd);
  336. Collections.sort(members);
  337. for (Iterator j = members.iterator(); j.hasNext();) {
  338. printIntroducedSummaryMember(cd, (ProgramElementDoc)j.next());
  339. if (j.hasNext()) print(", ");
  340. }
  341. printIntroducedSummaryFooter(cd);
  342. }
  343. }
  344. private boolean nointros = false;
  345. public void printMembers() {
  346. nointros = true;
  347. super.printMembers();
  348. nointros = false;
  349. }
  350. public void navSummaryLink() {
  351. nointros = true;
  352. super.navSummaryLink();
  353. nointros = false;
  354. }
  355. protected void navDetailLink() {
  356. printNavDetailLink(members(classdoc).size() > 0 ? true : false);
  357. }
  358. public final List members(ClassDoc cd) {
  359. return nointros ? nointros(getMembers(cd)) : getMembers(cd);
  360. }
  361. protected List getMembers(ClassDoc cd) {
  362. return super.members(cd);
  363. }
  364. }