Yes, I tried to replace FUNCTIONS_STR ="search" with FUNCTIONS_STR ="[search]" and still same problem.
On Thu, Jun 16, 2011 at 12:58 AM, Per-Erik Svensson < [email protected]> wrote: > Somewhere someone is trying to cast a String to a String[]? Don't know the > API at all but looks like gogoFunctions and/or FUNCTIONS might be > culprits?? > > Regards, > > Per-Erik Svensson > > On Thu, Jun 16, 2011 at 7:35 AM, 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> > > >

