Cool thanks. So you said it is coming next week?
On Thu, Jun 16, 2011 at 11:14 AM, Richard S. Hall <[email protected]>wrote: > On 6/16/11 13:57, Mike Veksler wrote: > >> So how will it be addressed? It will convert string into string array? >> Will >> I have to specify list of functions with specific format? >> > > It will accept either a string or a string[]... > > -> richard > > > On Jun 16, 2011 10:54 AM, "Richard S. Hall"<[email protected]> wrote: >> >>> On 6/16/11 13:51, Mike Veksler wrote: >>> >>>> Also, I could just use activator and not use IPOJO for TUI component. >>>> I through I was doing something wrong. >>>> However, looks like we need to raise an issue with IPOJO Annotation to >>>> properly convert string into String array? >>>> >>>> Thanks for the info on the "e" and "type" commands. I did not see them >>>> documented anywhere did you dig in the code to uncover theme? >>>> >>> I just started a release vote for Gogo 0.10.0 which should address this >>> issue in Gogo too, so grab that early next week. >>> >>> -> richard >>> >>> >>>> On Thu, Jun 16, 2011 at 2:13 AM, Derek Baum<[email protected]> >>>> >>> wrote: >> >>> Hmmm this seems to be a limitation of the iPojo @ServiceProperty >>>>> annotation. >>>>> >>>>> You don't actually need the gogo help command to test your example. >>>>> >>>>> another command which will show the existence of your search command is >>>>> 'type': >>>>> >>>>> g! type search >>>>> >>>>> search is Set<Book> book:search(String, String, String, String) >>>>> search is Set<Book> book:search(String, String, String, int, int) >>>>> >>>>> You should be able to invoke it directly: >>>>> >>>>> g! search args ... >>>>> >>>>> Derek >>>>> >>>>> >>>>> >>>>> >>>>> On 16 June 2011 09:58, Mike Veksler<[email protected]> wrote: >>>>> >>>>> I tried registing FUNCTIONS however the annotation expects String >>>>>> value >>>>>> >>>>> and >>>>> >>>>>> not String array. >>>>>> >>>>>> On Thu, Jun 16, 2011 at 1:55 AM, Derek Baum<[email protected]> >>>>>> wrote: >>>>>> >>>>>> This is a bug in the gogo help command. >>>>>>> >>>>>>> Services proving commands can be registered with >>>>>>> @ServiceProperty(name = "osgi.command.function", functions) >>>>>>> >>>>>>> where functions is either String or String[]. >>>>>>> >>>>>>> The gogo help command does not take account of this being a String >>>>>>> >>>>>> rather >>>>> >>>>>> than String[]. >>>>>>> >>>>>>> The quick fix for now is to register FUNCTIONS rather than >>>>>>> >>>>>> FUNCTIONS_STR. >>>>> >>>>>> I'll raise an issue to fix the gogo help command. >>>>>>> >>>>>>> Derek >>>>>>> >>>>>>> >>>>>>> On 16 June 2011 09:46, Mike Veksler<[email protected]> wrote: >>>>>>> >>>>>>> Here is the stack trace: >>>>>>>> g! e >>>>>>>> java.lang.ClassCastException: java.lang.String cannot be cast to >>>>>>>> [Ljava.lang.String; >>>>>>>> at >>>>>>>> >>>>>>> org.apache.felix.gogo.command.Basic.getCommands(Basic.java:384) >>>>>> >>>>>>> at org.apache.felix.gogo.command.Basic.help(Basic.java:211) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) >>>>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >>>>>>>> >>>>>>> Source) >>>>>> >>>>>>> at java.lang.reflect.Method.invoke(Unknown Source) >>>>>>>> at >>>>>>>> org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136) >>>>>>>> at >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82) >> >>> at >>>>>>>> org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:469) >>>>>>>> at >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:395) >> >>> at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) >>>>>>>> at >>>>>>>> >>>>>>> org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183) >>>>>> >>>>>>> at >>>>>>>> >>>>>>> org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120) >>>>>> >>>>>>> at >>>>>>>> >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.jav >> >>> a:89) >>>>>>>> at org.apache.felix.gogo.shell.Console.run(Console.java:62) >>>>>>>> at org.apache.felix.gogo.shell.Shell.console(Shell.java:203) >>>>>>>> at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:128) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) >>>>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >>>>>>>> >>>>>>> Source) >>>>>> >>>>>>> at java.lang.reflect.Method.invoke(Unknown Source) >>>>>>>> at >>>>>>>> org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136) >>>>>>>> at >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82) >> >>> at >>>>>>>> org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:469) >>>>>>>> at >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:395) >> >>> at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) >>>>>>>> at >>>>>>>> >>>>>>> org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183) >>>>>> >>>>>>> at >>>>>>>> >>>>>>> org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120) >>>>>> >>>>>>> at >>>>>>>> >>>>>>>> >>>>>>>> org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.jav >> >>> a:89) >>>>>>>> at >>>>>>>> org.apache.felix.shell.remote.Shell.startGogoShell(Shell.java:108) >>>>>>>> at org.apache.felix.shell.remote.Shell.run(Shell.java:81) >>>>>>>> at java.lang.Thread.run(Unknown Source) >>>>>>>> g! >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Jun 16, 2011 at 1:39 AM, Derek Baum<[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Have you got a stack trace? >>>>>>>>> >>>>>>>>> Type 'e' in gogo after an exception is reported to see the stack >>>>>>>>> >>>>>>>> trace >>>>>> >>>>>>> 'e' is actually a function: >>>>>>>>> g! type e >>>>>>>>> e is function { $exception printStackTrace } >>>>>>>>> >>>>>>>>> which simply invokes the printStackTrace() method on the Exception >>>>>>>>> >>>>>>>> object >>>>>>> >>>>>>>> stored in the gogo exception variable. >>>>>>>>> >>>>>>>>> Derek >>>>>>>>> >>>>>>>>> On 16 June 2011 06:35, Mike Veksler<[email protected]> wrote: >>>>>>>>> >>>>>>>>> I am trying to go through tutorial from OSGI and Apache Felix 3.0 >>>>>>>>>> >>>>>>>>> book >>>>>>> >>>>>>>> and >>>>>>>>> >>>>>>>>>> one of the the examples is to use IPOJO Annotation and Meta.xml. >>>>>>>>>> >>>>>>>>> When >>>>>> >>>>>>> I >>>>>>> >>>>>>>> deploy application to Felix the application runs fine but if i >>>>>>>>>> >>>>>>>>> try >>>>> >>>>>> to >>>>>> >>>>>>> lookup >>>>>>>>>> help iside Felix Gogo shell, I get error: gogo: >>>>>>>>>> >>>>>>>>> ClassCastException: >>>>> >>>>>> java.lang.String cannot be cast to [Ljava.lang.String; >>>>>>>>>> >>>>>>>>>> Here is the code with annotation: >>>>>>>>>> >>>>>>>>>> package com.packtpub.felix.bookshelf.service.tui; >>>>>>>>>> >>>>>>>>>> import com.packtpub.felix.bookshelf.inventory.api.Book; >>>>>>>>>> import >>>>>>>>>> >>>>>>>>>> com.packtpub.felix.bookshelf.inventory.api.BookAlreadyExistsException; >>>>>>> >>>>>>>> import >>>>>>>>>> >>>>>>>>> com.packtpub.felix.bookshelf.inventory.api.BookNotFoundException; >>>>>>>> >>>>>>>>> import >>>>>>>>>> >>>>>>>>> com.packtpub.felix.bookshelf.inventory.api.InvalidBookException; >>>>>>> >>>>>>>> import com.packtpub.felix.bookshelf.service.api.BookshelfService; >>>>>>>>>> import >>>>>>>>>> >>>>>>>>>> com.packtpub.felix.bookshelf.service.api.InvalidCredentialsException; >>>>>> >>>>>>> import >>>>>>>>>> >>>>>>>>> com.packtpub.felix.bookshelf.service.tui.api.BookshelfServiceProxy; >>>>>>>>> >>>>>>>>>> import org.apache.felix.ipojo.annotations.Component; >>>>>>>>>> import org.apache.felix.ipojo.annotations.Provides; >>>>>>>>>> import org.apache.felix.ipojo.annotations.Requires; >>>>>>>>>> import org.apache.felix.ipojo.annotations.ServiceProperty; >>>>>>>>>> import org.apache.felix.service.command.Descriptor; >>>>>>>>>> //import org.osgi.framework.BundleContext; >>>>>>>>>> import org.osgi.framework.ServiceReference; >>>>>>>>>> >>>>>>>>>> import java.util.HashSet; >>>>>>>>>> import java.util.Set; >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> @Component(name = "BookshelfServiceProxy") >>>>>>>>>> @Provides >>>>>>>>>> public class BookshelfServiceProxyImpl implements >>>>>>>>>> >>>>>>>>> BookshelfServiceProxy{ >>>>>>>> >>>>>>>>> public static final String SCOPE = "book"; >>>>>>>>>> >>>>>>>>>> @ServiceProperty(name = "osgi.command.scope", value = SCOPE) >>>>>>>>>> public String gogoScope; >>>>>>>>>> >>>>>>>>>> public static final String[] FUNCTIONS = new String[] { >>>>>>>>>> "add", "search" >>>>>>>>>> }; >>>>>>>>>> >>>>>>>>>> public static final String FUNCTIONS_STR ="search"; >>>>>>>>>> @ServiceProperty(name = "osgi.command.function", value = >>>>>>>>>> >>>>>>>>> FUNCTIONS_STR) >>>>>>>>> >>>>>>>>>> public String gogoFunctions; >>>>>>>>>> >>>>>>>>>> //private BundleContext context; >>>>>>>>>> @Requires >>>>>>>>>> private BookshelfService bookshelf; >>>>>>>>>> >>>>>>>>>> // public BookshelfServiceProxyImpl(BundleContext context){ >>>>>>>>>> // this.context = context; >>>>>>>>>> // } >>>>>>>>>> public BookshelfServiceProxyImpl(){ >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> @Descriptor("Search books by author, title, or category") >>>>>>>>>> public Set<Book> search( >>>>>>>>>> @Descriptor("username") >>>>>>>>>> String username, >>>>>>>>>> @Descriptor("password") >>>>>>>>>> String password, >>>>>>>>>> @Descriptor( >>>>>>>>>> "search on attribute: author, title, or >>>>>>>>>> >>>>>>>>> category" >>>>>> >>>>>>> ) >>>>>>>>>> String attribute, >>>>>>>>>> @Descriptor( >>>>>>>>>> "match like (use % at the beginning or end of >>>>>>>>>> >>>>>>>>> <like>" >>>>>>>> >>>>>>>>> + >>>>>>>>> >>>>>>>>>> " for wild-card)") >>>>>>>>>> String filter) throws InvalidCredentialsException{ >>>>>>>>>> >>>>>>>>>> BookshelfService service = lookupService(); >>>>>>>>>> >>>>>>>>>> String sessionid = >>>>>>>>>> >>>>>>>>> service.login(username,password.toCharArray()); >>>>>>>> >>>>>>>>> Set<String> results; >>>>>>>>>> >>>>>>>>>> if("title".equals(attribute)){ >>>>>>>>>> results = >>>>>>>>>> >>>>>>>>> service.searchBooksByTitle(sessionid,filter); >>>>> >>>>>> } >>>>>>>>>> else if("author".equals(attribute)){ >>>>>>>>>> results = >>>>>>>>>> >>>>>>>>> service.searchBooksByAuthor(sessionid,filter); >>>>> >>>>>> } >>>>>>>>>> else if("category".equals(attribute)){ >>>>>>>>>> results = >>>>>>>>>> >>>>>>>>> service.searchBooksByCategory(sessionid,filter); >>>>>> >>>>>>> } >>>>>>>>>> else{ >>>>>>>>>> throw new RuntimeException( >>>>>>>>>> "Invalid attribute, expecting one of { >>>>>>>>>> >>>>>>>>> 'title', >>>>> >>>>>> " >>>>>> >>>>>>> + >>>>>>> >>>>>>>> "'author', 'category' } got >>>>>>>>>> >>>>>>>>> '"+attribute+"'"); >>>>>>>> >>>>>>>>> } >>>>>>>>>> return getBooks(sessionid,service,results); >>>>>>>>>> >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> @Descriptor("Search books by rating") >>>>>>>>>> public Set<Book> search( >>>>>>>>>> @Descriptor("username") >>>>>>>>>> String username, >>>>>>>>>> @Descriptor("password") >>>>>>>>>> String password, >>>>>>>>>> @Descriptor("search on attribute rating") >>>>>>>>>> String attribute, >>>>>>>>>> @Descriptor("lower rating limit (inclusive)") >>>>>>>>>> int lower, >>>>>>>>>> @Descriptor("upper rating limit (inclusive)") >>>>>>>>>> int upper) throws InvalidCredentialsException { >>>>>>>>>> >>>>>>>>>> if(!"rating".equals(attribute)){ >>>>>>>>>> throw new RuntimeException( >>>>>>>>>> "Invalid attribute, expecting 'rating' got '"+ >>>>>>>>>> attribute+"'"); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> BookshelfService service = lookupService(); >>>>>>>>>> String sessionid = >>>>>>>>>> >>>>>>>>> service.login(username,password.toCharArray()); >>>>>>>> >>>>>>>>> Set<String> results = >>>>>>>>>> service.searchBooksByRating(sessionid,lower,upper); >>>>>>>>>> return getBooks(sessionid,service,results); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> @Descriptor("Add book to the inventory") >>>>>>>>>> public String add( >>>>>>>>>> @Descriptor("username") String username, >>>>>>>>>> @Descriptor("password") String password, >>>>>>>>>> @Descriptor("ISBN") String isbn, >>>>>>>>>> @Descriptor("Title") String title, >>>>>>>>>> @Descriptor("Author") String author, >>>>>>>>>> @Descriptor("Category") String category, >>>>>>>>>> @Descriptor("Rating (0..10)") int rating) >>>>>>>>>> throws InvalidCredentialsException, >>>>>>>>>> BookAlreadyExistsException, >>>>>>>>>> InvalidBookException{ >>>>>>>>>> BookshelfService service = lookupService(); >>>>>>>>>> String sessionId = >>>>>>>>>> >>>>>>>>> service.login(username,password.toCharArray()); >>>>>>>> >>>>>>> service.addBook(sessionId,isbn,title,author,category,rating); >>>>>> >>>>>>> return isbn; >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> private BookshelfService lookupService(){ >>>>>>>>>> // ServiceReference reference = >>>>>>>>>> >>>>>>>>> context.getServiceReference( >>>>> >>>>>> // BookshelfService.class.getName()); >>>>>>>>>> // if(reference==null){ >>>>>>>>>> // throw new RuntimeException("BookshelfService not >>>>>>>>>> registered,cannot invoke "+ >>>>>>>>>> // "operation"); >>>>>>>>>> // } >>>>>>>>>> // BookshelfService service = (BookshelfService) >>>>>>>>>> this.context.getService(reference); >>>>>>>>>> // if(service==null){ >>>>>>>>>> // throw new RuntimeException( >>>>>>>>>> // "BookshelfService not registered, cannot >>>>>>>>>> >>>>>>>>> invoke >>>>>> >>>>>>> "+ >>>>>>>> >>>>>>>>> // "operation"); >>>>>>>>>> // } >>>>>>>>>> // return service; >>>>>>>>>> return this.bookshelf; >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> private Set<Book> getBooks( >>>>>>>>>> String sessionid, BookshelfService service, >>>>>>>>>> Set<String> results) { >>>>>>>>>> Set<Book> books = new HashSet<Book>(); >>>>>>>>>> for(String isbn: results){ >>>>>>>>>> Book book; >>>>>>>>>> try{ >>>>>>>>>> book = service.getBook(sessionid,isbn); >>>>>>>>>> books.add(book); >>>>>>>>>> } catch (BookNotFoundException e) { >>>>>>>>>> System.out.println("ISBN "+ isbn + >>>>>>>>>> " referenced but not found"); >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> return books; >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Here is meta.xml: >>>>>>>>>> >>>>>>>>>> <?xml version="1.0" encoding="UTF-8"?> >>>>>>>>>> <ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>>>>>>>> xsi:schemaLocation="org.apache.felix.ipojo >>>>>>>>>> http://felix.apache.org/ipojo/schemas/CURRENT/core.xsd" >>>>>>>>>> xmlns="org.apache.felix.ipojo"> >>>>>>>>>> >>>>>>>>>> <instance component="BookshelfServiceProxy" >>>>>>>>>> name="bookshelf.service.tui"/> >>>>>>>>>> </ipojo> >>>>>>>>>> >>>>>>>>>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [email protected] >>> For additional commands, e-mail: [email protected] >>> >>> > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >

