「最終用戶」我們有一個Java應用程序,我們希望爲最終用戶提供寫「業務規則」的能力。這些規則將在實體創建,更新或刪除時進行評估。腳本語言在Java應用程序
我要找寫這些業務規則的語言。注意事項有:
- 配置的安全性 - 最終用戶不應該能夠調用之類的新的文件(「一些祕密文件」),或調用內部API
- 易於閱讀和理解
- 容易操縱列表和
- 有能力提供一個語法檢查器
任何建議的地圖?
「最終用戶」我們有一個Java應用程序,我們希望爲最終用戶提供寫「業務規則」的能力。這些規則將在實體創建,更新或刪除時進行評估。腳本語言在Java應用程序
我要找寫這些業務規則的語言。注意事項有:
任何建議的地圖?
使用一個業務規則引擎(如Drools的)或建立使用Groovy或XTEXT自己的詞彙或DSL。
你也可以試試ANTLR。這有點複雜,但有很大的靈活性。
Python可以進行相當的英語讀,並提供給Java作爲Jython的包。 Python中的列表語法非常靈活,並且對於像這樣的用例來說它有很多的合成語法。 Jython是一個非常成熟的項目,已經用於商業應用程序腳本。
沙箱可以使用JVM內部安全管理機制,Java級別來提供。這是Java小程序使用的。
Python有所謂pylint的語法檢查器。
您也可以基於XML,JSON,YAML甚至LISP的S-EXP您的DSL。
一些例子:
使用YAML:
- action: reject
pattern: http://www\.example\.com/.+
- action: allow
pattern: http://www\.example\.net/.+
另一個YAML例如:
- xpath-select: /a[1]/b/c[@p1=v1]/d
as: x
- xpath-select: /e/f/g
as: y
- yield: "${x}+${y}"
使用XML:
<select value="*" from="mytable">
<criteria property="name" op="eq" value="foo" />
<criteria property="age" op="ge" value="18" />
</select>
XML,JSON,YAML是數據格式。您必須自己解釋這些數據,但它可以防止創建任意對象。使用衆所周知的數據格式也使您不必編寫自己的解析器。 Java中有現有的解析器可用。 「
」不應該能夠調用像新文件(「/ etc/passwd」)的東西很容易。不要以超級用戶身份運行JVM。 – Dev 2012-03-18 03:56:12
@Dev:'-rw -r - r-- 1 root root 2168 2011-04-13 04:43/etc/passwd'是可讀的整個世界,必須要允許登錄。 – 2012-03-18 05:22:59
注意[內部平臺效應](http://en.wikipedia.org/wiki/Inner-platform_effect)。 – Jesper 2012-03-18 09:16:54