Created
August 12, 2012 13:38
-
-
Save volgar1x/3331876 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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