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> > > > > > >

