package ilarkesto.mda.generator;
import ilarkesto.base.Str;
import ilarkesto.mda.model.Node;
import ilarkesto.mda.model.NodeByIndexComparator;
import ilarkesto.mda.model.NodeTypes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class GwtServiceCallGenerator extends AJavaClassGenerator implements NodeTypes {
private Node call;
private Node package_;
private Node gwtModule;
public GwtServiceCallGenerator(String srcPath, Node call) {
super(srcPath, true);
this.call = call;
package_ = call.getSuperparentByType(Package);
assert package_ != null;
gwtModule = package_.getSuperparentByType(GwtModule);
assert gwtModule != null;
}
@Override
protected void printCode(JavaPrinter out) {
out.package_(getPackageName());
out.beginClass(call.getValue() + "ServiceCall", "scrum.client.core.AServiceCall", null);
List<Node> parameters = call.getChildrenByType(Parameter);
Collections.sort(parameters, new NodeByIndexComparator());
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();
StringBuilder callParameters = new StringBuilder();
for (Node parameter : parameters) {
callParameters.append(parameter.getValue()).append(", ");
}
out.beginMethod("void", "execute", Arrays.asList("Runnable returnHandler"));
out.statement("serviceCaller.onServiceCall()");
out.statement("serviceCaller.getService()." + Str.lowercaseFirstLetter(call.getValue())
+ "(serviceCaller.getConversationNumber(), " + callParameters + "new DefaultCallback(returnHandler))");
out.endMethod();
out.toStringMethod('\"' + call.getValue() + '\"');
out.endClass();
}
private String getType(Node parameter) {
Node typeNode = parameter.getChildByType(Type);
return typeNode == null ? "String" : typeNode.getValue();
}
private String getPackageName() {
String packageName = getBasePackageName() + "." + package_.getValue();
return packageName;
}
private String getBasePackageName() {
return gwtModule.getValue().toLowerCase() + ".client";
}
}