package ilarkesto.mda.generator; import ilarkesto.core.event.Quiet; import ilarkesto.mda.model.Node; import ilarkesto.mda.model.NodeTypes; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; public class GwtEventGenerator extends AJavaClassGenerator implements NodeTypes { private static final String QUIET_FLAG = "quiet"; private Node event; private Node package_; private Node gwtModule; public GwtEventGenerator(String srcPath, Node event) { super(srcPath, true); this.event = event; package_ = event.getSuperparentByType(Package); assert package_ != null; gwtModule = package_.getSuperparentByType(GwtModule); assert gwtModule != null; } @Override protected void printCode(JavaPrinter out) { out.package_(getPackageName()); out.beginClass(event.getValue() + "Event", ilarkesto.core.event.AEvent.class.getName(), getInterfaces()); List<Node> parameters = event.getChildrenByType(Parameter); for (Node parameter : parameters) { out.field("private", getType(parameter), parameter.getValue(), null); } List<String> constructorParameters = new ArrayList<String>(parameters.size()); for (Node parameter : parameters) { constructorParameters.add(getType(parameter) + " " + parameter.getValue()); } out.beginConstructor(constructorParameters); for (Node parameter : parameters) { out.assignment("this." + parameter.getValue(), parameter.getValue()); } out.endConstructor(); for (Node parameter : parameters) { out.getter(getType(parameter), parameter.getValue()); } out.beginMethod("void", "tryToGetHandled", Arrays.asList("Object handler")); out.beginIf("handler instanceof " + event.getValue() + "Handler"); if (!event.containsChild(Flag, QUIET_FLAG)) { out.logDebug("\" \" + handler.getClass().getName() + \".on" + event.getValue() + "(event)\""); } out.statement("((" + event.getValue() + "Handler)handler).on" + event.getValue() + "(this)"); out.endIf(); out.endMethod(); out.endClass(); } private String getType(Node parameter) { Node typeNode = parameter.getChildByType(Type); return typeNode == null ? "Object" : typeNode.getValue(); } private Collection<String> getInterfaces() { if (event.containsChild(Flag, QUIET_FLAG)) return Arrays.asList(Quiet.class.getName()); return Collections.emptyList(); } private String getPackageName() { String packageName = getBasePackageName() + "." + package_.getValue(); return packageName; } private String getBasePackageName() { return gwtModule.getValue().toLowerCase() + ".client"; } }