Hi Sam, Am Freitag, den 11.02.2011, 12:21 +0000 schrieb sam lee: > Thanks Felix. > I noticed the typo (ADAPTER_CLASSES). > Indeed, @Property annotation taking Class object would be nicer.
I created an improvement issue in the Felix project for this: https://issues.apache.org/jira/browse/FELIX-2838 > > I was using these as examples: > http://svn.apache.org/repos/asf/sling/whiteboard/fmeschbe/adapterfactory/src/main/java/org/apache/sling/jcr/jackrabbit/adapterfactory/ Cool ;-) Regards Felix > > <http://svn.apache.org/repos/asf/sling/whiteboard/fmeschbe/adapterfactory/src/main/java/org/apache/sling/jcr/jackrabbit/adapterfactory/> > On Fri, Feb 11, 2011 at 4:24 AM, Felix Meschberger <[email protected]>wrote: > > > 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. > > > > > >
