I just fix it in the code ;-). Those exceptions should only happen during 
runtime (due to some false assumptions).
For the same reasons methods do throw IllegalArgumentExceptions in case a given 
parameter is null 
(http://stackoverflow.com/questions/5172948/should-we-always-check-each-parameter-of-method-in-java-for-null-in-the-first-li).
 This is mainly for the developer, but makes the life much easier as with that 
information it is obvious how to fix :-)
Konrad

On 01 Jul 2014, at 12:14, Carsten Ziegeler <cziege...@apache.org> wrote:

> So if your adapter is buggy and you get an exception, what do you do with
> it?
> 
> Carsten
> 
> 
> 2014-07-01 12:08 GMT+02:00 Jeff Young <j...@adobe.com>:
> 
>> Hi Carsten,
>> 
>> Sure, but Konrad has a point in that I think sometimes the client *does*
>> care why the adaption failed.  For instance, if it had to do with
>> something entirely different from whether or not adaption would normally
>> work.
>> 
>> Let's say that I have a resource that should adapt to XYZ, but that my
>> adapter is currently buggy.  I'd like to get an exception for that, but
>> said exception is going to get eaten.
>> 
>> I do agree that if I have a resource that should NOT adapt to XYZ, that
>> getting back null is fine, and that I don't care why the adaption failed.
>> 
>> Cheers,
>> Jeff.
>> 
>> 
>> On 01/07/2014 10:19, "Carsten Ziegeler" <cziege...@apache.org> wrote:
>> 
>>> Sure :) For the adapter pattern, the client does not care why the adaption
>>> failed, the client is just interested in the result (success or not)
>>> Validation is a different beast, if validation fails you want to know
>>> specific reasons why it failed - and this can be multiple.
>>> I tried to explain in my first mail on this thread, that all other use
>>> cases mentioned can be handled with the current implementation - with the
>>> exception of validation. But I think validation requires a different
>>> concept than the adapter pattern.
>>> 
>>> Carsten
>>> 
>>> 
>>> 2014-07-01 11:09 GMT+02:00 Jeff Young <j...@adobe.com>:
>>> 
>>>> Hi Carsten,
>>>> 
>>>> Can you say more?  (I'm not sure I understand what you're getting
>>>> at....)
>>>> 
>>>> Thanks,
>>>> Jeff.
>>>> 
>>>> 
>>>> On 01/07/2014 09:56, "Carsten Ziegeler" <cziege...@apache.org> wrote:
>>>> 
>>>>> adaption and validation are different concerns
>>>>> 
>>>>> Carsten
>>>>> 
>>>>> 
>>>>> 2014-07-01 10:55 GMT+02:00 Jeff Young <j...@adobe.com>:
>>>>> 
>>>>>> We could solve that by defining a specific exception for
>>>>>> adaptation-not-possible and then catch only that.
>>>>>> 
>>>>>> Of course that would leak tons of exceptions from code written before
>>>>>> that
>>>>>> exception became available.  Maybe do the catching based on some
>>>> sort of
>>>>>> version clue?
>>>>>> 
>>>>>> Cheers,
>>>>>> Jeff.
>>>>>> 
>>>>>> 
>>>>>> On 01/07/2014 09:40, "Konrad Windszus" <konra...@gmx.de> wrote:
>>>>>> 
>>>>>>> It is not (only) about throwing exceptions in case no suitable
>>>> adapter
>>>>>> is
>>>>>>> available. It rather is about the fact, that today the adaptTo is a
>>>>>>> barrier for all kinds of exceptions. In some cases the adaptation
>>>> fails
>>>>>>> for a specific reason (one example is Sling Models where injection
>>>>>> fails,
>>>>>>> another one is the issue mentioned in
>>>>>>> https://issues.apache.org/jira/browse/SLING-2712 (ValueMap not
>>>>>> supporting
>>>>>>> primitives)). Both would be valid use cases where the client would
>>>> be
>>>>>>> interested to catch the exception here.
>>>>>>> 
>>>>>>> On 01 Jul 2014, at 10:34, Carsten Ziegeler <cziege...@apache.org>
>>>>>> wrote:
>>>>>>> 
>>>>>>>> Adding a new interface would require us to implement it all over
>>>> the
>>>>>>>> place
>>>>>>>> and as Felix points out, client code would always need to check
>>>>>> whether
>>>>>>>> the
>>>>>>>> new interface is implemented or not Having to methods, like
>>>>>> hasAdapter
>>>>>>>> and
>>>>>>>> adaptOrThrow does not work very well as between the two calls
>>>> things
>>>>>>>> might
>>>>>>>> have changed already: while hasAdapter returns true, the
>>>> underlying
>>>>>>>> factory
>>>>>>>> gets unregistered before adaptOrThrow is called.
>>>>>>>> In many use cases, the current pattern works fine - the client
>>>> does
>>>>>> not
>>>>>>>> care whether an exception is thrown within the adaption - it just
>>>>>> cares
>>>>>>>> whether an object is returned or not. And there are valid use
>>>> cases,
>>>>>>>> where
>>>>>>>> client code does different things whether the adaption works or
>>>> not
>>>>>>>> (e.g.
>>>>>>>> the post servlet checks for adaptTo(Node) and then does additional
>>>>>>>> things
>>>>>>>> if the resource is backed up by a node.)
>>>>>>>> 
>>>>>>>> I see the point that there are also use cases where it would be
>>>> fine
>>>>>> to
>>>>>>>> simpy throw an exception if adaptTo is not successful. This would
>>>>>> make
>>>>>>>> the
>>>>>>>> client code easier. However as this most properly is a runtime
>>>>>>>> exception,
>>>>>>>> client code can today just call a method on the object and end up
>>>>>> with a
>>>>>>>> NPE - having the same result :)
>>>>>>>> 
>>>>>>>> This leaves us with use cases where the client code explicitely
>>>>>> wants to
>>>>>>>> catch the exception and then do something depending on the
>>>> exception.
>>>>>>>> Maybe
>>>>>>>> we should just add something for this explicit use case instead of
>>>>>>>> bloating
>>>>>>>> the general adaptTo mechanism?
>>>>>>>> 
>>>>>>>> Regards
>>>>>>>> Carsten
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 2014-07-01 9:44 GMT+02:00 Konrad Windszus <konra...@gmx.de>:
>>>>>>>> 
>>>>>>>>> Regarding 1) Having such a Result class would mean that all
>>>> consumer
>>>>>>>>> would
>>>>>>>>> need to unwrap the exception first. So instead of being forced of
>>>>>>>>> implementing a null-check (as with the old solution) one would
>>>> need
>>>>>> to
>>>>>>>>> implement another check. I want to prevent such a burden to the
>>>>>>>>> consumers.
>>>>>>>>> Regarding 2) Since the client code knows on which object the
>>>>>>>>> adaptToOrThrow is called I don¹t get why an instanceof check is
>>>>>>>>> necessary.
>>>>>>>>> Whether this object implements Adaptable2 is known at
>>>> compile-time,
>>>>>> so
>>>>>>>>> you
>>>>>>>>> do have the full IDE-support here.
>>>>>>>>> Regarding 3) In that case I would no longer allow a null value
>>>> to be
>>>>>>>>> returned. One drawback is, that all the null checks are no longer
>>>>>>>>> effective.
>>>>>>>>> 
>>>>>>>>> IMHO solution 2) is the best. At the same time I would deprecate
>>>> the
>>>>>>>>> old
>>>>>>>>> Adaptable, because I cannot come up with a real use-case where
>>>>>>>>> returning
>>>>>>>>> has an advantage. I would rather implement another method boolean
>>>>>>>>> hasAdapter(Class<AdapterType> type) on the Adaptable2 interface.
>>>>>>>>> Regards,
>>>>>>>>> Konrad
>>>>>>>>> 
>>>>>>>>> On 01 Jul 2014, at 09:07, Felix Meschberger <fmesc...@adobe.com>
>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Hi
>>>>>>>>>> 
>>>>>>>>>> There currently are two issues floating around dealing with the
>>>>>>>>>> question
>>>>>>>>> of returning more information than just null from the
>>>>>>>>> Adaptable.adaptTo(Class) method:
>>>>>>>>> https://issues.apache.org/jira/browse/SLING-3714 and
>>>>>>>>> https://issues.apache.org/jira/browse/SLING-3709. I think these
>>>>>>>>> requests
>>>>>>>>> warrant some discussion on the list.
>>>>>>>>>> 
>>>>>>>>>> Background: adaptTo can be implemented by Adaptable
>>>> implementations
>>>>>>>>> themselves or, by extending from SlingAdaptable, they may defer
>>>> to
>>>>>> an
>>>>>>>>> AdapterMananager. AdapterManager itself is extended by
>>>>>> AdapterFactory
>>>>>>>>> services. All these interfaces define an adaptTo method. All
>>>> these
>>>>>>>>> methods
>>>>>>>>> return null if adaption is not possible and don't declare or
>>>>>> document
>>>>>>>>> to
>>>>>>>>> throw an exception.
>>>>>>>>>> 
>>>>>>>>>> While not explicitly documented as such, the intention is and
>>>> was
>>>>>> that
>>>>>>>>> adaptTo never throws on the grounds that adaption may fail which
>>>> is
>>>>>>>>> considered a valid result and thus exceptions are not to be
>>>> expected
>>>>>>>>> and
>>>>>>>>> handled.
>>>>>>>>>> 
>>>>>>>>>> Hence all implementations of the methods generally
>>>>>>>>> catch-and-log-but-don't-throw. Interestingly
>>>> SlingAdaptable.adaptTo
>>>>>> and
>>>>>>>>> AdapterManagerImpl.getAdapter don't catch ‹ so any
>>>> RuntimeException
>>>>>>>>> thrown
>>>>>>>>> from an AdapterFactory would be forwarded.
>>>>>>>>>> 
>>>>>>>>>> Having said this there are options available:
>>>>>>>>>> 
>>>>>>>>>> (1) Add support for a new Result<?> class. We would probably
>>>>>> implement
>>>>>>>>> this in the AdapterManager.getAdapter implementation explicitly
>>>>>>>>> handling
>>>>>>>>> this case because it would entail catching the adaptTo/getAdapter
>>>>>>>>> calls to
>>>>>>>>> get the exception (the Result.getError should return Throwable
>>>>>>>>> probably not
>>>>>>>>> Error)
>>>>>>>>>> 
>>>>>>>>>> Use would be limited to new AdapterFactory implementations
>>>> throwing
>>>>>>>>> RuntimeExcpetion. For Sling Models this would be the case.
>>>>>>>>>> 
>>>>>>>>>> (2) Add a new adaptToOrThrow method, which is declared to throw
>>>> a
>>>>>>>>> RuntimeException and never return null: Either it can adapt or it
>>>>>>>>> throws.
>>>>>>>>> This would require a new interface Adaptable2 (probably) to not
>>>>>> break
>>>>>>>>> existing Adaptable implementations. The SlingAdaptable base class
>>>>>> would
>>>>>>>>> implement the new method of course, probably something like this:
>>>>>>>>>> 
>>>>>>>>>>> SlingAdaptable implements Adaptable2 {
>>>>>>>>>>> Š
>>>>>>>>>>> public <AdapterType> AdapterType
>>>> adaptToOrThrow(Class<AdapterType>
>>>>>>>>> type) {
>>>>>>>>>>>    AdapterType result = this.adaptTo(type);
>>>>>>>>>>>    if (result != null) {
>>>>>>>>>>>        return result;
>>>>>>>>>>>    }
>>>>>>>>>>>    throw new CannotAdaptException(Š);
>>>>>>>>>>> }
>>>>>>>>>>> }
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Use is problematic because you would have to know whether you
>>>> can
>>>>>> call
>>>>>>>>> the new method: So instead of an null check you now have an
>>>>>> instanceof
>>>>>>>>> check Š Except for the Resource interface which would be
>>>> extended to
>>>>>>>>> extend
>>>>>>>>> from Adaptable2 as well.
>>>>>>>>>> 
>>>>>>>>>> (3) Document, that Adaptable.adaptTo may throw a
>>>> RuntimeException.
>>>>>>>>>> 
>>>>>>>>>> The problem here is, that this may conceptually break existing
>>>>>> callers
>>>>>>>>> of Adaptable.adaptTo which don't expect an exception at all ‹
>>>>>>>>> presumably
>>>>>>>>> this is a minor nuisance because technically a RuntimeException
>>>> may
>>>>>>>>> always
>>>>>>>>> be thrown.
>>>>>>>>>> 
>>>>>>>>>> Regards
>>>>>>>>>> Felix
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> --
>>>>>>>> Carsten Ziegeler
>>>>>>>> Adobe Research Switzerland
>>>>>>>> cziege...@apache.org
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> Carsten Ziegeler
>>>>> Adobe Research Switzerland
>>>>> cziege...@apache.org
>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> Carsten Ziegeler
>>> Adobe Research Switzerland
>>> cziege...@apache.org
>> 
>> 
> 
> 
> -- 
> Carsten Ziegeler
> Adobe Research Switzerland
> cziege...@apache.org

Reply via email to