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