Skip to content

Instantly share code, notes, and snippets.

@ZenLiuCN
Last active August 26, 2024 08:55
Show Gist options
  • Save ZenLiuCN/9b4605b3c13417d6b4363b919f394bf9 to your computer and use it in GitHub Desktop.
Save ZenLiuCN/9b4605b3c13417d6b4363b919f394bf9 to your computer and use it in GitHub Desktop.
VertX templates
<templateSet group="VertX">
<template name="ieEntity" value=" record $name$(&#10; $CTX$ ctx,&#10; io.vertx.sqlclient.SqlConnection tx,&#10; $ELE$X.DataJson data&#10; ) implements Entities&lt;$ELE$, $ELE$X.DataJson, $name$&gt; {&#10; static $name$ of( $CTX$ ctx,&#10; io.vertx.sqlclient.SqlConnection tx,&#10; $ELE$X.DataJson data){&#10; return new $name$(ctx,tx,data);&#10; }&#10; @Override&#10; public $name$ $it() {&#10; return this;&#10; }&#10;&#10; @Override&#10; public java.util.function.Function&lt;$ELE$, $ELE$X.DataJson&gt; $toJson() {&#10; return $ELE$X::fromAsJson;&#10; }&#10;&#10; @Override&#10; public java.util.function.Function&lt;$ELE$X.DataJson, $name$&gt; $ctor() {&#10; return d -&gt; new $name$(ctx, tx, d);&#10; }&#10; }" description="Entity template" toReformat="true" toShortenFQNames="true">
<variable name="CTX" expression="completeSmart()" defaultValue="Context" alwaysStopAt="false" />
<variable name="ELE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="name" expression="camelCase(ELE)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieEntities" value="interface Entities&lt;&#10; E extends com.medtreehealth.vertx.api.Entity,&#10; J extends com.medtreehealth.vertx.api.util.CopyableX&lt;? extends E&gt; &amp; com.medtreehealth.vertx.api.util.XJsonData,&#10; XE extends Entities&lt;E, J, XE&gt;&#10; &gt; extends com.medtreehealth.vertx.api.util.XUnits.XEntityTransaction&lt;E, J, XE, $CTX$&gt; {&#10; &#9;&#10; }" description="units Entities" toReformat="true" toShortenFQNames="true">
<variable name="CTX" expression="completeSmart()" defaultValue="Context" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieCtx" value="class Context extends $DOMAIN$UX&lt;io.vertx.sqlclient.Pool, Context&gt; implements com.medtreehealth.vertx.api.util.XUnits.XTransactional&lt;Context&gt;{&#10; @Override&#10; public Context itself() {&#10; return this;&#10; }&#10;}" description="units context" toReformat="true" toShortenFQNames="true">
<variable name="DOMAIN" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defSys" value="@com.medtreehealth.vertx.api.util.annotation.VertX(withProxy = true)&#10;@com.medtreehealth.vertx.api.util.annotation.UnitsX(&#10; stores = {},&#10; abilityProviders = {},&#10; auditor = &quot;$END$::$MODULE$&quot;,&#10; notifiers = {},&#10; listeners = {}&#10;)&#10;public interface $NAME$ extends Sys&#10;{&#10; org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger($NAME$.class);&#10; @Override&#10; default Class&lt;? extends Sys&gt; type() {&#10; return $NAME$ .class;&#10; }&#10;&#10; @Override&#10; default List&lt;Class&lt;? extends Sys&gt;&gt; dependencies() {&#10; return java.util.List.of(com.medtreehealth.services.foundation.api.user.Users.class, com.medtreehealth.services.foundation.api.audit.Auditor.class);&#10; }&#10;}&#10;" description="system template" toReformat="true" toShortenFQNames="true">
<variable name="MODULE" expression="camelCase(NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defErrors" value="@com.medtreehealth.vertx.api.util.ErrorX.Errors&#10;public interface Errors {&#10; ErrorX.Define STATUS_CONFLICT = ErrorX.Define.CODE_CONFLICT(&quot;状态冲突,请检查重试&quot;);&#10;}" description="errors template" toReformat="true" toShortenFQNames="true">
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defRecord" value="@com.medtreehealth.vertx.api.util.annotation.VertX(table = &quot;$PRE$_rec_$tab$&quot;)&#10;public interface $NAME$ extends com.medtreehealth.vertx.api.Rec, com.medtreehealth.vertx.api.Entity,$END${&#10; @Override&#10; default Class&lt;? extends com.medtreehealth.vertx.api.Rec&gt; type() {&#10; return $NAME$.class;&#10; }&#10;}" description="Record element template" toReformat="true" toShortenFQNames="true">
<variable name="PRE" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="tab" expression="snakeCase(NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defEvent" value="@com.medtreehealth.vertx.api.util.annotation.VertX(withRow = false, withOutCodec = true, eventAddress = &quot;$ADDRESS$&quot;)&#10;public interface $NAME$ extends com.medtreehealth.vertx.api.Event {&#10; @Override&#10; default Class&lt;? extends $NAME$&gt; type() {&#10; return $NAME$.class;&#10; }&#10;&#10; int KIND_EVENT_SAMPLE = 0;&#10;&#10;}" description="event template" toReformat="true" toShortenFQNames="true">
<variable name="ADDRESS" expression="" defaultValue="domain::event-address" alwaysStopAt="true" />
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defAble" value="@com.medtreehealth.vertx.api.util.annotation.VertX(table = &quot;$PRE$_able_$TABLE$&quot;, provider = true, providerAssignPayload = $REGISTER_VALUE$.class)&#10;public interface $NAME$ extends com.medtreehealth.vertx.api.Ability, com.medtreehealth.vertx.api.Entity,$END$ {&#10; @Override&#10; default Class&lt;? extends $NAME$&gt; type() {&#10; return $NAME$.class;&#10; }&#10; @Override&#10; long user();&#10;&#10;}" description="Ablitity template" toReformat="true" toShortenFQNames="true">
<variable name="PRE" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="TABLE" expression="snakeCase(NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="REGISTER_VALUE" expression="concat(&quot;Register.&quot;,NAME,&quot;Register&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="defValue" value="&#10;@com.medtreehealth.vertx.api.util.annotation.VertX(withRow = false, validate = true)&#10;public interface $NAME$ extends com.medtreehealth.vertx.api.Element, com.medtreehealth.vertx.api.util.ValidX.Validatable&lt; $NAME$&gt; {&#10; @Override&#10; default Class&lt;? extends $NAME$&gt; type() {&#10; return $NAME$.class;&#10; }&#10;&#10;&#10;&#10; @ValidX.Validate(code = 1, rule = &quot;::phoneCN&quot;, message = &quot;手机号错误&quot;)&#10; String sample1();&#10;&#10;&#10; @ValidX.Validate(code = 2, rule = &quot;::notBlank&quot;, message = &quot;名字无效&quot;)&#10; String sample2();&#10;&#10;}&#10;" description="Value with validation" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieVerticle" value="@lombok.extern.slf4j.Slf4j&#10;@lombok.experimental.Accessors(fluent = true)&#10;public class $NAME$ extends com.medtreehealth.vertx.core.verticle.VerticleX.SingularMySQLProxiesBinder&lt;$DOMAIN$&gt; implements VerticleX.ReDeployable {&#10;&#10; public $NAME$(@lombok.NonNull io.vertx.core.json.JsonObject config) {&#10; super(&quot;$config$&quot;, config);&#10; log.info(&quot;launching {}&quot;, this.getClass());&#10; }&#10;&#10; @Override&#10; protected $DOMAIN$ system() {&#10; return new $DOMAIN$Impl(&#10; vertx,&#10; sql(),&#10; dialect(),&#10; conf().value()&#10; $END$&#10; );&#10; }&#10;}" description="Verticle template" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<variable name="DOMAIN" expression="groovyScript(&quot;_1.minus('Verticle')&quot;,NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="config" expression="camelCase(DOMAIN)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ddlMySQLTable" value="CREATE TABLE IF NOT EXISTS $TABLE$_$KIND$_$MODULE$&#10;(&#10; id bigint auto_increment not null primary key comment '系统ID',&#10;&#10;&#9;$END$&#10;&#10;&#10; version integer default 0 comment '系统数据版本',&#10; removed bit(1) default b'0' comment '系统删除',&#10; create_by bigint default -1 comment '系统创建操作用户',&#10; create_at timestamp default CURRENT_TIMESTAMP comment '系统创建时间',&#10; modified_at timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '系统更新时间',&#10; modified_by bigint default -1 comment '系统创建操作用户',&#10; index idx_$TABLE$_$KIND$_$MODULE$_sys_version (removed, version)&#10;) comment '$PROJECT$:$DOMAIN$:$NAME$';" description="MySQL DDL table" toReformat="true" toShortenFQNames="true">
<variable name="TABLE" expression="groovyScript(&quot;_1.minus('.ddl.mysql')&quot;,fileNameWithoutExtension())" defaultValue="" alwaysStopAt="false" />
<variable name="KIND" expression="enum(&quot;able&quot;,&quot;actor&quot;,&quot;rec&quot;)" defaultValue="" alwaysStopAt="true" />
<variable name="MODULE" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="PROJECT" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="DOMAIN" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ieUT" value="import cn.zenliu.units.error.DomainError;&#10;import com.medtreehealth.services.foundation.api.audit.Auditor;&#10;import com.medtreehealth.services.foundation.api.user.Users;&#10;import com.medtreehealth.services.foundation.api.user.actor.User;&#10;import com.medtreehealth.services.foundation.api.user.actor.UserX;&#10;import com.medtreehealth.vertx.api.util.AssertX;&#10;import com.medtreehealth.vertx.api.util.ErrorX;&#10;import com.medtreehealth.vertx.api.util.XJsonData;&#10;import io.vertx.core.Future;&#10;import io.vertx.core.Vertx;&#10;import io.vertx.core.json.Json;&#10;import io.vertx.core.json.JsonArray;&#10;import io.vertx.core.json.JsonObject;&#10;import io.vertx.junit5.VertxExtension;&#10;import io.vertx.junit5.VertxTestContext;&#10;import io.vertx.sqlclient.Pool;&#10;import lombok.extern.slf4j.Slf4j;&#10;import org.jooq.lambda.Seq;&#10;import org.junit.jupiter.api.*;&#10;import org.junit.jupiter.api.extension.ExtendWith;&#10;import org.mockito.ArgumentCaptor;&#10;import org.mockito.Captor;&#10;import org.mockito.Mock;&#10;import org.mockito.MockitoAnnotations;&#10;import org.mockito.junit.jupiter.MockitoExtension;&#10;&#10;import java.time.Instant;&#10;import java.time.temporal.ChronoUnit;&#10;import java.util.Objects;&#10;import java.util.Optional;&#10;import java.util.concurrent.atomic.AtomicReference;&#10;import java.util.stream.Collectors;&#10;import java.util.stream.Stream;&#10;&#10;import static com.medtreehealth.vertx.api.util.FuncX.accept;&#10;import static com.medtreehealth.vertx.api.util.FuncX.required;&#10;import static com.medtreehealth.vertx.api.util.TupleX.*;&#10;&#10;import static org.junit.jupiter.api.Assertions.*;&#10;import static org.mockito.ArgumentMatchers.*;&#10;import static org.mockito.Mockito.when;&#10;&#10;&#10;@ExtendWith({VertxExtension.class, MockitoExtension.class})&#10;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)&#10;@TestInstance(TestInstance.Lifecycle.PER_CLASS)&#10;@Slf4j&#10;class $NAME$ {&#10; interface Data {&#10; UserX.DataJson user = new UserX.DataJson().id(1L).version(0);&#10; JsonArray userX = JsonArray.of(&quot;removed&quot;,&quot;version&quot;, &quot;id&quot;);&#10; }&#10;&#10; @Test&#10; @Order(1)&#10; void sample(Vertx vertx, VertxTestContext vtc) {&#10; var sys = factory(vertx);&#10; vtc.assertComplete(Future.succeededFuture())&#10; .flatMap(AssertX.expectEquals($ -&gt; Future.succeededFuture(Data.user), () -&gt; Data.user, Data.userX))&#10; .onComplete(r -&gt; {&#10; if (r.failed()) vtc.failNow(r.cause());&#10; vtc.completeNow();&#10; });&#10; }&#10;&#10; //region Tools&#10; Pool sql;&#10; Auditor auditor;&#10; @Mock&#10; Users users;&#10; AutoCloseable mockCloser;&#10;&#10; @BeforeAll&#10; void setup(Vertx vertx, VertxTestContext vtc) {&#10; System.out.println(&quot;before all&quot;);&#10; mockCloser = MockitoAnnotations.openMocks(this);&#10; // mockito&#10;&#10; //data-source&#10; sql = io.vertx.mysqlclient.MySQLBuilder.pool().using(vertx)&#10; .connectingTo(&quot;mysql://root:root@127.0.0.1:3306/sample?serverTimezone=UTC&quot;)&#10; .build();&#10; auditor = Auditor.EVENT_LOGGING_AUDITOR.apply(vertx);&#10;&#10; sql.query(Stream.of(&#10; //TABLE names of storage&#10; SampleX.XStore.ITable.TABLE_NAME&#10; ,Sample2X.XStore.ITable.TABLE_NAME&#10; ).map(t -&gt; &quot;TRUNCATE TABLE &quot; + t).collect(Collectors.joining(&quot;;&quot;)))&#10; .execute()&#10; .transform(AssertX.executeDDL(vertx, sql, &quot;$END$.ddl.mysql.sql&quot;, false))&#10; .onComplete(vtc.succeedingThenComplete());&#10;&#10;&#10; }&#10;&#10; @AfterAll&#10; void teardown(VertxTestContext vtc) throws Exception {&#10; mockCloser.close();&#10; if (sql != null)&#10; sql.close().onComplete(vtc.succeedingThenComplete());&#10; }&#10; volatile $DOMAIN$ sys;&#10; final Object lock=new Object();&#10; $DOMAIN$ factory(Vertx vertx) {&#10; if(sys==null){&#10; synchronized (lock){&#10; if(sys==null)&#10; sys= new $DOMAIN$Impl(vertx,&#10; sql,&#10; com.medtreehealth.vertx.api.util.xquery.XDialect.mysql(java.time.ZoneOffset.ofHours(8)),&#10; ((JsonObject) Json.decodeValue(&quot;{}&quot;))&#10; );&#10; }&#10; }&#10; return sys;&#10; }&#10; //endregion&#10;}&#10;&#10;" description="unit test for domain (file should named as DomainImplTest)" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<variable name="DOMAIN" expression="groovyScript(&quot;_1.minus('ImplTest')&quot;,NAME)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="apiAct" value="io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Register(User user, $REGISTER$ register, $ABLITY$ actor);&#10;io.vertx.core.Future&lt;Optional&lt;$TYPE$&gt;&gt; $NAME$Of(com.medtreehealth.services.foundation.api.user.actor.User user);&#10;io.vertx.core.Future&lt;Optional&lt;$TYPE$&gt;&gt; $NAME$OfId(long id);&#10;io.vertx.core.Future&lt;Void&gt; $NAME$Drop($TYPE$ $NAME$,@org.jetbrains.annotations.Nullable $DROP_INFO$ payload,$ABLITY$ actor);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Update($END$,com.medtreehealth.vertx.api.Entry $NAME$, $ABLITY$ actor);&#10;" description="common api for actor or ablitiy" toReformat="true" toShortenFQNames="true" useStaticImport="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="true" />
<variable name="REGISTER" expression="completeSmart()" defaultValue="JsonObject" alwaysStopAt="true" />
<variable name="DROP_INFO" expression="completeSmart()" defaultValue="JsonObject" alwaysStopAt="true" />
<variable name="ABLITY" expression="completeSmart()" defaultValue=" com.medtreehealth.services.foundation.api.user.actor.User" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="apiRec" value="io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Register($REGISTER$ register, $ABLITY$ actor);&#10;io.vertx.core.Future&lt;Optional&lt;$TYPE$&gt;&gt; $NAME$OfId(long id);&#10;io.vertx.core.Future&lt;Void&gt; $NAME$Drop(com.medtreehealth.vertx.api.Entry $NAME$, $DROP_INFO$ payload, $ABLITY$ actor);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Update($END$,com.medtreehealth.vertx.api.Entry $NAME$, $ABLITY$ actor);" description="common api for record" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="true" />
<variable name="REGISTER" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="ABLITY" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="DROP_INFO" expression="completeSmart()" defaultValue="JsonObject" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="apiPublish" value="io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Register($REGISTER$ register, $ABLITY$ actor);&#10;io.vertx.core.Future&lt;Optional&lt;$TYPE$&gt;&gt; $NAME$OfId(long id);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Revoke(com.medtreehealth.vertx.api.Entry $NAME$ , $ABLITY$ actor);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Update($END$,com.medtreehealth.vertx.api.Entry $NAME$ , $ABLITY$ actor);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Publish(com.medtreehealth.vertx.api.Entry $NAME$ , $ABLITY$ actor);&#10;io.vertx.core.Future&lt;$TYPE$&gt; $NAME$CancelPublish(com.medtreehealth.vertx.api.Entry $NAME$ , $ABLITY$ actor);&#10;io.vertx.core.Future&lt;Void&gt; $NAME$Drop(com.medtreehealth.vertx.api.Entry $NAME$ , $ABLITY$ actor);" description="Publishable trait common api for record or actor or ablity" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="false" />
<variable name="REGISTER" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="ABLITY" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="pomVerticle" value=" &lt;properties&gt;&#10; &lt;module.name&gt;mth.services.vertx.$END$.verticle&lt;/module.name&gt;&#10; &lt;/properties&gt;&#10; &lt;artifactId&gt;$PREFIX$-verticle&lt;/artifactId&gt;&#10; &lt;dependencies&gt;&#10; &lt;dependency&gt;&#10; &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;&#10; &lt;artifactId&gt;$PREFIX$-api&lt;/artifactId&gt;&#10; &lt;/dependency&gt;&#10; &lt;dependency&gt;&#10; &lt;groupId&gt;com.medtreehealth.vertx&lt;/groupId&gt;&#10; &lt;artifactId&gt;core&lt;/artifactId&gt;&#10; &lt;/dependency&gt;&#10;&#10; &lt;dependency&gt;&#10; &lt;groupId&gt;io.vertx&lt;/groupId&gt;&#10; &lt;artifactId&gt;vertx-mysql-client&lt;/artifactId&gt;&#10; &lt;/dependency&gt;&#10; &lt;/dependencies&gt;" shortcut="ENTER" description="verticle pom" toReformat="true" toShortenFQNames="true">
<variable name="PREFIX" expression="complete()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="MAVEN" value="true" />
</context>
</template>
<template name="pomApi" value=" &lt;properties&gt;&#10; &lt;module.name&gt;mth.services.vertx.$END$.api&lt;/module.name&gt;&#10; &lt;/properties&gt;&#10; &lt;artifactId&gt;$PREFIX$-api&lt;/artifactId&gt;&#10;&#10; &lt;dependencies&gt;&#10; &lt;dependency&gt;&#10; &lt;groupId&gt;com.medtreehealth.services&lt;/groupId&gt;&#10; &lt;artifactId&gt;foundation-api&lt;/artifactId&gt;&#10; &lt;/dependency&gt;&#10; &lt;/dependencies&gt;" shortcut="ENTER" description="pom segment for api" toReformat="true" toShortenFQNames="true">
<variable name="PREFIX" expression="complete()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="MAVEN" value="true" />
</context>
</template>
<template name="pomBom" value=" &lt;dependency&gt;&#10; &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;&#10; &lt;artifactId&gt;$PREFIX$-api&lt;/artifactId&gt;&#10; &lt;version&gt;${project.version}&lt;/version&gt;&#10; &lt;/dependency&gt;&#10; &lt;dependency&gt;&#10; &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;&#10; &lt;artifactId&gt;$PREFIX$-verticle&lt;/artifactId&gt;&#10; &lt;version&gt;${project.version}&lt;/version&gt;&#10; &lt;/dependency&gt;" shortcut="ENTER" description="pom bom segement for one module" toReformat="true" toShortenFQNames="true">
<variable name="PREFIX" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="MAVEN" value="true" />
</context>
</template>
<template name="imStore" value="default $TYPE$X.XStore $NAME$() {&#10; return store($TYPE$X::store);&#10;}&#10;&#10;default $TYPE$X.XStore $NAME$(io.vertx.sqlclient.SqlConnection tx) {&#10; return tx==null?$NAME$():store((d, x) -&gt; $TYPE$X.store(d, tx));&#10;}" description="entity store segment" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieSys" value="public class $NAME$ extends com.medtreehealth.vertx.core.verticle.ServiceX.WareHouseX implements $TYPE$ {&#10; final $CTX$ ctx;&#10; @Override&#10; public io.vertx.core.Future&lt;Void&gt; dispose() {&#10; return ctx.dispose();&#10; }&#10; $NAME$(io.vertx.core.Vertx vertx, io.vertx.sqlclient.Pool sql, com.medtreehealth.vertx.api.util.xquery.XDialect dialect, io.vertx.core.json.JsonObject config) {&#10; super(vertx, sql, dialect);&#10; ctx = new $CTX$(dialect, sql, vertx&#10; ,$END$&#10; config, log);&#10; }&#10;}" description="sys implement" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<variable name="TYPE" expression="groovyScript(&quot;_1.minus('Impl')&quot;,NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="CTX" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieCtxErr" value="class Context extends $API$.$DOMAIN$&lt;Pool, Context&gt; implements com.medtreehealth.vertx.api.util.XUnits.XTransactional&lt;Context&gt; {&#10;&#10; final org.slf4j.Logger log;&#10; final $API$.util.ErrorsX errors;&#10;&#10; Context(XDialect dialect, Pool sql, Vertx vertx,&#10; $END$ JsonObject config, Logger log) {&#10; super(dialect, sql, vertx /*Todo*/);&#10; this.log = log;&#10; this.errors = ErrorsX.of(config, log);&#10; }&#10;&#10; @Override&#10; public Context itself() {&#10; return this;&#10; }&#10;}" description="units context with errors" toReformat="true" toShortenFQNames="true">
<variable name="DOMAIN" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="API" expression="groovyScript(&quot;return _1.substring(0,_1.lastIndexOf(File.separator)).replace('verticle','api').replace(File.separator,'.')&quot;,fileRelativePath())" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imEntFac" value="static io.vertx.core.Future&lt;$ENT$&gt; $ENT$($CTX$ cx, @Nullable io.vertx.sqlclient.SqlConnection tx, com.medtreehealth.vertx.api.Entry entry) {&#10; return cx.$ENT$(tx)&#10; .maybe(entry)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(cx.errors::$CODE$))&#10; .map(p-&gt;new $ENT$(cx,tx,$API$.util.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}&#10;static io.vertx.core.Future&lt;$ENT$&gt; $ENT$($CTX$ cx, @Nullable io.vertx.sqlclient.SqlConnection tx, long id) {&#10; return cx.$ENT$(tx)&#10; .maybe(id)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(cx.errors::$CODE$))&#10; .map(p-&gt;new $ENT$(cx,tx,$API$.util.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}" description="impl of entity factory segment" toReformat="true" toShortenFQNames="true">
<variable name="ENT" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="CTX" expression="completeSmart()" defaultValue="Context" alwaysStopAt="false" />
<variable name="CODE" expression="" defaultValue="notFound" alwaysStopAt="true" />
<variable name="ENTITY" expression="concat(capitalize(ENT),&quot;X&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="API" expression="groovyScript(&quot;_1.substring(0,_1.lastIndexOf(File.separator)).replace('verticle','api').replace(File.separator,'.')&quot;,fileRelativePath())" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imAsyncCacheID" value="$cache$=com.github.benmanes.caffeine.cache.Caffeine.from($SPEC$)&#10; .executor(exec) //!ExecutorX.ofVertxContext(vertx)&#10; .buildAsync((id, ex) -&gt; $name$().maybe(id)&#10; .map(v -&gt; v.map($TYPE$X::fromAsJson)&#10; .orElse(null))&#10; .toCompletionStage().toCompletableFuture());" description="caffiene Async Cache by ID" toReformat="true" toShortenFQNames="true">
<variable name="cache" expression="concat(name,&quot;s&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="SPEC" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="name" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="false" />
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_STATEMENT" value="true" />
</context>
</template>
<template name="imAsyncLoadEntity" value="io.vertx.core.Future&lt;java.util.Optional&lt;$TYPE$X.DataJson&gt;&gt; async$TYPE$(long id) {&#10; return io.vertx.core.Future.fromCompletionStage($CACHE$.get(id))&#10; .map(java.util.Optional::ofNullable);&#10;}&#10;&#10;io.vertx.core.Future&lt;java.util.Optional&lt;$TYPE$X.DataJson&gt;&gt; async$TYPE$(com.medtreehealth.vertx.api.Entry entry) {&#10; return async$TYPE$(entry.id())&#10; .map(v-&gt;v.filter(x-&gt;x.sameVersion(entry.version())));&#10;&#10;}" description="caffiene Async Cache load Vertx Future" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="CACHE" expression="concat(camelCase(TYPE),&quot;s&quot;)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imPublish" value="@Override&#10;public io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Revoke(Entry $NAME$, $ABLE$ man) {&#10; return ctx.audit$TYPE$RevokeOf($NAME$, man, cx -&gt; Entities.$LOAD$(cx, null, man)&#10; .flatMap(p -&gt; p.revoke$TYPE$($NAME$))&#10; );&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Update($ARGS$, Entry $NAME$, $ABLE$ man) {&#10; return ctx.audit$TYPE$UpdateOf($ARGS$, $NAME$, man, cx -&gt; Entities.$LOAD$(cx, null, man)&#10; .flatMap(p -&gt; p.update$TYPE$($ARGS$,$NAME$))&#10; );&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Publish(Entry $NAME$, $ABLE$ man) {&#10; return ctx.audit$TYPE$PublishOf(tenant, man, cx -&gt; Entities.$LOAD$(cx, null, man)&#10; .flatMap(p -&gt; p.publish$TYPE$($NAME$))&#10; );&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;$TYPE$&gt; $NAME$CancelPublish(Entry $NAME$, $ABLE$ man) {&#10; return ctx.audit$TYPE$CancelPublishOf($NAME$, man, cx -&gt; Entities.$LOAD$(cx, null, man)&#10; .flatMap(p -&gt; p.cancelPublish$TYPE$($NAME$))&#10; );&#10;}&#10;@Override&#10;public io.vertx.core.Future&lt;$TYPE$&gt; $NAME$Drop(Entry $NAME$, $ABLE$ man) {&#10; return ctx.audit$TYPE$DropOf($NAME$, man, cx -&gt; Entities.$LOAD$(cx, null, man)&#10; .flatMap(p -&gt; p.drop$TYPE$($NAME$))&#10; );&#10;}" description="Publishable method template" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="NAME" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="true" />
<variable name="ABLE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="LOAD" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="ARGS" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imAct" value="&#10;@Override&#10;public io.vertx.core.Future&lt;$T$&gt; $N$Register(com.medtreehealth.services.foundation.api.user.actor.User user, $R$ register, com.medtreehealth.services.foundation.api.user.actor.User actor) {&#10; return ctx.audit$T$RegisterOf(user,register,actor,cx-&gt;cx.register$T$(user,register,actor));&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;java.util.Optional&lt;$T$&gt;&gt; $N$Of(com.medtreehealth.services.foundation.api.user.actor.User user) {&#10; return ctx.$N$().maybe(t -&gt; t.user().eq(user.id()));&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;Void&gt; $N$Drop($T$ $N$, @org.jetbrains.annotations.Nullable io.vertx.core.json.JsonObject payload, com.medtreehealth.services.foundation.api.user.actor.User actor) {&#10; return ctx.audit$T$DropOf($N$,payload,actor,cx-&gt;cx.drop$T$($N$,payload,actor));&#10;}&#10;&#10;@Override&#10;public io.vertx.core.Future&lt;java.util.Optional&lt;$T$&gt;&gt; $N$OfId(long id) {&#10; return ctx.$N$().maybe(id);&#10;}" description="sys actor ablity methods implement" toReformat="true" toShortenFQNames="true">
<variable name="T" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="N" expression="camelCase(T)" defaultValue="" alwaysStopAt="false" />
<variable name="R" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imCacheWithLoad" value="&#10;final AsyncLoadingCache&lt;Long, $TYPE$X.DataJson&gt; $CACHE$=com.github.benmanes.caffeine.cache.Caffeine.from($CACHE$)&#10; .executor(exec) //ExecutorX.ofVertxContext(vertx) //! move code to conturctor&#10; .buildAsync((id, ex) -&gt; $name$().maybe(id)&#10; .map(v -&gt; v.map($TYPE$X::fromAsJson)&#10; .orElse(null))&#10; .toCompletionStage().toCompletableFuture());&#10;io.vertx.core.Future&lt;java.util.Optional&lt;$TYPE$X.DataJson&gt;&gt; async$TYPE$(long id) {&#10; return io.vertx.core.Future.fromCompletionStage($CACHE$.get(id))&#10; .map(java.util.Optional::ofNullable);;&#10;}&#10;&#10;io.vertx.core.Future&lt;java.util.Optional&lt;$TYPE$X.DataJson&gt;&gt; async$TYPE$(com.medtreehealth.vertx.api.Entry entry) {&#10; return async$TYPE$(entry.id())&#10; .map(v-&gt;v.filter(x-&gt;x.sameVersion(entry.version())));&#10;&#10;}" description="caffiene Async Cache load Vertx Future (also with Cache)" toReformat="true" toShortenFQNames="true">
<variable name="TYPE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="CACHE" expression="concat(name,&quot;s&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="name" expression="camelCase(TYPE)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ddlMySQLStatus" value="status tinyint not null default 0 comment '状态:0 草稿 1 发布 2 下架'" description="MySQL DDL Publishable" toReformat="true" toShortenFQNames="true">
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLProfile" value=" profile json null comment '档案'," description="MySQL DDL Profile" toReformat="true" toShortenFQNames="true">
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLConfigure" value="configure json not null comment '配置信息'," description="MySQL DDL Configure" toReformat="true" toShortenFQNames="true">
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLNameUnique" value="name varchar(64) not null unique comment '唯一名称',&#10;unique udx_$TABLE$_$KIND$_$MODULE$_name_unique (name, removed)," description="MySQL DDL Name.Unique" toReformat="true" toShortenFQNames="true">
<variable name="TABLE" expression="groovyScript(&quot;_1.minus('.ddl.mysql')&quot;,fileNameWithoutExtension())" defaultValue="" alwaysStopAt="false" />
<variable name="KIND" expression="enum(&quot;able&quot;,&quot;actor&quot;,&quot;rec&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="MODULE" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLRefer" value="$NAME$ bigint not null comment '$END$'," description="MySQL DDL Refer entity" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLFlag32" value="$NAME$ int not null default 0 comment 'FALG $END$'," description="MySQL DDL flag" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLFlag64" value="$NAME$ bigint not null default 0 comment 'FALG $END$'," description="MySQL DDL flag" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLBoolean" value=" $NAME$ bit(1) default b'$DEF$' comment '$END$'," description="MySQL DDL boolean" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="DEF" expression="enum(&quot;0&quot;,&quot;1&quot;)" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="ddlMySQLString" value="$NAME$ varchar($LEN$) not null comment '$END$',&#10;" description="MySQL DDL String" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
<variable name="LEN" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="SQL_CODE_MYSQL" value="true" />
</context>
</template>
<template name="defConfig" value="@com.medtreehealth.vertx.api.util.ConfigureX.Configure&#10;public interface Config {&#10; @com.medtreehealth.vertx.api.util.ConfigureX.DefaultEmpty&#10; String $OBJ_CACHES = &quot;caches&quot;;&#10; @com.medtreehealth.vertx.api.util.ConfigureX.DefaultValue(&quot;\&quot;initialCapacity=5,maximumSize=4096,expireAfterWrite=5m\&quot;&quot;)&#10;&#10;}" description="config template" toReformat="true" toShortenFQNames="true">
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieActor" value=" record $name$(&#10; $CTX$ ctx,&#10; io.vertx.sqlclient.SqlConnection tx,&#10; $ELE$X.DataJson data&#10; ) implements Entities&lt;$ELE$, $ELE$X.DataJson, $name$&gt; {&#10; static $name$ of( $CTX$ ctx,&#10; io.vertx.sqlclient.SqlConnection tx,&#10; $ELE$X.DataJson data){&#10; return new $name$(ctx,tx,data);&#10; }&#10; com.medtreehealth.vertx.api.Identified actor() {&#10; return data::user;&#10; }&#10;&#10; @Override&#10; public $name$ $it() {&#10; return this;&#10; }&#10;&#10; @Override&#10; public java.util.function.Function&lt;$ELE$, $ELE$X.DataJson&gt; $toJson() {&#10; return $ELE$X::fromAsJson;&#10; }&#10;&#10; @Override&#10; public java.util.function.Function&lt;$ELE$X.DataJson, $name$&gt; $ctor() {&#10; return d -&gt; new $name$(ctx, tx, d);&#10; }&#10; }" description="Actor or ability entity template" toReformat="true" toShortenFQNames="true">
<variable name="CTX" expression="completeSmart()" defaultValue="Context" alwaysStopAt="true" />
<variable name="ELE" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="name" expression="camelCase(ELE)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="iet" value="$API$" description="test for expand" toReformat="true" toShortenFQNames="true">
<variable name="API" expression="groovyScript(&quot;_1.substring(0,_1.lastIndexOf(File.separator)).replace('verticle','api').replace(File.separator,'.')&quot;,fileRelativePath())" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imCtxEntAbleFac" value="io.vertx.core.Future&lt;$ENT$&gt; $ENT$( @Nullable io.vertx.sqlclient.SqlConnection tx, com.medtreehealth.vertx.api.Entry entry) {&#10; return $ENT$(tx)&#10; .maybe(entry)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(errors::$CODE$))&#10; .map(p-&gt;new $ENT$(this,tx,$API$.ability.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}&#10;io.vertx.core.Future&lt;$ENT$&gt; $ENT$(@Nullable io.vertx.sqlclient.SqlConnection tx, long id) {&#10; return $ENT$(tx)&#10; .maybe(id)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(errors::$CODE$))&#10; .map(p-&gt;new $ENT$(this,tx,$API$.ability.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}" description="impl of able entity factory segment in Context" toReformat="true" toShortenFQNames="true">
<variable name="ENT" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="CODE" expression="completeSmart()" defaultValue="" alwaysStopAt="false" />
<variable name="ENTITY" expression="concat(capitalize(ENT),&quot;X&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="API" expression="groovyScript(&quot;_1.substring(0,_1.lastIndexOf(File.separator)).replace('verticle','api').replace(File.separator,'.')&quot;,fileRelativePath())" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="imCtxEntRecFac" value="io.vertx.core.Future&lt;$ENT$&gt; $ENT$( @Nullable io.vertx.sqlclient.SqlConnection tx, com.medtreehealth.vertx.api.Entry entry) {&#10; return $ENT$(tx)&#10; .maybe(entry)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(errors::$CODE$))&#10; .map(p-&gt;new $ENT$(this,tx,$API$.record.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}&#10;io.vertx.core.Future&lt;$ENT$&gt; $ENT$(@Nullable io.vertx.sqlclient.SqlConnection tx, long id) {&#10; return $ENT$(tx)&#10; .maybe(id)&#10; .map(com.medtreehealth.vertx.api.util.FuncX.required(errors::$CODE$))&#10; .map(p-&gt;new $ENT$(this,tx,$API$.record.$ENTITY$.fromAsJson(p)))&#10; ;&#10;}" description="impl of record entity factory segment in Context" toReformat="true" toShortenFQNames="true">
<variable name="ENT" expression="completeSmart()" defaultValue="" alwaysStopAt="true" />
<variable name="CODE" expression="completeSmart()" defaultValue="" alwaysStopAt="false" />
<variable name="ENTITY" expression="concat(capitalize(ENT),&quot;X&quot;)" defaultValue="" alwaysStopAt="false" />
<variable name="API" expression="groovyScript(&quot;_1.substring(0,_1.lastIndexOf(File.separator)).replace('verticle','api').replace(File.separator,'.')&quot;,fileRelativePath())" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
<template name="ieVerticleProxy" value="@lombok.extern.slf4j.Slf4j&#10;@lombok.experimental.Accessors(fluent = true)&#10;public class $NAME$ extends com.medtreehealth.vertx.core.verticle.VerticleX.SingularMySQLProxiesBinder&lt;$DOMAIN$&gt; implements&#10; com.medtreehealth.vertx.core.verticle.VerticleX.ReDeployable,&#10; com.medtreehealth.vertx.core.verticle.VerticleX.ProxyManager&#10;{&#10; @lombok.Getter&#10; final java.util.Map&lt;Class&lt;? extends com.medtreehealth.vertx.api.Sys&gt;, com.medtreehealth.vertx.api.Sys&gt; proxies = new java.util.HashMap&lt;&gt;();&#10; public $NAME$(@lombok.NonNull io.vertx.core.json.JsonObject config) {&#10; super(&quot;$config$&quot;, config);&#10; log.info(&quot;launching {}&quot;, this.getClass());&#10; }&#10;&#10; @Override&#10; protected $DOMAIN$ system() {&#10; return new $DOMAIN$Impl(&#10; vertx,&#10; sql(),&#10; dialect(),&#10; conf().value(),&#10; proxy($END$)&#10; );&#10; }&#10;}" description="Verticle with proxy manager template" toReformat="true" toShortenFQNames="true">
<variable name="NAME" expression="fileNameWithoutExtension()" defaultValue="" alwaysStopAt="false" />
<variable name="DOMAIN" expression="groovyScript(&quot;_1.minus('Verticle')&quot;,NAME)" defaultValue="" alwaysStopAt="false" />
<variable name="config" expression="camelCase(DOMAIN)" defaultValue="" alwaysStopAt="false" />
<context>
<option name="JAVA_DECLARATION" value="true" />
</context>
</template>
</templateSet>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment