Skip to content

Commit 1f308b2

Browse files
authored
feat: CICS SOAPFAULT improvements (#2589)
1 parent 03c6de0 commit 1f308b2

File tree

4 files changed

+224
-11
lines changed

4 files changed

+224
-11
lines changed

server/engine/src/main/antlr4/org/eclipse/lsp/cobol/implicitDialects/cics/CICSParser.g4

+5-11
Original file line numberDiff line numberDiff line change
@@ -783,17 +783,11 @@ cics_signon_token_body: ((KERBEROS | BIT | BASE64) | (TOKENLEN | GROUPID | LANGU
783783
(TOKEN | LANGINUSE | NATLANGINUSE | ESMREASON | ESMRESP) cics_data_area | (TOKENTYPE | DATATYPE) cics_cvda | cics_handle_response)+;
784784

785785
/** SOAPFAULT ADD / CREATE / DELETE */
786-
cics_soapfault: SOAPFAULT (cics_soapfault_add | cics_soapfault_create | DELETE);
787-
cics_soapfault_add: ADD (cics_soapfault_faultstring | cics_soapfault_subcodestr | FROMCCSID cics_data_value | cics_handle_response)+;
788-
cics_soapfault_faultstring: (FAULTSTRING cics_data_value | FAULTSTRLEN cics_data_value | NATLANG cics_data_value)+;
789-
cics_soapfault_subcodestr: (SUBCODESTR cics_data_value | SUBCODELEN cics_data_value)+;
790-
cics_soapfault_create: CREATE (FAULTCODE cics_cvda | CLIENT | SERVER | SENDER | RECEIVER | cics_soapfault_faultcodestr |
791-
cics_soapfault_faultstring | cics_soapfault_role | cics_soapfault_faultactor |
792-
cics_soapfault_detail | FROMCCSID cics_data_value | cics_handle_response)+;
793-
cics_soapfault_faultcodestr: (FAULTCODESTR cics_data_value | FAULTCODELEN cics_data_value)+;
794-
cics_soapfault_role: (ROLE cics_data_value | ROLELENGTH cics_data_value)+;
795-
cics_soapfault_faultactor: (FAULTACTOR cics_data_value | FAULTACTLEN cics_data_value)+;
796-
cics_soapfault_detail: (DETAIL cics_data_value | DETAILLENGTH cics_data_value)+;
786+
cics_soapfault: SOAPFAULT (cics_soapfault_add | cics_soapfault_create | cics_soapfault_delete);
787+
cics_soapfault_add: ADD ((FAULTSTRING | FAULTSTRLEN |NATLANG | SUBCODESTR | SUBCODELEN | FROMCCSID) cics_data_value | cics_handle_response)+;
788+
cics_soapfault_create: CREATE ((CLIENT | SERVER | SENDER | RECEIVER) | (FAULTCODESTR | FAULTCODELEN | FAULTSTRING | FAULTSTRLEN | NATLANG | ROLE | ROLELENGTH | FAULTACTOR | FAULTACTLEN | DETAIL | DETAILLENGTH | FROMCCSID) cics_data_value
789+
| (FAULTCODE) cics_cvda | cics_handle_response)+;
790+
cics_soapfault_delete: (DELETE | cics_handle_response)+;
797791

798792
/** SPOOLCLOSE */
799793
cics_spoolclose: SPOOLCLOSE cics_spoolclose_options;

server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/cics/utility/CICSOptionsCheckUtility.java

+3
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ public CICSOptionsCheckUtility(DialectProcessingContext context, List<SyntaxErro
276276
optionsMap.put(
277277
CICSPutContainerOptionsCheckUtility.RULE_INDEX,
278278
new CICSPutContainerOptionsCheckUtility(context, errors));
279+
optionsMap.put(
280+
CICSSoapfaultOptionsCheckUtility.RULE_INDEX,
281+
new CICSSoapfaultOptionsCheckUtility(context, errors));
279282
spOptionsMap.put(
280283
CICSInquireSPOptionsCheckUtility.RULE_INDEX,
281284
new CICSInquireSPOptionsCheckUtility(context, errors));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
* Copyright (c) 2024 Broadcom.
3+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4+
*
5+
* This program and the accompanying materials are made
6+
* available under the terms of the Eclipse Public License 2.0
7+
* which is available at https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Broadcom, Inc. - initial API and implementation
13+
*
14+
*/
15+
package org.eclipse.lsp.cobol.implicitDialects.cics.utility;
16+
17+
import org.antlr.v4.runtime.ParserRuleContext;
18+
import org.eclipse.lsp.cobol.common.dialects.DialectProcessingContext;
19+
import org.eclipse.lsp.cobol.common.error.ErrorSeverity;
20+
import org.eclipse.lsp.cobol.common.error.SyntaxError;
21+
import org.eclipse.lsp.cobol.implicitDialects.cics.CICSLexer;
22+
import org.eclipse.lsp.cobol.implicitDialects.cics.CICSParser;
23+
24+
import java.util.*;
25+
26+
import static org.eclipse.lsp.cobol.implicitDialects.cics.CICSParser.*;
27+
28+
/** Checks CICS SOAPFAULT rules for required and invalid options */
29+
public class CICSSoapfaultOptionsCheckUtility extends CICSOptionsCheckBaseUtility {
30+
31+
public static final int RULE_INDEX = RULE_cics_soapfault;
32+
33+
private static final Map<Integer, ErrorSeverity> DUPLICATE_CHECK_OPTIONS =
34+
new HashMap<Integer, ErrorSeverity>() {
35+
{
36+
put(CICSLexer.FAULTCODE, ErrorSeverity.ERROR);
37+
put(CICSLexer.CLIENT, ErrorSeverity.ERROR);
38+
put(CICSLexer.SERVER, ErrorSeverity.ERROR);
39+
put(CICSLexer.SENDER, ErrorSeverity.ERROR);
40+
put(CICSLexer.RECEIVER, ErrorSeverity.ERROR);
41+
put(CICSLexer.FAULTCODESTR, ErrorSeverity.ERROR);
42+
put(CICSLexer.FAULTCODELEN, ErrorSeverity.ERROR);
43+
put(CICSLexer.FAULTSTRING, ErrorSeverity.ERROR);
44+
put(CICSLexer.FAULTSTRLEN, ErrorSeverity.ERROR);
45+
put(CICSLexer.NATLANG, ErrorSeverity.ERROR);
46+
put(CICSLexer.ROLE, ErrorSeverity.ERROR);
47+
put(CICSLexer.ROLELENGTH, ErrorSeverity.ERROR);
48+
put(CICSLexer.FAULTACTOR, ErrorSeverity.ERROR);
49+
put(CICSLexer.FAULTACTLEN, ErrorSeverity.ERROR);
50+
put(CICSLexer.DETAIL, ErrorSeverity.ERROR);
51+
put(CICSLexer.DETAILLENGTH, ErrorSeverity.ERROR);
52+
put(CICSLexer.FROMCCSID, ErrorSeverity.ERROR);
53+
54+
put(CICSLexer.DELETE, ErrorSeverity.WARNING);
55+
put(CICSLexer.CREATE, ErrorSeverity.WARNING);
56+
put(CICSLexer.ADD, ErrorSeverity.WARNING);
57+
}
58+
};
59+
60+
public CICSSoapfaultOptionsCheckUtility(DialectProcessingContext context, List<SyntaxError> errors) {
61+
super(context, errors, DUPLICATE_CHECK_OPTIONS);
62+
}
63+
64+
/**
65+
* Entrypoint to check CICS SOAPFAULT CREATE rules for required and invalid options
66+
* @param ctx ParserRuleContext subclass containing options
67+
* @param <E> A subclass of ParserRuleContext
68+
*/
69+
public <E extends ParserRuleContext> void checkOptions(E ctx) {
70+
switch (ctx.getRuleIndex()) {
71+
case RULE_cics_soapfault_create:
72+
checkCreate((CICSParser.Cics_soapfault_createContext) ctx);
73+
break;
74+
case RULE_cics_soapfault_add:
75+
checkAdd((CICSParser.Cics_soapfault_addContext) ctx);
76+
break;
77+
case RULE_cics_soapfault_delete:
78+
checkDelete((CICSParser.Cics_soapfault_deleteContext) ctx);
79+
break;
80+
default:
81+
break;
82+
}
83+
84+
checkDuplicates(ctx);
85+
}
86+
87+
private void checkCreate(CICSParser.Cics_soapfault_createContext ctx) {
88+
checkHasExactlyOneOption("FAULTCODE, FAULTCODESTR, CLIENT, SERVER, SENDER or RECEIVER", ctx, ctx.FAULTCODE(), ctx.FAULTCODESTR(), ctx.CLIENT(), ctx.SERVER(), ctx.SENDER(), ctx.RECEIVER());
89+
90+
checkHasMandatoryOptions(ctx.FAULTSTRING(), ctx, "FAULTSTRING");
91+
92+
checkPrerequisiteIsMet(ctx.FAULTCODESTR(), ctx.FAULTCODELEN(), ctx, "FAULTCODELEN without FAULTCODESTR");
93+
94+
checkPrerequisiteIsMet(ctx.ROLE(), ctx.ROLELENGTH(), ctx, "ROLELENGTH without ROLE");
95+
96+
checkPrerequisiteIsMet(ctx.FAULTACTOR(), ctx.FAULTACTLEN(), ctx, "FAULTACTLEN without FAULTACTOR");
97+
98+
checkPrerequisiteIsMet(ctx.DETAIL(), ctx.DETAILLENGTH(), ctx, "DETAILLENGTH without DETAIL");
99+
100+
checkPrerequisiteIsMet(ctx.FAULTCODE(), ctx.FAULTCODELEN(), ctx, "FAULTCODELEN without FAULTCODE");
101+
102+
checkPrerequisiteIsMet(ctx.FAULTSTRING(), ctx.FAULTSTRLEN(), ctx, "FAULTSTRLEN without FAULTSTRING");
103+
}
104+
105+
private void checkAdd(CICSParser.Cics_soapfault_addContext ctx) {
106+
checkPrerequisiteIsMet(ctx.FAULTSTRING(), ctx.FAULTSTRLEN(), ctx, "FAULTSTRLEN without FAULTSTRING");
107+
108+
checkPrerequisiteIsMet(ctx.SUBCODESTR(), ctx.SUBCODELEN(), ctx, "SUBCODELEN without SUBCODESTR");
109+
110+
checkHasExactlyOneOption("FAULTSTRING or SUBCODESTR", ctx, ctx.FAULTSTRING(), ctx.SUBCODESTR());
111+
}
112+
113+
private void checkDelete(CICSParser.Cics_soapfault_deleteContext ctx) {
114+
checkHasMandatoryOptions(ctx.DELETE(), ctx, "DELETE");
115+
}
116+
117+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright (c) 2024 Broadcom.
3+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4+
*
5+
* This program and the accompanying materials are made
6+
* available under the terms of the Eclipse Public License 2.0
7+
* which is available at https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Broadcom, Inc. - initial API and implementation
13+
*
14+
*/
15+
16+
package org.eclipse.lsp.cobol.usecases;
17+
18+
import org.eclipse.lsp.cobol.common.error.ErrorSource;
19+
import org.eclipse.lsp.cobol.usecases.common.CICSTestUtils;
20+
import org.eclipse.lsp4j.Diagnostic;
21+
import org.eclipse.lsp4j.DiagnosticSeverity;
22+
import org.eclipse.lsp4j.Range;
23+
import org.junit.jupiter.api.Test;
24+
25+
import java.util.*;
26+
27+
/**
28+
* Test CICS WEB command. Documentation link: <a
29+
* href="https://www.ibm.com/docs/en/cics-ts/6.x?topic=summary-receive-zos-communications-server-default">WEB
30+
* Command</a>
31+
*
32+
* <p>This class tests all variations of the WEB command found in the link above.
33+
*/
34+
35+
public class TestCICSSoapfaultStatement {
36+
// Test Strings
37+
private static final String SOAPFAULT_DELETE_VALID = "SOAPFAULT DELETE";
38+
39+
private static final String SOAPFAULT_ADD_1 = "SOAPFAULT ADD FAULTSTRING({$varOne}) FAULTSTRLEN({$varOne}) NATLANG({$varOne}) FROMCCSID({$varOne})";
40+
private static final String SOAPFAULT_ADD_2 = "SOAPFAULT ADD FAULTSTRING({$varOne})";
41+
42+
private static final String SOAPFAULT_CREATE_1 = "SOAPFAULT CREATE FAULTCODE({$varOne}) FAULTSTRING({$varOne}) FAULTSTRLEN({$varOne}) NATLANG({$varOne}) ROLE({$varOne}) ROLELENGTH({$varOne}) FAULTACTOR({$varOne}) FAULTACTLEN({$varOne}) DETAIL({$varOne}) DETAILLENGTH({$varOne}) FROMCCSID({$varOne})";
43+
private static final String SOAPFAULT_CREATE_2 = "SOAPFAULT CREATE CLIENT FAULTSTRING({$varOne})";
44+
45+
// Invalid Tests
46+
private static final String SOAPFAULT_DELETE_INVALID = "SOAPFAULT DELETE {CLIENT|errorOne}";
47+
private static final String SOAPFAULT_DELETE_INVALID_2 = "SOAPFAULT DELETE {DELETE|errorOne} NOHANDLE";
48+
private static final String SOAPFAULT_ADD_INVALID = "SOAPFAULT ADD {FAULTSTRING|errorOne}({$varOne}) {SUBCODESTR|errorTwo}({$varOne})";
49+
private static final String SOAPFAULT_CREATE_INVALID = "SOAPFAULT CREATE {CLIENT|errorOne} {FAULTCODESTR|errorTwo}({$varOne}) FAULTSTRING({$varOne})";
50+
51+
// Valid Test Cases
52+
@Test
53+
void testDelete() {
54+
CICSTestUtils.noErrorTest(SOAPFAULT_DELETE_VALID);
55+
}
56+
57+
@Test
58+
void testAdd() {
59+
CICSTestUtils.noErrorTest(SOAPFAULT_ADD_1);
60+
CICSTestUtils.noErrorTest(SOAPFAULT_ADD_2);
61+
}
62+
63+
@Test
64+
void testCreate() {
65+
CICSTestUtils.noErrorTest(SOAPFAULT_CREATE_1);
66+
CICSTestUtils.noErrorTest(SOAPFAULT_CREATE_2);
67+
}
68+
69+
// Invalid Tests
70+
@Test
71+
void testDeleteInvalid() {
72+
HashMap<String, Diagnostic> expectedDiagnostics = new HashMap<>();
73+
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Extraneous input CLIENT", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
74+
CICSTestUtils.errorTest(SOAPFAULT_DELETE_INVALID, expectedDiagnostics);
75+
}
76+
77+
@Test
78+
void testDeleteInvalid2() {
79+
HashMap<String, Diagnostic> expectedDiagnostics = new HashMap<>();
80+
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Excessive options provided for: DELETE", DiagnosticSeverity.Warning, ErrorSource.PARSING.getText()));
81+
CICSTestUtils.errorTest(SOAPFAULT_DELETE_INVALID_2, expectedDiagnostics);
82+
}
83+
84+
@Test
85+
void testAddInvalid() {
86+
HashMap<String, Diagnostic> expectedDiagnostics = new HashMap<>();
87+
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Exactly one option required, options are mutually exclusive: FAULTSTRING or SUBCODESTR", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
88+
expectedDiagnostics.put("errorTwo", new Diagnostic(new Range(), "Exactly one option required, options are mutually exclusive: FAULTSTRING or SUBCODESTR", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
89+
CICSTestUtils.errorTest(SOAPFAULT_ADD_INVALID, expectedDiagnostics);
90+
}
91+
92+
@Test
93+
void testCreateInvalid() {
94+
HashMap<String, Diagnostic> expectedDiagnostics = new HashMap<>();
95+
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Exactly one option required, options are mutually exclusive: FAULTCODE, FAULTCODESTR, CLIENT, SERVER, SENDER or RECEIVER", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
96+
expectedDiagnostics.put("errorTwo", new Diagnostic(new Range(), "Exactly one option required, options are mutually exclusive: FAULTCODE, FAULTCODESTR, CLIENT, SERVER, SENDER or RECEIVER", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
97+
CICSTestUtils.errorTest(SOAPFAULT_CREATE_INVALID, expectedDiagnostics);
98+
}
99+
}

0 commit comments

Comments
 (0)