package org.lemsml.jlems.schema; import org.lemsml.jlems.io.reader.LemsClasses; import org.lemsml.jlems.io.reader.LemsClass; 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.LemsCollection; import org.lemsml.jlems.io.util.FileUtil; // NB this is not used - it could be used to create a set of plain java classes for instantiating the data model // and operating on them as a preliminary stage before mapping to the core/type classes. // or maybe as an API public class ModelGenerator { private void generateModelSource(File destdir) throws IOException { LemsClasses lclasses = LemsClasses.getInstance(); ArrayList<LemsClass> alc = lclasses.getClasses(); for (LemsClass lc : alc) { String fnm = lc.getName() + ".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("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() + " {\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(" private " + dec + " " + f.getName() + ";\n"); msb.append(" public void set" + capname + "(" + dec + " v) {\n"); msb.append(" " + fname + " = v;\n"); msb.append(" }\n\n"); msb.append(" public " + dec + " get" + capname + "() {\n"); msb.append(" return " + fname + ";\n"); msb.append(" }\n\n"); } } } } sb.append("\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()); String lccnm = lowerCase(ccnm) + "s"; sb.append(" ArrayList<" + ccnm + "> " + lccnm + " = new ArrayList<" + ccnm +">();\n"); msb.append(" public List<" + ccnm + "> get" + capitalize(lccnm) + "() {\n"); msb.append(" return " + lccnm +";\n"); msb.append(" }\n\n"); msb.append(" public void add" + ccnm + "(" + ccnm + " v){\n"); msb.append(" " + lccnm + ".add(v);\n"); msb.append(" }\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(" for (XMLElement cel : xel.getXMLElements()) {\n"); sb.append(" String xn = cel.getTag();\n\n"); sb.append(" Object obj = instantiateFromXMLElement(cel);\n"); sb.append(" if (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(" } else if (obj instanceof " + ccnm + ") {\n"); sb.append(" ret." + f.getName() + ".add((" + ccnm + ")obj);\n"); } } } sb.append(" } else {\n"); sb.append(" E.warning(\"unrecognized element \" + cel);\n"); sb.append(" }\n"); sb.append(" }\n\n\n"); } public static void main(String[] argv) throws IOException { ModelGenerator lmg = new ModelGenerator(); File fmod = new File("src/org/lemsml/jlems/model"); lmg.generateModelSource(fmod); } }