Enterprise Architect 代码生成:获取界面标签
Enterprise Architect Code Generation: Get tags of interface
我使用 Enterprise Architect 进行代码生成,我想自动检索 class 实现的接口的所有标签(在我的例子中是 Java 注释)。考虑以下示例:
根据这个模型,我想生成一个 class 如下所示:
@AnnotationOfMyInterface
public class MyClass {
...
}
所以我想将注释作为标签添加到 MyInterface
,在代码生成期间应该应用于 MyClass
。在 UI 中,显示了已实现接口的标签,所以我希望有一种方法可以在代码生成期间获取这些标签。
我尝试编辑代码生成模板并找到宏来获取
- class 实现的所有接口:
%list="ClassInterface" @separator=", "%
- 具有给定名称的所有标签(正在为其生成代码的 class):
%classTag:"annotations"%
但不幸的是,我无法组合这些宏,即我无法将一个接口传递给 classTag
宏,以便我可以检索该特定接口的标签(而不是我正在生成代码的接口)为了)。有没有办法获取特定 class / 接口的 class 标签?
我还尝试创建一个单独的代码生成模板并从主 class 代码生成模板“调用”它。但是在我的模板中,classTag
宏仍然只获取 class.
的标签
多亏了上面的评论,特别是因为在 EA 的论坛上回答了我的问题,我才能够设置一些概念验证来实现我想要的。我正在回答我的问题以记录我的解决方案,以防将来有人遇到类似问题。
在 Eve 在 EA 论坛中的提示之后,我研究了为 Enterprise Architect 创建一个插件,以便从代码生成模板中使用该插件。正如@Geert Bellekens 在 this tutorial 中所解释的那样,我首先编写了一个基本的插件。之后我更改了 AddIn 以满足我的需要。这就是我最终获得 class 实现的接口的标记值(注释)的方式:
第一步:
在代码生成模板中,我获得了 class 实现的所有接口并将它们传递给我的 AddIn:
$interfaces=%list="ClassInterface" @separator=", "%
%EXEC_ADD_IN("MyAddin","getInterfaceTags", $interfaces)%
第二步:
如记录 here 存储库对象与 EXEC_ADD_IN 调用一起传递。我使用存储库对象并使用 $interfaces 中包含的名称查询所有接口。然后我可以获得每个界面元素的标记值。为单个界面实现此目的的简单原型:
public Object getInterfaceTags(EA.Repository repo, Object args)
{
String[] interfaceNames = args as String[];
String firstInterfaceName = interfaceNames[0];
EA.Element interfaceElement = repo.GetElementsByQuery("Simple", firstInterfaceName).GetAt(0);
String tag = interfaceElement.TaggedValues.GetAt(0);
return interfaceElement.Name + " has tag value" + tag.Value;
}
我知道,有几个缺点,但这只是一个很可能永远不会成为生产代码的想法的简单概念证明。
我使用 Enterprise Architect 进行代码生成,我想自动检索 class 实现的接口的所有标签(在我的例子中是 Java 注释)。考虑以下示例:
根据这个模型,我想生成一个 class 如下所示:
@AnnotationOfMyInterface
public class MyClass {
...
}
所以我想将注释作为标签添加到 MyInterface
,在代码生成期间应该应用于 MyClass
。在 UI 中,显示了已实现接口的标签,所以我希望有一种方法可以在代码生成期间获取这些标签。
我尝试编辑代码生成模板并找到宏来获取
- class 实现的所有接口:
%list="ClassInterface" @separator=", "%
- 具有给定名称的所有标签(正在为其生成代码的 class):
%classTag:"annotations"%
但不幸的是,我无法组合这些宏,即我无法将一个接口传递给 classTag
宏,以便我可以检索该特定接口的标签(而不是我正在生成代码的接口)为了)。有没有办法获取特定 class / 接口的 class 标签?
我还尝试创建一个单独的代码生成模板并从主 class 代码生成模板“调用”它。但是在我的模板中,classTag
宏仍然只获取 class.
多亏了上面的评论,特别是因为在 EA 的论坛上回答了我的问题,我才能够设置一些概念验证来实现我想要的。我正在回答我的问题以记录我的解决方案,以防将来有人遇到类似问题。
在 Eve 在 EA 论坛中的提示之后,我研究了为 Enterprise Architect 创建一个插件,以便从代码生成模板中使用该插件。正如@Geert Bellekens 在 this tutorial 中所解释的那样,我首先编写了一个基本的插件。之后我更改了 AddIn 以满足我的需要。这就是我最终获得 class 实现的接口的标记值(注释)的方式:
第一步: 在代码生成模板中,我获得了 class 实现的所有接口并将它们传递给我的 AddIn:
$interfaces=%list="ClassInterface" @separator=", "%
%EXEC_ADD_IN("MyAddin","getInterfaceTags", $interfaces)%
第二步: 如记录 here 存储库对象与 EXEC_ADD_IN 调用一起传递。我使用存储库对象并使用 $interfaces 中包含的名称查询所有接口。然后我可以获得每个界面元素的标记值。为单个界面实现此目的的简单原型:
public Object getInterfaceTags(EA.Repository repo, Object args)
{
String[] interfaceNames = args as String[];
String firstInterfaceName = interfaceNames[0];
EA.Element interfaceElement = repo.GetElementsByQuery("Simple", firstInterfaceName).GetAt(0);
String tag = interfaceElement.TaggedValues.GetAt(0);
return interfaceElement.Name + " has tag value" + tag.Value;
}
我知道,有几个缺点,但这只是一个很可能永远不会成为生产代码的想法的简单概念证明。