Just to clarify, when I say it does not work, I mean that the injected service is not the correct one matching the filter expression.
Best regards, Alex soto > On Mar 12, 2020, at 9:24 AM, Jean-Baptiste Onofre <[email protected]> wrote: > > Hi, > > Let me check, but AFAIR, I have a test about that and it seems to work. > > I will create a Jira to double check. > > Regards > JB > >> Le 12 mars 2020 à 14:23, Alex Soto <[email protected] >> <mailto:[email protected]>> a écrit : >> >> I see, but it is not working for me… >> >> The PR does not update >> org.apache.karaf.shell.impl.action.command.ManagerImpl#instantiate, >> shouldn’t this method be updated also to inject the appropriate service when >> the command is instantiated? (See code fragment I pasted earlier) >> >> >> Best regards, >> Alex soto >> >> >> >> >>> On Mar 12, 2020, at 9:07 AM, Jean-Baptiste Onofre <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> Hi Alex, >>> >>> You can find the change I did about that here: >>> >>> https://github.com/apache/karaf/pull/992 >>> <https://github.com/apache/karaf/pull/992> >>> >>> Regards >>> JB >>> >>>> Le 12 mars 2020 à 14:02, Alex Soto <[email protected] >>>> <mailto:[email protected]>> a écrit : >>>> >>>> Thanks, JB >>>> >>>> But it doesn’t seem to work for Karaf 4.2.8. >>>> I am not familiar with the internals of Karaf code, but I spotted the >>>> following in >>>> org.apache.karaf.shell.impl.action.command.ManagerImpl.instantiate of >>>> org.apache.karaf.shell.core-4.2.8.jar: >>>> >>>> Reference ref = field.getAnnotation(Reference.class); >>>> if (ref != null) { >>>> GenericType type = new >>>> GenericType(field.getGenericType()); >>>> Object value; >>>> if (type.getRawClass() == List.class) { >>>> Set<Object> set = new HashSet<>(); >>>> >>>> set.addAll(registry.getServices(type.getActualTypeArgument(0).getRawClass())); >>>> if (registry != this.dependencies) { >>>> >>>> set.addAll(this.dependencies.getServices(type.getActualTypeArgument(0).getRawClass())); >>>> } >>>> value = new ArrayList<>(set); >>>> } else { >>>> value = registry.getService(type.getRawClass()); >>>> if (value == null && registry != >>>> this.dependencies) { >>>> value = >>>> this.dependencies.getService(type.getRawClass()); >>>> } >>>> } >>>> if (!allowCustomServices && value == null && >>>> !ref.optional()) { >>>> throw new IllegalStateException("No service >>>> matching " + field.getType().getName()); >>>> } >>>> field.setAccessible(true); >>>> field.set(instance, value); >>>> } >>>> >>>> Maybe this is not the relevant piece of code, but I do not see that the >>>> filter attribute is being used to look up the service. >>>> >>>> >>>> Best regards, >>>> Alex soto >>>> >>>> >>>> >>>> >>>>> On Mar 12, 2020, at 12:50 AM, Jean-Baptiste Onofre <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>>> Hi, >>>>> >>>>> Yes, it’s to "select" the service you want to use. >>>>> >>>>> I did the change because previously it wasn’t possible to select, meaning >>>>> that if you had several services (with the same interface) available, it >>>>> took the first one. >>>>> >>>>> Now, you can specify the LDIF filter to select the exact service you want >>>>> to inject. >>>>> >>>>> Regards >>>>> JB >>>>> >>>>>> Le 11 mars 2020 à 20:03, Alex Soto <[email protected] >>>>>> <mailto:[email protected]>> a écrit : >>>>>> >>>>>> Is the filter attribute in annotation >>>>>> org.apache.karaf.shell.api.action.lifecycle.Reference used to filter the >>>>>> injected service on Service attributes? >>>>>> >>>>>> Best regards, >>>>>> Alex soto >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >
