@broadcom/mat-detect-for-zowe-cli
Version:
MAT Detect plug-in for Zowe CLI
264 lines • 24.9 kB
JavaScript
;
/*
* Copyright (c) 2019 Broadcom. All Rights Reserved. The term
* "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
*
* This software and all information contained therein is
* confidential and proprietary and shall not be duplicated,
* used, disclosed, or disseminated in any way except as
* authorized by the applicable license agreement, without the
* express written permission of Broadcom. All authorized
* reproductions must be marked with this language.
*
* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO
* THE EXTENT PERMITTED BY APPLICABLE LAW, BROADCOM PROVIDES THIS
* SOFTWARE WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT
* LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL BROADCOM
* BE LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR
* DAMAGE, DIRECT OR INDIRECT, FROM THE USE OF THIS SOFTWARE,
* INCLUDING WITHOUT LIMITATION, LOST PROFITS, BUSINESS
* INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF BROADCOM IS
* EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE.
*/
const util_1 = require("util");
const erroSeg = "The length is more than 8 characters";
class PMAProfileValidationPlan /*implements IProfileValidationPlan*/ {
static getformatdate() {
// Getting system today's date with proper format and then replace with Variable for job submission.
const tod = new Date();
let dd = String(tod.getDate()).substring(0, 2);
if (dd.length === 1) {
dd = "0" + dd;
}
let mm = String(tod.getMonth() + 1).substring(0, 2);
if (mm.length === 1) {
mm = "0" + mm;
}
const yyyy = tod.getFullYear();
const todaystring = yyyy + "-" + mm + "-" + dd;
return todaystring;
}
static checkJobAcct(jobAcct) {
const ALLOWED_NUMBER = /^[0-9]+$/;
let errors;
const jobAcct1 = jobAcct.toString();
if (!jobAcct1.match(ALLOWED_NUMBER)) {
errors = `job_acct value provided - "${jobAcct}" - is not valid. Valid values are any numbers from 0 to 9 `;
}
return errors;
}
static checkJobClass(jobClass) {
const ALLOWED_NUMBER = /^[0-9a-zA-Z]+$/;
let errors;
if (!String(jobClass).match(ALLOWED_NUMBER) || (jobClass.length > 1)) {
errors = `job_class value provided - "${jobClass}" - is not valid. Valid values are any characters from A to Z and any numbers from 0 to 9 `;
}
return errors;
}
static checkJobMClass(jobMClass) {
const ALLOWED_NUMBER = /^[0-9a-zA-Z]+$/;
let errors;
if (!String(jobMClass).match(ALLOWED_NUMBER) || (jobMClass.length > 1)) {
errors = `MSGCLASS value provided - "${jobMClass}" - is not valid. Valid values are any characters from A to Z and any numbers from 0 to 9 `;
}
return errors;
}
static toUpperclass(jobKClass) {
const ALLOWED_CHAR = /[a-z]/;
if (String(jobKClass).match(ALLOWED_CHAR)) {
jobKClass = jobKClass.toLocaleUpperCase();
}
return jobKClass;
}
/* checkDsName function is for checking dataset name validity
*/
static checkDsName(dsName) {
const MAX_SEGMENTS_COUNT = 22;
const MIN_SEGMENTS_COUNT = 1;
let errors;
if (dsName === " " || (0, util_1.isNullOrUndefined)(dsName)) {
errors = dsName + " data set name is empty";
}
else {
dsName = dsName.toUpperCase();
errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "max", errors);
errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "start", errors);
errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "end", errors);
errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "inc", errors);
errors = PMAProfileValidationPlan.checkDsNameErr(dsName, "ninc", errors);
const num = 30;
const nameSegments = dsName.toUpperCase().split(".", num);
switch (true) {
case (nameSegments.length < MIN_SEGMENTS_COUNT):
errors = dsName + " data set name doesn't contain any node ";
break;
case (nameSegments.length > MAX_SEGMENTS_COUNT):
errors = dsName + " data set name contains too many nodes (more than 22) ";
break;
}
for (const dsNameSegment of nameSegments) {
const temp = PMAProfileValidationPlan.checkDsNameSegmentFromDataSet(dsName, dsNameSegment);
if (!(0, util_1.isNullOrUndefined)(temp)) {
errors = temp;
}
}
}
return errors;
}
static checkDsNameErr(dsName, cond, errors) {
const MAX_DSNAME_LENGTH = 44;
switch (true) {
case (dsName.length > MAX_DSNAME_LENGTH && cond === "max"):
errors = dsName + " data set name is too long ";
break;
case (dsName.startsWith(".") && cond === "start"):
errors = dsName + " data set name starts with a \",\". ";
break;
case (dsName.endsWith(".") && cond === "end"):
errors = dsName + " data set name ends with a \",\". ";
break;
case (dsName.toLowerCase().includes("..") && cond === "inc"):
errors = dsName + " data set contains \",\".. ";
break;
case (!dsName.toLowerCase().includes(".") && cond === "ninc"):
errors = dsName + " data set is too short, it must contain at least 2 nodes/segments ";
break;
}
return errors;
}
/* checkDsNameSegmentFromDataSet function is for checking each nodes from dataset name validity
*/
static checkDsNameSegmentFromDataSet(dsName, dsNameSegment) {
let errorsSegment;
const MAX_SEGMENT_LENGTH = 8;
const MIN_SEGMENT_LENGTH = 1;
const ALLOWED_CHARACTERS1 = /^[a-zA-Z]+$/;
const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$]/;
let firstChar = null;
if (dsNameSegment.length < MIN_SEGMENT_LENGTH) {
errorsSegment = " contains a node that is too short, contains .., or starts with a . ";
}
if (dsNameSegment.length > MAX_SEGMENT_LENGTH) {
errorsSegment = " the following node is too long: "
+ dsNameSegment;
}
switch (true) {
// check node with first letter
case (dsNameSegment.length === 1):
firstChar = dsNameSegment.charAt(0);
if ((!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) && firstChar !== "#"
&& firstChar !== "@" && firstChar !== "$") {
errorsSegment = " the first character of data set " + dsName + " node is invalid " + dsNameSegment.charAt(0);
}
break;
// check first letter should be A-Z or @#$
case (dsNameSegment.length > 1):
firstChar = dsNameSegment.charAt(0);
if (!(firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) && firstChar !== "#"
&& firstChar !== "@" && firstChar !== "$") {
errorsSegment = " the following node \"" + ",\"" + dsNameSegment + "\" "
+ ",\" starts with a prohibited character: "
+ dsNameSegment.charAt(0);
}
// check the rest of the name, should be A-Z, 0-9 or @#$-
for (let i = 1; i < dsNameSegment.length; ++i) {
const iChar = dsNameSegment.charAt(i);
if ((!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) && iChar !== "#"
&& iChar !== "@" && iChar !== "$") {
errorsSegment = " the following node \"" + ",\"" + dsNameSegment + "\" "
+ ",\" contains a prohibited character: "
+ dsNameSegment.charAt(i);
}
}
break;
default:
break;
}
return errorsSegment;
}
static checkjobname(dsNameSegment) {
if (!(0, util_1.isNullOrUndefined)(dsNameSegment)) {
let errorsSegment;
const MAX_SEGMENT_LENGTH = 8;
const ALLOWED_CHARACTERS1 = /^[a-zA-Z#@$]/;
const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$]/;
if (dsNameSegment.length > MAX_SEGMENT_LENGTH) {
errorsSegment = erroSeg;
}
// check node with first letter
const firstChar = dsNameSegment.toString().substring(0, 1);
if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) {
errorsSegment = ` the first character of jobname is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`;
}
// check the rest of the name, should be A-Z, 0-9 or @#$-
if ((0, util_1.isNullOrUndefined)(errorsSegment)) {
for (let i = 1; i <= dsNameSegment.length; ++i) {
const iChar = dsNameSegment.toString().substring(i - 1, i);
if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) {
errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`;
}
}
}
return errorsSegment;
}
}
static checkpmajobname(dsNameSegment) {
if (!(0, util_1.isNullOrUndefined)(dsNameSegment)) {
let errorsSegment;
const MAX_SEGMENT_LENGTH = 8;
const ALLOWED_CHARACTERS1 = /^[a-zA-Z#@$_]/;
const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$_*]/;
if (dsNameSegment.length > MAX_SEGMENT_LENGTH) {
errorsSegment = erroSeg;
}
// check node with first letter
const firstChar = dsNameSegment.toString().substring(0, 1);
if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) {
errorsSegment = ` the first character is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`;
}
// check the rest of the name, should be A-Z, 0-9 or @#$-
for (let i = 1; i <= dsNameSegment.length; ++i) {
const iChar = dsNameSegment.toString().substring(i - 1, i);
if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g")) && (0, util_1.isNullOrUndefined)(errorsSegment)) {
errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`;
}
if ((iChar === "*") && (i !== dsNameSegment.length) && (0, util_1.isNullOrUndefined)(errorsSegment)) {
errorsSegment = ` character after * is prohibited`;
}
}
return errorsSegment;
}
}
static checkpmaproname(dsNameSegment) {
let errorsSegment;
const MAX_SEGMENT_LENGTH = 8;
const ALLOWED_CHARACTERS1 = /^[0-9a-zA-Z#@$_]/;
const ALLOWED_CHARACTERS2 = /^[0-9a-zA-Z#@$_*]/;
if (dsNameSegment.length > MAX_SEGMENT_LENGTH) {
errorsSegment = erroSeg;
}
// check node with first letter
const firstChar = dsNameSegment.toString().substring(0, 1);
if (!firstChar.match(new RegExp(ALLOWED_CHARACTERS1, "g"))) {
errorsSegment = ` the first character is "${firstChar}". The first character in the name must be an alphabetic character (the letters A through Z) or a special character (the symbols #, @, and $).`;
}
// check the rest of the name, should be A-Z, 0-9 or @#$-
if ((0, util_1.isNullOrUndefined)(errorsSegment)) {
for (let i = 1; i <= dsNameSegment.length; ++i) {
const iChar = dsNameSegment.toString().substring(i - 1, i);
if (!iChar.match(new RegExp(ALLOWED_CHARACTERS2, "g"))) {
errorsSegment = ` contains a prohibited character: "${iChar}". The remaining characters can be alphanumeric (the letters A through Z and numbers 0 through 9) or special characters.`;
}
if (iChar === "*") {
if (i !== dsNameSegment.length) {
errorsSegment = ` character after * is prohibited`;
}
}
}
}
return errorsSegment;
}
}
module.exports = PMAProfileValidationPlan;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUE1BUHJvZmlsZVZhbGlkYXRpb25QbGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9QTUFQcm9maWxlVmFsaWRhdGlvblBsYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCwrQkFBeUM7QUFDekMsTUFBTSxPQUFPLEdBQUcsc0NBQXNDLENBQUM7QUFDdkQsTUFBTSx3QkFBd0IsQ0FBQyxxQ0FBcUM7SUFDekQsTUFBTSxDQUFDLGFBQWE7UUFDdkIsb0dBQW9HO1FBQ3BHLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxXQUFXLEdBQVcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ00sTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ3RDLE1B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