Hey,
I do a lot of prototyping in GWT before I build the backend and I've
recently had the need to generate a "build version" for my GWT
interface. While there are about fiftybazillionmillion different ways
to do this, I've chosen a GWT generator to create a buildstamp. This
lets me tar up the www results of clicking on "Compile/Browse" and
fire them off for others to play. Code follows, wiring and example
proceed it. Imports omitted, use your favourite IDE to fill them in.
This makes a pretty simple Hello World example. Comments are more than
welcome.
-- 8< -- begin -- 8< --
package org.example.rebind;
public class BuildStampGenerator extends Generator {
private String className;
private String packageName;
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String typeName)
throws UnableToCompleteException {
try {
TypeOracle typeOracle = context.getTypeOracle();
JClassType classType = typeOracle.getType(typeName);
packageName = classType.getPackage().getName();
className = classType.getSimpleSourceName() + "Impl";
generateClass(logger, context);
} catch (Exception e) {
logger.log(TreeLogger.ERROR, "Exception during
BuildStamp
creation.", e);
}
return packageName + "." + className;
}
private void generateClass(TreeLogger logger, GeneratorContext
context) {
PrintWriter printWriter = context.tryCreate(logger, packageName,
className);
/* Returns null if the package has already been generated. */
if (printWriter == null) {
return;
}
ClassSourceFileComposerFactory composer = new
ClassSourceFileComposerFactory(packageName, className);
// shouldn't magic just happen here?
composer.addImplementedInterface(BuildStamp.class.getCanonicalName());
SourceWriter sourceWriter = composer.createSourceWriter(context,
printWriter);
writeGetBuildStamp(sourceWriter);
sourceWriter.outdent();
sourceWriter.println("}");
context.commit(logger, printWriter);
}
/**
* Write the source code for [EMAIL PROTECTED]
BuildStamp#getBuildStamp()}.
*/
private void writeGetBuildStamp(SourceWriter sourceWriter) {
sourceWriter.println("public String getBuildStamp() {");
sourceWriter.println(" return \"" +
Generator.escape(getBuildStamp()) + "\";");
sourceWriter.println("}");
}
/**
* Executed at *compile* time, this generates a string that is
embedded in the
* generated class. In hosted mode, this code is rebuilt each
Refresh.
*
* @return A user-friendly build string, good for hiding in tooltips.
*/
String getBuildStamp() {
StringBuilder msg = new StringBuilder();
msg.append("Built on ");
try {
String hostname =
InetAddress.getLocalHost().getCanonicalHostName();
msg.append(hostname);
} catch (UnknownHostException e) {
msg.append("(hostname not available)");
}
msg.append(" at ");
msg.append(new Date());
return msg.toString();
}
}
-- 8< -- end -- 8< --
You will need a BuildStamp interface:
package org.example.client;
public interface BuildStamp { public String getBuildStamp(); }
And wire it up in your .gwt.xml:
<generate-with class="org.example.rebind.BuildStampGenerator">
<when-type-assignable class="org.example.client.BuildStamp" />
</generate-with>
Then serve:
...
BuildStamp buildStamp = GWT.create(BuildStamp.class);
yourLogo.setTitle(buildStamp.getBuildStamp());
...
Much of this is borrowed from this forum post:
http://groups.google.com/group/Google-Web-Toolkit/msg/ae249ea67c2c3435
Cheers,
JAmes
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---