Interfaces support in SDC Parser

Part 1 of the changes of interface support in SDC Parser.

Change-Id: I3a5e0fdda69baad329460047a03f03665fbe577b
Issue-ID: SDC-1197
Signed-off-by: priyanshu <pagarwal@amdocs.com>
diff --git a/pom.xml b/pom.xml
index 990a7c9..5a2d1be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,8 +4,8 @@
 
 	<groupId>org.onap.sdc.jtosca</groupId>
 	<artifactId>jtosca</artifactId>
-	<version>1.3.4-SNAPSHOT</version>
-        <name>sdc-jtosca</name>
+	<version>1.3.5-SNAPSHOT</version>
+	<name>sdc-jtosca</name>
 	<properties>
 
 		<!-- ==================== -->
diff --git a/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java
index 20bc210..73b2341 100644
--- a/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java
+++ b/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java
@@ -1,5 +1,6 @@
 package org.onap.sdc.toscaparser.api;
 
+import static org.onap.sdc.toscaparser.api.elements.EntityType.TOSCA_DEF;
 import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue;
 
 import java.util.ArrayList;
@@ -405,6 +406,46 @@
 		return allowedOperations;
 	}
 
+	/**
+	 * Get all interface details for given node template.<br>
+	 * @return Map that contains the list of all interfaces and their definitions.
+	 * If none found, an empty map will be returned.
+	 */
+	public Map<String, List<InterfacesDef>> getAllInterfaceDetailsForNodeType(){
+		Map<String, List<InterfacesDef>> interfaceMap = new LinkedHashMap<>();
+
+		// Get custom interface details
+		Map<String, Object> customInterfacesDetails = ((NodeType)typeDefinition).getInterfaces();
+		// Get native interface details from tosca definitions
+		Object nativeInterfaceDetails = TOSCA_DEF.get(InterfacesDef.LIFECYCLE);
+		Map<String, Object> allInterfaceDetails = new LinkedHashMap<>();
+		allInterfaceDetails.putAll(customInterfacesDetails);
+		if (nativeInterfaceDetails != null){
+			allInterfaceDetails.put(InterfacesDef.LIFECYCLE, nativeInterfaceDetails);
+		}
+
+		// Process all interface details from combined collection and return an interface Map with
+		// interface names and their definitions
+		for(Map.Entry<String,Object> me: allInterfaceDetails.entrySet()) {
+			ArrayList<InterfacesDef> interfaces = new ArrayList<>();
+			String interfaceType = me.getKey();
+			Map<String,Object> interfaceValue = (Map<String,Object>)me.getValue();
+			if(interfaceValue.containsKey("type")){
+				interfaceType = (String) interfaceValue.get("type");
+			}
+
+			for(Map.Entry<String,Object> ve: interfaceValue.entrySet()) {
+				// Filter type as this is a reserved key and not an operation
+				if(!ve.getKey().equals("type")){
+					InterfacesDef iface = new InterfacesDef(typeDefinition, interfaceType,this, ve.getKey(), ve.getValue());
+					interfaces.add(iface);
+				}
+			}
+			interfaceMap.put(interfaceType, interfaces);
+		}
+		return interfaceMap;
+	}
+
 	private void _validateFields(LinkedHashMap<String,Object> nodetemplate) {
 		for(String ntname: nodetemplate.keySet()) {
 			boolean bFound = false;
diff --git a/src/main/java/org/onap/sdc/toscaparser/api/elements/InterfacesDef.java b/src/main/java/org/onap/sdc/toscaparser/api/elements/InterfacesDef.java
index f8669ed..86333d6 100644
--- a/src/main/java/org/onap/sdc/toscaparser/api/elements/InterfacesDef.java
+++ b/src/main/java/org/onap/sdc/toscaparser/api/elements/InterfacesDef.java
@@ -20,88 +20,88 @@
 	};
 
 	public static final String IMPLEMENTATION = "implementation";
+	public static final String DESCRIPTION = "description";
 	public static final String INPUTS = "inputs";
-	
-	public static final String INTERFACEVALUE[] = {IMPLEMENTATION, INPUTS};
 
 	public static final String INTERFACE_DEF_RESERVED_WORDS[] = {
 			"type", "inputs", "derived_from", "version", "description"};
-	
+
 	private EntityType ntype;
 	private EntityTemplate nodeTemplate;
-	private String name;
-	private Object value;
+
+	private String operationName;
+	private Object operationDef;
 	private String implementation;
 	private LinkedHashMap<String,Object> inputs;
+	private String description;
 
-	
 	@SuppressWarnings("unchecked")
 	public InterfacesDef(EntityType inodeType,
-					     String interfaceType,
-					     EntityTemplate inodeTemplate,
-					     String iname,
-					     Object ivalue) {
+			String interfaceType,
+			EntityTemplate inodeTemplate,
+			String iname,
+			Object ivalue) {
 		// void
 		super();
-		
-        ntype = inodeType;
-        nodeTemplate = inodeTemplate;
-        type = interfaceType;
-        name = iname;
-        value = ivalue;
-        implementation = null;
-        inputs = null;
-        defs = new LinkedHashMap<String,Object>();
 
-        if(interfaceType.equals(LIFECYCLE_SHORTNAME)) {
-            interfaceType = LIFECYCLE;
-        }
-        if(interfaceType.equals(CONFIGURE_SHORTNAME)) {
-            interfaceType = CONFIGURE;
-        }
-      
-        // only NodeType has getInterfaces "hasattr(ntype,interfaces)"
-        // while RelationshipType does not
-        if(ntype instanceof NodeType) {
-	        if(((NodeType)ntype).getInterfaces() != null &&
-	        		((NodeType)ntype).getInterfaces().values().contains(interfaceType)) {
-	        	LinkedHashMap<String,Object> nii = (LinkedHashMap<String,Object>)
-	        			((NodeType)ntype).getInterfaces().get(interfaceType);
-	        	interfaceType = (String)nii.get("type");
-	        }
-        }
-        if(inodeType != null) {
-        	if(nodeTemplate != null && nodeTemplate.getCustomDef() != null &&
-        			nodeTemplate.getCustomDef().values().contains(interfaceType)) {
-        		defs = (LinkedHashMap<String,Object>)
-        					nodeTemplate.getCustomDef().get(interfaceType);
-        	}
-        	else {
-        		defs = (LinkedHashMap<String,Object>)TOSCA_DEF.get(interfaceType);
-        	}
-        }
-        
-        if(ivalue != null) {
-        	if(ivalue instanceof LinkedHashMap) {
-        		for(Map.Entry<String,Object> me: ((LinkedHashMap<String,Object>)ivalue).entrySet()) {
-        			if(me.getKey().equals("implementation")) {
-        				implementation = (String)me.getValue();
-        			}
-        			else if(me.getKey().equals("inputs")) {
-        				inputs = (LinkedHashMap<String,Object>)me.getValue();
-        			}
-        			else {
-                        ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE123", String.format(
-                            "UnknownFieldError: \"interfaces\" of template \"%s\" contain unknown field \"%s\"",
-                            nodeTemplate.getName(),me.getKey()))); 
-        			}
-        		}
-        	}
-    		else {
-    			implementation = (String)ivalue;
-    		}
-        }
- 	}
+		ntype = inodeType;
+		nodeTemplate = inodeTemplate;
+		type = interfaceType;
+		operationName = iname;
+		operationDef = ivalue;
+		implementation = null;
+		inputs = null;
+		defs = new LinkedHashMap<String,Object>();
+
+		if(interfaceType.equals(LIFECYCLE_SHORTNAME)) {
+			interfaceType = LIFECYCLE;
+		}
+		if(interfaceType.equals(CONFIGURE_SHORTNAME)) {
+			interfaceType = CONFIGURE;
+		}
+
+		// only NodeType has getInterfaces "hasattr(ntype,interfaces)"
+		// while RelationshipType does not
+		if(ntype instanceof NodeType) {
+			if(((NodeType)ntype).getInterfaces() != null &&
+					((NodeType)ntype).getInterfaces().values().contains(interfaceType)) {
+				LinkedHashMap<String,Object> nii = (LinkedHashMap<String,Object>)
+						((NodeType)ntype).getInterfaces().get(interfaceType);
+				interfaceType = (String)nii.get("type");
+			}
+		}
+		if(inodeType != null) {
+			if(nodeTemplate != null && nodeTemplate.getCustomDef() != null &&
+					nodeTemplate.getCustomDef().containsKey(interfaceType)) {
+				defs = (LinkedHashMap<String,Object>)
+						nodeTemplate.getCustomDef().get(interfaceType);
+			}
+			else {
+				defs = (LinkedHashMap<String,Object>)TOSCA_DEF.get(interfaceType);
+			}
+		}
+
+		if(ivalue != null) {
+			if(ivalue instanceof LinkedHashMap) {
+				for(Map.Entry<String,Object> me: ((LinkedHashMap<String,Object>)ivalue).entrySet()) {
+					if(me.getKey().equals(IMPLEMENTATION)) {
+						implementation = (String)me.getValue();
+					}
+					else if(me.getKey().equals(INPUTS)) {
+						inputs = (LinkedHashMap<String,Object>)me.getValue();
+					}
+					else if(me.getKey().equals(DESCRIPTION)) {
+						description = (String)me.getValue();
+					}
+					else {
+						ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE123", String.format(
+								"UnknownFieldError: \"interfaces\" of template \"%s\" contain unknown field \"%s\"",
+								nodeTemplate.getName(),me.getKey())));
+					}
+				}
+			}
+		}
+	}
 
 	public ArrayList<String> getLifecycleOps() {
 		if(defs != null) {
@@ -111,7 +111,20 @@
 		}
 		return null;
 	}
-	
+
+	public ArrayList<String> getInterfaceOps() {
+		if(defs != null) {
+			ArrayList<String> ops = _ops();
+			ArrayList<String> idrw = new ArrayList<>();
+			for(int i=0; i<InterfacesDef.INTERFACE_DEF_RESERVED_WORDS.length; i++) {
+				idrw.add(InterfacesDef.INTERFACE_DEF_RESERVED_WORDS[i]);
+			}
+			ops.removeAll(idrw);
+			return ops;
+		}
+		return null;
+	}
+
 	public ArrayList<String> getConfigureOps() {
 		if(defs != null) {
 			if(type.equals(CONFIGURE)) {
@@ -120,22 +133,48 @@
 		}
 		return null;
 	}
-	
+
 	private ArrayList<String> _ops() {
 		return new ArrayList<String>(defs.keySet());
 	}
-	
+
 	// getters/setters
-	
+
 	public LinkedHashMap<String,Object> getInputs() {
 		return inputs;
 	}
-	
+
 	public void setInput(String name,Object value) {
 		inputs.put(name, value);
 	}
+
+	public String getImplementation(){
+		return  implementation;
+	}
+
+	public void setImplementation(String implementation){
+		this.implementation = implementation;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getOperationName() {
+		return operationName;
+	}
+
+	public void setOperationName(String operationName) {
+		this.operationName = operationName;
+	}
 }
 
+
+
 /*python
 
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/version.properties b/version.properties
index a8f201d..a24b0ee 100644
--- a/version.properties
+++ b/version.properties
@@ -5,7 +5,7 @@
 
 major=1
 minor=3
-patch=4
+patch=5
 
 base_version=${major}.${minor}.${patch}