あるオブジェクトが別のオブジェクトに「乗る」ための適格性を判断する必要がある状況があります。車両のルールは非常に紛らわしいので、プロジェクトを再起動または再コンパイルせずに変更できるようにしたいと考えています。
これは機能しますが、基本的に、セキュリティの友人を痙攣させて異言を話させます。
class SweetRider{
String stuff
BigDecimal someNumber
BigDecimal anotherNumber
}
class SweetVehicle{
static hasMany=[constraintLinkers:VehicleConstraintLinker]
String vehicleName
Boolean canIRideIt(SweetRider checkRider){
def checkList = VehicleConstraintLinker.findAllByVehicle(this)
checkList.each{
def theClosureObject = it.closureConstraint
def iThinkINeedAShell = new GroovyShell()
def checkerThing = iThinkINeedAShell.evaluate(theClosureObject.closureText)
def result = checkerThing(checkRider)
return result
}
}
}
class VehicleConstraintLinker{
static belongsTo = [closureConstraint:ConstraintByClosure, vehicle:SweetVehicle]
}
class ConstraintByClosure{
String humanReadable
String closureText
static hasMany = [vehicleLinkers:VehicleConstraintLinker]
}
したがって、「stuff」が「peggy」または「waffles」であり、someNumber が anotherNumber より大きい場合にのみ、特定の車両の資格があるというルールを追加したい場合、私がしなければならないことは次のとおりです。
humanReadable = "peggy waffle some#>" で新しい ConstraintByClosure を作成し (人間が読める説明です)、この文字列を ClosureText として追加します。
{
checkRider->if(
["peggy","waffles"].contains(checkRider.stuff) &&
checkRider.someNumber > checkRider.anotherNumber ) {
return true
}
else {
return false
}
}
次に、VehicleConstraintLinker を作成してリンクすると出来上がりです。
私の質問はこれです: GroovyShell ができることを制限する方法はありますか? ファイル、グローバル、またはデータベース データを変更できないようにすることはできますか? これで十分ですか?