I addressed the problem in https://issues.apache.org/jira/browse/LOG4J2-1280
LambdaUtil now correctly handles the case where Supplier<?>s returns a
Message object.
I believe that MessageSupplier can now be deprecated.

It may also make sense to  remove the new traceEntry/traceExit methods
introduced in LOG4J2-1255 that use MessageSupplier: their Supplier<?>
equivalent should be sufficient.

On Tue, Feb 16, 2016 at 8:34 AM, Matt Sicker <boa...@gmail.com> wrote:

> The wildcard bounds are checked at compile time though I thought. Plus,
> despite the type erasure, there's still a bit of info available through
> reflection, so it's not entirely lost.
>
> On 15 February 2016 at 16:23, Remko Popma <remko.po...@gmail.com> wrote:
>
>> The wildcard bounds are no help since they get erased, so we cannot have
>> separate methods for Supplier<? extends Message> and Supplier<?>. (This is
>> why I originally introduced MessageSupplier.)
>>
>> I don't mind deprecating MessageSupplier, but the point is that in the
>> implementation of these logging methods we need to be very careful:
>>
>> Generally, if log(Supplier<?>) supplies an object of type Message it
>> doesn't need to be wrapped in an ObjectMessage, where if any other Object
>> is supplied it _does_ need to be wrapped.
>>
>> Similarly for where the Supplier supplies param values: if the supplied
>> value is a Message you need to _unwrap_ it by calling getFormattedString()
>> on it. The current impl of traceEntry/Exit does not do this correctly, I
>> reported this as a bug in LOG4J2-1255.
>>
>> Sent from my iPhone
>>
>> On 2016/02/16, at 2:21, Gary Gregory <garydgreg...@gmail.com> wrote:
>>
>> On Mon, Feb 15, 2016 at 9:17 AM, Gary Gregory <garydgreg...@gmail.com>
>> wrote:
>>
>>> On Mon, Feb 15, 2016 at 9:08 AM, Matt Sicker <boa...@gmail.com> wrote:
>>>
>>>> Sounds good. Remko was mentioning how they could be combined by
>>>> checking if get() returns an instanceof Message, but using the wildcard
>>>> bounds like you show sounds like a better way (where possible).
>>>>
>>>
>>> Wasn't Remko talking about a different case?
>>>
>>> Right now we have:
>>>
>>> traceExit(MessageSupplier, R)
>>> traceExit(Supplier<? extends Message>, R)
>>>
>>> Both "MessageSupplier.get()" and "Supplier<? extends Message>" *do*
>>> return a Message so I think we can remove traceExit(Supplier<? extends
>>> Message>, R)  (which is not even used/tested ATM).
>>>
>>
>> Ah, but we do not have a traceExit(Supplier<R>)
>>
>> I'll add that completeness, and also traceExit(EntryMessage). My use
>> cases only call for traceExit(EntryMessage, R) and traceExit(EntryMessage).
>>
>> Gary
>>
>>
>>> Gary
>>>
>>>>
>>>> On 15 February 2016 at 11:06, Gary Gregory <garydgreg...@gmail.com>
>>>> wrote:
>>>>
>>>>> Since 2.4 we have:
>>>>>
>>>>> public interface MessageSupplier {
>>>>>
>>>>>     /**
>>>>>      * Gets a Message.
>>>>>      *
>>>>>      * @return a Message
>>>>>      */
>>>>>     Message get();
>>>>> }
>>>>>
>>>>> and
>>>>>
>>>>> public interface Supplier<T> {
>>>>>
>>>>>     /**
>>>>>      * Gets a value.
>>>>>      *
>>>>>      * @return a value
>>>>>      */
>>>>>     T get();
>>>>> }
>>>>>
>>>>> Which smells fishy to me. Instead I propose:
>>>>>
>>>>> public interface MessageSupplier extends Supplier<Message> {
>>>>>     // empty
>>>>> }
>>>>>
>>>>> Whether or not we do the above, we can replace:
>>>>>
>>>>> traceExit(R, Supplier<? extends Message>)
>>>>>
>>>>> with:
>>>>>
>>>>> traceExit(R, MessageSupplier)
>>>>>
>>>>> which we already have.
>>>>>
>>>>> A test search shows the above as the only instance of "Supplier<?
>>>>> extends Message>" in our Java files.
>>>>>
>>>>> Thoughts?
>>>>>
>>>>> --
>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Matt Sicker <boa...@gmail.com>
>>>>
>>>
>>>
>>>
>>> --
>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>>
>
>
> --
> Matt Sicker <boa...@gmail.com>
>

Reply via email to