#54 : added first version of case class serializer

This commit is contained in:
Timo Westkämper 2011-11-23 22:17:52 +02:00
parent 480e5978e5
commit dd08c76382
4 changed files with 108 additions and 30 deletions

View File

@ -31,7 +31,7 @@
<commons.collections.version>4.01</commons.collections.version>
<commons.lang.version>3.0.1</commons.lang.version>
<commons.io.version>2.1</commons.io.version>
<codegen.version>0.4.4</codegen.version>
<codegen.version>0.4.5</codegen.version>
<mysema.lang.version>0.2.2</mysema.lang.version>
<cglib.version>2.2</cglib.version>
<findbugs.version>1.3.2</findbugs.version>

Binary file not shown.

View File

@ -2,7 +2,7 @@ package com.mysema.query.scala
import com.mysema.query.codegen._
import com.mysema.codegen.{ CodeWriter, ScalaWriter }
import com.mysema.codegen.model.Type
import com.mysema.codegen.model.{ Parameter, Type }
import com.mysema.query
import javax.inject.Inject
@ -14,19 +14,50 @@ import scala.reflect.BeanProperty
import scala.collection.JavaConversions._
import scala.collection.mutable.Set
/**
* BeanSerializer for Scala
*
* @author tiwe
*
*/
class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends Serializer {
class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) {
var javadocSuffix = " is a Querydsl bean type"
var javaBeanSupport = true
def writeClass(model: EntityType, writer: ScalaWriter) = {
// javadoc
writer.javadoc(model.getSimpleName + javadocSuffix)
// header
model.getAnnotations foreach (writer.annotation(_))
writer.beginClass(model)
// properties
model.getProperties foreach { property =>
property.getAnnotations.foreach(writer.annotation(_))
if (javaBeanSupport) writer.line("@BeanProperty")
writer.publicField(property.getType(), property.getEscapedName, "_")
}
writer.end()
}
}
class CaseClassSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) {
def javaBeanSupport = false
def writeClass(model: EntityType, writer: ScalaWriter) = {
model.getAnnotations foreach (writer.annotation(_))
val parameters = model.getProperties.map(p => new Parameter(p.getEscapedName, p.getType)).toArray
writer.caseClass(model.getSimpleName, parameters:_*)
}
}
abstract class BeanSerializer(typeMappings: TypeMappings) extends Serializer {
var createCompanionObject = true
var javaBeanSupport = true
var javadocSuffix = " is a Querydsl bean type"
def javaBeanSupport: Boolean
def serialize(model: EntityType, serializerConfig: SerializerConfig, writer: CodeWriter) {
val simpleName = model.getSimpleName
@ -47,24 +78,12 @@ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends Seriali
writeCompanionObject(model, queryType, writer.asInstanceOf[ScalaWriter])
}
// javadoc
writer.javadoc(simpleName + javadocSuffix)
// header
model.getAnnotations foreach (writer.annotation(_))
writer.beginClass(model)
// properties
model.getProperties foreach { property =>
property.getAnnotations.foreach(writer.annotation(_))
if (javaBeanSupport) writer.line("@BeanProperty")
writer.publicField(property.getType(), property.getEscapedName, "_")
}
writer.end()
writeClass(model, writer.asInstanceOf[ScalaWriter])
}
private def writeCompanionObject(model: EntityType, queryType: Type, writer: ScalaWriter) = {
def writeClass(model: EntityType, writer: ScalaWriter)
def writeCompanionObject(model: EntityType, queryType: Type, writer: ScalaWriter) = {
val modelName = writer.getRawName(model)
val queryTypeName = writer.getRawName(queryType)
val variable = model.getUncapSimpleName
@ -75,7 +94,6 @@ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends Seriali
writer.end()
}
private def getAnnotationTypes(model: EntityType): Set[String] = {
val imports = Set() ++ model.getAnnotations.map(_.annotationType.getName);
// flatMap flattens the results of the map-function.
@ -83,4 +101,6 @@ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends Seriali
imports ++ model.getProperties.flatMap(_.getAnnotations.map(_.annotationType.getName));
}
}
}

View File

@ -0,0 +1,58 @@
package com.mysema.query.scala
import org.apache.commons.lang3.StringUtils
import com.mysema.codegen._;
import com.mysema.codegen.model._;
import com.mysema.query.codegen._;
import java.io.StringWriter;
import org.junit._
import org.junit.Assert._
import scala.collection.JavaConversions._
class CaseClassSerializerTest extends CompileTestUtils {
val typeMappings = ScalaTypeMappings.create
var entityType: EntityType = null
var writer = new StringWriter()
@Before
def setUp() {
// type
val typeModel = new SimpleType(TypeCategory.ENTITY, "com.mysema.query.DomainClass", "com.mysema.query", "DomainClass", false, false)
entityType = new EntityType(typeModel)
// property
entityType.addProperty(new Property(entityType, "entityField", entityType, new Array[String](0)))
entityType.addProperty(new Property(entityType, "collection", new SimpleType(Types.COLLECTION, typeModel), new Array[String](0)))
entityType.addProperty(new Property(entityType, "listField", new SimpleType(Types.LIST, typeModel), new Array[String](0)))
entityType.addProperty(new Property(entityType, "setField", new SimpleType(Types.SET, typeModel), new Array[String](0)))
entityType.addProperty(new Property(entityType, "arrayField", new ClassType(TypeCategory.ARRAY, classOf[Array[String]]), new Array[String](0)))
entityType.addProperty(new Property(entityType, "mapField", new SimpleType(Types.MAP, typeModel, typeModel), new Array[String](0)))
}
@Test
def Print {
val serializer = new CaseClassSerializer(typeMappings)
typeMappings.register(entityType, new QueryTypeFactoryImpl("Q", "", "").create(entityType))
serializer.serialize(entityType, SimpleSerializerConfig.DEFAULT, new ScalaWriter(writer))
println(writer.toString)
}
@Test
def Compile {
val serializer = new CaseClassSerializer(typeMappings)
serializer.createCompanionObject = false
typeMappings.register(entityType, new QueryTypeFactoryImpl("Q", "", "").create(entityType))
serializer.serialize(entityType, SimpleSerializerConfig.DEFAULT, new ScalaWriter(writer))
val str = writer.toString()
assertCompileSuccess(str)
}
}