=============== Context information =============== In order to handle server "push" events, I am using a pattern described and used in multiple places: a getEvents() RPC method waits for up to 30 seconds but returns as soon as an event is received.
The issue is that this pattern eats a browser connection, so that if two GWT modules (loaded on a given page) do register to server events, the 2 allowed connections are wasted. Hence my desire to have a central events receiver/router in the browser and possibly several GWT modules listening to that router. =============== In the router: =============== public class ServerEventsRouter { .... public static void addServerEventsListener( ServerEventListener listener ) { // register the listener in a collection... } ... private static native void createRegisteringFunction() /*-{ $wnd.addServerEventsListener = @com.foo.gwt.ServerEventsRouter::addServerEventsListener(Lcom/foo/gwt/ events/ServerEventListener;); }-*/; ... } The createRegisteringFunction() needs to be called first somehow... ======================= And then, in the client listener: ======================= private native void registerServerEventsListener ( ServerEventListener listener )/*-{ $wnd.addServerEventsListener ( listener ); }-*/; and registerServerEventsListener( new ServerEventListener() { public void onServerEvent( ServerEvent event ) { GWT.log( "Received event", null ); }); =============== The Issue(s) =============== However, as you might expect, this doesn't work. Well, it works for 'hello world' type of functions which not not require parameters... but the ServerEventListener parameter is not "marshalled" properly. A. In WEB mode The ServerEventListener interface is not implemented by any class in the router module, so that the dispatching function is optimized from: for ( ServerEvent event : events ) { for ( ServerEventListener listener : listeners ) { listener.onServerEvent( event ); } } into something like: for (event$iterator = events.iterator(); event$iterator.hasNext ();) { dynamicCast(event$iterator.next_0(), 11); for (listener$iterator = $AbstractList$IteratorImpl(new AbstractList$IteratorImpl(), this$static.m_listeners); listener $iterator.i < listener$iterator.this$0.size_0();) { throwClassCastExceptionUnlessNull($next_1(listener $iterator)); null.nullMethod(); } } B. In HOSTED mode Presumably in order to match the behaviour of the WEB mode, the classes in the two modules are loaded from two different class loaders, so that the implementations of the ServerEventListener are not seen as such in the router module and any assignment generates a class cast exception. =============== My proposal =============== Instruct the compiler not to optimize out sub-classes of a specified type (here ServerEventListener), and have these classes loaded from a common upstream (i.e. "more global") class loader in Hosted Mode. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to Google-Web-Toolkit@googlegroups.com To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---