如何在Xtext验证器中访问本地文件系统?

时间:2013-12-18 00:13:48

标签: validation filesystems xtext

我正在使用Xtext构建DSL,我希望当用户编写类似这样的语句时:

import "someFile.txt"

能够验证并检查该文件是否已存在。如果导入定义如上,则该文件应与用户正在编写的DSL程序位于同一项目中。但他也应该能够指定绝对路径。

问题是我找不到在验证器中访问文件系统的方法!我看到很多人都在谈论ResourcesPlugin,但我无法从Xtext生成的基础项目中访问它(我不仅可以在ui生成的项目中访问它,而且验证器存在于基础项目中)。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

你可以像在Java中那样简单地完成它:

import java.io.File
import java.io.BufferedReader
import java.io.FileReader

class FileTest {
def static void main(String[] args) {
    try{    
        var testFile = new File(TheFilePathTheUserTypedAfterImportStatement)

        if(!testFile.exists){
            println("That file doesn't exist!")
        }else {
            var reader = new BufferedReader(new FileReader(testFile))

            var String line
            while((line = reader.readLine) != null) {
                println(line)
            }
        }
    }
    catch(Exception e) {
        println(e.stackTrace)
    }
}
}

您可以使用内容/文件不存在的事实来计算验证方法

中的内容,而不是打印文件不存在的消息或打印lineContent。

问候Krzmbrzl

答案 1 :(得分:0)

您可以编写一个小界面,如:

interface FileFinder {
    def boolean exists(String fileName, emf.Resource context)
}

然后有一个使用java.io.File的实现和一个使用Eclipse资源API的实现。您可以分别使用您的语言的RuntimeModule和UiModule绑定它们:

public Class<? extends FileFinder> bindFileFinder() {
    return JavaIOFileFinder.class;
}

然后在验证规则中使用它:

@Inject FileFinder finder

@Check
def checkFiles(Model model) {
    for (file: model.files) {
        if (!finder.exists(file, model.eResource))
            error...
    }
}