package org.lemsml.jlems.io.reader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import org.lemsml.jlems.core.logging.E;
import org.lemsml.jlems.core.type.Attribute;
import org.lemsml.jlems.core.type.LemsCollection;
import org.lemsml.jlems.core.type.ParamValue;
import org.lemsml.jlems.core.type.dynamics.RequiredVar;
import org.lemsml.jlems.core.type.procedure.Statement;
import org.lemsml.jlems.core.type.structure.BuildElement;
import org.lemsml.jlems.io.util.FileUtil;
public class LemsModelGenerator
{
private void generateModelSource(File destdir) throws IOException
{
LemsClasses lclasses = LemsClasses.getInstance();
ArrayList<LemsClass> alc = lclasses.getClasses();
for (LemsClass lc : alc)
{
process(destdir, lc);
}
process(destdir, new LemsClass(BuildElement.class, null));
process(destdir, new LemsClass(Statement.class, null));
process(destdir, new LemsClass(RequiredVar.class, null));
process(destdir, new LemsClass(Attribute.class, null));
process(destdir, new LemsClass(ParamValue.class, null));
}
private void process(File destdir, LemsClass lc) throws IOException
{
String fnm = lc.getName() + "Doc.java";
File fcl = new File(destdir, fnm);
String ssrc = generateSingleModelSource(lc);
FileUtil.writeStringToFile(ssrc, fcl);
E.info("Written " + fcl.getAbsolutePath());
}
private String generateSingleModelSource(LemsClass lc)
{
StringBuilder sb = new StringBuilder();
StringBuilder msb = new StringBuilder();
sb.append("//-----------------------------------------------\n");
sb.append("// GENERATED CODE, DONT'MODIFY\n");
sb.append("//-----------------------------------------------\n");
sb.append("package org.lemsml.jlems.model;\n\n");
Class<?> c = lc.jclass;
if (hasListFields(c))
{
sb.append("import java.util.ArrayList;\n");
sb.append("import java.util.List;\n");
}
sb.append("public class " + lc.getName() + "Doc {\n\n\n");
for (Field f : c.getFields())
{
if (java.lang.reflect.Modifier.isPublic(f.getModifiers()))
{
if (java.lang.reflect.Modifier.isStatic(f.getModifiers()))
{
// not set from xml
}
else
{
String dec = null;
if (f.getType() == String.class)
{
dec = "String";
}
else if (f.getType() == double.class)
{
dec = "double";
}
else if (f.getType() == int.class)
{
dec = "int";
}
else if (f.getType() == boolean.class)
{
dec = "boolean";
}
if (dec != null)
{
String fname = "_"+f.getName();
String capname = capitalize(f.getName());
sb.append("\tprivate " + dec + " " + fname + ";\n\n");
msb.append("\tpublic void set" + capname + "(" + dec + " v) {\n");
msb.append("\t\t" + fname + " = v;\n");
msb.append("\t}\n\n");
msb.append("\tpublic " + dec + " get" + capname + "() {\n");
msb.append("\t\treturn " + fname + ";\n");
msb.append("\t}\n\n");
}
}
}
}
if (hasListFields(c))
{
for (Field f : c.getFields())
{
if (java.lang.reflect.Modifier.isPublic(f.getModifiers()))
{
if (f.getType() == LemsCollection.class)
{
String ccnm = getListClassName(f.getName())+"Doc";
String lccnm = "_"+lowerCase(ccnm) + "s";
sb.append("\tprivate ArrayList<" + ccnm + "> " + lccnm + " = new ArrayList<" + ccnm + ">();\n\n");
msb.append("\tpublic List<" + ccnm + "> get" + capitalize(lccnm.substring(1)) + "() {\n");
msb.append("\t\treturn " + lccnm + ";\n");
msb.append("\t}\n\n");
}
}
}
}
sb.append(msb.toString());
sb.append("}\n\n");
String ret = sb.toString();
return ret;
}
private String capitalize(String s)
{
String ret = s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
return ret;
}
private String lowerCase(String s)
{
String ret = s.substring(0, 1).toLowerCase() + s.substring(1, s.length());
return ret;
}
protected String getListClassName(String s)
{
String ret = s;
// TODO no special cases
if (s.equals("dynamicses"))
{
ret = "Dynamics";
}
else if (s.equals("attachmentses"))
{
ret = "Attachments";
}
else
{
if (ret.endsWith("s"))
{
ret = ret.substring(0, ret.length() - 1);
}
ret = ret.substring(0, 1).toUpperCase() + ret.substring(1, ret.length());
}
return ret;
}
private boolean hasListFields(Class<?> c)
{
boolean ret = false;
for (Field f : c.getFields())
{
if (java.lang.reflect.Modifier.isPublic(f.getModifiers()))
{
if (f.getType() == LemsCollection.class)
{
ret = true;
break;
}
}
}
return ret;
}
private void appendListItemInstantiation(StringBuilder sb, Class<?> c)
{
sb.append("\t\tfor (XMLElement cel : xel.getXMLElements()) {\n");
sb.append("\t\t\tString xn = cel.getTag();\n\n");
sb.append("\t\t\tObject obj = instantiateFromXMLElement(cel);\n");
sb.append("\t\t\tif (xn.equals(\"UNUSED\")) {\n");
for (Field f : c.getFields())
{
if (java.lang.reflect.Modifier.isPublic(f.getModifiers()))
{
if (f.getType() == LemsCollection.class)
{
String ccnm = getListClassName(f.getName());
sb.append("\t\t\t} else if (obj instanceof " + ccnm + ") {\n");
sb.append("\t\tret." + f.getName() + ".add((" + ccnm + ")obj);\n");
}
}
}
sb.append("\t\t\t} else {\n");
sb.append("\t\t\t\tE.warning(\"unrecognized element \" + cel);\n");
sb.append("\t\t\t}\n");
sb.append("\t\t}\n\n\n");
}
public static void main(String[] argv) throws IOException
{
LemsModelGenerator lmg = new LemsModelGenerator();
File fmod = new File("./target/generated-sources/src/org/lemsml/jlems/model");
File parent = fmod.getParentFile();
if(!parent.exists() && !parent.mkdirs()){
throw new IllegalStateException("Couldn't create dir: " + parent);
}
fmod.mkdirs();
lmg.generateModelSource(fmod);
}
}