[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-ui / src / nfvo-utils / json / JSONSchema.js
index 8c7d8cf..3b3a9bf 100644 (file)
@@ -1,23 +1,18 @@
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
+/*!
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
  */
-
 // import Ajv from 'ajv';
 import cloneDeep from 'lodash/cloneDeep.js';
 import JSONPointer from './JSONPointer.js';
@@ -40,6 +35,108 @@ export default class JSONSchema {
                return data;
        }
 
+       // array of names of validation functions
+       setSupportedValidationFunctions(supportedValidationFunctions) {
+               this._supportedValidationFunctions = supportedValidationFunctions;
+       }
+
+       /* FYI - I was going to support "required" but then found out that server never sends it in its schema (it was a business decision. so leaving the code commented for now */
+       flattenSchema(supportedValidationFunctions) {
+               if (supportedValidationFunctions) { this.setSupportedValidationFunctions(supportedValidationFunctions); }
+               let genericFieldInfo = {};
+               if (this._schema && this._schema.properties) {
+                       this.travelProperties(this._schema.properties, genericFieldInfo/*, this._schema.required*/);
+               }
+               return {genericFieldInfo};
+       }
+
+       extractGenericFieldInfo(item) {
+               let validationsArr = [];
+               let additionalInfo = { isValid: true, errorText: ''};
+               for (let value in item) {
+                       if (this._supportedValidationFunctions.includes(value)) {
+                               let validationItem = this.extractValidations(item, value);
+                               validationsArr[validationsArr.length] = validationItem;
+                       } else {
+                               let enumResult = this.extractEnum(item, value);
+                               if (enumResult !== null) {
+                                       additionalInfo.enum = enumResult;
+                               }
+                               else {
+                                       additionalInfo[value] = item[value];
+                               }
+                               /*if (required.includes (property)) {
+                                additionalInfo[value].isRequired = true ;
+                                }*/
+                       }
+               }
+
+               additionalInfo.validations = validationsArr;
+               return additionalInfo;
+       }
+
+       extractValidations(item, value) {
+               let validationItem;
+               let data = item[value];
+               if (value === 'maximum') {
+                       if (item.exclusiveMaximum) {
+                               value = 'maximumExclusive';
+                       }
+               }
+               if (value === 'minimum') {
+                       if (item.exclusiveMinimum) {
+                               value = 'minimumExclusive';
+                       }
+               }
+               validationItem = {type: value, data: data};
+               return validationItem;
+       }
+
+       extractEnum(item, value) {
+               let enumResult = null;
+               if (value === 'type' && item[value] === 'array') {
+                       let items = item.items;
+                       if (items && items.enum && items.enum.length > 0) {
+                               let values = items.enum
+                                       .filter(value => value)
+                                       .map(value => ({enum: value, title: value}));
+                               enumResult = values;
+                       }
+               }
+               else if (value === 'enum') {
+                       let items = item[value];
+                       if (items && items.length > 0) {
+                               let values = items
+                                       .filter(value => value)
+                                       .map(value => ({enum: value, title: value}));
+                               enumResult = values;
+                       }
+               }
+               return enumResult;
+       }
+
+       travelProperties(properties, genericFieldDefs, /*required = [],*/ pointer = ''){
+               let newPointer = pointer;
+               for (let property in properties) {
+                       newPointer = newPointer ? newPointer + '/' + property : property;
+                       if (properties[property].properties) {
+                               this.travelProperties(properties[property].properties, genericFieldDefs /*, properties[property].required*/, newPointer);
+                       }
+                       else if (properties[property].$ref){
+                               let fragment = this._getSchemaFragmentByRef(properties[property].$ref);
+                               if (fragment.properties) {
+                                       this.travelProperties(fragment.properties, genericFieldDefs /*, properties[property].required*/, newPointer);
+                               } else {
+                                       genericFieldDefs[newPointer] = this.extractGenericFieldInfo(fragment.properties);
+                               }
+                       }
+                       else {
+                               genericFieldDefs[newPointer] = this.extractGenericFieldInfo(properties[property]);
+                       }
+                       newPointer = pointer;
+               }
+       }
+
        getTitle(pointer) {
                return this._getSchemaFragment(pointer).title;
        }
@@ -73,12 +170,12 @@ export default class JSONSchema {
 
        getMaxValue(pointer) {
                const fragment = this._getSchemaFragment(pointer);
-               return fragment && fragment.maximum;
+               return fragment && fragment.exclusiveMaximum ? fragment.maximum - 1 : fragment.maximum;
        }
 
        getMinValue(pointer) {
                const fragment = this._getSchemaFragment(pointer);
-               return fragment && fragment.minimum;
+               return fragment && fragment.exclusiveMinimum ? fragment.minimum : fragment.minimum;
        }
 
        isString(pointer) {