Skip to content

Commit

Permalink
fix: CICS WEB defect (eclipse-che4z#2734)
Browse files Browse the repository at this point in the history
  • Loading branch information
mm-broadcom authored Feb 7, 2025
1 parent a44319b commit 5d516c5
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 27 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -821,6 +821,8 @@ HOSTCODEPAGE : H O S T C O D E P A G E;
HOSTLENGTH : H O S T L E N G T H;
HOSTTYPE : H O S T T Y P E;
HOURS : H O U R S;
HTTP : H T T P;
HTTPS : H T T P S;
HTTPHEADER : H T T P H E A D E R;
HTTPMETHOD : H T T P M E T H O D;
HTTPRNUM : H T T P R N U M;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1074,7 +1074,7 @@ cics_web_endbrowse: (ENDBROWSE | FORMFIELD | HTTPHEADER | SESSTOKEN cics_data_va
cics_web_extract: (EXTRACT | HOSTLENGTH cics_data_value |
(HOST | HTTPMETHOD | METHODLENGTH | HTTPVERSION | VERSIONLEN | PATH | PATHLENGTH | PORTNUMBER | QUERYSTRING | QUERYSTRLEN | URIMAP | SESSTOKEN | REALM | REALMLEN) cics_data_area |
(SCHEME | HOSTTYPE | REQUESTTYPE) cics_cvda | cics_handle_response)+;
cics_web_open: (OPEN | (URIMAP | CIPHERS | NUMCIPHERS | CERTIFICATE | CODEPAGE | HOST | HOSTLENGTH | PORTNUMBER) cics_data_value | (SESSTOKEN | HTTPVNUM | HTTPRNUM) cics_data_area | SCHEME cics_cvda | cics_handle_response)+;
cics_web_open: ((OPEN | HTTP | HTTPS) | (URIMAP | CIPHERS | NUMCIPHERS | CERTIFICATE | CODEPAGE | HOST | HOSTLENGTH | PORTNUMBER) cics_data_value | (SESSTOKEN | HTTPVNUM | HTTPRNUM) cics_data_area | SCHEME cics_cvda | cics_handle_response)+;
cics_web_parse: (PARSE | (URL | URLLENGTH) cics_data_value | (SCHEMENAME | HOST | HOSTLENGTH | PORTNUMBER | PATH | PATHLENGTH | QUERYSTRING | QUERYSTRLEN) cics_data_area | HOSTTYPE cics_cvda | cics_handle_response)+;
cics_web_read: (READ | (QUERYPARM | NAMELENGTH | CHARACTERSET | HOSTCODEPAGE) cics_data_value | (FORMFIELD | HTTPHEADER | SESSTOKEN | VALUE | VALUELENGTH) cics_data_area | SET cics_ref | cics_handle_response)+;
cics_web_readnext: (READNEXT | (FORMFIELD | QUERYPARM | HTTPHEADER | VALUE | VALUELENGTH) cics_data_area | (SESSTOKEN | NAMELENGTH) cics_data_value | cics_handle_response)+;
Expand Down Expand Up @@ -2005,6 +2005,8 @@ ABCODE
| HOSTLENGTH
| HOSTTYPE
| HOURS
| HTTP
| HTTPS
| HTTPHEADER
| HTTPMETHOD
| HTTPRNUM
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ private void checkEndbrowse(CICSParser.Cics_web_endbrowseContext ctx) {
checkHasMandatoryOptions(ctx.ENDBROWSE(), ctx, "ENDBROWSE");
checkHasExactlyOneOption("FORMFIELD, HTTPHEADER, QUERYPARM", ctx, ctx.FORMFIELD(), ctx.HTTPHEADER(), ctx.QUERYPARM());
checkPrerequisiteIsMet(ctx.HTTPHEADER(), ctx.SESSTOKEN(), ctx, "HTTPHEADER");
if (!ctx.FORMFIELD().isEmpty() || !ctx.HTTPHEADER().isEmpty()) {
if (!ctx.FORMFIELD().isEmpty() || !ctx.QUERYPARM().isEmpty()) {
checkHasIllegalOptions(ctx.SESSTOKEN(), "SESSTOKEN");
}
}
Expand All @@ -262,7 +262,7 @@ private void checkExtract(CICSParser.Cics_web_extractContext ctx) {
// HTTP Server
if (!ctx.REQUESTTYPE().isEmpty() || !ctx.HTTPMETHOD().isEmpty() || !ctx.METHODLENGTH().isEmpty() || !ctx.QUERYSTRING().isEmpty() || !ctx.QUERYSTRLEN().isEmpty()) {
checkPrerequisiteIsMet(ctx.HTTPMETHOD(), ctx.METHODLENGTH(), ctx, "METHODLENGTH without HTTPMETHOD");
checkPrerequisiteIsMet(ctx.QUERYSTRING(), ctx.QUERYSTRLEN(), ctx, "QUERYSTRLEN without QUERYSTRING");
checkAllOptionsArePresentOrAbsent("QUERYSTRING and QUERYSTRLEN", ctx, ctx.QUERYSTRING(), ctx.QUERYSTRLEN());

checkAllOptionsArePresentOrAbsent("HTTPMETHOD and METHODLENGTH", ctx, ctx.HTTPMETHOD(), ctx.METHODLENGTH());

Expand All @@ -274,7 +274,7 @@ private void checkExtract(CICSParser.Cics_web_extractContext ctx) {
// HTTP Client
if (!ctx.SESSTOKEN().isEmpty() || !ctx.REALM().isEmpty() || !ctx.REALMLEN().isEmpty()) {
checkHasMandatoryOptions(ctx.SESSTOKEN(), ctx, "SESSTOKEN");
checkPrerequisiteIsMet(ctx.REALM(), ctx.REALMLEN(), ctx, "REALMLEN without REALM");
checkAllOptionsArePresentOrAbsent("REALM and REALMLEN", ctx, ctx.REALM(), ctx.REALMLEN());

checkHasIllegalOptions(ctx.REQUESTTYPE(), "REQUESTTYPE");
checkHasIllegalOptions(ctx.HTTPMETHOD(), "HTTPMETHOD");
Expand All @@ -291,26 +291,28 @@ private void checkExtract(CICSParser.Cics_web_extractContext ctx) {

private void checkOpen(CICSParser.Cics_web_openContext ctx) {
checkHasMandatoryOptions(ctx.OPEN(), ctx, "OPEN");
checkMutuallyExclusiveOptions("URIMAP or HOST", ctx.URIMAP(), ctx.HOST());
checkHasExactlyOneOption("URIMAP or HOST", ctx, ctx.URIMAP(), ctx.HOST());

checkAllOptionsArePresentOrAbsent("HOST, HOSTLENGTH, PORTNUMBER, SCHEME", ctx, ctx.HOST(), ctx.HOSTLENGTH(), ctx.PORTNUMBER(), ctx.SCHEME());
if (!ctx.HOST().isEmpty()) {
checkHasExactlyOneOption("SCHEME, HTTP or HTTPS", ctx, ctx.SCHEME(), ctx.HTTP(), ctx.HTTPS());
} else {
checkHasIllegalOptions(ctx.SCHEME(), "SCHEME");
checkHasIllegalOptions(ctx.HTTP(), "HTTP");
checkHasIllegalOptions(ctx.HTTPS(), "HTTPS");
}

checkHasMandatoryOptions(ctx.SESSTOKEN(), ctx, "SESSTOKEN");
checkPrerequisiteIsMet(ctx.HTTPVNUM(), ctx.HTTPRNUM(), ctx, "HTTPVNUM");
checkAllOptionsArePresentOrAbsent("HTTPVNUM and HTTPRNUM", ctx, ctx.HTTPVNUM(), ctx.HTTPRNUM());
}

private void checkParse(CICSParser.Cics_web_parseContext ctx) {
checkHasMandatoryOptions(ctx.PARSE(), ctx, "PARSE");
checkHasMandatoryOptions(ctx.URL(), ctx, "URL");
checkHasMandatoryOptions(ctx.URLLENGTH(), ctx, "URLLENGTH");
checkPrerequisiteIsMet(ctx.URL(), ctx.URLLENGTH(), ctx, "URLLENGTH without URL");

checkPrerequisiteIsMet(ctx.HOST(), ctx.HOSTLENGTH(), ctx, "HOSTLENGTH without HOST");
checkPrerequisiteIsMet(ctx.HOST(), ctx.HOSTTYPE(), ctx, "HOSTTYPE without HOST");

if (!ctx.HOST().isEmpty()) {
checkHasMandatoryOptions(ctx.HOSTLENGTH(), ctx, "HOSTLENGTH");
}

checkPrerequisiteIsMet(ctx.PATH(), ctx.PATHLENGTH(), ctx, "PATHLENGTH without PATH");
checkPrerequisiteIsMet(ctx.QUERYSTRING(), ctx.QUERYSTRLEN(), ctx, "QUERYSTRLEN without QUERYSTRING");
}
Expand All @@ -326,7 +328,6 @@ private void checkRead(CICSParser.Cics_web_readContext ctx) {
}

if (!ctx.HTTPHEADER().isEmpty()) {
checkHasMandatoryOptions(ctx.NAMELENGTH(), ctx, "NAMELENGTH");
checkHasMandatoryOptions(ctx.VALUE(), ctx, "VALUE");
checkHasMandatoryOptions(ctx.VALUELENGTH(), ctx, "VALUELENGTH");

Expand Down Expand Up @@ -363,9 +364,13 @@ private void checkReadNext(CICSParser.Cics_web_readnextContext ctx) {
private void checkReceive(CICSParser.Cics_web_receiveContext ctx) {
checkHasMandatoryOptions(ctx.RECEIVE(), ctx, "RECEIVE");

boolean isBuffer = false;
boolean isContainer = false;

if (!ctx.INTO().isEmpty() || !ctx.SET().isEmpty() || !ctx.LENGTH().isEmpty() || !ctx.MAXLENGTH().isEmpty() || !ctx.NOTRUNCATE().isEmpty() || !ctx.SRVCONVERT().isEmpty() || !ctx.NOSRVCONVERT().isEmpty() || !ctx.SERVERCONV().isEmpty()
|| !ctx.CLICONVERT().isEmpty() || !ctx.NOCLICONVERT().isEmpty() || !ctx.CLIENTCONV().isEmpty() || !ctx.HOSTCODEPAGE().isEmpty()) {
// Buffer
isBuffer = true;
checkHasIllegalOptions(ctx.TOCONTAINER(), "TOCONTAINER");
checkHasIllegalOptions(ctx.TOCHANNEL(), "TOCHANNEL");

Expand All @@ -374,11 +379,12 @@ private void checkReceive(CICSParser.Cics_web_receiveContext ctx) {
checkMutuallyExclusiveOptions("CLICONVERT, NOCLICONVERT, CLIENTCONV", ctx.CLICONVERT(), ctx.NOCLICONVERT(), ctx.CLIENTCONV());

checkHasMandatoryOptions(ctx.LENGTH(), ctx, "LENGTH");

}

if (!ctx.TOCONTAINER().isEmpty() || !ctx.TOCHANNEL().isEmpty()) {
// Container
isContainer = true;

checkHasIllegalOptions(ctx.INTO(), "INTO");
checkHasIllegalOptions(ctx.SET(), "SET");
checkHasIllegalOptions(ctx.LENGTH(), "LENGTH");
Expand All @@ -401,6 +407,10 @@ private void checkReceive(CICSParser.Cics_web_receiveContext ctx) {
checkAllOptionsArePresentOrAbsent("STATUSCODE and STATUSTEXT", ctx, ctx.STATUSCODE(), ctx.STATUSTEXT());
checkPrerequisiteIsMet(ctx.STATUSCODE(), ctx.STATUSLEN(), ctx, "STATUSLEN without STATUSCODE");
}

if (!isBuffer && !isContainer) {
checkHasExactlyOneOption("INTO, SET, LENGTH or TOCONTAINER", ctx, ctx.INTO(), ctx.SET(), ctx.LENGTH(), ctx.TOCONTAINER());
}
}

private void checkRetrieve(CICSParser.Cics_web_retrieveContext ctx) {
Expand All @@ -412,7 +422,7 @@ private void checkSend(CICSParser.Cics_web_sendContext ctx) {
checkHasMandatoryOptions(ctx.SEND(), ctx, "SEND");
if (!ctx.SESSTOKEN().isEmpty()) {
// Client
checkHasExactlyOneOption("GET, HEAD, PATCH, POST, PUT, TRACE, OPTIONS, DELETE or METHOD", ctx, ctx.GET(), ctx.HEAD(), ctx.PATCH(), ctx.POST(), ctx.PUT(), ctx.TRACE(), ctx.OPTIONS(), ctx.DELETE(), ctx.METHOD());
checkMutuallyExclusiveOptions("GET, HEAD, PATCH, POST, PUT, TRACE, OPTIONS, DELETE or METHOD", ctx.GET(), ctx.HEAD(), ctx.PATCH(), ctx.POST(), ctx.PUT(), ctx.TRACE(), ctx.OPTIONS(), ctx.DELETE(), ctx.METHOD());

checkMutuallyExclusiveOptions("PATH or URIMAP", ctx.PATH(), ctx.URIMAP());
checkAllOptionsArePresentOrAbsent("PATH and PATHLENGTH", ctx, ctx.PATH(), ctx.PATHLENGTH());
Expand Down Expand Up @@ -449,18 +459,14 @@ private void checkSend(CICSParser.Cics_web_sendContext ctx) {
checkMutuallyExclusiveOptions("CLICONVERT, NOCLICONVERT, CLIENTCONV", ctx.CLICONVERT(), ctx.NOCLICONVERT(), ctx.CLIENTCONV());
} else {
// Server
checkHasExactlyOneOption("DOCTOKEN, FROM or CONTAINER", ctx, ctx.DOCTOKEN(), ctx.FROM(), ctx.CONTAINER());
checkMutuallyExclusiveOptions("DOCTOKEN, FROM or CONTAINER", ctx.DOCTOKEN(), ctx.FROM(), ctx.CONTAINER());

checkPrerequisiteIsMet(ctx.DOCTOKEN(), ctx.NODOCDELETE(), ctx, "NODOCDELETE without DOCTOKEN");
checkPrerequisiteIsMet(ctx.DOCTOKEN(), ctx.DOCDELETE(), ctx, "DOCDELETE without DOCTOKEN");
checkPrerequisiteIsMet(ctx.DOCTOKEN(), ctx.DOCSTATUS(), ctx, "DOCSTATUS without DOCTOKEN");
checkMutuallyExclusiveOptions("NODOCDELETE, DOCDELETE or DOCSTATUS", ctx.NODOCDELETE(), ctx.DOCDELETE(), ctx.DOCSTATUS());

checkPrerequisiteIsMet(ctx.FROM(), ctx.CHUNKNO(), ctx, "CHUNKNO without FROM");
checkPrerequisiteIsMet(ctx.FROM(), ctx.CHUNKYES(), ctx, "CHUNKYES without FROM");
checkPrerequisiteIsMet(ctx.FROM(), ctx.CHUNKEND(), ctx, "CHUNKEND without FROM");
checkPrerequisiteIsMet(ctx.FROM(), ctx.CHUNKING(), ctx, "CHUNKING without FROM");
checkMutuallyExclusiveOptions("CHUNKNO, CHUNKYES, CHUNKEND or CHUNKING", ctx.CHUNKNO(), ctx.CHUNKYES(), ctx.CHUNKEND(), ctx.CHUNKING());
checkMutuallyExclusiveOptions("DOCTOKEN, CONTAINER, CHUNKNO, CHUNKYES, CHUNKEND or CHUNKING", ctx.DOCTOKEN(), ctx.CONTAINER(), ctx.CHUNKNO(), ctx.CHUNKYES(), ctx.CHUNKEND(), ctx.CHUNKING());

checkPrerequisiteIsMet(ctx.FROM(), ctx.HOSTCODEPAGE(), ctx, "HOSTCODEPAGE without FROM");

Expand Down
4 changes: 3 additions & 1 deletion server/engine/src/main/resources/LanguageKeywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1424,6 +1424,8 @@ HOSTLENGTH=
HOSTTYPE=
HOUR=
HOURS=
HTTP=
HTTPS=
HTTPHEADER=
HTTPMETHOD=
HTTPRNUM=
Expand Down Expand Up @@ -2130,7 +2132,7 @@ NOOPTIMIZE=
NOOPTIONS=
NOORDER=
NOOTELTRACE=
NOOUTCONERT=
NOOUTCONVERT=
NOP=
NOPASSBKRD=
NOPASSBKWR=
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ private static Stream<String> getProgramToTest() {
"NOHANDLE",
"NOINCONVERT",
"NONE",
"NOOUTCONERT",
"NOOUTCONVERT",
"NOQUEUE",
"NOQUIESCE",
"NOSRVCONVERT",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public class TestCicsWebStatement {
private static final String CLOSE_INVALID = WEB + "{CLOSE|errorOne}";
private static final String READ_QUERYPARM_INVALID = WEB_READ + "QUERYPARM({$varOne}) NAMELENGTH({$varOne}) {SESSTOKEN|errorOne}({$varOne}) VALUE({$varOne}) VALUELENGTH({$varOne})";
private static final String READNEXT_QUERYPARM_INVALID = WEB_READNEXT + "QUERYPARM({$varOne}) NAMELENGTH({$varOne}) {SESSTOKEN|errorOne}({$varOne}) VALUE({$varOne}) VALUELENGTH({$varOne})";
private static final String SEND_SERVER_INVALID = WEB + "SEND {DOCTOKEN|errorOne}({$varOne}) {FROM|errorOne}({$varOne}) FROMLENGTH({$varOne}) NODOCDELETE MEDIATYPE({$varOne}) SRVCONVERT CHARACTERSET({$varOne}) STATUSCODE({$varOne}) STATUSTEXT({$varOne}) STATUSLEN({$varOne}) IMMEDIATE NOCLOSE";
private static final String SEND_SERVER_INVALID = WEB + "SEND DOCTOKEN({$varOne}) {FROM|errorOne}({$varOne}) FROMLENGTH({$varOne}) NODOCDELETE MEDIATYPE({$varOne}) SRVCONVERT CHARACTERSET({$varOne}) STATUSCODE({$varOne}) STATUSTEXT({$varOne}) STATUSLEN({$varOne}) IMMEDIATE NOCLOSE";



Expand Down Expand Up @@ -198,7 +198,7 @@ void testSendServerValid() {
@Test
void testSendServerInvalid() {
HashMap<String, Diagnostic> expectedDiagnostics = new HashMap<>();
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Exactly one option required, options are mutually exclusive: DOCTOKEN, FROM or CONTAINER", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
expectedDiagnostics.put("errorOne", new Diagnostic(new Range(), "Options \"DOCTOKEN, FROM or CONTAINER\" are mutually exclusive.", DiagnosticSeverity.Error, ErrorSource.PARSING.getText()));
CICSTestUtils.errorTest(SEND_SERVER_INVALID, expectedDiagnostics);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ class TestReplacingWithDifferentPatternsShowsError {
+ "MCC, MEDIATYPE, MESSAGEID, METADATA, METADATALEN, METHOD, METHODLENGTH, MILLISECONDS, MINIMUM, MINUTES, MMDDYY, MMDDYYYY, "
+ "MODENAME, MONITOR, MONTH, MONTHOFYEAR, MSR, MSRCONTROL, NAME, NAMELENGTH, NATLANG, NATLANGINUSE, NETNAME, NEWPASSWORD, "
+ "NEWPHRASE, NEWPHRASELEN, NEXTTRANSID, NLEOM, NOAUTOPAGE, NOCC, NOCHECK, NOCLICONVERT, NOCLOSE, NODATA, NODOCDELETE, "
+ "NODUMP, NOEDIT, NOFLUSH, NOHANDLE, NOINCONVERT, NONE, NOOUTCONERT, NOQUEUE, NOQUIESCE, NOSRVCONVERT, NOSUSPEND, NOTE, "
+ "NODUMP, NOEDIT, NOFLUSH, NOHANDLE, NOINCONVERT, NONE, NOOUTCONVERT, NOQUEUE, NOQUIESCE, NOSRVCONVERT, NOSUSPEND, NOTE, "
+ "NOTPURGEABLE, NOTRUNCATE, NOWAIT, NSCONTAINER, NUMCIPHERS, NUMEVENTS, NUMITEMS, NUMREC, NUMROUTES, NUMSEGMENTS, NUMTAB, "
+ "OIDCARD, OPCLASS, OPERATION, OPERATOR, OPERID, OPERKEYS, OPERPURGE, OPID, OPSECURITY, OPTIONS, ORGABCODE, ORGANIZATLEN,"
+ " ORGUNIT, ORGUNITLEN, OUTDESCR, OUTLINE, OUTPARTN, OWNER, PA, PAGENUM, PAGING, PARTN, PARTNER, PARTNPAGE, PARTNS, PARTNSET, "
Expand Down

0 comments on commit 5d516c5

Please sign in to comment.