Skip to content

Instantly share code, notes, and snippets.

@volgar1x
Created August 12, 2012 13:38
Show Gist options
  • Save volgar1x/3331876 to your computer and use it in GitHub Desktop.
Save volgar1x/3331876 to your computer and use it in GitHub Desktop.
package fr.blackrush.activejdbc;
import java.util.*;
public class App {
static String capitalize(String s) {
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
static class Pair<T> {
public T first, second;
public Pair() { }
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public static <T> Pair<T> create(T first, T second) { return new Pair<T>(first, second); }
}
static class ModelClass {
public String pkg, name;
public List<ModelField> fields = new ArrayList<ModelField>();
}
static class ModelField {
public String name, type;
public boolean many2one = false, one2many = false, many2many = false;
}
static ModelClass fromArray(String[] args) {
ModelClass model = new ModelClass();
model.pkg = args[0];
model.name = args[1];
for (int i = 2; i < args.length; ++i) {
String[] fieldParams = args[i].split(":");
ModelField field = new ModelField();
field.name = fieldParams[0];
field.type = fieldParams[1];
if (fieldParams.length > 2) {
String option1 = fieldParams[2];
if (option1.equalsIgnoreCase("many2one")) {
field.many2one = true;
} else if (option1.equalsIgnoreCase("one2many")) {
field.one2many = true;
} else if (option1.equalsIgnoreCase("many2many")) {
field.many2many = true;
}
}
model.fields.add(field);
}
return model;
}
static String getGetterType(ModelField field) {
return field.one2many ?
"LazyList<" + field.type + ">" :
field.type;
}
static final String[] SUPPORTED_TYPES = {"BigDecimal", "Boolean", "Date", "Double", "Float", "Integer", "Long", "String", "Timestamp"};
static String getSupported(String type) {
for (String supported : SUPPORTED_TYPES) {
if (type.equalsIgnoreCase(supported)) {
return supported;
}
}
return null;
}
static String getGetterMethod(ModelField field) {
if (field.one2many) {
return "getAll(" + field.type + ".class)";
} else if (field.many2one) {
return "parent(" + field.type + ".class)";
} else {
String supported = getSupported(field.type);
if (supported != null) {
return "get" + supported + "(\"" + field.name + "\")";
} else {
return "(" + field.type + ") get(\"" + field.name + "\")";
}
}
}
static String getGetterName(ModelField field) {
String verb = field.type.equalsIgnoreCase("boolean") ? "is" : "get";
return verb + capitalize(field.name);
}
static String getSetterType(ModelField field) {
return field.type; // should do the trick
}
static String getSetterMethod(ModelField field) {
String varName = getSetterVarName(field);
if (field.one2many) {
return "add(" + varName + ")";
} else {
return "set(\"" + field.name + "\", " + varName + ")";
}
}
static String getSetterName(ModelField field) {
String verb = field.one2many ? "add" : "set",
name = field.one2many && field.name.endsWith("s") ?
field.name.substring(0, field.name.length() - 1) :
field.name;
return verb + capitalize(name);
}
static String getSetterVarName(ModelField field) {
return field.one2many && field.name.endsWith("s") ?
field.name.substring(0, field.name.length() - 1) :
field.name;
}
static final String CLASS_TPL = // {package} {name} {content}
"package {package};\n" +
"\n" +
"import org.javalite.activejdbc.Model;\n" +
"import org.javalite.activejdbc.LazyList;\n" +
"\n" +
"public class {name} extends Model {\n" +
"{content}\n" +
"}\n";
static final String FIELD_TPL = // {getter:name|method|type} {setter:name|method|type|var}
"\tpublic {getter:type} {getter:name}() {\n" +
"\t\treturn {getter:method};\n" +
"\t}\n" +
"\n" +
"\tpublic void {setter:name}({setter:type} {setter:var}) {\n" +
"\t\t{setter:method};\n" +
"\t}\n" +
"\n";
/**
* example :
* java -jar App.jar test.models Player name:String owner:Account:many2one
*/
public static void main(String[] args) {
ModelClass model = fromArray(args);
StringBuilder content = new StringBuilder();
for (ModelField field : model.fields) {
String out = FIELD_TPL
.replace("{getter:name}", getGetterName(field))
.replace("{getter:method}", getGetterMethod(field))
.replace("{getter:type}", getGetterType(field))
.replace("{setter:name}", getSetterName(field))
.replace("{setter:method}", getSetterMethod(field))
.replace("{setter:type}", getSetterType(field))
.replace("{setter:var}", getSetterVarName(field))
.replace("{field}", field.name)
;
content.append(out);
}
String file = CLASS_TPL
.replace("{package}", model.pkg)
.replace("{name}", model.name)
.replace("{content}", content.toString())
;
System.out.println(file);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment