Great, lots to play with :) Before I look into writing my own JSNI bridge, I've still been trying to use gwt-exporter, but.....
I've three GWT applications:- (1) Plugin (inherits "Common") (2) Backend (inherits "Common") (3) Common "Plugin" -------- Contains:- ... echoButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { //Debugging statements shown --> shows 'callback' is not null PluginCallback<String> callback = getPluginCallback(); Window.alert("Plugin.onModuleLoad.onClick.callback is " + (callback != null ? "not " : "") + "null"); echo(text.getText(), callback); } }); ... private native void echo(String text, PluginCallback<String> callback) /*-{ //Debugging statements shown --> shows 'callback' is not null alert("Plugin.echo.callback is " + (callback != null ? "not " : "") + "null"); $wnd.com.anstis.pluginserver.CommonService.echo(text, callback); }-*/; "Backend" -------- Contains:- public void onModuleLoad() { //Use gwt-exporter to generate the JSNI for CommonService.class GWT.create(CommonService.class); } CommonService is:- @Export public class CommonService implements Exportable { private static final EchoServiceAsync echoService = GWT.create(EchoService.class); public static void echo(String input, PluginCallback<String> callback) { //Debugging statements shown --> shows 'callback' is null Window.alert("CommonService.echo.callback is " + (callback != null ? "not " : "") + "null"); try { //The guts of the method, invoke a GWT-RPC call --> RTE, as 'callback' is null echoService.echo(input, callback); } catch (Exception e) { e.fillInStackTrace(); e.printStackTrace(System.out); Window.alert(e.getMessage()); } } } "Common" -------- Simply defines PluginCallback, as follows:- public class PluginCallback<T> implements AsyncCallback<T> { public void onFailure(Throwable caught) {} public void onSuccess(T result) {} } My problem is that the PluginCallback instance is proven to be non- null in "Plugin" (both Java and JSNI methods), but is reported as null in "Backends" CommonService. Somewhere it is getting munged, but I only pass a Java Object from "Plugin" to JSNI (echo) to Java (CommonService) so don't understand why it's being nulled?!?! Any ideas (I'll post as a new question if you don't see anything wrong, so it gets seen by a new audience as opposed to those just following this thread). Thanks, Mike On Jun 21, 7:32 pm, lemaiol <lema...@gmail.com> wrote: > Hi Mike, > > > I am growing to believe I need to deploy each plug-in as a separate > > WAR on a web-server. Is this true, or have I missed something? > > In the case of my architecture, it is even a requirement that every > plugin will be deployed as an own WAR file. It allows different teams > working in parallel in completely independent applications (plugins) > which have a common "message data model". When inside the plugins > container, they receive messages with this "common data model". When > out of the plugins container, the show a simplified UI to let the > developer pass a "message" generated by hand and therefore test the > application. > > > I am also using gwt-exporter to make the JSNI messaging mechanism; > > i.e. I just write an "Exportable" class and use the resulting JS API > > from my plugins. I am hoping to use gwt-api-interop to remove the need > > to use the JS API. > > I have seen gwt-exporter but do not know gwt-api-interop. > > > I assume the JS "bridge" between GWT applications handles the > > messaging between them (i.e. plugins register callbacks to handle > > messages sent from the "host"?) > > Yes. > > > If I understand correctly, adding additional script tags to my > > "loader" page and having each plug-in as a separate WAR I avoid the > > need to inherit in my gwt.xml file? > > My common model and plugin base classes live in a common GWT module > that each plugin inherits. > > > An example of your use of JavaScriptObject in your messaging sub- > > system would be interesting.... > > // Application specific common model > public final class CustomerInfo extends ModuleInfo { > protected CustomerInfo() { > } > > public native String getId() /*-{ > return this.id; > }-*/; > > public native void setId(String id) /*-{ > this.id = id; > }-*/; > > } > > // Base class for common models - no functionality as of now > public class ModuleInfo extends JavaScriptObject { > protected ModuleInfo() { > } > > } > > // To be implemented by every module > public interface IModule<T extends ModuleInfo> { > public String getName(); > public void dispatch(String containerId, T moduleInfo); > > } > > // To be implemented by the main module or classes interested in > module lifecycle events > public interface IModuleAware<T extends ModuleInfo> { > public void onModuleAttached(Module<T> module); > > } > > // Durable callback implementation - Because it uses JSNI, can be > inherited from GWT modules but it is interoperable. Avoids using gwt- > exporter > public final class ModuleListener<T extends ModuleInfo> extends > JavaScriptObject { > protected ModuleListener() { > } > > public void onModuleAttached(Module<T> module) { > invokeCallback(getCallback(), module); > } > > private native void invokeCallback(JavaScriptObject callback, > Module<T> module) /*-{ > this.callback(module); > }-*/; > > private native JavaScriptObject getCallback() /*-{ > return this.callback; > }-*/; > > public native void setCallback(JavaScriptObject callback) /*-{ > this.callback = callback; > }-*/; > > } > > // Support for common modules functionality (static methods) > public abstract class ModulesSupport { > public static <T extends ModuleInfo> boolean > registerAsListener(IModuleAware<T> instance) { > ModulesConfig<T> modulesConfig = getModulesConfig(); > boolean result = null != modulesConfig; > if (result) { > modulesConfig.registerListener(createListener(instance)); > } > return result; > } > > public static <T extends ModuleInfo> boolean > registerAsModule(IModule<T> module) { > ModulesConfig modulesConfig = ModulesConfig.get(); > boolean result = null != modulesConfig; > if (result) { > modulesConfig.attach(module.getName(), > createDispatchCallback(module)); > } > return result; > } > > public static <T extends ModuleInfo> ModulesConfig<T> > getModulesConfig() { > return ModulesConfig.get(); > } > > private static <T extends ModuleInfo> ModuleListener<T> > createListener(IModuleAware<T> instance) { > ModuleListener<T> result = > JavaScriptObject.createObject().cast(); > result.setCallback(createListenerCallback(instance)); > return result; > } > > private static native JavaScriptObject > createListenerCallback(IModuleAware instance) /*-{ > return function(module) { > > instan...@org.myexample.modules.client.IModuleAware::onModuleAttached(Lorg/ > myexample/modules/client/Module;)(module); > }; > }-*/; > > private static native JavaScriptObject > createDispatchCallback(IModule instance) /*-{ > return function(containerId, moduleInfo) { > > instan...@org.myexample.modules.client.IModule::dispatch(Ljava/lang/ > String;Lorg/myexample/modules/client/ModuleInfo;)(containerId, > moduleInfo); > }; > }-*/; > > } > > Hope it helps, > Berto -- 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.