Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CICS Create System Command #2666

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ cics_create_opts:((ATOMSERVICE | BUNDLE | DB2CONN | DB2ENTRY | DB2TRAN | DOCTEMP
IPCONN | JOURNALMODEL | JVMSERVER | LIBRARY | LSRPOOL | MAPSET | MQCONN | MQMONITOR | PARTITIONSET |
PARTNER | PIPELINE | PROCESSTYPE | PROFILE | PROGRAM | TCPIPSERVICE | TDQUEUE | TRANCLASS |
TRANSACTION | TSMODEL | TYPETERM | URIMAP | WEBSERVICE | SESSIONS | TERMINAL | CONNECTION) cics_data_value |
(ATTRIBUTES cics_attributes | COMPLETE | DISCARD | ATTRLEN cics_data_value | LOG | NOLOG | LOGMESSAGE cics_cvda | cics_handle_response))+;
(ATTRIBUTES cics_data_area | COMPLETE | DISCARD | ATTRLEN cics_data_value | LOG | NOLOG | LOGMESSAGE cics_cvda | cics_handle_response))+;
KutluOzel-b marked this conversation as resolved.
Show resolved Hide resolved

/** DEFINE (all of them) */
cics_define: DEFINE (cics_define_activity | cics_define_composite_event | cics_define_counter_dcounter | cics_define_input_event | cics_define_process | cics_define_timer);
Expand Down Expand Up @@ -1014,7 +1014,6 @@ cics_hhmmss: LPARENCHAR hhmmss RPARENCHAR;
cics_label: LPARENCHAR paragraphNameUsage RPARENCHAR;
cics_value: LPARENCHAR ptr_value RPARENCHAR;
empty_parens: LPARENCHAR RPARENCHAR;
cics_attributes: LPARENCHAR ( WORD_IDENTIFIER | literal | LPARENCHAR (WORD_IDENTIFIER | literal) RPARENCHAR )+ RPARENCHAR;

