RFR : 8213354 : Support package-specific stylesheets
Jonathan Gibbons
jonathan.gibbons at oracle.com
Wed Feb 20 21:49:15 UTC 2019
In DocFilesHandler.java, put the import for java.util.List first.
Otherwise OK.
No need for additional review.
-- Jon
On 02/17/2019 10:21 PM, Priya Lakshmi Muthuswamy wrote:
> ok Jon.
>
> updated webrev :
> http://cr.openjdk.java.net/~pmuthuswamy/8213354/webrev.03/
>
> Thanks,
> Priya
>
> On 2/16/2019 2:01 AM, Jonathan Gibbons wrote:
>> Priya,
>>
>> This is a mostly just a heads-up with some additional comments, that
>> only now came to mind.
>>
>> The Head class provides API to set stylesheets, but you are
>> "tunneling" the package-specific stylesheets into the <head> node via
>> the "extraContent" parameter. That is less than ideal, since it means
>> that the client code that is calling printHtmlDocument is creating
>> the <link> nodes, when it would be better to leverage the code
>> already in Head.java.
>>
>> I apologize for not suggesting this before, but it only came to me
>> when I was reviewing other code, and noticed the code in
>> printHtmlDocument, and that it was calling Head.setStylesheets.
>>
>> But, even given all that, I'm inclined to stay with your current
>> strategy for the short term, because another item I've been
>> considering is to replace the "printHtmlDocument" call with a builder
>> and print call. In other words, instead of having overloads of
>> printHtmlDocument with lots of arguments, it would be better to
>> create and use a different HtmlDocument class so that
>>
>> printHtmlDocument(arg1, arg2, arg3);
>>
>> is replaced by
>>
>> new HtmlDocument()
>> .setArg1(arg1)
>> .setArg2(arg2)
>> .setArg3(arg3)
>> .write(file);
>>
>> If we create this new class, it would be easy to design in a new method,
>>
>> setLocalStylesheets(List<DocPath> files)
>>
>> which would mean we could eliminate the code in your current patch to
>> create the <link> nodes and to pass them in through the extraContent
>> arg.
>>
>> -- Jon
>>
>>
>> On 02/15/2019 04:08 AM, Priya Lakshmi Muthuswamy wrote:
>>> Hi Jon,
>>>
>>> I have updated the fix based on the comments.
>>>
>>> Regarding throwing broader DocletException in getStylesheets,
>>> printDocument in various writer classes throw DocFileIOException,
>>> If we have to change, then we might make changes in all these methods.
>>>
>>> I will log a separate bug for supporting module specific stylesheets.
>>>
>>> webrev : http://cr.openjdk.java.net/~pmuthuswamy/8213354/webrev.02/
>>>
>>> Thanks,
>>> Priya
>>>
>>> On 2/15/2019 7:28 AM, Jonathan Gibbons wrote:
>>>> It's looking good but could still be improved.
>>>>
>>>> 1. You haven't followed the typical coding patter for managing a
>>>> cache -- in this case the cache of stylesheets.
>>>>
>>>> The pattern is typically:
>>>>
>>>> Foo foo = fooCache.get(key);
>>>> if (foo == null) {
>>>> foo = // compute foo
>>>> fooCache.put(key, foo);
>>>> }
>>>> // use foo
>>>>
>>>> In your case, you have most of that pattern in HtmlDocletWriter,
>>>> but the call to update the cache is buried inside DocFilesHandlerImpl.
>>>>
>>>> 2. I still don't really like the reference to stylesheets in
>>>> DocFilesHandler, but I can live with it, but you should follow the
>>>> style of the other method and declare that you throw
>>>> DocletException instead of the more specific DocFileIOException.
>>>> That saves needing the more specific import, and allows any future
>>>> subtypes or upgrades to use other subtypes of DocletException if
>>>> desired. Note that you can change the exception here without
>>>> changing the throws on the implementation method.
>>>>
>>>> 3. You are very close to supporting module-specifc stylesheets as
>>>> well as package-specific ones. I'm not suggesting you go all the
>>>> way for this, unless you want to, but I think you should at least
>>>> generalize the cache in HtmlConfiguration to be a
>>>> Map<Element,List<DocPath>> and change/generalize some of the method
>>>> names as well (e.g. by removing the Package word), so that they can
>>>> be reused if we choose to support module-specific stylesheets.
>>>>
>>>> It would be pretty easy to have what is currently
>>>> getPackageLocalStylesheetContent(PackageElement) automatically
>>>> check if the package has an enclosing module and look up the style
>>>> sheets for the enclosing module as well as the package.
>>>>
>>>> -- Jon
>>>>
>>>> On 02/12/2019 12:40 AM, Priya Lakshmi Muthuswamy wrote:
>>>>> Hi Jon,
>>>>>
>>>>> Thanks for the review.
>>>>>
>>>>> I have modified the DocFilesHandlerImpl to get all the .css files,
>>>>> so that user is not restricted to one name.
>>>>> Also included the Map in HtmlConfiguration.
>>>>>
>>>>> updated webrev :
>>>>> http://cr.openjdk.java.net/~pmuthuswamy/8213354/webrev.01/
>>>>>
>>>>> Thanks,
>>>>> Priya
>>>>>
>>>>> On 2/9/2019 6:24 AM, Jonathan Gibbons wrote:
>>>>>> Hi Priya,
>>>>>>
>>>>>> There are two significant issues that need to be addressed.
>>>>>>
>>>>>> 1.
>>>>>>
>>>>>> In DocFilesHandlerImpl you randomly take the first .css file you
>>>>>> find when listing the directory. If there should only be one, we
>>>>>> should specify the name (e.g. stylesheet.css). Otherwise, I think
>>>>>> you should honor all files found. Note that the order of
>>>>>> iteration of a directory is undefined, and may depend on the
>>>>>> operating system, and may vary over time. That is a very strong
>>>>>> reason not to just take the first file found when listing the
>>>>>> directory.
>>>>>>
>>>>>> In terms of naming, "check..." is not a good name for this
>>>>>> method. I'd suggest either getStylesheet (if you only want to
>>>>>> handle one) or getStyleSheets() returning a List<DocPath> if you
>>>>>> support more than one. Note that using a list allows you to
>>>>>> easily handle no files found (i.e. an empty list) as well as 1 or
>>>>>> more files found.
>>>>>>
>>>>>> Minor nit: please ensure a space between a keyword and an open
>>>>>> parenthesis. You should be able to configure your IDE for that
>>>>>> style; it is the standard style for JDK code.
>>>>>>
>>>>>> 2.
>>>>>>
>>>>>> You should not be modifying anything for this feature in the
>>>>>> jdk/javadoc/internal/doclets/toolkit/ directory. The use of
>>>>>> stylesheets and CSS is specific to the HTML format, and any
>>>>>> changes should be limited to the directory
>>>>>> jdk/javadoc/internal/doclets/formats/html/ (and any subdirectories.)
>>>>>>
>>>>>> I realize you need to get information into the individual
>>>>>> *WriterImpl classes. In general, the way we do that is to build
>>>>>> and use a table in the HtmlConfiguration object. Some class like
>>>>>> HtmlDoclet can stash information in that table; other Html
>>>>>> classes can access it. The table can either be a
>>>>>> Map<PackageElement,DocPath> or a
>>>>>> Map<PackageElement,List<DocPath>> depending on whether you
>>>>>> support at most one stylesheet per package or many.
>>>>>>
>>>>>> If you keep a Map in HtmlConfiguration, you could also compute
>>>>>> entries lazily, and not bother with editing HtmlDoclet. For
>>>>>> example, no entry in the cache means it has not been computed
>>>>>> yet, an empty list in the cache means no package-specific
>>>>>> stylesheets, a non-empty list means you have local stylesheets.
>>>>>> This computation can all be done in DocFilesHandlerImpl, with
>>>>>> just the cache object itself being retained in HtmlConfiguration.
>>>>>>
>>>>>> -- Jon
>>>>>>
>>>>>>
>>>>>> On 01/30/2019 04:18 AM, Priya Lakshmi Muthuswamy wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Kindly review the fix for
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8213354
>>>>>>> Package specific stylesheets needs to placed under doc-files
>>>>>>> directory of a package.
>>>>>>> DocFilesHandler looks for any css file and adds them to the
>>>>>>> generated html pages.
>>>>>>>
>>>>>>> webrev : http://cr.openjdk.java.net/~pmuthuswamy/8213354/webrev.00/
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Priya
>>>>>>>
>>>>>>
>>>>
>>
More information about the javadoc-dev
mailing list