This commit is contained in:
Timo Westkämper 2010-09-19 20:36:17 +00:00
parent 077f969b9b
commit d27ab43068

View File

@ -1,9 +1,12 @@
package com.mysema.query.scala.sql
import com.mysema.query.codegen._
import com.mysema.codegen.CodeWriter
import com.mysema.codegen.model.TypeCategory._
import com.mysema.query
import com.mysema.query.codegen._
import com.mysema.query.sql._
import com.mysema.query.sql.support._
import java.util._
import java.io.IOException
@ -11,7 +14,7 @@ import java.io.IOException
import scala.reflect.BeanProperty
import scala.collection.JavaConversions._
class ScalaMetaDataSerializer extends Serializer {
class ScalaMetaDataSerializer(val namingStrategy: NamingStrategy) extends Serializer {
val typeMappings = new TypeMappings();
@ -53,35 +56,110 @@ class ScalaMetaDataSerializer extends Serializer {
// properties
for (property <- model.getProperties()){
val methodName: String = property.getType.getCategory match {
case COMPARABLE => "createComparable";
case BOOLEAN => "createBoolean";
case DATE => "createDate";
case DATETIME => "createDateTime";
case ENUM => "createEnum";
case NUMERIC => "createNumber";
case STRING => "createString";
case SIMPLE => "createSimple";
case TIME => "createTime";
}
var ptype = typeMappings.getPathType(property.getType, model, false);
var value: String = null;
if (property.getType.getCategory == BOOLEAN || property.getType.getCategory == STRING){
value = methodName + "(\"" + property.getName + "\")";
}else{
value = methodName + "(\"" + property.getName + "\", classOf[" + writer.getRawName(property.getType) + "])";
}
writer.publicFinal(ptype, property.getEscapedName, value);
serializeProperty(property);
}
// TODO : primary keys
// primary keys
val primaryKeys: Collection[PrimaryKeyData] = model.getData.get(classOf[PrimaryKeyData]);
if (primaryKeys != null){
serializePrimaryKeys(model, writer, primaryKeys);
}
// foreign keys
val foreignKeys: Collection[ForeignKeyData] = model.getData.get(classOf[ForeignKeyData]);
if (foreignKeys != null){
serializeForeignKeys(model, writer, foreignKeys, false);
}
// TODO : foreign keys
// TODO : inverse foreign keys
// inverse foreign keys
val inverseForeignKeys: Collection[InverseForeignKeyData] = model.getData.get(classOf[InverseForeignKeyData]);
if (inverseForeignKeys != null){
serializeForeignKeys(model, writer, inverseForeignKeys, true);
}
writer.end();
}
def serializeProperty(var property: Property){
val methodName: String = property.getType.getCategory match {
case COMPARABLE => "createComparable";
case BOOLEAN => "createBoolean";
case DATE => "createDate";
case DATETIME => "createDateTime";
case ENUM => "createEnum";
case NUMERIC => "createNumber";
case STRING => "createString";
case SIMPLE => "createSimple";
case TIME => "createTime";
}
var ptype = typeMappings.getPathType(property.getType, model, false);
var value: String = null;
if (property.getType.getCategory == BOOLEAN || property.getType.getCategory == STRING){
value = methodName + "(\"" + property.getName + "\")";
}else{
value = methodName + "(\"" + property.getName + "\", classOf[" + writer.getRawName(property.getType) + "])";
}
writer.publicFinal(ptype, property.getEscapedName, value);
}
@throws(classOf[IOException])
def serializePrimaryKeys(model: EntityType, writer: CodeWriter, primaryKeys: Collection[PrimaryKeyData]) {
for (primaryKey <- primaryKeys){
val fieldName = namingStrategy.getPropertyNameForPrimaryKey(primaryKey.getName(), model);
val value: StringBuilder = new StringBuilder("createPrimaryKey(");
var first = true;
for (column <- primaryKey.getColumns()){
if (!first){
value.append(", ");
}
value.append(namingStrategy.getPropertyName(column, namePrefix, model));
first = false;
}
value.append(")");
writer.publicFinal(new ClassType(classOf[PrimaryKey], model), fieldName, value.toString());
}
}
@throws(classOf[IOException])
def serializeForeignKeys(model: EntityType, writer: CodeWriter, foreignKeys Collection[_ <: KeyData] , inverse: Boolean){
for (foreignKey <- foreignKeys){
var fieldName: String = null;
if (inverse){
fieldName = namingStrategy.getPropertyNameForInverseForeignKey(foreignKey.getName, model);
}else{
fieldName = namingStrategy.getPropertyNameForForeignKey(foreignKey.getName, model);
}
var foreignType: String = namingStrategy.getClassName(namePrefix, foreignKey.getTable);
if (!model.getPrefix.isEmpty){
foreignType = foreignType.substring(namePrefix.length);
}
val value: = new StringBuilder();
if (inverse){
value.append("createInvForeignKey(");
}else{
value.append("createForeignKey(");
}
if (foreignKey.getForeignColumns.size == 1){
value.append(namingStrategy.getPropertyName(foreignKey.getForeignColumns.get(0), namePrefix, model));
value.append(", \"" + foreignKey.getParentColumns().get(0) + "\"");
}else{
val local = new StringBuilder();
val foreign = new StringBuilder();
for (int i = 0; i < foreignKey.getForeignColumns().size(); i++){
if (i > 0){
local.append(", ");
foreign.append(", ");
}
local.append(namingStrategy.getPropertyName(foreignKey.getForeignColumns().get(0), namePrefix, model));
foreign.append("\"" +foreignKey.getParentColumns.get(0) + "\"");
}
value.append("Arrays.asList("+local+"), Arrays.asList("+foreign+")");
}
value.append(")");
val t = new ClassType(classOf[ForeignKey], new SimpleType(model.getPackageName+"."+foreignType, model.getPackageName, foreignType));
writer.publicFinal(t, fieldName, value.toString());
}
}
def getAnnotationTypes(model: EntityType): Set[String] = {
var imports = new HashSet[String]();