Hi Sam,
Am Donnerstag, den 10.02.2011, 20:03 +0000 schrieb sam lee:
> Hey,
>
> I am using Sling and Felix (Day CQ to be exact).
>
> I am trying to provide my own AdapterFactory so that I can do
> resource.adaptTo(Foo.class);
>
> This is what I have:
>
> @Component(name="...", metatype=false, immediate=true)
> @Service
> public class FooAdapterFactory implements AdapterFactory {
> ...
> @Property(value={Resource.class.getCanonicalName()})
> private static final String ADAPTERS = AdapterFactory.ADAPTER_CLASSES;
> }
>
>
> Obviously, this won't compile because Resource.class.getCanonicalName() is
> not constant expression.
>
>
> Workaround would be using String literal:
> @Property(value={"org.apache.sling.api.resource.Resource"})
> private static final String ADAPTERS = AdapterFactory.ADAPTER_CLASSES;
This is actually wrong because ADAPTER_CLASSES lists the target classes
to adapt the objects to. In addition, instead of introducing unneeded
additional constants, I declare such things on the class level such as:
> @Properties({
> @Property(name = AdapterFactory.ADAPTABLE_CLASSES, value = {
> "org.apache.sling.api.resource.ResourceResolver",
> "org.apache.sling.api.resource.Resource" }),
> @Property(name = AdapterFactory.ADAPTER_CLASSES, value = {
> "javax.jcr.security.AccessControlManager",
> "org.apache.jackrabbit.api.security.JackrabbitAccessControlManager"
> }) })
>
>
>
> Is there other way to register AdapterFactory to Felix?
> @Property annotation does not take Class ....
>
> And I don't want to use string literal.
Currently there is no way to use something like xyz.class. But out of my
belly it sounds like a reasonable extension to support something like
@Property(name = AdapterFactory.ADAPTABLE_CLASSES,
classValue = {
org.apache.sling.api.resource.ResourceResolver.class,
org.apache.sling.api.resource.Resource.class
})
where the class objects will then be converted to their fully qualified
names as is done for the @Service annotation.
Regards
Felix
> Thanks.