Looking for confirmation or insight in how best to specify components and
references, so that the same component can be invoked directly or more
generically through its interface.

Let's say that I have some components, 1 per table to do some export
function:

@Component(
        property= MappingConstants.CONFIG_TABLE_NAME + "=BigTable",
        service= { BigTableXlExporter.class, XlExportContent.class }
)
public final class BigTableXlExporter implements XlExportContent {...}

and in another component I can get a specific reference with:
@Component(service=SomeComp.class)
public final class SomeComp
    @Reference
    private BigTableXlExporter exporter;
    ...
}

and in another case i could get a more generic invocation (as part of
config or through a factory:
@Component(service=GenericComp.class)
public final class GenericComp
   @Activate
   private void init(Map<String,Object> props, BundleContext bcontext) {
     ServiceReference servRef;
      try {
         Collection<ServiceReference<T>> servRefs =
bcontext.getServiceReferences(target, props.get("filter"));  //filter to be
like: "(target
        servRef = servRefs.isEmpty() ? null : servRefs.iterator().next();
        }
        catch (InvalidSyntaxException e) {
            throw new IllegalArgumentException("Invalid Filter Syntax
Exception", e);
        }

        //do something with ref....
   }
}

Does this make sense or are there better ways to do this.

Alain
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to