How to create automatically (Fake) DAO pattern class from a original class
Note:I would like to get your feedback
You can create automatically FAKE DAO(Data Access Object) pattern class
using this function:
def createDaoFromClassName(className:String):(String,String) = { val clazz = Class.forName(className) val packageName = clazz.getPackage().getName() val fieldNames = clazz.getDeclaredFields().map(_.getName()) val fPara = clazz.getDeclaredFields().map{ e => e.getType().getName() match{ case "java.lang.String" => "String" case "int" => "Int" case "long" => "Long" case "float" => "Float" case "double" => "Double" case "boolean" => "Boolean" case "char" => "Char" case "byte" => "Byte" case "short" => "Short" case "java.lang.Integer" => "Int" case "java.lang.Long" => "Long" case "java.lang.Double" => "Double" case "java.lang.Float" => "Float" case "java.lang.Boolean" => "Boolean" case "java.lang.Character" => "Char" case "java.lang.Byte" => "Byte" case "java.lang.Short" => "Short" case i => i } } val point = className.lastIndexOf(".") val originClassName = if (point != -1) { className.substring(point+1,className.length()) }else{ className } val constructor = clazz.getConstructors()(0) val consts = constructor.getParameterTypes().map{ e => e.getName() match{ case "java.lang.String" => "String" case "int" => "Int" case "long" => "Long" case "float" => "Float" case "double" => "Double" case "boolean" => "Boolean" case "char" => "Char" case "byte" => "Byte" case "short" => "Short" case "java.lang.Integer" => "Int" case "java.lang.Long" => "Long" case "java.lang.Double" => "Double" case "java.lang.Float" => "Float" case "java.lang.Boolean" => "Boolean" case "java.lang.Character" => "Char" case "java.lang.Byte" => "Byte" case "java.lang.Short" => "Short" case i => i } } //consts.foreach(println) val header = """package dao import queryprj.obms import """+className+""" class """+originClassName+"""Dao { val className = """"+originClassName+"""" }""" + "\n" val update = (fieldNames,fPara).zipped map{ (e,f) =>{ "\tdef update"+e+"(ID:Any,"+e+":"+f+") = {\n\t\tval obj:"+ originClassName+" = obms.getObject(className, ID)\n\t\tobj."+e+" = "+e+"\n\t}\n" } } val mkConstArgWT = (consts,0 to consts.length).zipped map { (arg,count) => "arg"+count+":"+arg } val mkConstArg = (consts,0 to consts.length).zipped map { (arg,count) => "arg"+count } val middle = "trait "+originClassName+"DaoUpdator extends "+originClassName+"Dao{\n\n\tdef create"+originClassName+ "(ID:Any,"+mkConstArgWT.mkString(",")+") = {\n\t\tobms.createObject(className, ID)("+mkConstArg.mkString(",")+")\n\t}\n\tdef delete"+ originClassName+"(ID:Any) = {\n\t\tobms.deleteObject(className, ID)\n\t}\n"+ update.mkString+"\n}\n" val footer = "trait "+originClassName+"DaoSelector extends "+originClassName+"Dao {\n\tdef getAll : List["+ originClassName+"] = {\n\t\tobms.getAllList(className)\n\t}\n\tdef getByName(ID:Any):"+ originClassName+" = {\n\t\tobms.getObject(className, ID)\n\t}\n}\n" val result = header + middle + footer println(result) (originClassName+"Dao.scala",result) }
For example,
one original Car class below:
package domainScala import java.util.Date class Car(n:Int,o:String,p:Long,q:Float,r:Double,s:Boolean,t:Char,u:Byte,v:Short,f:Party,g:Date){ var number:Int = n var maxCarry:Float = _ def run = println(this.toString + " runs.") override def toString = "Car Instance(number:" + number + ",maximum payload:" + maxCarry + "t)" }
You can automatically create this Fake DAO pattern class:
package dao import queryprj.obms import domainScala.Car class CarDao { val className = "Car" } trait CarDaoUpdator extends CarDao{ def createCar(ID:Any,arg0:Int,arg1:String,arg2:Long,arg3:Float,arg4:Double,arg5:Boolean,arg6:Char,arg7:Byte,arg8:Short,arg9:domainScala.Party,arg10:java.util.Date) = { obms.createObject(className, ID)(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) } def deleteCar(ID:Any) = { obms.deleteObject(className, ID) } def updatenumber(ID:Any,number:Int) = { val obj:Car = obms.getObject(className, ID) obj.number = number } def updatemaxCarry(ID:Any,maxCarry:Float) = { val obj:Car = obms.getObject(className, ID) obj.maxCarry = maxCarry } } trait CarDaoSelector extends CarDao { def getAll : List[Car] = { obms.getAllList(className) } def getByName(ID:Any):Car = { obms.getObject(className, ID) } }