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

Reply via email to