Hello all, Have you tried to use an LDAP filter expression? Instead of *color=red* try *(color=red). *(I haven't tried this myself)
João Assunção Email: joao.assun...@exploitsys.com Mobile: +351 916968984 Phone: +351 211933149 Web: www.exploitsys.com On Mon, Jul 13, 2020 at 6:33 PM Paul Spencerx <p...@intekon.com> wrote: > 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 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >> > > > >