I just want to extend Foo and FooFactory so that Bar (which extends Foo)
will be supplied in some cases..
Simple concept.. hard to do in Sling, I guess.


On Mon, Dec 17, 2012 at 1:22 PM, Ryan Lunka <[email protected]> wrote:

> I see a couple things going on here…
>
> First, I think the reason you are going to see an infinite recursion
> situation is because you haven't defined HOW Resource will adapt to Foo.
>  All the AdapterFactory should do is take an Object and a class and create
> a new Object of that Class FROM the adaptable Object you passed in.  That
> means you need to have a way to create a Foo out of a Resource, if you want
> to adapt the latter to the former.  The simplest example is by adding a Foo
> constructor that takes Resource (i.e. "return (AdapterType) new
> Foo(adaptable)" where adaptable is a Resource).  If you cannot change the
> Foo class, there are probably a variety of other ways to handle it.
>
> Second, the "if some condition" logic to occasionally return Bar does not
> belong in this AdapterFactory.  The AdapterFactory should probably only be
> responsible for converting one Object to a certain Class.  Logic
> determining WHAT that Class should be, belongs elsewhere, in whatever code
> is calling the adaptTo() function.  What you'll probably want to implement
> as an AdapterFactory that can adapt Resource to both Foo or Bar, depending
> on what class gets called in.  Then your "if some condition" logic should
> call resource.adaptTo() passing in either of those classes.
>
> Third, the service may not be registered, and that's why it's not getting
> called on resource.adaptTo().  Try using
> @Server(value=AdapterFactory.class).
>
> Hope this helps.  Adaptables are not very clearly documented (in my
> opinion), so I'm curious if anyone else has feedback as well.  It helped me
> quite a bit to look at some of the Adaptable and AdatperFactory
> implementations in the Sling code base.
>
> --
>
> Ryan D. Lunka
>
>
>
>
>
> On Dec 17, 2012, at 1:06 PM, Sam Lee <[email protected]> wrote:
>
> > Hey,
> >
> > Given
> > public class Bar implements Foo {
> > ...
> > }
> >
> >
> > I want to provide AdapterFactory that returns Bar instance when
> > resource.adaptTo(Foo.class)  is called.
> >
> >
> > Here is my attempt:
> > =>8=
> > @Component(metatype = false, immediate = true)
> > @Service
> > @Properties({
> >    @Property(name = SlingConstants.PROPERTY_ADAPTABLE_CLASSES, value =
> > {"org.apache.sling.api.resource.Resource"}),
> >    @Property(name = SlingConstants.PROPERTY_ADAPTER_CLASSES, value =
> > {"com.example.Foo"}),
> >    @Property(name = "service.ranking", intValue = -1)//this doesn't seem
> > to be observed
> > })
> > public class MyAdaptToFoo implements AdapterFactory {
> >    @Override
> >    public <AdapterType> AdapterType getAdapter(Object adaptable,
> > Class<AdapterType> type) {
> >        final Resource resource = (Resource) adaptable;
> >        final Foo foo = resource.adaptTo(Foo.class);//I don't want
> infinite
> > recursion here.
> >        if (someCondition) {
> >            final Bar bar = new Bar(foo);
> >            return (AdapterType) bar;
> >        }
> >        return (AdapterType) foo;
> >    }
> >
> > }
> > =>8=
> >
> > first of all, that adapter factory doesn't get called  when
> > resource.adaptTo(Foo.class); is called..
> > Even if MyAdaptToFoo gets called, I don't want infinite recursion when
> its
> > .getAdapter() calls resource.adaptTo(Foo.class).
> >
> > The reason why I'm doing this is because I have a massive code base that
> > uses resource.adaptTo(Foo.class).. and I need to augment Foo (with Bar)
> in
> > some cases.
> >
> > Is this possible?
>
>

Reply via email to