黑名单用于groovy脚本的synchronized关键字

时间:2013-04-05 12:35:48

标签: groovy

有一个应用程序,用户可以提供自定义groovy脚本。他们可以在这些脚本中编写自己的函数。我想限制人们在这些脚本中使用'synchronized'关键字以及其他一些关键字。例如,不应该编写如下函数。

public synchronized void test() {
}

我正在使用SecureASTCustomizer创建CompilerConfiguration。但是,将org.codehaus.groovy.syntax.Types.KEYWORD_SYNCHRONIZED添加到黑名单标记列表中似乎不起作用。 (如果我添加org.codehaus.groovy.syntax.Types.PLUS它会阻止在脚本中使用'+'但似乎没有为同步做的工作)

关于如何实现这一目标的任何想法......

1 个答案:

答案 0 :(得分:5)

您可以这样做:

import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.syntax.SyntaxException
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.classgen.GeneratorContext

class SynchronizedRemover extends org.codehaus.groovy.control.customizers.CompilationCustomizer {
    SynchronizedRemover() {
        super(org.codehaus.groovy.control.CompilePhase.CONVERSION)
    }

    void call(final SourceUnit source, final GeneratorContext context, final ClassNode classNode) {
        classNode.methods.each { mn ->
            if (mn.modifiers & 0x0020) { // 0x0020 is for synchronized
                source.addError(new SyntaxException("Synchronized is not allowed", mn.lineNumber, mn.columnNumber))
            }
        }
    }
}

def config = new CompilerConfiguration()
config.addCompilationCustomizers(new SynchronizedRemover())

def shell = new GroovyShell(config)
shell.evaluate '''
    class Foo { public synchronized void foo() { println 'bar' } }
'''

这个想法是创建一个编译定制器来检查生成的类,并且对于每个方法,如果存在synchronized修饰符,则添加错误。对于synchronized块内部方法,您可以将SecureASTCustomizer与自定义语句检查器一起使用。