package io.trygvis.persistence.generators; import io.trygvis.container.compiler.SqlUnitModel; import io.trygvis.container.compiler.model.ClassG; import io.trygvis.container.compiler.model.Constructor; import io.trygvis.container.compiler.model.FieldRef; import io.trygvis.container.compiler.model.Imports; import io.trygvis.container.compiler.model.MethodRef; import io.trygvis.container.compiler.model.Parameters; import io.trygvis.container.compiler.model.TypeRef; import io.trygvis.persistence.EntityMirror; import io.trygvis.persistence.sql.SqlEntityManagerFactory; import io.trygvis.persistence.sql.SqlEntityMeta; import io.trygvis.persistence.sql.SqlUnit; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.util.ArrayList; import java.util.List; import static io.trygvis.container.compiler.Utils.toClassName; import static java.lang.reflect.Modifier.*; import static org.apache.commons.lang.StringUtils.join; public class EntityManagerFactoryGenerator { public static ClassG generateEntityManagerFactory(SqlUnitModel unit) throws IOException { String prefix = unit.getPackageName() + "." + toClassName(unit.getName()); TypeRef emfType = new TypeRef(prefix + "EntityManagerFactory"); ClassG g = new ClassG(PUBLIC, emfType). extendsType(SqlEntityManagerFactory.class); List s = new ArrayList<>(); for (EntityMirror entity : unit.getEntities().values()) { s.add(entity.daoType.plainName + ".desc"); } TypeRef sqlEntityMetaArrayType = new TypeRef(SqlEntityMeta[].class); FieldRef entities = g.addField(PUBLIC | STATIC, sqlEntityMetaArrayType, "entities"). value("new " + sqlEntityMetaArrayType + "{" + join(s, ", ") + "}"); g.add(constructor(entities, g.imports)); g.add(createEntityManager(unit, g.imports)); return g; } private static Constructor constructor(FieldRef entities, Imports imports) { TypeRef dataSourceType = imports.add(DataSource.class); TypeRef sqlUnitType = imports.add(SqlUnit.class); Parameters p = new Parameters(); Parameters.ParameterRef ds = p.addParameter(dataSourceType, "ds"); ArrayList body = new ArrayList<>(); body.add("super(new " + sqlUnitType.plainName + "(" + entities.name + "), " + ds.name + ");"); return new Constructor(p, body); } private static MethodRef createEntityManager(SqlUnitModel unit, Imports imports) { String prefix = unit.getPackageName() + "." + toClassName(unit.getName()); TypeRef entityManagerType = imports.add(EntityManager.class); TypeRef connectionType = imports.add(Connection.class); TypeRef emType = imports.add(new TypeRef(prefix + "EntityManager")); Parameters p = new Parameters(); Parameters.ParameterRef c = p.addParameter(connectionType, "c"); return new MethodRef(PROTECTED, entityManagerType, "createEntityManager", p, "return new " + emType + "(this, " + c.name + ");"); } }