diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2013-08-10 15:44:58 +0200 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2013-08-10 15:44:58 +0200 |
commit | 5a1256a8ed931f7a5ba05c4328353411bae31f2b (patch) | |
tree | 2d25ea2076d2dd229bfe7bac61b27977f11889eb /container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java | |
parent | 86c174ddf24b3e5ac8c8d45fa4d7dc6c5d5d3a3a (diff) | |
download | container-playground-5a1256a8ed931f7a5ba05c4328353411bae31f2b.tar.gz container-playground-5a1256a8ed931f7a5ba05c4328353411bae31f2b.tar.bz2 container-playground-5a1256a8ed931f7a5ba05c4328353411bae31f2b.tar.xz container-playground-5a1256a8ed931f7a5ba05c4328353411bae31f2b.zip |
o Moving code out to separate generators.
o Creating SqlSession and SqlSessionFactory.
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java')
-rw-r--r-- | container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java new file mode 100644 index 0000000..3f0da2b --- /dev/null +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java @@ -0,0 +1,67 @@ +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.SqlEntityMeta; +import io.trygvis.persistence.sql.SqlSessionFactory; +import io.trygvis.persistence.sql.SqlUnit; + +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 SqlSessionFactoryGenerator { + public static ClassG generateSqlSessionFactory(SqlUnitModel unit) throws IOException { + String prefix = unit.getPackageName() + "." + toClassName(unit.getName()); + TypeRef ssfType = new TypeRef(prefix + "SqlSessionFactory"); + TypeRef ssType = new TypeRef(prefix + "SqlSession"); + + ClassG g = new ClassG(PUBLIC, ssfType). + extendsType(new TypeRef(SqlSessionFactory.class).args(ssType)); + + List<String> 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(newSession(unit, ssType, 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<String> body = new ArrayList<>(); + body.add("super(new " + sqlUnitType.plainName + "(" + entities.name + "), " + ds.name + ");"); + return new Constructor(p, body); + } + + private static MethodRef newSession(SqlUnitModel unit, TypeRef sessionType, Imports imports) { + String prefix = unit.getPackageName() + "." + toClassName(unit.getName()); + TypeRef connectionType = imports.add(Connection.class); + + Parameters p = new Parameters(); + Parameters.ParameterRef c = p.addParameter(connectionType, "c"); + return new MethodRef(PROTECTED, sessionType, "newSession", p, + "return new " + sessionType + "(" + c.name + ");"); + } +} |