Right, so in this case it looks like you’re running a whiteboard, is it possible you would be better off not using the service properties for this filtering? For example:
@Reference(policy=DYNAMIC, cardinality=MULTIPLE) private final List<ZKRenderer> renderers = new CopyOnWriteArrayList<>(); public ZKRenderer getRendererFor(Object o) { return renderers.stream() .filter(r -> r.supports(o)) .collect(Collectors.maxBy((a,b) -> a.getPriority(o).compareTo(b.getPriority(o)))) .orElseThrow(() -> new IllegalArgumentException("No renderer for object " + o)); } Tim > On 24 Aug 2018, at 10:34, Alain Picard <pic...@castortech.com> wrote: > > They represent classes, which is why I would have like to have a Class > annotation so I could do "tester=MyTester.class". instead of > "tester="com.acme.mypkg.MyTester". > > For example I have a number of components implementing a service and as part > of their property they define their "filter conditions" which are then passed > on to the 3rd party library, and there are 2 types of testers, etc: > Component(service=ZKRenderer.class, factory=ZKRenderer.CONFIG_FACTORY, > property= { ZKRenderer.CONFIG_STATIC_TEST + "=c.c.i.tester.ReferenceTree", > ZKRenderer.CONFIG_STATIC_TEST_PRIORITY + ":Integer=9" }) > > If I move my ReferenceTree tester in the above case, no compiler would catch > it and I'm just looking for pain in the future. > > I am not sure I grasp your approach. Here clients just ask for a renderer (an > instance of the service) for some "object" that is passed in and an > appropriate and "highest ranking" one is returned. So the client is never > specifying the class string at all. Here we are providing the full class name > so it can be loaded, hence it would be much more natural to provide a Class > object. > > When we have cases where the component and reference must have to match we do > as such: > public static final String CONFIG_QUALIFIER = > OsgiConstants.SERVICE_QUALIFIER + "=ReferenceList"; //$NON-NLS-1$ > public static final String CONFIG_TARGET = "(" + CONFIG_QUALIFIER + ")"; > //$NON-NLS-1$ //$NON-NLS-2$ > > and here the component use the 1st line in its property and the reference > target uses the 2nd constant and that is not an issue. > > Alain > > > > Alain Picard > Chief Strategy Officer > Castor Technologies Inc > o:514-360-7208 > m:813-787-3424 > > pic...@castortech.com <mailto:pic...@castortech.com> > www.castortech.com <http://www.castortech.com/> > > On Fri, Aug 24, 2018 at 5:16 AM Tim Ward <tim.w...@paremus.com > <mailto:tim.w...@paremus.com>> wrote: > Do these properties “represent” classes or are they actually classes? If they > are just representations (which would be a good thing) then you can define a > static string constant representing the class which is mapped internally to > the correct class name (which can then change over time). Clients then filter > based on the string representation which will not change. > > Tim > > >> On 24 Aug 2018, at 10:07, Alain Picard <pic...@castortech.com >> <mailto:pic...@castortech.com>> wrote: >> >> Tim & all, >> >> My immediate use case is that my components have some properties and some of >> those represent classes (this interfaces with 3rd party libraries, I would >> probably design it differently if I could, but it has to be configuration as >> it is used to determine if the component is a match, much like for target >> filters). Properties in the component annotation are String[] and that >> forces the specification of classes as String which is very bad since if the >> class is moved, renamed, deleted, etc, it will cause no error or warning and >> blow up later on. And since annotations only support compile time constants, >> you can't do a MyClass.class.getName() to even get a String. My idea was >> since the implementation class is part of the component description, if I >> could get a hold of it, to have a static method in the class to provide this >> "constant". >> >> How can I work around the limitations of Properties as String and Java >> compile time constants. Am I stuck to introduce a new separate annotation to >> track this configuration? >> >> Alain >> >> Alain >> >> >> On Thu, Aug 23, 2018 at 5:24 AM Tim Ward <tim.w...@paremus.com >> <mailto:tim.w...@paremus.com>> wrote: >> The properties visible in the Map (or ServiceReference) are the service >> properties. There is some overlap with configuration (services that are >> configurable are encouraged to publish configuration properties as service >> properties) but they are separate, and can be different. >> >> The only way that something becomes a service property is if it is >> deliberately registered as such or, for a few specific properties such as >> service.id <http://service.id/> and service.scope, added automatically by >> the framework. >> >> The class name of the implementation would only be added as a service >> property if done so deliberately, and this is typically discouraged (it >> leaks internal implementation detail and forces your internal naming to >> become API). If you *really* care about the details of a service (and in >> general you shouldn’t) then you should mark it with a service property that >> you can recognise. Ideally one that is separate from the other >> implementation details of the service. >> >> Best Regards, >> >> Tim >> >> > On 22 Aug 2018, at 16:53, Alain Picard via osgi-dev >> > <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote: >> > >> > In a reference method, i can get the property configuration of the service >> > along with the ComponentFactory and some other optional arguments. Can any >> > of those give me a way to retrieve the implementation from the >> > configuration (i.e. the class name of the implementation) ? >> > >> > Thanks >> > Alain >> > >> > _______________________________________________ >> > OSGi Developer Mail List >> > osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >> > https://mail.osgi.org/mailman/listinfo/osgi-dev >> > <https://mail.osgi.org/mailman/listinfo/osgi-dev> >> >
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev