Fix Issues in TOSCA Parser 63/48563/7
authorWang,Frank(gw1218) <gw1218@att.com>
Tue, 22 May 2018 19:50:33 +0000 (14:50 -0500)
committerWang,Frank(gw1218) <gw1218@att.com>
Wed, 23 May 2018 19:54:59 +0000 (14:54 -0500)
Fixed a bug and added some new validations in TOSCA Parser

Issue-ID: POLICY-776
Change-Id: I2dc1b5b38cd137efc5c24ccf55b19de9f47c44da
Signed-off-by: Wang,Frank(gw1218) <gw1218@att.com>
ONAP-REST/src/main/java/org/onap/policy/rest/util/MSModelUtils.java
ONAP-REST/src/main/java/org/onap/policy/rest/util/ParserException.java [new file with mode: 0644]
ONAP-REST/src/test/java/org/onap/policy/rest/util/MSModelUtilsTest.java

index 7db16bd..1a62ccc 100644 (file)
@@ -763,13 +763,16 @@ public class MSModelUtils {
                
        } catch (IOException e) {
                logger.error(e);
+       }catch(ParserException e){
+               logger.error(e);
+               return e.getMessage();
        }
           
        return null;
        } 
        
        @SuppressWarnings("unchecked")
-       public LinkedHashMap<String, String> load(String fileName) throws IOException { 
+       public LinkedHashMap<String, String> load(String fileName) throws IOException,ParserException { 
                File newConfiguration = new File(fileName);
                StringBuilder orderInfo = new StringBuilder("[");
                Yaml yaml = new Yaml();
@@ -778,6 +781,8 @@ public class MSModelUtils {
                        yamlMap = (LinkedHashMap<Object, Object>) yaml.load(is); 
                } catch (FileNotFoundException e) {
                        logger.error(e);
+               }catch(Exception e){
+                       throw new ParserException("Invalid TOSCA Model format. Please make sure it is a valid YAML file");
                }
 
                StringBuilder sb = new StringBuilder(); 
@@ -1098,17 +1103,25 @@ public class MSModelUtils {
                                                                stringListItems.append(uniqueDataKeySplit[1].toUpperCase()+":required-"+requiredValue +":MANY-true");
                                                        }
                                                        dataMapForJson.put(uniqueDataKey, stringListItems.toString());
-                                                       dataListBuffer.append(uniqueDataKeySplit[1].toUpperCase()+"=[");
+                                                       boolean isConstraintsFound = false;
                                                        for(int i=0;i<10;i++){
                                                                String findConstraints= DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+".entry_schema.constraints.0.valid_values."+i;
                                                                logger.info("findConstraints => " + findConstraints);
                                                                String constraintsValue=map.get(findConstraints);
                                                                logger.info("constraintsValue => " + constraintsValue);
-                                                               if(constraintsValue==null){
+                                                               if((constraintsValue==null || constraintsValue.isEmpty()) && i==0){ //if no constraints at all ( index i as 0 can tell this )
+                                                                       isConstraintsFound = false;
+                                                                       //if type is list but no constraints
+                                                                       String newValue = dataMapForJson.get(uniqueDataKey).replace("MANY-false", "MANY-true"); 
+                                                                       newValue = newValue.replace(uniqueDataKeySplit[1].toUpperCase()+":", "");       
+                                                                       dataMapForJson.put(uniqueDataKey, newValue);
                                                                        break;
-                                                               }
-                                                               else{
-                                                                       logger.info("constraintsValue => " + constraintsValue);
+                                                               } else{
+                                                                       isConstraintsFound = true;
+                                                                       if(i == 0){ // only need to add one time for the same attribute
+                                                                          dataListBuffer.append(uniqueDataKeySplit[1].toUpperCase()+"=[");
+                                                                       }
+
                                                                        if(constraintsValue.contains("=")){
                                                                                constraintsValue = constraintsValue.replace("=", "equal-sign");
                                                                        }
@@ -1116,9 +1129,12 @@ public class MSModelUtils {
                                                                        dataListBuffer.append(constraintsValue+",");
                                                                }
                                                        }
-                                                       dataListBuffer.append("]#");
-                                                       logger.info(dataListBuffer);
+                                                       if(isConstraintsFound){                                                 
+                                                           dataListBuffer.append("]#");
+                                                       }
                                                }
+                                       }else{
+                                               logger.info("entry_schema.type is not defined correctly");
                                        }
                                }
                                else{
@@ -1138,7 +1154,7 @@ public class MSModelUtils {
        }
        
        
-       LinkedHashMap<String, LinkedHashMap<String, String>> parsePolicyNodes(Map<String,String> map){
+       LinkedHashMap<String, LinkedHashMap<String, String>> parsePolicyNodes(Map<String,String> map) throws ParserException{
                LinkedHashMap<String,LinkedHashMap<String,String>> mapKey= new LinkedHashMap <>();
                for(String uniqueKey: uniqueKeys){
                        LinkedHashMap<String,String> hm;
@@ -1150,7 +1166,11 @@ public class MSModelUtils {
                                                hm = mapKey.get(uniqueKey);
                                                String keyStr= key.substring(key.lastIndexOf('.')+1);
                                                String valueStr= map.get(key);
-                                               if(("type").equals(keyStr)){
+                                               if("type".equalsIgnoreCase(keyStr) && ((key.contains("entry_schema.0.type") || key.contains("entry_schema.type") && valueStr.contains("policy.data.")))){
+                                                  throw new ParserException("For using user defined object type, Please make sure no space between 'type:' and object " + valueStr );
+                                                       
+                                               }       
+                                               if("type".equals(keyStr)){
                                                        if(!key.contains("entry_schema"))
                                                        {
                                                                hm.put(keyStr,valueStr);
@@ -1163,6 +1183,9 @@ public class MSModelUtils {
                                                hm = new LinkedHashMap <>();
                                                String keyStr= key.substring(key.lastIndexOf('.')+1);
                                                String valueStr= map.get(key);
+                                               if(key.contains(".objective.")){                                                        
+                                                       throw new ParserException("Attribute objective is a key word. Please use a different name");
+                                               }
                                                if(("type").equals(keyStr)){
                                                        if(!key.contains("entry_schema"))
                                                        {
diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/util/ParserException.java b/ONAP-REST/src/main/java/org/onap/policy/rest/util/ParserException.java
new file mode 100644 (file)
index 0000000..be7acb4
--- /dev/null
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-REST
+ * ================================================================================
+ * Copyright (C) 2018 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
+ * 
+ * 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=========================================================
+ */
+package org.onap.policy.rest.util;
+
+public class ParserException  extends Exception{
+          String message;
+          ParserException(String message) {
+               this.message = message;
+          }
+          public String getMessage(){ 
+               return message ;
+          }
+}
\ No newline at end of file
index aa41429..6a9c4c4 100644 (file)
@@ -95,6 +95,8 @@ public class MSModelUtilsTest {
                        } catch (IOException e) {
                                logger.error("testLoad", e);
                                result = null;
+                       }catch(ParserException e){
+                               logger.error("testLoad", e);
                        }
                        
                        assertTrue(result != null && !result.isEmpty());