package ilarkesto.mda.generator; import ilarkesto.core.scope.ComponentReflector; import ilarkesto.core.scope.Scope; import ilarkesto.mda.model.Node; import ilarkesto.mda.model.NodeTypes; import java.util.Arrays; import java.util.List; public class GwtComponentReflectorGenerator extends AJavaClassGenerator implements NodeTypes { private Node component; private Node package_; private Node gwtModule; public GwtComponentReflectorGenerator(String srcPath, Node component) { super(srcPath, true); this.component = component; package_ = component.getSuperparentByType(Package); assert package_ != null; gwtModule = package_.getSuperparentByType(GwtModule); assert gwtModule != null; } @Override protected void printCode(JavaPrinter out) { out.package_(getPackageName()); out.beginClass(getClassName(), null, getInterfacesNames()); out.beginProcedure("injectComponents", getInjectOutjectParameters()); printInjections(out); out.endProcedure(); out.beginProcedure("callInitializationMethods", Arrays.asList(component.getValue() + " component")); printInitializations(out); out.endProcedure(); out.beginProcedure("outjectComponents", getInjectOutjectParameters()); out.endProcedure(); out.endClass(); } private void printInitializations(JavaPrinter out) { for (Node initProc : component.getChildrenByType(InitializationProcedure)) { out.statement("component." + initProc.getValue() + "()"); } } private void printInjections(JavaPrinter out) { for (Node dependency : component.getChildrenByType(Dependency)) { if (dependency.containsChildByTypeAndValueFalse(Inject)) continue; String type = getDependencyType(dependency); out.assignment("component." + dependency.getValue(), "(" + type + ") scope.getComponent(\"" + dependency.getValue() + "\")"); } } private List<String> getInjectOutjectParameters() { return Arrays.asList(component.getValue() + " component", Scope.class.getName() + " scope"); } private List<String> getInterfacesNames() { return Arrays.asList(ComponentReflector.class.getName() + "<" + component.getValue() + ">"); } private String getClassName() { return "G" + component.getValue() + "Reflector"; } private String getPackageName() { String packageName = getBasePackageName() + "." + package_.getValue(); return packageName; } private String getBasePackageName() { return gwtModule.getValue().toLowerCase() + ".client"; } }