/src/main/java/io/proleap/cobol/asg/metamodel/data/report/impl/ReportDescriptionImpl.java

https://github.com/uwol/proleap-cobol-parser · Java · 482 lines · 301 code · 93 blank · 88 comment · 68 complexity · dc3b984c97e164f5f9a012f11277f4d5 MD5 · raw file

  1. /*
  2. * Copyright (C) 2017, Ulrich Wolffgang <ulrich.wolffgang@proleap.io>
  3. * All rights reserved.
  4. *
  5. * This software may be modified and distributed under the terms
  6. * of the MIT license. See the LICENSE file for details.
  7. */
  8. package io.proleap.cobol.asg.metamodel.data.report.impl;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import io.proleap.cobol.CobolParser.ReportDescriptionContext;
  16. import io.proleap.cobol.CobolParser.ReportDescriptionEntryContext;
  17. import io.proleap.cobol.CobolParser.ReportGroupBlankWhenZeroClauseContext;
  18. import io.proleap.cobol.CobolParser.ReportGroupColumnNumberClauseContext;
  19. import io.proleap.cobol.CobolParser.ReportGroupDescriptionEntryContext;
  20. import io.proleap.cobol.CobolParser.ReportGroupDescriptionEntryFormat1Context;
  21. import io.proleap.cobol.CobolParser.ReportGroupDescriptionEntryFormat2Context;
  22. import io.proleap.cobol.CobolParser.ReportGroupDescriptionEntryFormat3Context;
  23. import io.proleap.cobol.CobolParser.ReportGroupIndicateClauseContext;
  24. import io.proleap.cobol.CobolParser.ReportGroupJustifiedClauseContext;
  25. import io.proleap.cobol.CobolParser.ReportGroupLineNumberClauseContext;
  26. import io.proleap.cobol.CobolParser.ReportGroupNextGroupClauseContext;
  27. import io.proleap.cobol.CobolParser.ReportGroupPictureClauseContext;
  28. import io.proleap.cobol.CobolParser.ReportGroupResetClauseContext;
  29. import io.proleap.cobol.CobolParser.ReportGroupSignClauseContext;
  30. import io.proleap.cobol.CobolParser.ReportGroupSourceClauseContext;
  31. import io.proleap.cobol.CobolParser.ReportGroupSumClauseContext;
  32. import io.proleap.cobol.CobolParser.ReportGroupTypeClauseContext;
  33. import io.proleap.cobol.CobolParser.ReportGroupUsageClauseContext;
  34. import io.proleap.cobol.CobolParser.ReportGroupValueClauseContext;
  35. import io.proleap.cobol.asg.metamodel.ProgramUnit;
  36. import io.proleap.cobol.asg.metamodel.call.ReportCall;
  37. import io.proleap.cobol.asg.metamodel.data.report.ReportDescription;
  38. import io.proleap.cobol.asg.metamodel.data.report.ReportDescriptionEntry;
  39. import io.proleap.cobol.asg.metamodel.data.report.ReportGroupDescriptionEntriesSymbolTableEntry;
  40. import io.proleap.cobol.asg.metamodel.data.report.ReportGroupDescriptionEntry;
  41. import io.proleap.cobol.asg.metamodel.data.report.ReportGroupDescriptionEntryPrintable;
  42. import io.proleap.cobol.asg.metamodel.data.report.ReportGroupDescriptionEntrySingle;
  43. import io.proleap.cobol.asg.metamodel.data.report.ReportGroupDescriptionEntryVertical;
  44. import io.proleap.cobol.asg.metamodel.impl.CobolDivisionElementImpl;
  45. import io.proleap.cobol.asg.util.AsgStringUtils;
  46. public class ReportDescriptionImpl extends CobolDivisionElementImpl implements ReportDescription {
  47. private final static Logger LOG = LoggerFactory.getLogger(ReportDescriptionImpl.class);
  48. protected List<ReportCall> calls = new ArrayList<ReportCall>();
  49. protected final ReportDescriptionContext ctx;
  50. protected String name;
  51. protected ReportDescriptionEntry reportDescriptionEntry;
  52. protected List<ReportGroupDescriptionEntry> reportGroupDescriptionEntries = new ArrayList<ReportGroupDescriptionEntry>();
  53. protected Map<String, ReportGroupDescriptionEntriesSymbolTableEntry> reportGroupDescriptionEntriesSymbolTable = new HashMap<String, ReportGroupDescriptionEntriesSymbolTableEntry>();
  54. public ReportDescriptionImpl(final String name, final ProgramUnit programUnit, final ReportDescriptionContext ctx) {
  55. super(programUnit, ctx);
  56. this.ctx = ctx;
  57. this.name = name;
  58. }
  59. @Override
  60. public void addCall(final ReportCall call) {
  61. calls.add(call);
  62. }
  63. @Override
  64. public ReportDescriptionEntry addReportDescriptionEntry(final ReportDescriptionEntryContext ctx) {
  65. ReportDescriptionEntry result = (ReportDescriptionEntry) getASGElement(ctx);
  66. if (result == null) {
  67. final String name = determineName(ctx.reportName());
  68. result = new ReportDescriptionEntryImpl(name, programUnit, ctx);
  69. /*
  70. * global
  71. */
  72. if (ctx.reportDescriptionGlobalClause() != null) {
  73. result.addGlobalClause(ctx.reportDescriptionGlobalClause());
  74. }
  75. /*
  76. * page limit
  77. */
  78. if (ctx.reportDescriptionPageLimitClause() != null) {
  79. result.addPageLimitClause(ctx.reportDescriptionPageLimitClause());
  80. }
  81. /*
  82. * heading
  83. */
  84. if (ctx.reportDescriptionHeadingClause() != null) {
  85. result.addHeadingClause(ctx.reportDescriptionHeadingClause());
  86. }
  87. /*
  88. * first detail
  89. */
  90. if (ctx.reportDescriptionFirstDetailClause() != null) {
  91. result.addFirstDetailClause(ctx.reportDescriptionFirstDetailClause());
  92. }
  93. /*
  94. * last detail
  95. */
  96. if (ctx.reportDescriptionLastDetailClause() != null) {
  97. result.addLastDetailClause(ctx.reportDescriptionLastDetailClause());
  98. }
  99. /*
  100. * heading
  101. */
  102. if (ctx.reportDescriptionFootingClause() != null) {
  103. result.addFootingClause(ctx.reportDescriptionFootingClause());
  104. }
  105. result.setReport(this);
  106. reportDescriptionEntry = result;
  107. registerASGElement(result);
  108. }
  109. return result;
  110. }
  111. @Override
  112. public ReportGroupDescriptionEntryPrintable addReportGroupDescriptionEntryPrintable(
  113. final ReportGroupDescriptionEntryFormat3Context ctx) {
  114. ReportGroupDescriptionEntryPrintable result = (ReportGroupDescriptionEntryPrintable) getASGElement(ctx);
  115. if (result == null) {
  116. final String name = determineName(ctx);
  117. result = new ReportGroupDescriptionEntryPrintableImpl(name, programUnit, ctx);
  118. /*
  119. * level number
  120. */
  121. final Integer levelNumber = AsgStringUtils.parseInteger(ctx.integerLiteral().getText());
  122. result.setLevelNumber(levelNumber);
  123. /*
  124. * picture
  125. */
  126. final List<ReportGroupPictureClauseContext> pictureClauseContexts = ctx.reportGroupPictureClause();
  127. if (!pictureClauseContexts.isEmpty()) {
  128. final ReportGroupPictureClauseContext pictureClauseContext = pictureClauseContexts.get(0);
  129. result.addPictureClause(pictureClauseContext);
  130. }
  131. /*
  132. * usage
  133. */
  134. final List<ReportGroupUsageClauseContext> usageClauseContexts = ctx.reportGroupUsageClause();
  135. if (!usageClauseContexts.isEmpty()) {
  136. final ReportGroupUsageClauseContext groupUsageClause = usageClauseContexts.get(0);
  137. result.addGroupUsageClause(groupUsageClause);
  138. }
  139. /*
  140. * sign
  141. */
  142. final List<ReportGroupSignClauseContext> signClauseContexts = ctx.reportGroupSignClause();
  143. if (!signClauseContexts.isEmpty()) {
  144. final ReportGroupSignClauseContext signClauseContext = signClauseContexts.get(0);
  145. result.addSignClause(signClauseContext);
  146. }
  147. /*
  148. * justified
  149. */
  150. final List<ReportGroupJustifiedClauseContext> justifiedClauseContexts = ctx.reportGroupJustifiedClause();
  151. if (!justifiedClauseContexts.isEmpty()) {
  152. final ReportGroupJustifiedClauseContext justifiedClauseContext = justifiedClauseContexts.get(0);
  153. result.addJustifiedClause(justifiedClauseContext);
  154. }
  155. /*
  156. * blank when zero
  157. */
  158. final List<ReportGroupBlankWhenZeroClauseContext> blankWhenZeroClauseContexts = ctx
  159. .reportGroupBlankWhenZeroClause();
  160. if (!blankWhenZeroClauseContexts.isEmpty()) {
  161. final ReportGroupBlankWhenZeroClauseContext blankWhenZeroClauseContext = blankWhenZeroClauseContexts
  162. .get(0);
  163. result.addBlankWhenZeroClause(blankWhenZeroClauseContext);
  164. }
  165. /*
  166. * line number
  167. */
  168. final List<ReportGroupLineNumberClauseContext> lineNumberClauseContexts = ctx.reportGroupLineNumberClause();
  169. if (!lineNumberClauseContexts.isEmpty()) {
  170. final ReportGroupLineNumberClauseContext lineNumberClauseContext = lineNumberClauseContexts.get(0);
  171. result.addLineNumberClause(lineNumberClauseContext);
  172. }
  173. /*
  174. * column number
  175. */
  176. final List<ReportGroupColumnNumberClauseContext> columnNumberClauseContexts = ctx
  177. .reportGroupColumnNumberClause();
  178. if (!columnNumberClauseContexts.isEmpty()) {
  179. final ReportGroupColumnNumberClauseContext columnNumberClauseContext = columnNumberClauseContexts
  180. .get(0);
  181. result.addColumnNumberClause(columnNumberClauseContext);
  182. }
  183. /*
  184. * source
  185. */
  186. final List<ReportGroupSourceClauseContext> sourceClauseContexts = ctx.reportGroupSourceClause();
  187. if (!sourceClauseContexts.isEmpty()) {
  188. final ReportGroupSourceClauseContext sourceClauseContext = sourceClauseContexts.get(0);
  189. result.addSourceClause(sourceClauseContext);
  190. }
  191. /*
  192. * value
  193. */
  194. final List<ReportGroupValueClauseContext> valueClauseContexts = ctx.reportGroupValueClause();
  195. if (!valueClauseContexts.isEmpty()) {
  196. final ReportGroupValueClauseContext valueClauseContext = valueClauseContexts.get(0);
  197. result.addValueClause(valueClauseContext);
  198. }
  199. /*
  200. * sum
  201. */
  202. final List<ReportGroupSumClauseContext> sumClauseContexts = ctx.reportGroupSumClause();
  203. if (!sumClauseContexts.isEmpty()) {
  204. final ReportGroupSumClauseContext sumClauseContext = sumClauseContexts.get(0);
  205. result.addSumClause(sumClauseContext);
  206. }
  207. /*
  208. * reset
  209. */
  210. final List<ReportGroupResetClauseContext> resetClauseContexts = ctx.reportGroupResetClause();
  211. if (!resetClauseContexts.isEmpty()) {
  212. final ReportGroupResetClauseContext resetClauseContext = resetClauseContexts.get(0);
  213. result.addResetClause(resetClauseContext);
  214. }
  215. /*
  216. * group indicate
  217. */
  218. final List<ReportGroupIndicateClauseContext> indicateClauseContexts = ctx.reportGroupIndicateClause();
  219. if (!indicateClauseContexts.isEmpty()) {
  220. final ReportGroupIndicateClauseContext indicateClauseContext = indicateClauseContexts.get(0);
  221. result.addGroupIndicateClause(indicateClauseContext);
  222. }
  223. reportGroupDescriptionEntries.add(result);
  224. assureReportGroupDescriptionEntriesSymbolTableEntry(name).addReportGroupDescriptionEntry(result);
  225. registerASGElement(result);
  226. }
  227. return result;
  228. }
  229. @Override
  230. public ReportGroupDescriptionEntrySingle addReportGroupDescriptionEntrySingle(
  231. final ReportGroupDescriptionEntryFormat2Context ctx) {
  232. ReportGroupDescriptionEntrySingle result = (ReportGroupDescriptionEntrySingle) getASGElement(ctx);
  233. if (result == null) {
  234. final String name = determineName(ctx);
  235. result = new ReportGroupDescriptionEntrySingleImpl(name, programUnit, ctx);
  236. /*
  237. * level number
  238. */
  239. final Integer levelNumber = AsgStringUtils.parseInteger(ctx.integerLiteral().getText());
  240. result.setLevelNumber(levelNumber);
  241. /*
  242. * line number
  243. */
  244. if (ctx.reportGroupLineNumberClause() != null) {
  245. final ReportGroupLineNumberClauseContext lineNumberClauseContext = ctx.reportGroupLineNumberClause();
  246. result.addLineNumberClause(lineNumberClauseContext);
  247. }
  248. /*
  249. * group usage
  250. */
  251. if (ctx.reportGroupUsageClause() != null) {
  252. final ReportGroupUsageClauseContext usageClauseContext = ctx.reportGroupUsageClause();
  253. result.addGroupUsageClause(usageClauseContext);
  254. }
  255. reportGroupDescriptionEntries.add(result);
  256. assureReportGroupDescriptionEntriesSymbolTableEntry(name).addReportGroupDescriptionEntry(result);
  257. registerASGElement(result);
  258. }
  259. return result;
  260. }
  261. @Override
  262. public ReportGroupDescriptionEntryVertical addReportGroupDescriptionEntryVertical(
  263. final ReportGroupDescriptionEntryFormat1Context ctx) {
  264. ReportGroupDescriptionEntryVertical result = (ReportGroupDescriptionEntryVertical) getASGElement(ctx);
  265. if (result == null) {
  266. final String name = determineName(ctx);
  267. result = new ReportGroupDescriptionEntryVerticalImpl(name, programUnit, ctx);
  268. /*
  269. * level number
  270. */
  271. final Integer levelNumber = AsgStringUtils.parseInteger(ctx.integerLiteral().getText());
  272. result.setLevelNumber(levelNumber);
  273. /*
  274. * line number
  275. */
  276. if (ctx.reportGroupLineNumberClause() != null) {
  277. final ReportGroupLineNumberClauseContext lineNumberClauseContext = ctx.reportGroupLineNumberClause();
  278. result.addLineNumberClause(lineNumberClauseContext);
  279. }
  280. /*
  281. * next group
  282. */
  283. if (ctx.reportGroupNextGroupClause() != null) {
  284. final ReportGroupNextGroupClauseContext nextGroupClause = ctx.reportGroupNextGroupClause();
  285. result.addNextGroupClause(nextGroupClause);
  286. }
  287. /*
  288. * type
  289. */
  290. if (ctx.reportGroupTypeClause() != null) {
  291. final ReportGroupTypeClauseContext typeClause = ctx.reportGroupTypeClause();
  292. result.addTypeClause(typeClause);
  293. }
  294. /*
  295. * usage
  296. */
  297. if (ctx.reportGroupUsageClause() != null) {
  298. final ReportGroupUsageClauseContext groupUsageClause = ctx.reportGroupUsageClause();
  299. result.addGroupUsageClause(groupUsageClause);
  300. }
  301. reportGroupDescriptionEntries.add(result);
  302. assureReportGroupDescriptionEntriesSymbolTableEntry(name).addReportGroupDescriptionEntry(result);
  303. registerASGElement(result);
  304. }
  305. return result;
  306. }
  307. protected ReportGroupDescriptionEntriesSymbolTableEntry assureReportGroupDescriptionEntriesSymbolTableEntry(
  308. final String name) {
  309. ReportGroupDescriptionEntriesSymbolTableEntry reportGroupDescriptionEntriesSymbolTableEntry = reportGroupDescriptionEntriesSymbolTable
  310. .get(getSymbol(name));
  311. if (reportGroupDescriptionEntriesSymbolTableEntry == null) {
  312. reportGroupDescriptionEntriesSymbolTableEntry = new ReportGroupDescriptionEntriesSymbolTableEntryImpl();
  313. reportGroupDescriptionEntriesSymbolTable.put(getSymbol(name),
  314. reportGroupDescriptionEntriesSymbolTableEntry);
  315. }
  316. return reportGroupDescriptionEntriesSymbolTableEntry;
  317. }
  318. @Override
  319. public ReportGroupDescriptionEntry createReportGroupDescriptionEntry(
  320. final ReportGroupDescriptionEntry lastReportGroupDescriptionEntry,
  321. final ReportGroupDescriptionEntryContext ctx) {
  322. final ReportGroupDescriptionEntry result;
  323. if (ctx.reportGroupDescriptionEntryFormat1() != null) {
  324. result = addReportGroupDescriptionEntryVertical(ctx.reportGroupDescriptionEntryFormat1());
  325. } else if (ctx.reportGroupDescriptionEntryFormat2() != null) {
  326. result = addReportGroupDescriptionEntrySingle(ctx.reportGroupDescriptionEntryFormat2());
  327. } else if (ctx.reportGroupDescriptionEntryFormat3() != null) {
  328. result = addReportGroupDescriptionEntryPrintable(ctx.reportGroupDescriptionEntryFormat3());
  329. } else {
  330. LOG.warn("unknown report description entry {}", ctx);
  331. result = null;
  332. }
  333. if (lastReportGroupDescriptionEntry != null && result != null) {
  334. groupReportGroupDescriptionEntry(lastReportGroupDescriptionEntry, result);
  335. }
  336. return result;
  337. }
  338. @Override
  339. public List<ReportCall> getCalls() {
  340. return calls;
  341. }
  342. @Override
  343. public String getName() {
  344. return name;
  345. }
  346. @Override
  347. public ReportDescriptionEntry getReportDescriptionEntry() {
  348. return reportDescriptionEntry;
  349. }
  350. @Override
  351. public List<ReportGroupDescriptionEntry> getReportGroupDescriptionEntries() {
  352. return reportGroupDescriptionEntries;
  353. }
  354. @Override
  355. public List<ReportGroupDescriptionEntry> getReportGroupDescriptionEntries(final String name) {
  356. return reportGroupDescriptionEntriesSymbolTable.get(getSymbol(name)) == null ? null
  357. : reportGroupDescriptionEntriesSymbolTable.get(getSymbol(name)).getReportGroupDescriptionEntries();
  358. }
  359. @Override
  360. public ReportGroupDescriptionEntry getReportGroupDescriptionEntry(final String name) {
  361. return reportGroupDescriptionEntriesSymbolTable.get(getSymbol(name)) == null ? null
  362. : reportGroupDescriptionEntriesSymbolTable.get(getSymbol(name)).getReportGroupDescriptionEntry();
  363. }
  364. @Override
  365. public List<ReportGroupDescriptionEntry> getRootReportGroupDescriptionEntries() {
  366. final List<ReportGroupDescriptionEntry> result = new ArrayList<ReportGroupDescriptionEntry>();
  367. for (final ReportGroupDescriptionEntry reportGroupDescriptionEntry : reportGroupDescriptionEntries) {
  368. if (reportGroupDescriptionEntry.getParentReportGroupDescriptionEntry() == null) {
  369. result.add(reportGroupDescriptionEntry);
  370. }
  371. }
  372. return result;
  373. }
  374. protected void groupReportGroupDescriptionEntry(final ReportGroupDescriptionEntry lastReportGroupDescriptionEntry,
  375. final ReportGroupDescriptionEntry reportGroupDescriptionEntry) {
  376. final Integer lastLevelNumber = lastReportGroupDescriptionEntry.getLevelNumber();
  377. final Integer levelNumber = reportGroupDescriptionEntry.getLevelNumber();
  378. if (levelNumber > lastLevelNumber) {
  379. lastReportGroupDescriptionEntry.addReportGroupDescriptionEntry(reportGroupDescriptionEntry);
  380. reportGroupDescriptionEntry.setParentReportGroupDescriptionEntry(lastReportGroupDescriptionEntry);
  381. } else {
  382. final ReportGroupDescriptionEntry lastParentReportGroupDescriptionEntry = lastReportGroupDescriptionEntry
  383. .getParentReportGroupDescriptionEntry();
  384. if (lastParentReportGroupDescriptionEntry != null) {
  385. groupReportGroupDescriptionEntry(lastParentReportGroupDescriptionEntry, reportGroupDescriptionEntry);
  386. }
  387. }
  388. }
  389. }