Hello,
at the moment I'm playing around a bit with GWT.create and
the generate-with-directive in the GWT.xml-file to be able
to generate classes used for deferred bindings. I have the
following directive in my XML-file:
<generate-with class="mypackage.rebind.AboutDataGenerator">
<when-type-assignable class="mypackage.data.AboutData"/>
</generate-with>
The generate-method in AboutDataGenerator is here:
public String generate(TreeLogger logger, GeneratorContext context, String
typeName) throws UnableToCompleteException {
logger.log(TreeLogger.INFO, "Creating AboutData-class with
build-informations", null);
TypeOracle oracle = context.getTypeOracle();
JClassType requestedClass = oracle.findType(typeName);
String packageName = requestedClass.getPackage().getName();
String simpleName = requestedClass.getSimpleSourceName();
String proxyName = simpleName + "Proxy";
String proxyClassname = packageName + "." + proxyName;
PrintWriter pw = context.tryCreate(logger, packageName, proxyName);
ClassSourceFileComposerFactory factory = new
ClassSourceFileComposerFactory(packageName, proxyName);
factory.setSuperclass(simpleName);
factory.addImport("java.util.Date");
SourceWriter source = factory.createSourceWriter(context, pw);
source.println("public " + proxyName + "(){");
source.indent();
source.println("buildDate = new Date(" +
Long.toString(System.currentTimeMillis()) + "L);");
source.println("isBuiltVersion = \"" + escape(Version.getImplVersion()) +
"\";");
source.println("isSvnRevision = " + Integer.toString(Version.REVISION) + ";");
source.outdent();
source.println("}");
source.commit(logger);
return proxyClassname;
}
The whole thing works in hosted mode, i.e. my About-Dialog happily
shows the build-date and version of the server the build was created
with. The problem starts, wenn I create another dialog leading to a
new call of GWT.create(AboutData.class). Instead of using the already
created class, a new attempt of creation is done leading to the
return of null when trying to get the PrintWriter. This lead to
a NullPointerException when doing the creation of the SourceFactory.
I tried to check if the proxy-class already exist with inserting
try{
Class.forName(proxyClassname);
return proxyClassname;
}
catch(ClassNotFoundException cnfe){
// nothing to do
}
before creating the PrintWriter but the class is not known and
the creation-process starts again leading to the same exception.
Here is the exception I get in that case:
[ERROR] Uncaught exception escaped
java.lang.RuntimeException: Deferred binding failed for
'mypackage.data.AboutData' (did you forget to inherit a required module?)
at
com.google.gwt.dev.shell.JavaScriptHost.rebindAndCreate(JavaScriptHost.java:157)
at com.google.gwt.dev.shell.ShellGWT.create(ShellGWT.java:24)
at com.google.gwt.core.client.GWT.create(transient source for
com.google.gwt.core.client.GWT:47)
at mypackage.client.general.AboutPanel.startup(AboutPanel.java:88)
at mypackage.client.MainPanel$6.onTreeItemSelected(MainPanel.java:294)
at
com.google.gwt.user.client.ui.TreeListenerCollection.fireItemSelected(TreeListenerCollection.java:36)
at com.google.gwt.user.client.ui.Tree.onSelection(Tree.java:836)
at com.google.gwt.user.client.ui.Tree.elementClicked(Tree.java:701)
at com.google.gwt.user.client.ui.Tree.onBrowserEvent(Tree.java:361)
at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1265)
Caused by: java.lang.NullPointerException: null
at
com.google.gwt.user.rebind.ClassSourceFileComposer.print(ClassSourceFileComposer.java:144)
at
com.google.gwt.user.rebind.ClassSourceFileComposer.println(ClassSourceFileComposer.java:159)
at
com.google.gwt.user.rebind.ClassSourceFileComposer.<init>(ClassSourceFileComposer.java:61)
at
com.google.gwt.user.rebind.ClassSourceFileComposerFactory.createSourceWriter(ClassSourceFileComposerFactory.java:98)
at
mypackage.rebind.AboutDataGenerator.generate(AboutDataGenerator.java:59)
at
com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:43)
at
com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.tryRebind(StandardRebindOracle.java:116)
at
com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:61)
at
com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:173)
at
com.google.gwt.dev.shell.ShellModuleSpaceHost.rebind(ShellModuleSpaceHost.java:127)
I solved this specific problem by assigning the AboutDataProxy-class
to a static member of the dialog, so the call only happens once now,
but this is just a test (for mastering the learning curve) and there
are other uses where I can't do that that easy.
How is the correct way?
Regards, Lothar
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---