以编程方式使用M2Doc:生成的.docx文档错误

时间:2019-03-28 14:24:11

标签: java m2doc

我正在尝试以编程方式使用M2Doc,我设法生成了.docx文件,但在验证部分没有出现错误,但是在生成的文档中出现了以下错误:

{m:self.Name} Couldn't find the 'aqlFeatureAccess(org.eclipse.emf.common.util.URI.Hierarchical,java.lang.String)' service

“ self.Name”部分是我在模板中写的。

我认为我缺乏某种对服务的引用,但是我不知道如何解决它。

self变量是对基于我创建的元模型的模型的引用。但是我不确定我是否将其正确导入了我的代码。

我的代码基于在M2Doc website 上找到的代码以及在他们的GitHub上找到的一些代码,特别是有关如何在queryEnvironment中添加服务的信息。

我在acceleo和M2Doc的源代码中进行了搜索,以查看它们添加了哪些服务,但似乎它们已经导入了我正在使用的所有服务。

正如我说的那样,验证部分进行得很好,并且不会生成验证文件。

    public static void parseDocument(String templateName) throws Exception{
        final URI templateURI = URI.createFileURI("Template/"+templateName+"."+M2DocUtils.DOCX_EXTENSION_FILE);
        final IQueryEnvironment queryEnvironment = 
                org.eclipse.acceleo.query.runtime.Query.newEnvironmentWithDefaultServices(null); 
        final Map<String, String> options = new HashMap<>(); // can be empty
        M2DocUtils.prepareEnvironmentServices(queryEnvironment, templateURI, options); // delegate to IServicesConfigurator

        prepareEnvironmentServicesCustom(queryEnvironment, options);

        final IClassProvider classProvider = new ClassProvider(ClassLoader.getSystemClassLoader()); // use M2DocPlugin.getClassProvider() when running inside Eclipse
        try (DocumentTemplate template = M2DocUtils.parse(templateURI, queryEnvironment, classProvider)) {
            ValidationMessageLevel validationLevel = validateDocument(template, queryEnvironment, templateName);
            if(validationLevel == ValidationMessageLevel.OK){
                generateDocument(template, queryEnvironment, templateName, "Model/ComplexKaosModel.kaos");
            }
        }
    }
    public static void prepareEnvironmentServicesCustom(IQueryEnvironment queryEnvironment, Map<String, String> options){

        Set<IService> services = ServiceUtils.getServices(queryEnvironment, FilterService.class);
        ServiceUtils.registerServices(queryEnvironment, services);

        M2DocUtils.getConfigurators().forEach((configurator) -> {
            ServiceUtils.registerServices(queryEnvironment, configurator.getServices(queryEnvironment, options));
        });
    }
    public static void generateDocument(DocumentTemplate template, IQueryEnvironment queryEnvironment,
            String templateName, String modelPath)throws Exception{

        final Map<String, Object> variable = new HashMap<>();
        variable.put("self", URI.createFileURI(modelPath));
        final Monitor monitor = new BasicMonitor.Printing(System.out);
        final URI outputURI = URI.createFileURI("Generated/"+templateName+".generated."+M2DocUtils.DOCX_EXTENSION_FILE);
        M2DocUtils.generate(template, queryEnvironment, variable, outputURI, monitor);
    }

1 个答案:

答案 0 :(得分:0)

变量“ self”包含一个URI:

variable.put("self", URI.createFileURI(modelPath));

您必须使用以下方法加载模型并为模型中的元素设置self的值:

final ResourceSet rs = new ResourceSetImpl();
final Resource r = rs.getResource(uri, true);
final EObject value = r.getContents()...;
variable.put("self", value);

您可以在EMF documentation中获得有关资源加载的更多详细信息。