ELWrapper.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package com.yomahub.liteflow.builder.el;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.yomahub.liteflow.util.JsonUtil;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7. import java.util.Map;
  8. /**
  9. * ELWrapper是所有组件的抽象父类
  10. * 定义所有EL表达式的公有变量 tag、id、data、maxWaitSeconds 以及 子表达式列表 ELWrapperList
  11. *
  12. * @author gezuao
  13. * @since 2.11.1
  14. */
  15. public abstract class ELWrapper {
  16. private final List<ELWrapper> elWrapperList = new ArrayList<>();
  17. private String tag;
  18. private String id;
  19. private String dataName;
  20. private String data;
  21. private Integer maxWaitSeconds;
  22. protected void addWrapper(ELWrapper wrapper){
  23. this.elWrapperList.add(wrapper);
  24. }
  25. protected void addWrapper(ELWrapper... wrappers){
  26. this.elWrapperList.addAll(Arrays.asList(wrappers));
  27. }
  28. protected void addWrapper(ELWrapper wrapper, int index){
  29. this.elWrapperList.add(index, wrapper);
  30. }
  31. protected void setWrapper(ELWrapper wrapper, int index){
  32. this.elWrapperList.set(index, wrapper);
  33. }
  34. protected ELWrapper getFirstWrapper(){
  35. return this.elWrapperList.get(0);
  36. }
  37. protected List<ELWrapper> getElWrapperList(){
  38. return this.elWrapperList;
  39. }
  40. protected void setTag(String tag){
  41. this.tag = tag;
  42. }
  43. protected String getTag(){
  44. return this.tag;
  45. }
  46. protected void setId(String id){
  47. this.id = id;
  48. }
  49. protected String getId(){
  50. return this.id;
  51. }
  52. protected void setData(String data){
  53. this.data = data;
  54. }
  55. protected String getData(){
  56. return this.data;
  57. }
  58. protected void setDataName(String dataName){
  59. this.dataName = dataName;
  60. }
  61. protected String getDataName(){
  62. return this.dataName;
  63. }
  64. protected void setMaxWaitSeconds(Integer maxWaitSeconds){
  65. this.maxWaitSeconds = maxWaitSeconds;
  66. }
  67. protected Integer getMaxWaitSeconds(){
  68. return this.maxWaitSeconds;
  69. }
  70. /**
  71. * 设置组件标记内容
  72. *
  73. * @param tag 标记内容
  74. * @return {@link ELWrapper}
  75. */
  76. protected abstract ELWrapper tag(String tag);
  77. /**
  78. * 设置组件的id
  79. *
  80. * @param id 编号
  81. * @return {@link ELWrapper}
  82. */
  83. protected abstract ELWrapper id(String id);
  84. /**
  85. * 设置表达式data属性
  86. *
  87. * @param dataName 数据名称
  88. * @param object JavaBean
  89. * @return {@link ELWrapper}
  90. */
  91. protected ELWrapper data(String dataName, Object object){
  92. setData("'" + JsonUtil.toJsonString(object) + "'");
  93. setDataName(dataName);
  94. return this;
  95. }
  96. /**
  97. * 设置表达式data属性
  98. *
  99. * @param dataName 数据名称
  100. * @param jsonString JSON格式字符串
  101. * @return {@link ELWrapper}
  102. */
  103. protected ELWrapper data(String dataName, String jsonString){
  104. setData(jsonString);
  105. setDataName(dataName);
  106. return this;
  107. }
  108. /**
  109. * 设置data属性
  110. *
  111. * @param dataName 数据名称
  112. * @param jsonMap 键值映射
  113. * @return {@link ELWrapper}
  114. */
  115. protected ELWrapper data(String dataName, Map<String, Object> jsonMap){
  116. setData("'" + JsonUtil.toJsonString(jsonMap) + "'");
  117. setDataName(dataName);
  118. return this;
  119. }
  120. protected ELWrapper maxWaitSeconds(Integer maxWaitSeconds){
  121. setMaxWaitSeconds(maxWaitSeconds);
  122. return this;
  123. }
  124. /**
  125. * 非格式化输出EL表达式
  126. *
  127. * @return {@link String}
  128. */
  129. public String toEL(){
  130. StringBuilder paramContext = new StringBuilder();
  131. String elContext = toEL(null, paramContext);
  132. return paramContext.append(elContext).append(";").toString();
  133. }
  134. /**
  135. * 是否格式化输出树形结构的表达式
  136. *
  137. * @param format 格式
  138. * @return {@link String}
  139. */
  140. public String toEL(boolean format){
  141. StringBuilder paramContext = new StringBuilder();
  142. String elContext;
  143. if(!format){
  144. elContext = toEL(null, paramContext);
  145. } else {
  146. elContext = toEL(0, paramContext);
  147. }
  148. return paramContext.append(elContext).append(";").toString();
  149. }
  150. /**
  151. * 格式化输出EL表达式
  152. *
  153. * @param depth 深度
  154. * @param paramContext 参数上下文,用于输出data参数内容
  155. * @return {@link String}
  156. */
  157. protected abstract String toEL(Integer depth, StringBuilder paramContext);
  158. /**
  159. * 处理EL表达式的共有属性
  160. *
  161. * @param elContext EL表达式上下文
  162. * @param paramContext 参数上下文
  163. */
  164. protected void processWrapperProperty(StringBuilder elContext, StringBuilder paramContext){
  165. if(this.getId() != null){
  166. elContext.append(StrUtil.format(".id(\"{}\")", this.getId()));
  167. }
  168. if(this.getTag() != null){
  169. elContext.append(StrUtil.format(".tag(\"{}\")", this.getTag()));
  170. }
  171. if(this.getMaxWaitSeconds() != null){
  172. elContext.append(StrUtil.format(".maxWaitSeconds({})", String.valueOf(this.getMaxWaitSeconds())));
  173. }
  174. }
  175. /**
  176. * 处理格式化输出 EL表达式换行符
  177. *
  178. * @param elContext EL 上下文
  179. * @param depth 深度
  180. */
  181. protected void processWrapperNewLine(StringBuilder elContext, Integer depth){
  182. if(depth != null){
  183. elContext.append("\n");
  184. }
  185. }
  186. /**
  187. * 处理格式化输出 EL表达式制表符
  188. *
  189. * @param elContext EL 上下文
  190. * @param depth 深度
  191. */
  192. protected void processWrapperTabs(StringBuilder elContext, Integer depth){
  193. if(depth != null) {
  194. elContext.append(StrUtil.repeat(ELBus.TAB, depth));
  195. }
  196. }
  197. /**
  198. * 检查子表达式是否有最长等待秒数定义
  199. */
  200. protected void checkMaxWaitSeconds(){
  201. for(ELWrapper sonElWrapper : this.getElWrapperList()){
  202. if(sonElWrapper != null && sonElWrapper.getMaxWaitSeconds() != null){
  203. throw new IllegalArgumentException("maxWaitSeconds必须定义在完整的语义之后!");
  204. }
  205. }
  206. }
  207. }