KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > aspectj > tools > doclets > standard > AdviceSubWriter


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
24 import org.aspectj.ajdoc.AdviceDoc;
25 import org.aspectj.ajdoc.AspectDoc;
26 import org.aspectj.tools.ajdoc.Access;
27
28 import com.sun.javadoc.ClassDoc;
29 import com.sun.javadoc.ExecutableMemberDoc;
30 import com.sun.javadoc.MemberDoc;
31 import com.sun.javadoc.ProgramElementDoc;
32 import com.sun.javadoc.Tag;
33 import com.sun.javadoc.Type;
34 import com.sun.tools.doclets.Util;
35
36 import java.util.ArrayList JavaDoc;
37 import java.util.Collections JavaDoc;
38 import java.util.HashSet JavaDoc;
39 import java.util.Iterator JavaDoc;
40 import java.util.List JavaDoc;
41 import java.util.Set JavaDoc;
42 import java.util.TreeMap JavaDoc;
43
44 public class AdviceSubWriter extends ExecutableMemberSubWriter {
45
46     protected Class JavaDoc delegateClass() {
47         return MethodSubWriter.class;
48     }
49
50     public AdviceSubWriter
51         (com.sun.tools.doclets.standard.SubWriterHolderWriter writer,
52          AspectDoc aspectdoc)
53     {
54         super(writer, aspectdoc);
55     }
56
57     public AdviceSubWriter
58         (com.sun.tools.doclets.standard.SubWriterHolderWriter writer)
59     {
60         super(writer);
61     }
62
63     protected final String JavaDoc keyName() { return "Advice"; }
64    
65     protected String JavaDoc where(ProgramElementDoc member) {
66         return getWhere(classdoc, member);
67     }
68     
69     public static String JavaDoc getWhere(ClassDoc cd, ProgramElementDoc member) {
70         return getName(cd, (AdviceDoc)member).replace(' ','_').replace('#','-');
71     }
72
73     protected void printSummaryType(ProgramElementDoc member) {
74         AdviceDoc advice = (AdviceDoc)member;
75         printModifiers(advice);
76     }
77
78     protected void printReturnTag(Tag[] returnsTag) {
79         if (returnsTag.length > 0) {
80             writer.dt();
81             writer.boldText("doclet.Returns");
82             writer.dd();
83             writer.printInlineComment(returnsTag[0]);
84         }
85     }
86
87     protected void printTagsInfoHeader() {
88         writer.dd();
89         writer.dl();
90     }
91
92     protected void printTagsInfoFooter() {
93         writer.dlEnd();
94         writer.ddEnd();
95     }
96
97     protected void printSignature(ExecutableMemberDoc member) {
98         AdviceDoc advice = (AdviceDoc)member;
99         writer.displayLength = 0;
100         writer.pre();
101         printReturnType(advice);
102         bold(advice.name());
103         printParameters(advice);
104         if (advice.isThrowing()) {
105             writer.print(" throwing ");
106             printExtraType(advice.extraType());
107         }
108         if (advice.isReturning()) {
109             writer.print(" returning ");
110             printExtraType(advice.extraType());
111         }
112         writer.preEnd();
113     }
114
115     protected void printExtraType(Type type) {
116         print(' ');
117         print('(');
118         if (type != null) {
119             printTypeLink(type);
120         }
121         print(')');
122     }
123
124     public static String JavaDoc getName(ClassDoc cd, AdviceDoc advice) {
125         String JavaDoc name = advice.name();
126         int num = 1;
127         for (Iterator JavaDoc i = staticMembers(cd).iterator(); i.hasNext();) {
128             AdviceDoc ad = (AdviceDoc)i.next();
129             if (ad.equals(advice)) {
130                 break;
131             }
132             if (ad.name().equals(name)) {
133                 num++;
134             }
135         }
136         return name + " #" + num;
137     }
138
139     protected String JavaDoc name(ProgramElementDoc member) {
140         return getName(classdoc, (AdviceDoc)member);
141     }
142
143     protected void printParameters(ExecutableMemberDoc member) {
144         //AdviceDoc advice = (AdviceDoc)member;
145
Access.printParameters
146             ((com.sun.tools.doclets.standard.ExecutableMemberSubWriter)
147              ((AbstractSubWriter)del()).del(),
148              member);
149     }
150
151     protected void printReturnType(AdviceDoc advice) {
152         Type type = advice.returnType();
153         if (type != null) {
154             printTypeLink(type);
155             print(' ');
156         }
157     }
158
159     public void nonfinalPrintMember(ProgramElementDoc elem) {
160         AdviceDoc advice = (AdviceDoc)elem;
161         writer.anchor(where(advice));
162         printHead(advice);
163         printSignature(advice);
164         printFullComment(advice);
165     }
166
167     protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
168         ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
169         String JavaDoc name = emd.name();
170         writer.bold();
171         writer.printClassLink(cd, where(emd), name, false);
172         writer.boldEnd();
173         writer.displayLength = name.length();
174         printParameters(emd);
175     }
176
177     protected void printHead(MemberDoc member) {
178         printHead(name(member));
179     }
180
181     protected static List JavaDoc staticMembers(ClassDoc classdoc) {
182         if (!(classdoc instanceof AspectDoc)) return Collections.EMPTY_LIST;
183         AdviceDoc[] advice = ((AspectDoc)classdoc).advice();
184         return advice == null ? Collections.EMPTY_LIST : Util.asList(advice);
185     }
186     
187     protected List JavaDoc getMembers(ClassDoc classdoc) {
188         return staticMembers(classdoc);
189     }
190
191     public void printCrosscuts(ClassDoc cd, ProgramElementDoc member) {
192         if (!(cd instanceof AspectDoc)) return;
193         //AspectDoc ad = (AspectDoc)cd;
194
AdviceDoc advice = (AdviceDoc)member;
195         ExecutableMemberDoc[] crosscuts = advice.crosscuts();
196         if (null != crosscuts && crosscuts.length > 0) {
197             writer.dt();
198             writer.boldText("doclet.Crosscuts");
199             Set JavaDoc set = new HashSet JavaDoc();
200             for (int i = 0; i < crosscuts.length; i++) {
201                 set.add(crosscuts[i]);
202             }
203             List JavaDoc list = new ArrayList JavaDoc(set);
204             Collections.sort(list);
205             for (Iterator JavaDoc i = list.iterator(); i.hasNext();) {
206                 ExecutableMemberDoc emd = (ExecutableMemberDoc)i.next();
207                 if (null != emd) {
208                     writer.dd();
209                     writer.code();
210                     String JavaDoc where = emd instanceof AdviceDoc
211                         ? where(emd)
212                         : super.where(emd);
213                     writer.printClassLink(emd.containingClass(),
214                                           where, label(emd));
215                     print(" in ");
216                     writer.printClassLink(emd.containingClass());
217                     writer.codeEnd();
218                     print('.');
219                 }
220             }
221         }
222     }
223
224     public void printSummaryCrosscuts(ClassDoc cd,
225                                          ProgramElementDoc member) {
226
227         class CCs extends TreeMap JavaDoc {
228             void add(ExecutableMemberDoc cc) {
229                 if (null != cc) {
230                     Object JavaDoc o = get(cc.containingClass());
231                     if (o == null) {
232                         o = cc;
233                     } else if (o instanceof ExecutableMemberDoc) {
234                         o = new Integer JavaDoc(2);
235                     } else {
236                         o = new Integer JavaDoc(((Integer JavaDoc)o).intValue()+1);
237                     }
238                     put(cc.containingClass(), o);
239                 }
240             }
241         }
242         
243         ExecutableMemberDoc[] crosscuts = ((AdviceDoc)member).crosscuts();
244         if (crosscuts.length > 0) {
245             writer.boldText("doclet.Advises");
246             CCs ccs = new CCs();
247             for (int i = 0; i < crosscuts.length; i++) {
248                 ccs.add(crosscuts[i]);
249             }
250             for (Iterator JavaDoc i = ccs.keySet().iterator(); i.hasNext();) {
251                 print(' ');
252                 ClassDoc target = (ClassDoc)i.next();
253                 Object JavaDoc o = ccs.get(target);
254                 String JavaDoc link;
255                 String JavaDoc name = target.name();
256                 if (o instanceof AdviceDoc) {
257                     link = where((AdviceDoc)o);
258                 } else if (o instanceof ExecutableMemberDoc) {
259                     link = super.where((ExecutableMemberDoc)o);
260                 } else {
261                     link = "method_detail";
262                     name += "(" + o + ")";
263                 }
264                 writer.printClassLink(target, link, name);
265                 if (i.hasNext()) print(",");
266             }
267         }
268     }
269
270     public boolean hasCrosscuts(ClassDoc classDoc, ProgramElementDoc member) {
271         return true;
272     }
273 }
274
Popular Tags