Sunday, April 15, 2007

Grails Tips : ドメインクラスを奥までさわる

久しぶりの更新!!!
そういえば、Grails eXchange 2007の日程が変わりました。
http://www.grails-exchange.com/
色々あって、10月に移動。理由書いて良いのか?わからないので知りたい人は、メールください。


本日の内容「ドメインクラスを奥までさわる」
Java Doc見ればわかるよと言われれば、それまでですが・・・

ドメインクラスを名指しで取り出す

def domainCls = grailsApplication.getDomainClass("Book")
//又は、(0.5から対応)
def domainCls = grailsApplication.getArtefact("Domain","Book")


ドメインクラスから色々取得
ドメインクラスを取り出したら:

println domainCls.name // クラス名
println domainCls.propertyName // 頭も小文字の名前 Book -> book
println domainCls.clazz.list() // MetaMethods実行 clazz.findAll* 等
println domainCls.getRelatedClassType("projects")//リレークラスの型取得
//メソッド一覧
domainCls.class.methods.each{
println it.name
}


プロパティーリスト取得
そして、constraints 内容順にソート

def comparator = org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator.class
def props = domainCls.properties.findAll { it.name != 'version' }
Collections.sort(props, comparator.constructors[0].newInstance([domainCls] as Object[]))
println props


プロパティーリストから、色々取得

props.each{prop->
println "------"
println "getName ${prop.name}"
println "getType ${prop.type} ${prop.type.name}"
println "getNaturalName ${prop.naturalName}" // fieldNameOne => Field Name One
println "getDomainClass ${prop.domainClass}"
println "getFieldName ${prop.fieldName}"

println "isOneToMany ${prop.isOneToMany()}"
println "isManyToOne ${prop.isManyToOne()}"
println "isBidirectional ${prop.isBidirectional()}"
println "isAssociation ${prop.isAssociation()}"
println "isPersistent ${prop.isPersistent()}"
println "isManyToMany ${prop.isManyToMany()}"
println "isOwningSide ${prop.isOwningSide()}"
println "isOptional ${prop.isOptional()}"
println "isOneToOne ${prop.isOneToOne()}"
println "isCircular ${prop.isCircular()}"

println "getReferencedPropertyType ${prop.referencedPropertyType}"
println "getReferencedDomainClass ${prop.referencedDomainClass}"
println "getReferencedPropertyName ${prop.referencedPropertyName}"
println "getFetchMode ${prop.getFetchMode()}"
println "getOtherSide ${prop.getOtherSide()}"
println "getTypePropertyName ${prop.name}"

println "isInherited ${prop.isInherited()}"
println "isIdentity ${prop.isIdentity()}"
}



こんな感じで、ドメインクラスの色々を紹介しました。
これだけできると、ダイナミックに色々操作する仕組みが結構想像できます。

Labels: ,

0 Comments:

Post a Comment

<< Home