> On Oct 13, 2015, at 5:14 AM, Daniel Fuchs <daniel.fu...@oracle.com> wrote: > > Hi Mandy, > > > Thanks a lot for your feedback! > > On 13/10/15 04:50, Mandy Chung wrote: >> >> >> There are many new tests that I will need time to review them all. > > :
My typo s/new tests/new classes/ > >> I’m going to pass you my comments in several batches. This is the first >> batch. >> >> LogManager.java >> 1938 if (caller.getClassLoader() == null) { >> 1939 return LogManager.getLogManager().demandSystemLogger(name, >> 1940 Logger.SYSTEM_LOGGER_RB_NAME, caller); >> >> This only considers the classes loaded by the boot loader as system classes. >> We have deprivileged several modules to be loaded by the ext class loader >> such as JAX-WS, JAXB, CORBA etc. Loggers created by modules loaded by boot >> and ext class loader should be system. > > Right. I agree. But I also think this is orthogonal to this > JEP implementation. Would you agree to handle that in a separate > JBS issue (probably more 'Bug' than 'RFE’)? I recalled you specify this in the specification. I prefer this to be handled at the moment. I currently focus on reviewing the implementation. I will re-comment on this point. > >> In the absence of java.logging, the default provider implementation will be >> used to print the log messages to System.err. This is useful since most JDK >> log messages are for debugging. I expect that a component may want to turn >> on debug messages without requiring the presence of java.logging. >> >> Is there any mechanism to change the default level of the default simple >> console loggers? It may be useful; otherwise it would need to run on an >> image with java.logging module. Maybe something to add in the future. > > There isn't at this time. We could add for instance a global system > property that would allow to define the 'default level' for all > SimpleConsoleLogger. Something like '-Djdk.loggers.level.default=DEBUG' > which would have an effect similar to setting the root logger level > .level=FINE in the default configuration. > The question then is whether that property would only be used > when java.logging is not present, or whether the LogManager should > be modified to take this into account too - and whether it would have > precedence over what is in the configuration (default or not)... > > Possibly something to handle in a second time. Should I add a subtask > to JDK-8046565 - to log an RFE about that after the initial > implementation gets in? That’d be good. > >> System.Logger >> 964 * Unless >> - incomplete sentence? > > Thanks for catching that. I'd been considering adding some kind of > global blanket statement for the throwing of NullPointerException, > then decided against it but forgot I had started writing the sentence... > I will remove this line. > > >> 1697 * @implSpec >> 1698 * Instances returned by this method route messages to loggers >> 1699 * obtained by calling {@link >> LoggerFinder#getLogger(java.lang.String, java.lang.Class) >> 1700 * LoggerFinder.getLogger(name, ca >> >> Is this intended to be implementation specification but not API spec? > > It's intended to be an API spec that the messages should be routed > to loggers obtained from LoggerFinder.getLogger(name, caller). You can take out @implSpec in that case. > > Whether the logger returned is directly the logger obtained, or > a wrapper, and at which point exactly the 'real' logger will be created > is implementation dependent. I think we need to have a bit of freedom > here to deal with bootstrap issues according to the needs of the > modules in the JDK. > >> RuntimePermission(“LoggerFinder) is required in the provider constructor. >> - is it time to define a ServiceProviderPermission for provider constructor >> security permission check? Rather than overloading RuntimePermission > > If there was a ServiceProviderPermission I would use it, but I > don't think this JEP should introduce it. We could log another > RFE for that. > I don’t see any issue of defining the permission type. I also have to understand other permission checks required for the provider implementation and may be an option to use a new permission specific to logger finder. Stay tuned. > >> public static final RuntimePermission LOGGERFINDER_PERMISSION = >> new RuntimePermission("loggerFinder”); >> - is there any need to define this constant? Suggest this be >> implementation-details. > > This was mostly temporary convenience for me - until I'm sure > I won't get further feedback that the name should be changed. > Avoids copy/paste typo mistakes and spending time debugging it. > If you think it would be better to not define such a constant, > then I agree to remove it in the final API. My take is that custom provider implementation can construct this instance themselves. You can define this constant as implementation. > Should I had a subtask to the JEP to get this removed, so that > it's not forgotten? > Are you thinking this is an API change? If you plan to address this in the first integration of this JEP, there is no need to file a subtask. It’s up to you if you prefer filing a subtask tracking the review comments for your own use. > >> private LoggerFinderLoader() { >> throw new InternalError("LoggerFinderLoader cannot be instantiated"); >> } >> - is throwing InternalError necessary? No one else except its enclosing >> class can construct it. > > It clearly indicates that it should not be instantiated. > I like it :-) Maybe assert is what you should consider. Static factory classes have an empty private constructor which is a clear idiom IMO. Mandy