You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2019/01/16 12:09:02 UTC

[jira] [Closed] (GROOVY-7233) Configurable @Log AST logger field access modifiers

     [ https://issues.apache.org/jira/browse/GROOVY-7233?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul King closed GROOVY-7233.
-----------------------------

> Configurable @Log AST logger field access modifiers
> ---------------------------------------------------
>
>                 Key: GROOVY-7233
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7233
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Joe Wolf
>            Assignee: Paul King
>            Priority: Minor
>              Labels: ast, logging
>             Fix For: 3.0.0-alpha-4
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> On rare occasions, it can be desirable for a logger to be non-private. 
> Consider a @Log-annotated class with a method containing anonymous closures that log using the class's AST-injected logger.
> {code:title=BaseClient.groovy|borderStyle=solid}
> @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1' )
> import groovy.util.logging.*
> import groovyx.net.http.*
> import static groovyx.net.http.ContentType.*
> import static groovyx.net.http.Method.*
> @Log
> class BaseClient {
>     def fetchDocuments(String id) {
>         new HTTPBuilder('https://tsdrapi.uspto.gov').request(GET, XML) {
>             log.fine "Retrieving documents for case $id..."
>             uri.path = "/ts/cd/casedocs/$id/info.xml"
>             response.success = { resp, xml ->
>                 log.fine "..successfully received data for $id"
>                 xml
>             }
>         }
>     }
> }
> {code}
> Invoking {{new BaseClient().fetchDocuments('86375968')}} works as expected. However, if a subclass is written that invokes the parent method, such as:
> {code:title=Client.groovy|borderStyle=solid}
> class Client extends BaseClient {
>     def getDocuments() {
>         fetchDocuments('86375968')
>     }
> }
> {code}
> Invoking {{new Client().documents}} surprisingly results in a {{groovy.lang.MissingPropertyException: No such property: log for class: groovyx.net.http.HTTPBuilder$RequestConfigDelegate}} error. I believe this is due to the closure delegation being done via the subclass, which does not have visibility to the parent class's private fields--namely, the injected log field.
> Other than a design change, or by defining a new log variable within the parent method ({{def log = log}}, this problem can be avoided if the log field had protected visibility. 
> Here's an example of how it would look.
> {code}
> @Log(access='protected')
> class SomeClass {}
> {code}
> results in
> {code}
> public class SomeClass {
>     protected static transient final Logger log;
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)