cicsWord
: WORD_IDENTIFIER | cicsWords
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,13 @@ public <E extends ParserRuleContext> void checkOptions(E ctx) {
checkDuplicates(ctx);
}
private void checkOpts(CICSParser.Cics_create_optsContext ctx) {
slavek-kucera marked this conversation as resolved.
Show resolved Hide resolved
checkHasMutuallyExclusiveOptions(ctx.ATOMSERVICE(), ctx.BUNDLE(), ctx.DB2CONN(), ctx.DB2ENTRY(), ctx.DB2TRAN(), ctx.DOCTEMPLATE(), ctx.DUMPCODE(),
slavek-kucera marked this conversation as resolved.
Show resolved Hide resolved
ctx.ENQMODEL(), ctx.FILE(), ctx.IPCONN(), ctx.JOURNALMODEL(), ctx.JVMSERVER(), ctx.LIBRARY(),
ctx.LSRPOOL(), ctx.MAPSET(), ctx.MQCONN(), ctx.MQMONITOR(), ctx.PARTITIONSET(), ctx.PARTNER(),
ctx.PROCESSTYPE(), ctx.PROFILE(), ctx.PROGRAM(), ctx.TCPIPSERVICE(), ctx.TDQUEUE(), ctx.TRANCLASS(),
ctx.TRANSACTION(), ctx.TSMODEL(), ctx.TYPETERM(), ctx.URIMAP(), ctx.WEBSERVICE(), ctx.SESSIONS(),
ctx.TERMINAL(), ctx.CONNECTION());

if (!ctx.CONNECTION().isEmpty() || !ctx.TERMINAL().isEmpty()) {
checkHasExactlyOneOption("ATTRIBUTES or COMPLETE or DISCARD", ctx, ctx.ATTRIBUTES(), ctx.COMPLETE(), ctx.DISCARD());
if (!ctx.DISCARD().isEmpty() || !ctx.COMPLETE().isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,34 @@ protected int checkHasMutuallyExclusiveOptions(String options, List<TerminalNode
}
return nodes.size();
}
/**
* Flags errors for rule lists passed as parameters if there are multiple instances of mutually
* exclusive options.
*
* @param rules Lists of TerminalNode to iterate through
* @return Number of TerminalNode instances found
*/
protected int checkHasMutuallyExclusiveOptions(List<TerminalNode>... rules) {
slavek-kucera marked this conversation as resolved.
Show resolved Hide resolved
List<TerminalNode> nodes =
Stream.of(rules)
.filter(rule -> !rule.isEmpty())
.flatMap(Collection::stream)
.collect(Collectors.toList());
nodes.removeIf(Objects::isNull);

if (!nodes.stream()
.allMatch(e -> e.getSymbol().getType() == nodes.get(0).getSymbol().getType())) {
nodes.forEach(
node -> {
throwException(
ErrorSeverity.ERROR,
getLocality(node),
"Exactly one option required, options are mutually exclusive: ",
nodes.toString().replace(",", " or").replace("[", "").replace("]", ""));
slavek-kucera marked this conversation as resolved.
Show resolved Hide resolved
});
}
return nodes.size();
}

protected <E extends ParseTree> void checkHasExactlyOneOption(
String options, ParserRuleContext parentCtx, List<E>... rules) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,41 +37,41 @@ public class TestCICSCreateSp {

private static Stream<String> getValidOptions() {
return Stream.of(
"CREATE ATOMSERVICE({$varFour}) NOLOG ATTRLEN({$varFour}) ATTRIBUTES(anything)",
"CREATE BUNDLE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE CONNECTION({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE DB2CONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE DB2ENTRY({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE DB2TRAN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE DOCTEMPLATE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE DUMPCODE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE ENQMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE FILE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE IPCONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE JOURNALMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE JVMSERVER({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE LIBRARY({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE LSRPOOL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE MAPSET({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE MQCONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE MQMONITOR({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PARTITIONSET({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PARTNER({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PIPELINE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PROCESSTYPE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PROFILE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE PROGRAM({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TCPIPSERVICE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TDQUEUE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TRANCLASS({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TRANSACTION({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TSMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TYPETERM({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE URIMAP({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE WEBSERVICE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE SESSIONS({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE TERMINAL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES(anything)",
"CREATE CONNECTION({$varFour}) ATTRLEN({$varOne}) ATTRIBUTES(anything) NOLOG");
"CREATE ATOMSERVICE({$varFour}) NOLOG ATTRLEN({$varFour}) ATTRIBUTES({$varFour})",
"CREATE BUNDLE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE CONNECTION({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE DB2CONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE DB2ENTRY({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE DB2TRAN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE DOCTEMPLATE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE DUMPCODE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE ENQMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE FILE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE IPCONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE JOURNALMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE JVMSERVER({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE LIBRARY({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE LSRPOOL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE MAPSET({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE MQCONN({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE MQMONITOR({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PARTITIONSET({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PARTNER({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PIPELINE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PROCESSTYPE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PROFILE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE PROGRAM({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TCPIPSERVICE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TDQUEUE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TRANCLASS({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TRANSACTION({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TSMODEL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TYPETERM({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE URIMAP({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE WEBSERVICE({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE SESSIONS({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE TERMINAL({$varFour}) NOLOG ATTRLEN({$varOne}) ATTRIBUTES({$varFour})",
"CREATE CONNECTION({$varFour}) ATTRLEN({$varOne}) ATTRIBUTES({$varFour}) NOLOG");
};

private static final String CREATE_INVALID =
Expand All @@ -83,9 +83,11 @@ private static Stream<String> getValidOptions() {
private static final String CREATE_CONNECTION_MUTUALEX_INVALID =
"CREATE CONNECTION({$varFour}) {COMPLETE|error} {DISCARD|error2}";
private static final String CREATE_DB2CONN_MUTUALEX_INVALID =
"CREATE DB2CONN({$varFour}) ATTRIBUTES(anything) {LOG|error} {NOLOG|error2}";
"CREATE DB2CONN({$varFour}) ATTRIBUTES({$varFour}) {LOG|error} {NOLOG|error2}";
private static final String CREATE_DB2ENTRY_DISCARD_INVALID =
"CREATE DB2ENTRY({$varFour}) ATTRIBUTES(anything) {DISCARD|error}";
"CREATE DB2ENTRY({$varFour}) ATTRIBUTES({$varFour}) {DISCARD|error}";
private static final String CREATE_DB2ENTRY_FILE_INVALID =
"CREATE NOHANDLE {DB2ENTRY|error}({$varFour}) ATTRIBUTES({$varFour}) {FILE|error2}({$varFour})";
@ParameterizedTest
@MethodSource("getValidOptions")
void testCreateSpAllValid(String valid) {
Expand Down Expand Up @@ -172,5 +174,24 @@ void testCreateDb2EntrySpInvalid() {

CICSTestUtils.errorTest(CREATE_DB2ENTRY_DISCARD_INVALID, expectedDiagnostic, "SP");
}
@Test
void testCreateMutualExSpInvalid() {
Map<String, Diagnostic> expectedDiagnostic =
ImmutableMap.of(
"error",
new Diagnostic(
new Range(),
"Exactly one option required, options are mutually exclusive: DB2ENTRY or FILE",
DiagnosticSeverity.Error,
ErrorSource.PARSING.getText()),
"error2",
new Diagnostic(
new Range(),
"Exactly one option required, options are mutually exclusive: DB2ENTRY or FILE",
DiagnosticSeverity.Error,
ErrorSource.PARSING.getText()));

CICSTestUtils.errorTest(CREATE_DB2ENTRY_FILE_INVALID, expectedDiagnostic, "SP");
}
}

Loading