如何自动生成 M2Doc,包括设置?

How to automate M2Doc generation including the settings?

我已经应用 guidance on programmatic usage of M2Doc (also with ) 通过 API 成功生成了一个文档,该文档之前是使用 M2Doc GUI(配置的 .docx 加上一个 .genconf 文件)准备的。它似乎也适用于已配置的 .docx,但没有 .genconf 文件。

现在我想更进一步,简化我们应用程序中的用户界面。用户应该附带一个 .docx,其中包含 {m:...} 字段,尤其是对于变量定义,然后在我们的 Eclipse 应用程序中,只需将模型元素分配给变量列表。最后按“生成”。其余的我想通过 M2Doc 处理 API:

我试图为此分析M2Doc源代码,但有一些问题要实现:

  1. parse/generate API 不会在 .docx 或 .genconf 文件中创建任何配置信息,对吗?至少生成 .docx 配置信息的 API 是什么?
  2. 源代码提到“如果您使用的是一代”——那是什么意思?使用 .genconf 文件(对于生成 API 似乎是可选的)?
  3. 我可以从哪里获取变量列表,M2Doc 在 .docx 中找到(在解析期间?),以便我可以将其呈现给用户以进行对象(模型元素)分配?
  4. 除了交出变量对象,还需要告诉M2Doc变量的类型,在哪个资源文件中吗?我的猜测是否定的,因为使用没有存储任何 M2Doc 信息的空白 .docx 文件也适用于变量本身(不适用于使用其他类型或 .oclAsType() 类型转换的任何其他 AQL 表达式)。
  5. 我如何为 M2Doc 提供上述 AQL 表达式的类型信息,我通常通过 nsURI 配置告诉它?我交出了我应用程序的完整资源集,但这似乎还不够。

非常感谢任何帮助!

到目前为止,为了让您对我的代码有个印象,请参见下文 - 请注意,它实际上是 Java 脚本而不是 Java,因为我们的应用程序有一个内置的 JS-Java 接口.

//=================== PARSING OF THE DOCUMENT ==============================
var templateURIString = "file:///.../templateReqs.docx";
var templateURI = URI.createURI(templateURIString);

// canNOT be empty, as we get nullpointer exceptions otherwise
var options = {"TemplateURI":templateURIString};

var exceptions = new java.util.ArrayList();

var resourceSetForModels = ...; //here our application's resource set for the whole model is used, instead of M2Doc "createResourceSetForModels" - works for the moment, but not sure if some services linking is not working

var queryEnvironment = m2doc.M2DocUtils.getQueryEnvironment(resourceSetForModels, templateURI, options);
        
var classProvider = m2doc.M2DocPlugin.getClassProvider();

// empty Monitor for the moment
var monitor = new BasicMonitor();

var template = m2doc.M2DocUtils.parse(resourceSetForModels.getURIConverter(), templateURI, queryEnvironment, classProvider, monitor);

// =================== GENERATION OF THE DOCUMENT ==============================

var outputURIString = "file:///.../templateReqs.autogenerated.docx";
var outputURI = URI.createURI(outputURIString);

variables["myVar1"] = ...; // assigment of objects...

m2doc.M2DocUtils.generate(template, queryEnvironment, variables, resourceSetForModels, outputURI, monitor);

谢谢!

  1. 不,用于解析生成的 API 不会修改模板文件或 .genconf 文件。要修改模板的配置,您需要使用 模板自定义属性 class。这将允许您注册您的元模型和服务 classes。此风暴随后用于配置 IQueryEnvironment,因此您可能还想在代码中直接配置 IQueryEnvironment。

  2. 这里的生成指的是.genconf文件。注意 genconf 文件也是一个 EMF 模型,因此如果对您来说更容易的话,您也可以在内存中制作一个来启动您的生成。但是是的,使用 .genconf 文件是可选的,就像在您的代码示例中一样。

  3. 到模板中的变量列表你可以使用class TemplateCustomProperties:

  • TemplateCustomProperties.getVariables() 将列出以其类型声明的变量
  • TemplateCustomProperties.getMissingVariables() 列出模板中使用但未声明的变量

您还可以找到已用元模型 (EPackage nsURI) 和导入服务的列表 classes。

  1. 生成时不需要变量类型,仅当您要验证模板时才需要。在生成时,您需要像您在示例中所做的那样,将一个映射从变量名传递到它的值。变量的值可以是模型中的任何对象(EObject)、字符串、整数……如果您想使用类似 oclIsKindOf(pkg::MyEClass) 的东西,您需要注册 pkg 的 nsURI先看下点。

  2. 您提供的代码应该允许您使用类似 projectmodel::PJDiagram.allInstances() 的代码。此服务需要在 M2DocUtils.getQueryEnvironment() 中初始化的 ResourceSetRootEObjectProvider()。但是您需要在模板中声明元模型的 nsURI(请参阅 TemplateCustomProperties)。这会将其注册到 IQueryEnvironment 中。您也可以使用 IQueryEnvironment.registerEPackage().

    自行注册

这应该可以帮助您找到 AQL 环境配置中缺失的部分。您的代码看起来不错,添加配置部分后应该可以正常工作。