package ilarkesto.mda.generator; import ilarkesto.base.Str; import ilarkesto.core.scope.ComponentReflector; import ilarkesto.core.scope.Scope; import ilarkesto.mda.model.Node; import ilarkesto.mda.model.NodeTypes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class GwtComponentsReflectorGenerator extends AJavaClassGenerator implements NodeTypes { private Node gwtModule; private List<Node> components = new ArrayList<Node>(); public GwtComponentsReflectorGenerator(String srcPath, Node gwtModule) { super(srcPath, true); this.gwtModule = gwtModule; } @Override protected void printCode(JavaPrinter out) { out.package_(getBasePackageName()); out.beginClass(getClassName(), null, Arrays.asList(ComponentReflector.class.getName())); for (Node component : components) printField(out, component); out.beginProcedure("injectComponents", Arrays.asList("Object component", Scope.class.getName() + " scope")); for (Node component : components) out.statement("if (component instanceof " + getType(component) + ") " + getName(component) + "Reflector.injectComponents(component, scope)"); out.endProcedure(); out.beginProcedure("callInitializationMethods", Arrays.asList("Object component")); for (Node component : components) out.statement("if (component instanceof " + getType(component) + ") " + getName(component) + "Reflector.callInitializationMethods(component)"); out.endProcedure(); out.beginProcedure("outjectComponents", Arrays.asList("Object component", Scope.class.getName() + " scope")); for (Node component : components) out.statement("if (component instanceof " + getType(component) + ") " + getName(component) + "Reflector.outjectComponents(component, scope)"); out.endProcedure(); for (Node component : components) printCreateMethod(out, component); out.endClass(); } private void printCreateMethod(JavaPrinter out, Node component) { out.beginMethod(ComponentReflector.class.getName(), "create" + component.getValue() + "Reflector", null); out.returnStatement("new " + getReflectorType(component) + "()"); out.endMethod(); } private void printField(JavaPrinter out, Node component) { out.protectedField(ComponentReflector.class.getName(), getName(component) + "Reflector", "create" + component.getValue() + "Reflector()"); } private String getName(Node component) { return Str.lowercaseFirstLetter(component.getValue()); } private String getType(Node component) { return getPackageName(component) + "." + component.getValue(); } private String getReflectorType(Node component) { return getPackageName(component) + ".G" + component.getValue() + "Reflector"; } private String getPackageName(Node component) { Node package_ = component.getSuperparentByType(Package); return getBasePackageName() + "." + package_.getValue(); } private String getClassName() { return "G" + gwtModule.getValue() + "ComponentsReflector"; } private String getBasePackageName() { return gwtModule.getValue().toLowerCase() + ".client"; } public void addComponent(Node component) { components.add(component); } }