示例
SimpleBuf是一个协议,我们可以定义一些协议的配置,并可以用SimpleBuf代码生成动作生成相关的Java代码,本示例就是这个代码生成的动作。
动作编辑截图

如图代码生成的动作是由一系列的子动作来实现,子动作通常都是SelfAction,其中Begin的作用是把原先的变量self命名成其他变量名。
动作的XML代码
使用XML表示这个动作的代码如下:
<Begin name="run" descriptors="xworker.lang.actions.Actions/@ActionGroup" changeSelf="true" selfVarName="data" createLocalVarScope="true">
<actions>
<AttributeVarGetter name="setProjectPath" _xmeta_id_="setRootPath" thingVarName="data" ifVarAttribute="projectPathVar" varAttribute="projectPath" varName="projectPath"></AttributeVarGetter>
<AttributeVarGetter name="setRootPackage" thingVarName="data" ifVarAttribute="rootPackageVar" varAttribute="rootPackage" varName="rootPackage"></AttributeVarGetter>
<TextTemplate name="setJavaPath" _xmeta_id_="javaPath" descriptors="xworker.lang.text.TextTemplate" outputVarName="javaPath" templateCode="${projectPath}/src/${rootPackage?replace(".", "/")}"></TextTemplate>
<ThingCollection name="generateProtoclHandlerAll" label="所有协议列表" varName="things" thingPaths="${data.protocolThings?if_exists}" attributeTemplate="true"></ThingCollection>
<ThingCollection name="setOtherDataThings" varName="otherDataThings" thingPaths="${data.dataThings?if_exists}" attributeTemplate="true"></ThingCollection>
<Iterator name="generateProtocols" varName="thing" collectionName="things">
<ChildAction>
<Iterator label="生成协议模型" varName="dataThing">
<actions>
<GroovyAction name="getCollection">
<code><![CDATA[def things = [];
def req = thing.get("Request@0");
if(req != null){
things.add(req);
getChilds(req, things);
}
def res = thing.get("Response@0");
if(res != null){
things.add(res);
getChilds(res, things);
}
if(otherDataThings != null){
for(otherDataThing in otherDataThings){
things.add(otherDataThing);
getChilds(otherDataThing, things);
}
}
return things;
def addDataThing(thingPath, things){
def adInfo = world.getThing(thingPath);
if(adInfo != null){
things.add(adInfo);
getChilds(adInfo, things);
}
}
def getChilds(data, things){
for(child in data.getChilds()){
if((child.getThingName() == "array" && child.className != null && child.className != "") || (child.getThingName() == "If" && child.type == "ifclass" && child.className != null && child.className != "")){
things.add(child);
}
getChilds(child, things);
}
}]]></code>
</GroovyAction>
</actions>
<ChildAction>
<GroovyAction name="setRefThings">
<code><![CDATA[def refThings = [];
def context = [:];
for(child in dataThing.getChilds()){
initRefThings(child, refThings, context);
}
actionContext.getScope().put("refThings", refThings);
def initRefThings(thing, refThings, context){
if((thing.getThingName() == "array" && thing.className != null && thing.className != "") || (thing.getThingName() == "If" && thing.type == "ifclass" && thing.className != null && thing.className != "")){
def refThing = [:];
if(thing.className == null || thing.className == ""){
refThing.className = thing.refClass;
}else{
refThing.className = thing.className;
}
refThing.packagePath = thing.packagePath;
if(refThing.packagePath != null && refThing.packagePath != ""){
refThing.packagePath = refThing.packagePath + ".";
}
if(context.get(refThing.packagePath + "." + refThing.className) == null){
refThings.add(refThing)
context.put(refThing.packagePath + "." + refThing.className, refThing);
}
}
for(child in thing.getChilds()){
initRefThings(child, refThings, context);
}
}]]></code>
</GroovyAction>
<CodeGenerator name="generateProtocol" filePath="${javaPath}/protocol/model/<#if dataThing.packagePath?exists>${dataThing.packagePath?replace(".","/")}</#if>/${dataThing.className}.java" attributeTemplate="true">
<Contents>
<FreemarkerContent name="JavaModelCode" templatePath="xworker/protocol/simplebuf/ftl/protocol_dataJava.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
</ChildAction>
</Iterator>
<CodeGenerator name="generateHandler" label="生成协议处理器" type="once" filePath="${javaPath}/protocol/handler/${thing.className}Handler.java" attributeTemplate="true">
<Contents>
<FreemarkerContent name="handlerTempalte" _xmeta_id_="javaCode" templatePath="xworker/protocol/simplebuf/ftl/protocol_HandlerJava.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
</ChildAction>
</Iterator>
<CodeGenerator name="generateProtoclHandlerAll" _xmeta_id_="generateProtoclHandlerAll1" label="生成协议总Handler" filePath="${javaPath}/protocol/ProtocolHandler.java" attributeTemplate="true">
<Contents>
<FreemarkerContent name="handleTempalte" templatePath="xworker/protocol/simplebuf/ftl/protocol_HandlerMainJava.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
<CodeGenerator name="generateUserData" type="once" filePath="${javaPath}/protocol/UserData.java" attributeTemplate="true">
<Contents>
<FreemarkerContent templatePath="xworker/protocol/simplebuf/ftl/UserData_java.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
<CodeGenerator name="generateCodeable" type="once" filePath="${javaPath}/protocol/codec/Codeable.java" attributeTemplate="true">
<Contents>
<FreemarkerContent templatePath="xworker/protocol/simplebuf/ftl/Codeable_java.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
<CodeGenerator name="generateCoder" type="once" filePath="${javaPath}/protocol/codec/Coder.java" attributeTemplate="true">
<Contents>
<FreemarkerContent templatePath="xworker/protocol/simplebuf/ftl/Coder_java.ftl"></FreemarkerContent>
</Contents>
</CodeGenerator>
</actions>
</Begin>
Copyright © 2007-2014 XWorker.org 版权所有