Support for @apiNote

This could also be used to add support for various other
missing block tags found in OpenJDK code.

e.g.
@since, @revised, @serialData, @author, @spec, @jls

Bug: 26624532
Change-Id: I0bb0896fcba176cbc2bdf469981ce0a80ba4e348
diff --git a/res/assets/templates/macros.cs b/res/assets/templates/macros.cs
index 16711c4..e7eb70c 100644
--- a/res/assets/templates/macros.cs
+++ b/res/assets/templates/macros.cs
@@ -126,7 +126,19 @@
   /each ?><?cs
 /def ?>
 
-<?cs # Show the short-form description of something.  These come from shortDescr and deprecated ?><?cs 
+<?cs # Print output for block tags that are not "standard" javadoc tags ?><?cs
+def:block_tag_list(tags) ?><?cs
+  each:tag = tags ?><?cs
+      if:tag.kind == "@apiNote" ?>
+        <div class="jd-tagdata">
+          <h5 class="jd-tagtitle">API Note:</h5>
+          <ul class="nolist"><li><?cs call:tag_list(tag.commentTags) ?></li></ul>
+        </div><?cs
+      /if ?><?cs
+  /each ?><?cs
+/def ?>
+
+<?cs # Show the short-form description of something.  These come from shortDescr and deprecated ?><?cs
 def:short_descr(obj) ?><?cs
   if:subcount(obj.deprecated) ?><em><?cs
     if:obj.deprecatedsince ?>
@@ -249,6 +261,9 @@
       </ul>
   </div><?cs 
   /if ?><?cs 
+  if:subcount(obj.blockTags) ?>
+    <?cs call:block_tag_list(obj.blockTags) ?><?cs
+  /if ?><?cs
   if:subcount(obj.paramTags) ?>
   <div class="jd-tagdata">
       <h5 class="jd-tagtitle">Parameters</h5>
diff --git a/src/com/google/doclava/Comment.java b/src/com/google/doclava/Comment.java
index 894bf04..225419d 100644
--- a/src/com/google/doclava/Comment.java
+++ b/src/com/google/doclava/Comment.java
@@ -28,6 +28,7 @@
       Pattern.compile("((.*?)\\.)[ \t\r\n\\<](.*)", Pattern.DOTALL);
 
   private static final Set<String> KNOWN_TAGS = new HashSet<String>(Arrays.asList(new String[] {
+          "@apiNote",
           "@author",
           "@since",
           "@version",
@@ -362,6 +363,8 @@
       mUndeprecateTagsList.add(new TextTagInfo("@undeprecate", "@undeprecate", text, pos));
     } else if (name.equals("@include") || name.equals("@sample")) {
       mInlineTagsList.add(new SampleTagInfo(name, "@include", text, mBase, pos));
+    } else if (name.equals("@apiNote")) {
+      mTagsList.add(new ParsedTagInfo(name, name, text, mBase, pos));
     } else {
       boolean known = KNOWN_TAGS.contains(name);
       if (!known) {
@@ -430,6 +433,11 @@
     return results.toArray(TagInfo.getArray(results.size()));
   }
 
+  public TagInfo[] blockTags() {
+    init();
+    return mTags;
+  }
+
   public ParamTagInfo[] paramTags() {
     init();
     return mParamTags;
@@ -528,6 +536,7 @@
     mInitialized = true;
 
     mInlineTags = mInlineTagsList.toArray(TagInfo.getArray(mInlineTagsList.size()));
+    mTags = mTagsList.toArray(TagInfo.getArray(mTagsList.size()));
     mParamTags = mParamTagsList.toArray(ParamTagInfo.getArray(mParamTagsList.size()));
     mSeeTags = mSeeTagsList.toArray(SeeTagInfo.getArray(mSeeTagsList.size()));
     mThrowsTags = mThrowsTagsList.toArray(ThrowsTagInfo.getArray(mThrowsTagsList.size()));
@@ -539,6 +548,7 @@
     mAttrTags = mAttrTagsList.toArray(AttrTagInfo.getArray(mAttrTagsList.size()));
     mBriefTags = mBriefTagsList.toArray(TagInfo.getArray(mBriefTagsList.size()));
 
+    mTagsList = null;
     mParamTagsList = null;
     mSeeTagsList = null;
     mThrowsTagsList = null;
diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java
index 02157aa..0ea8c33 100644
--- a/src/com/google/doclava/MethodInfo.java
+++ b/src/com/google/doclava/MethodInfo.java
@@ -316,6 +316,10 @@
     return new InlineTags();
   }
 
+  public TagInfo[] blockTags() {
+    return comment().blockTags();
+  }
+
   public InheritedTags firstSentenceTags() {
     return new FirstSentenceTags();
   }
@@ -581,6 +585,7 @@
 
     TagInfo.makeHDF(data, base + ".shortDescr", firstSentenceTags());
     TagInfo.makeHDF(data, base + ".descr", inlineTags());
+    TagInfo.makeHDF(data, base + ".blockTags", blockTags());
     TagInfo.makeHDF(data, base + ".deprecated", deprecatedTags());
     TagInfo.makeHDF(data, base + ".seeAlso", seeTags());
     data.setValue(base + ".since", getSince());
diff --git a/src/com/google/doclava/ParsedTagInfo.java b/src/com/google/doclava/ParsedTagInfo.java
index aad3767..ded9522 100755
--- a/src/com/google/doclava/ParsedTagInfo.java
+++ b/src/com/google/doclava/ParsedTagInfo.java
@@ -16,6 +16,7 @@
 
 package com.google.doclava;
 
+import com.google.clearsilver.jsilver.data.Data;
 import java.util.ArrayList;
 
 public class ParsedTagInfo extends TagInfo {
@@ -46,6 +47,12 @@
     mCommentText = comment;
   }
 
+  @Override
+  public void makeHDF(Data data, String base) {
+    super.makeHDF(data, base);
+    TagInfo.makeHDF(data, base + ".commentTags", commentTags());
+  }
+
   public static <T extends ParsedTagInfo> TagInfo[] joinTags(T[] tags) {
     ArrayList<TagInfo> list = new ArrayList<TagInfo>();
     final int N = tags.length;