primer for writing Java 9 taglets

Rick Hillegas rick.hillegas at gmail.com
Sat Jul 16 15:30:51 UTC 2016


On 7/12/16 7:22 PM, Jonathan Gibbons wrote:
>
>
> On 07/12/2016 06:45 PM, Rick Hillegas wrote:
>> Hi Jon,
>>
>> Thanks for replying. Some comments inline...
>>
>> On 7/11/16 7:00 PM, Jonathan Gibbons wrote:
>>>
>>>
>>> On 07/11/2016 06:28 PM, Rick Hillegas wrote:
>>>> Hey folks,
>>>>
>>>> Is there a primer for writing Java 9 Taglets which is similar to 
>>>> the primer for writing old-style Taglets found here: 
>>>> http://docs.oracle.com/javase/7/docs/technotes/guides/javadoc/taglet/overview.html. 
>>>> I am trying to get a clean, warning-free build of Apache Derby 
>>>> using b124 of JDK 9. In order to do this, I need to eliminate the 
>>>> doclet deprecation warnings introduced by b124.
>>>>
>>>> Thanks,
>>>> -Rick
>>>
>>> Hi Rick,
>>>
>>> Yes, the world in this area has changed a lot in JDK 9.
>>>
>>> I'm assuming from your reference that your taglets do conform to the 
>>> (simple) API in this page:
>>> http://docs.oracle.com/javase/7/docs/jdk/api/javadoc/taglet/com/sun/tools/doclets/Taglet.html 
>>>
>>>
>>> I say that to make sure you're not using the more complex internal 
>>> API that never became officially public, and which accesses a lot of 
>>> JDK-internal API.
>>>
>>> The good news for you is that there is a replacement; the bad news 
>>> is the guides have not been updated, and worse, we don't currently 
>>> publish any JDK 9 API docs other than the Java SE API. (But that's a 
>>> separate issue we're working on.)   But the API is there, if you're 
>>> prepared to build the docs. So, if you're able to build JDK 9, 
>>> execute "make docs" to build the API docs. Then, in the 
>>> build/$CONFIGURATION/images/docs directory, look for the API rooted 
>>> at jdk/api/javadoc/doclet/index.html, i.,e.
>>> build/$CONFIGURATION/images/docs/jdk/api/javadoc/doclet/index.html
>>>
>>> That will show you the new replacement API, using the DocTree API 
>>> added as part of the Compiler Tree API , in JDK 8.
>>> See here 
>>> https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/index.html
>>> and here: 
>>> https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/com/sun/source/doctree/package-summary.html
>>>
>>> It should be reasonably simple to convert taglets from the old API 
>>> to the new API.
>> This is the crux of the problem. No doubt it looks simple to experts. 
>> But it's puzzling me. I have indeed looked at the old and new APIs.  
>> Tags knew how to turn themselves into strings. Now Tags have been 
>> replaced by DocTrees, which are phrased in terms of a visitor 
>> pattern. Code for a sample Taglet.toString() implementation would be 
>> helpful if you have it handy.
>
> The comment about looking simple to experts, but puzzling, is a 
> reasonable one.
>
> If you have a jdk9/dev/langtools repo available, you can look at one 
> of the simple test taglets:
> langtools/test/jdk/javadoc/tool/api/basic/taglets/UnderlineTaglet.java
>
> That shows a visitor being used to render a tag to underline its 
> content.  It uses SimpleDocTreeVisitor to save you implementing all 
> the methods of the Visitor interface. You can implement as many of 
> those methods as are likely to occur in your taglet.   As a general 
> rule, any DocTree can be "converted" back to its original form with 
> .toString(),  There are subtypes of DocTree for plain text, entities 
> (e.g.  ), the start of an HTML element (e.g. <a href="url">) or 
> the end of an HTML element. (e.g. </a>) The DocTree API makes no other 
> attempt to parse HTML and to relate the start and end of elements, etc.
>
> I apologize ahead of time that the example is not a great one.  I see 
> typos and obsolete references in the code (e.g.  "param tag he 
> <code>Tag</code>") . It declares itself to be an inline tag, so you 
> shouldn't need to provide visitUnknownBlockTag (because block tags 
> cannot appear inside inline tags) and it would be better if 
> visitUnknownInlineTag composed its contents in a StringBuilder, rather 
> than just returning the first one.  A typical inline tag is likely to 
> have content which is a sequence of DocTree nodes which may be text, 
> entities and HTML.
>
>
> Let me know if you need a somewhat more exemplary example.
Thanks, Jon. That's what I needed. Applying that pattern across our 
Taglets was a quick, mechanical task, as you predicted.

Thanks,
-Rick
>
>
>
>>
>>>
>>>
>>> Given that the old Taglet API was a supported API in JDK 8, albeit a 
>>> somewhat obscure one, it will continue to be available in JDK 9, 
>>> although as you have seen, it is now deprecated. You can continue to 
>>> use it, in conjunction with the old standard doclet, and simply 
>>> suppress the deprecation warnings with 
>>> @SuppressWarnings("deprecation").
>> This is the last resort. So far I have managed to cope with all the 
>> other deprecation warnings introduced by Java 9. I have not had to 
>> suppress any warnings, but have, instead, managed to modernize the 
>> Derby codebase. I'm hoping that a little sample code will help me 
>> over this doclet speedbump.
>
> I applaud your zeal ;-)
>
>>
>> Thanks,
>> -Rick
>>>   However, if you are looking to use a taglet in the new standard 
>>> doclet (which understands JDK 9 modules) then you will have to 
>>> convert to the new improved API.
>>>
>>> -- Jon
>>>
>>>
>>>
>>>
>>>
>>
>
>



More information about the javadoc-dev mailing list