3 *******************************************************************************
4 * Copyright (C) 2002-2009, International Business Machines Corporation and *
5 * others. All Rights Reserved. *
6 *******************************************************************************
10 * Preprocess with com.ibm.icu.dev.tool.docs.CodeMangler to generate
11 * either a JDK 1.4 or JDK 1.5 version. For the 1.5 version, define
15 package com.ibm.icu.dev.tool.docs;
17 import com.sun.javadoc.*;
18 //#if defined(J2SE13) || defined(J2SE14)
19 //##import com.sun.tools.doclets.*;
21 // jdk 1.5 contains both com.sun.tools.doclets.Taglet and
22 // com.sun.tools.doclets.internal.toolkit.taglets.Taglet.
23 // Their registration code casts to the second, not the first, and the
24 // second doesn't implement the first, so if you just implement the
26 import com.sun.tools.doclets.internal.toolkit.taglets.*;
27 import com.sun.tools.doclets.internal.toolkit.taglets.Taglet;
30 import java.text.BreakIterator;
31 import java.util.Locale;
34 public abstract class ICUTaglet implements Taglet {
35 protected final String name;
36 protected final int mask;
38 protected static final int MASK_FIELD = 1;
39 protected static final int MASK_CONSTRUCTOR = 2;
40 protected static final int MASK_METHOD = 4;
41 protected static final int MASK_OVERVIEW = 8;
42 protected static final int MASK_PACKAGE = 16;
43 protected static final int MASK_TYPE = 32;
44 protected static final int MASK_INLINE = 64;
46 protected static final int MASK_DEFAULT = 0x003f; // no inline
47 protected static final int MASK_VALID = 0x007f; // includes inline
49 public static void register(Map taglets) {
50 ICUInternalTaglet.register(taglets);
51 ICUDraftTaglet.register(taglets);
52 ICUStableTaglet.register(taglets);
53 //#if defined(J2SE13) || defined(J2SE14)
54 //## ICUDeprecatedTaglet.register(taglets);
56 ICUProvisionalTaglet.register(taglets);
57 ICUObsoleteTaglet.register(taglets);
58 ICUIgnoreTaglet.register(taglets);
61 protected ICUTaglet(String name, int mask) {
63 this.mask = mask & MASK_VALID;
66 public boolean inField() {
67 return (mask & MASK_FIELD) != 0;
70 public boolean inConstructor() {
71 return (mask & MASK_CONSTRUCTOR) != 0;
74 public boolean inMethod() {
75 return (mask & MASK_METHOD) != 0;
78 public boolean inOverview() {
79 return (mask & MASK_OVERVIEW) != 0;
82 public boolean inPackage() {
83 return (mask & MASK_PACKAGE) != 0;
86 public boolean inType() {
87 return (mask & MASK_TYPE) != 0;
90 public boolean isInlineTag() {
91 return (mask & MASK_INLINE) != 0;
94 public String getName() {
98 public String toString(Tag tag) {
102 public String toString(Tag[] tags) {
104 if (tags.length > 1) {
105 String msg = "Should not have more than one ICU tag per element:\n";
106 for (int i = 0; i < tags.length; ++i) {
107 msg += " [" + i + "] " + tags[i] + "\n";
109 throw new IllegalStateException(msg);
110 } else if (tags.length > 0) {
111 return toString(tags[0]);
117 //#if defined(J2SE13) || defined(J2SE14)
119 public TagletOutput getTagletOutput(Tag tag, TagletWriter writer) throws IllegalArgumentException {
120 TagletOutput out = writer.getTagletOutputInstance();
121 out.setOutput(toString(tag));
125 public TagletOutput getTagletOutput(Doc holder, TagletWriter writer) throws IllegalArgumentException {
126 TagletOutput out = writer.getTagletOutputInstance();
127 Tag[] tags = holder.tags(getName());
128 if (tags.length == 0) {
131 out.setOutput(toString(tags[0]));
136 protected static final String STATUS = "<dt><b>Status:</b></dt>";
138 public static class ICUInternalTaglet extends ICUTaglet {
139 private static final String NAME = "internal";
141 public static void register(Map taglets) {
142 taglets.put(NAME, new ICUInternalTaglet());
145 private ICUInternalTaglet() {
146 super(NAME, MASK_DEFAULT);
149 public String toString(Tag tag) {
150 return STATUS + "<dd><em>Internal</em>. <font color='red'>This API is <em>ICU internal only</em>.</font></dd>";
154 public static class ICUDraftTaglet extends ICUTaglet {
155 private static final String NAME = "draft";
157 public static void register(Map taglets) {
158 taglets.put(NAME, new ICUDraftTaglet());
161 private ICUDraftTaglet() {
162 super(NAME, MASK_DEFAULT);
165 public String toString(Tag tag) {
166 String text = tag.text();
167 if (text.length() == 0) {
168 System.err.println("Warning: empty draft tag");
170 return STATUS + "<dd>Draft " + tag.text() + ".</dd>";
174 public static class ICUStableTaglet extends ICUTaglet {
175 private static final String NAME = "stable";
177 public static void register(Map taglets) {
178 taglets.put(NAME, new ICUStableTaglet());
181 private ICUStableTaglet() {
182 super(NAME, MASK_DEFAULT);
185 public String toString(Tag tag) {
186 String text = tag.text();
187 if (text.length() > 0) {
188 return STATUS + "<dd>Stable " + text + ".</dd>";
190 return STATUS + "<dd>Stable.</dd>";
194 //#if defined(J2SE13) || defined(J2SE14)
196 //## * sigh, in JDK 1.5 we can't override the standard deprecated taglet
197 //## * so easily. I'm not impressed with the javadoc code.
199 //## public static class ICUDeprecatedTaglet extends ICUTaglet {
200 //## private static final String NAME = "deprecated";
202 //## public static void register(Map taglets) {
203 //## taglets.remove(NAME); // override standard deprecated taglet
204 //## taglets.put(NAME, new ICUDeprecatedTaglet());
207 //## private ICUDeprecatedTaglet() {
208 //## super(NAME, MASK_DEFAULT);
211 //## public String toString(Tag tag) {
212 //## BreakIterator bi = BreakIterator.getSentenceInstance(Locale.US);
213 //## String text = tag.text();
214 //## bi.setText(text);
215 //## int first = bi.first();
216 //## int next = bi.next();
217 //## if (first == -1 || next == -1) {
218 //## System.err.println("Warning: bad deprecated tag '" + text + "'");
219 //## return "<dd><em>Note</em>. " + text + "</dd>";
221 //## if ("This API is ICU internal only.".equals(text)) {
224 //## return "<dd><em>Note, " + text.substring(first, next) + "</em>. " + text.substring(next) + "</dd>";
230 public static class ICUProvisionalTaglet extends ICUTaglet {
231 private static final String NAME = "provisional";
233 public static void register(Map taglets) {
234 taglets.remove(NAME); // override standard deprecated taglet
235 taglets.put(NAME, new ICUProvisionalTaglet());
238 private ICUProvisionalTaglet() {
239 super(NAME, MASK_DEFAULT);
242 public String toString(Tag tag) {
247 public static class ICUObsoleteTaglet extends ICUTaglet {
248 private static final String NAME = "obsolete";
250 public static void register(Map taglets) {
251 taglets.put(NAME, new ICUObsoleteTaglet());
254 private ICUObsoleteTaglet() {
255 super(NAME, MASK_DEFAULT);
258 public String toString(Tag tag) {
259 BreakIterator bi = BreakIterator.getSentenceInstance(Locale.US);
260 String text = tag.text();
262 int first = bi.first();
263 int next = bi.next();
264 if (text.length() == 0) {
267 return STATUS + "<dd><em>Obsolete.</em> <font color='red'>Will be removed in " + text.substring(first, next) + "</font>. " + text.substring(next) + "</dd>";
272 public static class ICUIgnoreTaglet extends ICUTaglet {
273 private static ICUTaglet singleton;
275 public static void register(Map taglets) {
276 if (singleton == null) {
277 singleton = new ICUIgnoreTaglet();
279 taglets.put("bug", singleton);
280 taglets.put("test", singleton);
281 taglets.put("summary", singleton);
284 private ICUIgnoreTaglet() {
285 super(".ignore", MASK_DEFAULT);
288 public String toString(Tag tag) {