JB, What is the status of your checking? @Reference for commands is not working for me either. I have included related code and output from Karaf below.
*** * Testing commands *** karaf@root()> color --help SUBSHELL color COMMANDS color:get-any Get any Service color:get-blue Get Blue Service color:get-green Get Green Service color:get-red Get Red Service karaf@root()> color:get-red Color = BLUE karaf@root()> color:get-red Color = BLUE karaf@root()> color:get-red Color = BLUE karaf@root()> color:get-any Color = BLUE karaf@root()> color:get-green Color = BLUE karaf@root()> *** * Available Color Services *** karaf@root()> services -p 165 Karaf Service sandbox (165) provides: ------------------------------------- color = blue component.id = 9 component.name = com.example.service.internal.BlueColorService objectClass = [com.example.service.ColorService] service.bundleid = 165 service.id = 193 service.scope = bundle ---- color = green component.id = 10 component.name = com.example.service.internal.GreenColorService objectClass = [com.example.service.ColorService] service.bundleid = 165 service.id = 194 service.scope = bundle ---- color = red component.id = 11 component.name = com.example.service.internal.RedColorService objectClass = [com.example.service.ColorService] service.bundleid = 165 service.id = 195 service.scope = bundle karaf@root()> *** * Example command source code *** package com.example.command.internal; import org.apache.karaf.shell.api.action.Action; import org.apache.karaf.shell.api.action.Command; import org.apache.karaf.shell.api.action.lifecycle.Reference; import org.apache.karaf.shell.api.action.lifecycle.Service; import com.example.service.ColorService; @Service @Command(scope = "color", name = "get-red", description = "Get Red Service") public class DisplayRedServiceCommand implements Action { @Reference(filter = "color=red") private ColorService colorService; @Override public Object execute() throws Exception { System.out.println("Color = " + colorService.getColor()); return null; } } *** * Example Service source code *** package com.example.service.internal; import org.osgi.service.component.annotations.Component; import com.example.service.ColorService; @Component(immediate = true, property = "color=red") public class RedColorService implements ColorService { @Override public String getColor() { return "RED"; } } Paul Spencer > On Mar 12, 2020, at 9:41 AM, Alex Soto <alex.s...@envieta.com> wrote: > > 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 <j...@nanthrax.net> 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 <alex.s...@envieta.com> 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 <j...@nanthrax.net> >>>> wrote: >>>> >>>> Hi Alex, >>>> >>>> You can find the change I did about that here: >>>> >>>> https://github.com/apache/karaf/pull/992 >>>> >>>> Regards >>>> JB >>>> >>>>> Le 12 mars 2020 à 14:02, Alex Soto <alex.s...@envieta.com> 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 <j...@nanthrax.net> >>>>>> 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 <alex.s...@envieta.com> 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 >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >