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.Collections;
import java.util.List;
public abstract class AJavaClassGenerator {
private String srcPath;
private boolean overwriteAllowed;
protected abstract void printCode(JavaPrinter out);
public AJavaClassGenerator(String srcPath, boolean overwriteAllowed) {
super();
this.srcPath = srcPath;
this.overwriteAllowed = overwriteAllowed;
}
public void generate() {
JavaPrinter out = new JavaPrinter();
if (overwriteAllowed) out.commentGenerated();
printCode(out);
out.writeToFile(srcPath, overwriteAllowed);
}
// --- helper ---
public String getDependencyType(Node dependency) {
Node module = dependency.getSuperparentByType(NodeTypes.GwtModule);
Node type = dependency.getChildByType(NodeTypes.Type);
if (type != null) return type.getValue();
String name = dependency.getValue();
name = Str.uppercaseFirstLetter(name);
Node component = module.getChildRecursive(NodeTypes.Component, name);
if (component != null)
return getModulePackage(module) + "." + component.getSuperparentByType(NodeTypes.Package).getValue() + "."
+ component.getValue();
throw new RuntimeException("Can not determine type for dependency: " + dependency);
}
public String getModulePackage(Node module) {
return module.getValue().toLowerCase() + ".client";
}
public List<String> getParameterNames(Node parent) {
List<Node> parameters = parent.getChildrenByType(NodeTypes.Parameter);
Collections.sort(parameters, new NodeByIndexComparator());
List<String> ret = new ArrayList<String>(parameters.size());
for (Node parameter : parameters) {
ret.add(parameter.getValue());
}
return ret;
}
public List<String> getParameterTypesAndNames(Node parent, String defaultType) {
List<Node> parameters = parent.getChildrenByType(NodeTypes.Parameter);
Collections.sort(parameters, new NodeByIndexComparator());
List<String> ret = new ArrayList<String>(parameters.size());
for (Node parameter : parameters) {
ret.add(getParameterTypeAndName(parameter, defaultType));
}
return ret;
}
public String getParameterTypeAndName(Node parameter, String defaultType) {
return getParameterType(parameter, defaultType) + " " + parameter.getValue();
}
private String getParameterType(Node parameter, String defaultType) {
Node typeNode = parameter.getChildByType(NodeTypes.Type);
return typeNode == null ? defaultType : typeNode.getValue();
}
}