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

Validation 如何在Xtext验证程序中访问本地文件系统?,validation,filesystems,xtext,Validation,Filesystems,Xtext,我正在使用Xtext构建DSL,当用户编写这样的语句时,我希望: import "someFile.txt" 能够验证和检查该文件是否已存在。如果导入定义如上所述,那么文件应该与用户正在编写的DSL程序位于同一个项目中。但他也应该能够指定绝对路径 问题是我找不到在验证器中访问文件系统的方法!我看到很多人在谈论ResourcesPlugin,但我无法从Xtext生成的基本项目访问它(我不能只在ui生成的项目中访问它,但基本项目中存在验证器) 我该怎么做呢?您可以像在Java中那样简单地执行: i

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

import "someFile.txt"
能够验证和检查该文件是否已存在。如果导入定义如上所述,那么文件应该与用户正在编写的DSL程序位于同一个项目中。但他也应该能够指定绝对路径

问题是我找不到在验证器中访问文件系统的方法!我看到很多人在谈论ResourcesPlugin,但我无法从Xtext生成的基本项目访问它(我不能只在ui生成的项目中访问它,但基本项目中存在验证器)


我该怎么做呢?

您可以像在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)
    }
}
}
您可以使用内容/文件不存在的事实来计算验证方法中的某些内容,而不是打印文件不存在的消息或打印行内容


欢迎Krzmbrzl

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

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...
    }
}