/src/main/java/io/proleap/cobol/asg/metamodel/data/file/impl/FileDescriptionEntryImpl.java

https://github.com/uwol/proleap-cobol-parser · Java · 558 lines · 379 code · 118 blank · 61 comment · 95 complexity · 2c4bd2f8b1cadd07fd2034bc240f80a6 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.file.impl;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import io.proleap.cobol.CobolParser.BlockContainsClauseContext;
  12. import io.proleap.cobol.CobolParser.BlockContainsToContext;
  13. import io.proleap.cobol.CobolParser.CodeSetClauseContext;
  14. import io.proleap.cobol.CobolParser.DataNameContext;
  15. import io.proleap.cobol.CobolParser.DataRecordsClauseContext;
  16. import io.proleap.cobol.CobolParser.ExternalClauseContext;
  17. import io.proleap.cobol.CobolParser.FileDescriptionEntryContext;
  18. import io.proleap.cobol.CobolParser.GlobalClauseContext;
  19. import io.proleap.cobol.CobolParser.LabelRecordsClauseContext;
  20. import io.proleap.cobol.CobolParser.LinageAtContext;
  21. import io.proleap.cobol.CobolParser.LinageClauseContext;
  22. import io.proleap.cobol.CobolParser.LinageFootingAtContext;
  23. import io.proleap.cobol.CobolParser.LinageLinesAtBottomContext;
  24. import io.proleap.cobol.CobolParser.LinageLinesAtTopContext;
  25. import io.proleap.cobol.CobolParser.RecordContainsClauseContext;
  26. import io.proleap.cobol.CobolParser.RecordContainsClauseFormat1Context;
  27. import io.proleap.cobol.CobolParser.RecordContainsClauseFormat2Context;
  28. import io.proleap.cobol.CobolParser.RecordContainsClauseFormat3Context;
  29. import io.proleap.cobol.CobolParser.RecordContainsToContext;
  30. import io.proleap.cobol.CobolParser.ReportClauseContext;
  31. import io.proleap.cobol.CobolParser.ReportNameContext;
  32. import io.proleap.cobol.CobolParser.ValueOfClauseContext;
  33. import io.proleap.cobol.CobolParser.ValuePairContext;
  34. import io.proleap.cobol.asg.metamodel.IntegerLiteral;
  35. import io.proleap.cobol.asg.metamodel.ProgramUnit;
  36. import io.proleap.cobol.asg.metamodel.call.Call;
  37. import io.proleap.cobol.asg.metamodel.data.datadescription.impl.DataDescriptionEntryContainerImpl;
  38. import io.proleap.cobol.asg.metamodel.data.file.BlockContainsClause;
  39. import io.proleap.cobol.asg.metamodel.data.file.CodeSetClause;
  40. import io.proleap.cobol.asg.metamodel.data.file.DataRecordsClause;
  41. import io.proleap.cobol.asg.metamodel.data.file.ExternalClause;
  42. import io.proleap.cobol.asg.metamodel.data.file.FileDescriptionEntry;
  43. import io.proleap.cobol.asg.metamodel.data.file.GlobalClause;
  44. import io.proleap.cobol.asg.metamodel.data.file.LabelRecordsClause;
  45. import io.proleap.cobol.asg.metamodel.data.file.LinageClause;
  46. import io.proleap.cobol.asg.metamodel.data.file.RecordContainsClause;
  47. import io.proleap.cobol.asg.metamodel.data.file.ReportClause;
  48. import io.proleap.cobol.asg.metamodel.data.file.ValueOfClause;
  49. import io.proleap.cobol.asg.metamodel.data.file.ValueOfNameValuePair;
  50. import io.proleap.cobol.asg.metamodel.environment.inputoutput.filecontrol.FileControlEntry;
  51. import io.proleap.cobol.asg.metamodel.valuestmt.ValueStmt;
  52. public class FileDescriptionEntryImpl extends DataDescriptionEntryContainerImpl implements FileDescriptionEntry {
  53. private final static Logger LOG = LoggerFactory.getLogger(FileDescriptionEntryImpl.class);
  54. protected BlockContainsClause blockContainsClause;
  55. protected CodeSetClause codeSetClause;
  56. protected final DataDescriptionEntryContainerType containerType = DataDescriptionEntryContainerType.FILE_DESCRIPTION_ENTRY;
  57. protected final FileDescriptionEntryContext ctx;
  58. protected DataRecordsClause dataRecordsClause;
  59. protected ExternalClause externalClause;
  60. protected Call fileCall;
  61. protected FileControlEntry fileControlEntry;
  62. protected GlobalClause globalClause;
  63. protected LabelRecordsClause labelRecordsClause;
  64. protected LinageClause linageClause;
  65. protected final String name;
  66. protected RecordContainsClause recordContainsClause;
  67. protected ReportClause reportClause;
  68. protected ValueOfClause valueOfClause;
  69. public FileDescriptionEntryImpl(final String name, final ProgramUnit programUnit,
  70. final FileDescriptionEntryContext ctx) {
  71. super(programUnit, ctx);
  72. this.ctx = ctx;
  73. this.name = name;
  74. }
  75. @Override
  76. public BlockContainsClause addBlockContainsClause(final BlockContainsClauseContext ctx) {
  77. BlockContainsClause result = (BlockContainsClause) getASGElement(ctx);
  78. if (result == null) {
  79. result = new BlockContainsClauseImpl(programUnit, ctx);
  80. /*
  81. * from
  82. */
  83. if (ctx.integerLiteral() != null) {
  84. final IntegerLiteral from = createIntegerLiteral(ctx.integerLiteral());
  85. result.setFrom(from);
  86. }
  87. /*
  88. * to
  89. */
  90. if (ctx.blockContainsTo() != null) {
  91. final BlockContainsToContext blockContainsTo = ctx.blockContainsTo();
  92. if (blockContainsTo.integerLiteral() != null) {
  93. final IntegerLiteral to = createIntegerLiteral(blockContainsTo.integerLiteral());
  94. result.setTo(to);
  95. }
  96. }
  97. /*
  98. * unit
  99. */
  100. final BlockContainsClause.Unit unit;
  101. if (ctx.RECORDS() != null) {
  102. unit = BlockContainsClause.Unit.RECORDS;
  103. } else if (ctx.CHARACTERS() != null) {
  104. unit = BlockContainsClause.Unit.CHARACTERS;
  105. } else {
  106. unit = null;
  107. }
  108. result.setUnit(unit);
  109. blockContainsClause = result;
  110. registerASGElement(result);
  111. }
  112. return result;
  113. }
  114. @Override
  115. public CodeSetClause addCodeSetClause(final CodeSetClauseContext ctx) {
  116. CodeSetClause result = (CodeSetClause) getASGElement(ctx);
  117. if (result == null) {
  118. result = new CodeSetClauseImpl(programUnit, ctx);
  119. final String alphabetName = determineName(ctx.alphabetName());
  120. result.setAlhpabetName(alphabetName);
  121. codeSetClause = result;
  122. registerASGElement(result);
  123. }
  124. return result;
  125. }
  126. @Override
  127. public DataRecordsClause addDataRecordsClause(final DataRecordsClauseContext ctx) {
  128. DataRecordsClause result = (DataRecordsClause) getASGElement(ctx);
  129. if (result == null) {
  130. result = new DataRecordsClauseImpl(programUnit, ctx);
  131. /*
  132. * data names
  133. */
  134. for (final DataNameContext dataNameContext : ctx.dataName()) {
  135. final Call dataCall = createCall(dataNameContext);
  136. result.addDataCall(dataCall);
  137. }
  138. dataRecordsClause = result;
  139. registerASGElement(result);
  140. }
  141. return result;
  142. }
  143. @Override
  144. public ExternalClause addExternalClause(final ExternalClauseContext ctx) {
  145. ExternalClause result = (ExternalClause) getASGElement(ctx);
  146. if (result == null) {
  147. result = new ExternalClauseImpl(programUnit, ctx);
  148. result.setExternal(true);
  149. externalClause = result;
  150. registerASGElement(result);
  151. }
  152. return result;
  153. }
  154. @Override
  155. public GlobalClause addGlobalClause(final GlobalClauseContext ctx) {
  156. GlobalClause result = (GlobalClause) getASGElement(ctx);
  157. if (result == null) {
  158. result = new GlobalClauseImpl(programUnit, ctx);
  159. result.setGlobal(true);
  160. globalClause = result;
  161. registerASGElement(result);
  162. }
  163. return result;
  164. }
  165. @Override
  166. public LabelRecordsClause addLabelRecordsClause(final LabelRecordsClauseContext ctx) {
  167. LabelRecordsClause result = (LabelRecordsClause) getASGElement(ctx);
  168. if (result == null) {
  169. result = new LabelRecordsClauseImpl(programUnit, ctx);
  170. /*
  171. * type
  172. */
  173. final LabelRecordsClause.LabelRecordsClauseType type;
  174. if (ctx.OMITTED() != null) {
  175. type = LabelRecordsClause.LabelRecordsClauseType.OMITTED;
  176. } else if (ctx.STANDARD() != null) {
  177. type = LabelRecordsClause.LabelRecordsClauseType.STANDARD;
  178. } else if (!ctx.dataName().isEmpty()) {
  179. type = LabelRecordsClause.LabelRecordsClauseType.DATA_NAMES;
  180. } else {
  181. type = null;
  182. }
  183. result.setLabelRecordsClauseType(type);
  184. /*
  185. * data names
  186. */
  187. for (final DataNameContext dataNameContext : ctx.dataName()) {
  188. final Call dataCall = createCall(dataNameContext);
  189. result.addDataCall(dataCall);
  190. }
  191. labelRecordsClause = result;
  192. registerASGElement(result);
  193. }
  194. return result;
  195. }
  196. @Override
  197. public LinageClause addLinageClause(final LinageClauseContext ctx) {
  198. LinageClause result = (LinageClause) getASGElement(ctx);
  199. if (result == null) {
  200. result = new LinageClauseImpl(programUnit, ctx);
  201. /*
  202. * number of lines
  203. */
  204. final ValueStmt numberOfLinesValueStmt = createValueStmt(ctx.dataName(), ctx.integerLiteral());
  205. result.setNumberOfLinesValueStmt(numberOfLinesValueStmt);
  206. /*
  207. * linage at
  208. */
  209. for (final LinageAtContext linageAtContext : ctx.linageAt()) {
  210. /*
  211. * footing at
  212. */
  213. if (linageAtContext.linageFootingAt() != null) {
  214. final LinageFootingAtContext linageFootingAtContext = linageAtContext.linageFootingAt();
  215. final ValueStmt footingAtValueStmt;
  216. if (linageFootingAtContext.dataName() != null) {
  217. footingAtValueStmt = createCallValueStmt(linageFootingAtContext.dataName());
  218. } else if (linageFootingAtContext.integerLiteral() != null) {
  219. footingAtValueStmt = createIntegerLiteralValueStmt(linageFootingAtContext.integerLiteral());
  220. } else {
  221. LOG.warn("unknown linage footing at {}", linageFootingAtContext);
  222. footingAtValueStmt = null;
  223. }
  224. result.setFootingAtValueStmt(footingAtValueStmt);
  225. }
  226. /*
  227. * lines at top
  228. */
  229. if (linageAtContext.linageLinesAtTop() != null) {
  230. final LinageLinesAtTopContext linageLinesAtTopContext = linageAtContext.linageLinesAtTop();
  231. final ValueStmt LinesAtTopValueStmt;
  232. if (linageLinesAtTopContext.dataName() != null) {
  233. LinesAtTopValueStmt = createCallValueStmt(linageLinesAtTopContext.dataName());
  234. } else if (linageLinesAtTopContext.integerLiteral() != null) {
  235. LinesAtTopValueStmt = createIntegerLiteralValueStmt(linageLinesAtTopContext.integerLiteral());
  236. } else {
  237. LOG.warn("unknown lines at top at {}", linageLinesAtTopContext);
  238. LinesAtTopValueStmt = null;
  239. }
  240. result.setLinesAtTopValueStmt(LinesAtTopValueStmt);
  241. }
  242. /*
  243. * lines at bottom
  244. */
  245. if (linageAtContext.linageLinesAtBottom() != null) {
  246. final LinageLinesAtBottomContext linageLinesAtBottomContext = linageAtContext.linageLinesAtBottom();
  247. final ValueStmt LinesAtBottomValueStmt;
  248. if (linageLinesAtBottomContext.dataName() != null) {
  249. LinesAtBottomValueStmt = createCallValueStmt(linageLinesAtBottomContext.dataName());
  250. } else if (linageLinesAtBottomContext.integerLiteral() != null) {
  251. LinesAtBottomValueStmt = createIntegerLiteralValueStmt(
  252. linageLinesAtBottomContext.integerLiteral());
  253. } else {
  254. LOG.warn("unknown lines at bottom at {}", linageLinesAtBottomContext);
  255. LinesAtBottomValueStmt = null;
  256. }
  257. result.setLinesAtBottomValueStmt(LinesAtBottomValueStmt);
  258. }
  259. }
  260. linageClause = result;
  261. registerASGElement(result);
  262. }
  263. return result;
  264. }
  265. @Override
  266. public RecordContainsClause addRecordContainsClause(final RecordContainsClauseContext ctx) {
  267. RecordContainsClause result = (RecordContainsClause) getASGElement(ctx);
  268. if (result == null) {
  269. result = new RecordContainsClauseImpl(programUnit, ctx);
  270. if (ctx.recordContainsClauseFormat1() != null) {
  271. final RecordContainsClauseFormat1Context recordContainsClauseFormat1 = ctx
  272. .recordContainsClauseFormat1();
  273. if (recordContainsClauseFormat1.integerLiteral() != null) {
  274. final IntegerLiteral from = createIntegerLiteral(recordContainsClauseFormat1.integerLiteral());
  275. result.setFrom(from);
  276. }
  277. } else if (ctx.recordContainsClauseFormat2() != null) {
  278. final RecordContainsClauseFormat2Context recordContainsClauseFormat2 = ctx
  279. .recordContainsClauseFormat2();
  280. /*
  281. * from
  282. */
  283. if (recordContainsClauseFormat2.integerLiteral() != null) {
  284. final IntegerLiteral from = createIntegerLiteral(recordContainsClauseFormat2.integerLiteral());
  285. result.setFrom(from);
  286. }
  287. /*
  288. * to
  289. */
  290. if (recordContainsClauseFormat2.recordContainsTo() != null) {
  291. final RecordContainsToContext recordContainsTo = recordContainsClauseFormat2.recordContainsTo();
  292. if (recordContainsTo.integerLiteral() != null) {
  293. final IntegerLiteral to = createIntegerLiteral(recordContainsTo.integerLiteral());
  294. result.setTo(to);
  295. }
  296. }
  297. /*
  298. * varying
  299. */
  300. if (recordContainsClauseFormat2.VARYING() != null) {
  301. result.setVarying(true);
  302. }
  303. /*
  304. * depending on
  305. */
  306. if (recordContainsClauseFormat2.qualifiedDataName() != null) {
  307. final Call dependingOnCall = createCall(recordContainsClauseFormat2.qualifiedDataName());
  308. result.setDependingOnCall(dependingOnCall);
  309. }
  310. } else if (ctx.recordContainsClauseFormat3() != null) {
  311. final RecordContainsClauseFormat3Context recordContainsClauseFormat3 = ctx
  312. .recordContainsClauseFormat3();
  313. /*
  314. * from
  315. */
  316. if (recordContainsClauseFormat3.integerLiteral() != null) {
  317. final IntegerLiteral from = createIntegerLiteral(recordContainsClauseFormat3.integerLiteral());
  318. result.setFrom(from);
  319. }
  320. /*
  321. * to
  322. */
  323. if (recordContainsClauseFormat3.recordContainsTo() != null) {
  324. final RecordContainsToContext recordContainsTo = recordContainsClauseFormat3.recordContainsTo();
  325. if (recordContainsTo.integerLiteral() != null) {
  326. final IntegerLiteral to = createIntegerLiteral(recordContainsTo.integerLiteral());
  327. result.setTo(to);
  328. }
  329. }
  330. }
  331. recordContainsClause = result;
  332. registerASGElement(result);
  333. }
  334. return result;
  335. }
  336. @Override
  337. public ReportClause addReportClause(final ReportClauseContext ctx) {
  338. ReportClause result = (ReportClause) getASGElement(ctx);
  339. if (result == null) {
  340. result = new ReportClauseImpl(programUnit, ctx);
  341. /*
  342. * report names
  343. */
  344. for (final ReportNameContext reportNameContext : ctx.reportName()) {
  345. final Call reportCall = createCall(reportNameContext);
  346. result.addReportCall(reportCall);
  347. }
  348. reportClause = result;
  349. registerASGElement(result);
  350. }
  351. return result;
  352. }
  353. @Override
  354. public ValueOfClause addValueOfClause(final ValueOfClauseContext ctx) {
  355. ValueOfClause result = (ValueOfClause) getASGElement(ctx);
  356. if (result == null) {
  357. result = new ValueOfClauseImpl(programUnit, ctx);
  358. for (final ValuePairContext valuePairContext : ctx.valuePair()) {
  359. final ValueOfNameValuePair valuePair = new ValueOfNameValuePairImpl();
  360. final Call systemCall = createCall(valuePairContext.systemName());
  361. valuePair.setNameCall(systemCall);
  362. final ValueStmt value = createValueStmt(valuePairContext.qualifiedDataName(),
  363. valuePairContext.literal());
  364. valuePair.setValue(value);
  365. result.addValuePair(valuePair);
  366. }
  367. valueOfClause = result;
  368. registerASGElement(result);
  369. }
  370. return result;
  371. }
  372. @Override
  373. public BlockContainsClause getBlockContainsClause() {
  374. return blockContainsClause;
  375. }
  376. @Override
  377. public CodeSetClause getCodeSetClause() {
  378. return codeSetClause;
  379. }
  380. @Override
  381. public DataDescriptionEntryContainerType getContainerType() {
  382. return containerType;
  383. }
  384. @Override
  385. public DataRecordsClause getDataRecordsClause() {
  386. return dataRecordsClause;
  387. }
  388. @Override
  389. public ExternalClause getExternalClause() {
  390. return externalClause;
  391. }
  392. @Override
  393. public Call getFileCall() {
  394. return fileCall;
  395. }
  396. @Override
  397. public FileControlEntry getFileControlEntry() {
  398. return fileControlEntry;
  399. }
  400. @Override
  401. public GlobalClause getGlobalClause() {
  402. return globalClause;
  403. }
  404. @Override
  405. public LabelRecordsClause getLabelRecordsClause() {
  406. return labelRecordsClause;
  407. }
  408. @Override
  409. public LinageClause getLinageClause() {
  410. return linageClause;
  411. }
  412. @Override
  413. public String getName() {
  414. return name;
  415. }
  416. @Override
  417. public RecordContainsClause getRecordContainsClause() {
  418. return recordContainsClause;
  419. }
  420. @Override
  421. public ReportClause getReportClause() {
  422. return reportClause;
  423. }
  424. @Override
  425. public ValueOfClause getValueOfClause() {
  426. return valueOfClause;
  427. }
  428. @Override
  429. public void setFileCall(final Call fileCall) {
  430. this.fileCall = fileCall;
  431. }
  432. @Override
  433. public void setFileControlEntry(final FileControlEntry fileControlEntry) {
  434. this.fileControlEntry = fileControlEntry;
  435. }
  436. @Override
  437. public String toString() {
  438. return "name=[" + name + "]";
  439. }
  440. }