📄 javasrcmodeldigester.java
字号:
}
private void generateBSFEngineCode(CodeBlock block, BSFEngineDescriptor desc) {
Field bsfManagerField = new Field("bsfManager");
bsfManagerField.setType("org.apache.bsf.BSFManager");
bsfManagerField.setValue("new org.apache.bsf.BSFManager()");
block.addFragment(bsfManagerField);
StringBuffer buf = new StringBuffer();
buf.append("org.apache.bsf.BSFManager.registerScriptingEngine(\"")
.append(desc.getLanguage())
.append("\", \"")
.append(desc.getEngineClassName())
.append("\", new String[] {");
for (Iterator iterator = desc.getExtensions().iterator(); iterator.hasNext(); ) {
String ext = (String) iterator.next();
buf.append("\"").append(ext).append("\"");
if (iterator.hasNext())
buf.append(", ");
}
buf.append("});");
block.addFragment(new CodeLine(buf.toString()));
}
}
private class DecisionFlowletNode extends FlowStructureModelDigester.DecisionFlowletNode {
public DecisionFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
if (isVisited())
return;
DecisionFlowletBind flowletBind = (DecisionFlowletBind)getFlowletBind();
IfThenElse ifThenElse = new IfThenElse();
ifThenElse.setBooleanStatement(
decisionStmntCompl.completeStatement(flowletBind.getLabel().getText(), "dictionary"));
((JavaSrcVisitor)visitor).getCodeBlock().addFragment(ifThenElse);
createJavadoc(flowletBind);
setVisited(true);
// true block
((JavaSrcVisitor)visitor).setCodeBlock(ifThenElse.getTrueBlock());
if (getFollowingTrueFlowletNode() != null)
getFollowingTrueFlowletNode().visit(visitor);
// false block
((JavaSrcVisitor)visitor).setCodeBlock(ifThenElse.getFalseBlock());
if (getFollowingFalseFlowletNode() != null)
getFollowingFalseFlowletNode().visit(visitor);
}
private void createJavadoc(DecisionFlowletBind flowletBind) {
if (flowletBind.getDescription() == null)
return;
JavadocBlock javadoc = javaFile.getJavaClass().getJavadoc();
JavadocBlock.XDocletTag xdTag = javadoc.new XDocletTag(FLOW4J_XDOCLET_PREFIX + "decision-flowlet");
javadoc.addTag(xdTag);
xdTag.addParam("name", flowletBind.getDescription());
StringBuffer buf =
new StringBuffer(flowletBind.getLabel().getText());
int i = buf.toString().indexOf("\"");
while (i > -1) {
buf.replace(i, i + 1, """);
i = buf.toString().indexOf("\"");
}
xdTag.addParam("statement", buf.toString());
}
}
private class CallFlowletNode extends FlowStructureModelDigester.CallFlowletNode {
public CallFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
if (isVisited())
return;
CallFlowletBind flowletBind = (CallFlowletBind)getFlowletBind();
String flowStart = flowletBind.getLabel().getText();
addExecuteFlowCode(((JavaSrcVisitor)visitor).getCodeBlock(), getFlowModelBind().getFlowName(), flowStart);
setVisited(true);
super.visit(visitor);
}
}
/**
* Adds the code that executes a flow. If it is the same flow then the right start method
* is called directly in thios flow, otherwise the FlowManger is asked to execute the other flow
* @param codeBlock the code block where the java code will be inserted
* @param thisFlowName the name of the current flow
* @param flowStart the other flow's name and startFlowlet name
*/
private void addExecuteFlowCode(CodeBlock codeBlock, String thisFlowName, String flowStart) {
StringTokenizer tokenizer = new StringTokenizer(flowStart, Flow4JRuntimeConsts.FLOW_START_DELIMITER);
boolean bool = tokenizer.countTokens() == 2;
if (bool) {
String flowName = tokenizer.nextToken();
String startFlowletName = tokenizer.nextToken();
if (thisFlowName.equals(flowName)) {
// find start method name
String startMethodName = null;
for (Iterator iter = getStartFlowletNodes().iterator(); iter.hasNext();) {
IFlowNode startFlowletNode = (IFlowNode)iter.next();
StartFlowletBind startFlowletBind = (StartFlowletBind)((AbstractFlowletNode)startFlowletNode).getFlowletBind();
String startLabelText = startFlowletBind.getLabel().getText();
startMethodName = startFlowletBind.getId(flowModelBind) + "_" + startLabelText;
if (startLabelText.equals(startFlowletName))
break;
}
// direct call of the start method in this flow
codeBlock.addFragment(new CodeLine(startMethodName + "(dictionary);\t// " + flowStart));
}
else
bool = false;
}
if (! bool)
codeBlock.addFragment(
new CodeLine("FlowManager.executeFlow(\"" + flowStart
+ "\", dictionary);"));
}
private class JoinFlowletNode extends FlowStructureModelDigester.JoinFlowletNode {
Method method;
JoinFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
JoinFlowletBind flowletBind = (JoinFlowletBind)getFlowletBind();
CodeBlock codeBlock;
if (getPreviousFlowletNodes().size() != 1) {
if (!isVisited()) {
String methodName = flowletBind.getId(getFlowModelBind());
method = new Method(methodName);
method.addModifier(Consts.MODIFIER_STATIC);
method.addModifier(Consts.MODIFIER_PRIVATE);
method.addModifier(Consts.MODIFIER_FINAL);
method.addMethodParameter(new MethodParameter("FlowDictionary", "dictionary"));
javaFile.getJavaClass().addMethod(method);
}
((JavaSrcVisitor)visitor).getCodeBlock().addFragment(new CodeLine(method.getName() + "(dictionary);"));
((JavaSrcVisitor)visitor).setCodeBlock(method.getCodeBlock());
}
if (isVisited())
return;
setVisited(true);
super.visit(visitor);
}
}
private class JumpFlowletNode extends FlowStructureModelDigester.JumpFlowletNode {
public JumpFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
if (isVisited())
return;
JumpFlowletBind flowletBind = (JumpFlowletBind)getFlowletBind();
String flowStart = flowletBind.getLabel().getText();
addExecuteFlowCode(((JavaSrcVisitor)visitor).getCodeBlock(), getFlowModelBind().getFlowName(), flowStart);
setVisited(true);
super.visit(visitor);
}
}
private class TemplateFlowletNode extends FlowStructureModelDigester.TemplateFlowletNode {
public TemplateFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
if (isVisited())
return;
TemplateFlowletBind flowletBind = (TemplateFlowletBind)getFlowletBind();
String templateName = flowletBind.getLabel().getText();
((JavaSrcVisitor)visitor).getCodeBlock().addFragment(
new CodeLine("dictionary.put(Flow4JRuntimeConsts.DICT_KEY_TEMPLATE_NAME, \""
+ templateName + "\");"));
createJavadoc(flowletBind);
setVisited(true);
super.visit(visitor);
}
private void createJavadoc(TemplateFlowletBind flowletBind) {
if (flowletBind.getDescription() == null)
return;
JavadocBlock javadoc = javaFile.getJavaClass().getJavadoc();
JavadocBlock.XDocletTag xdTag = javadoc.new XDocletTag(FLOW4J_XDOCLET_PREFIX + "template-flowlet");
javadoc.addTag(xdTag);
xdTag.addParam("name", flowletBind.getDescription());
StringBuffer buf =
new StringBuffer(flowletBind.getLabel().getText());
int i = buf.toString().indexOf("\"");
while (i > -1) {
buf.replace(i, i + 1, """);
i = buf.toString().indexOf("\"");
}
xdTag.addParam("template", buf.toString());
}
}
private class EndFlowletNode extends FlowStructureModelDigester.EndFlowletNode {
public EndFlowletNode(IFlowletBind flowletBind, FlowModelBind flowModelBind) {
super(flowletBind, flowModelBind);
}
public void visit(IFlowVisitor visitor) {
if (isVisited())
return;
((JavaSrcVisitor)visitor).getCodeBlock().addFragment(new CodeLine("//\tflow ends here"));
setVisited(true);
super.visit(visitor);
}
}
/**
* @see net.orthanc.flow4j.model.IModelDigester#digest(net.orthanc.flow4j.model.bind.FlowModelBind)
*/
public void digest(FlowModelBind flowModelBind) {
this.flowModelBind = flowModelBind;
// flowName = flowModelBind.getFlowName();
Method getFlowNameMethod = new Method("getName");
getFlowNameMethod.addModifier(Consts.MODIFIER_PUBLIC);
getFlowNameMethod.addModifier(Consts.MODIFIER_FINAL);
getFlowNameMethod.setReturnType("String");
getFlowNameMethod.addToCodeBlock(new CodeLine("return \"" + flowModelBind.getFlowName() + "\";"));
javaFile.getJavaClass().addMethod(getFlowNameMethod);
super.digest(flowModelBind);
}
public void digestStartFlowlet(StartFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new StartFlowletNode(flowletBind, flowModelBind));
}
public void digestJavaTaskFlowlet(JavaTaskFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new JavaTaskFlowletNode(flowletBind, flowModelBind));
}
public void digestScriptTaskFlowlet(ScriptTaskFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new ScriptTaskFlowletNode(flowletBind, flowModelBind));
}
public void digestDecisionFlowlet(DecisionFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new DecisionFlowletNode(flowletBind, flowModelBind));
}
public void digestCallFlowlet(CallFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new CallFlowletNode(flowletBind, flowModelBind));
}
public void digestJoinFlowlet(JoinFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new JoinFlowletNode(flowletBind, flowModelBind));
}
public void digestJumpFlowlet(JumpFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new JumpFlowletNode(flowletBind, flowModelBind));
}
public void digestTemplateFlowlet(TemplateFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new TemplateFlowletNode(flowletBind, flowModelBind));
}
public void digestEndFlowlet(EndFlowletBind flowletBind, FlowModelBind flowModelBind) {
addFlowletNode(new EndFlowletNode(flowletBind, flowModelBind));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -