On 6/16/11 14:46, Mike Veksler wrote:
Cool thanks.
So you said it is coming next week?
If all goes well with the vote, yes. I will shoot for Tues...
-> richard
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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]