RFR : 8213354 : Support package-specific stylesheets

Jonathan Gibbons jonathan.gibbons at oracle.com
Fri Feb 15 19:17:50 UTC 2019


> 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. 

As I said in my previous email, you would NOT need to change the 
overriding methods in the subtypes.

Try playing with this example:

-------

import java.io.*;

interface Super {
     void m() throws IOException, ReflectiveOperationException;
}

class Suub implements Super {
     @Override
     public void m() throws FileNotFoundException { }
}

-------

Note how Super.m throws two exceptions and Sub.m just throws 1.
Note how Super.m throws IOException, but Sub.m throws 
FileNotFOundException, which is a subtype of IOException.

See:
https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.6
https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.8.3

  *

    For every checked exception type listed in the |throws| clause of
    |m_2 |, that same exception class or one of its supertypes must
    occur in the erasure (ยง4.6
    <https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.6>)
    of the |throws| clause of |m_1 |; otherwise, a compile-time error
    occurs.



-- 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
>>>>>
>>>>
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/javadoc-dev/attachments/20190215/9f9566d5/attachment-0001.html>


More information about the javadoc-dev mailing list