Merge "Add an exception for new class TcaRequestFormatter"
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html
index 7305fd9..238e37a 100644
--- a/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html
+++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/tca_properties.html
@@ -70,17 +70,22 @@
 }
 
 #tcaEditHolder{
-	height:260px; 
 	background-color: #f5f5f5; 
-	padding:10px 0px; 
+	padding:10px 10px; 
 	margin: 15px 15px 0 0; 
 	float: right;
 }
+
+
+#tcaEditHolder #properties_tab>div+div {
+  margin-top: 10px;
+}
+
 .tcaErr{
 	display:none; 
 	text-align:center; 
 	margin-bottom:20px; 
-	color:red;"
+	color:red;
 }
 
 .tcaParentItems {
@@ -155,12 +160,6 @@
 		<div style="height: 10px"></div>
 		<div class="panel panel-default" id="panelHolder">
 			
-			<div class="panel-heading">
-				<ul id="nav_Tabs" class="nav nav-tabs">
-					<li class><a id="add_one_more" href="#desc_tab"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></a></li>
-				</ul>
-			</div>
-			
 			<span id="formSpan" style="display:none;">
 			<div class="panel-body">
 			
@@ -179,19 +178,6 @@
 								<input class="form-control" onkeydown="return false;" type="text" id="tuuid" name="tuuid"></input>
 							</div>
 						</div>
-						
-						<div class="col-sm-8 form-group" style="display:none;">
-							<label class="col-sm-3"> NF Code </label>
-							<div class="col-sm-9" style="padding:0px;">
-								<input class="form-control" onkeydown="return false;" type="text" id="tnfc" name="tnfc"></input>
-							</div>
-						</div>
-						
-						<div class="col-sm-3 form-group"> 
-							<label class="col-sm-8"> Enable </label>
-							<input class="col-sm-4" type="checkbox" style="height:21px; 
-								width:21px; margin:6px;" checked="checked" id="tcaEnab" name="tcaEnab"></input>
-						</div>
 					</div>
 					<div class="row">
 						<div class="col-sm-8 form-group">
@@ -200,6 +186,12 @@
 								<select name="tcaPol" id="tcaPol" enableFilter="true"></select>
 							</div>
 						</div>
+						<div class="col-sm-8 form-group">
+							<label class="col-sm-3">EventName</label>
+							<div class="col-sm-9" style="padding:0px;">
+								<select name="eventName" id="eventName" enableFilter="true"></select>
+							</div>
+						</div>            
 						
 						<div class="col-sm-8 form-group" style="display:none;">
 							<label class="col-sm-3"> Policy ID </label>
@@ -207,27 +199,7 @@
 								<input class="form-control" onkeydown="return false;" type="text" id="tcaPolId" name="tcaPolId"></input>
 							</div>
 						</div>
-						
-						<div class="col-sm-3 form-group"> 
-							<label class="col-sm-8">Max Intervals</label>
-							<input class="col-sm-4 form-control" style="width:80%" type="text" maxlength="3" 
-							id="tcaInt" onkeypress="return isNumberKey(event)" name="tcaInt"></input>
-						</div>
-					</div>
-					<div class="row">
-						<div class="col-sm-8 form-group">
-							<label class="col-sm-3"> Severity </label>
-							<div class="col-sm-9" style="padding:0px;">
-								<select name="tcaSev" id="tcaSev" enableFilter="false">
-								</select>
-							</div>
-						</div>
-						
-						<div class="col-sm-3 form-group"> 
-							<label class="col-sm-8">Min Violations</label>
-							<input class="col-sm-4 form-control" style="width:80%" type="text" maxlength="3" 
-							id="tcaVio" onkeypress="return isNumberKey(event)" name="tcaVio"></input>
-						</div>
+
 					</div>
 				</form>
 				
@@ -250,26 +222,38 @@
 					
 					<div id="tcaEditHolder" class="panel panel-default col-sm-6">
 						<div class="tab-content">
-							<div id="properties_tab" style="padding:10px;" class="form-horizontal">
-								<div style="margin-bottom:20px;">
+							<div id="properties_tab" class="form-vertical">
+								<div>
 									<label class="control-label">Metric</label>
 									<div>
 										<select id="fieldPathM" name="fieldPathM"></select>
 									</div>
 								</div>
-								<div style="margin-bottom:20px;">
+								<div>
 									<label class="control-label">Operator</label>
 									<div>
 										<select id="operator" name="operator"></select>
 									</div>
 								</div>
-								<div style="margin-bottom:20px;">
+								<div>
 									<label class="control-label">Threshold</label>
 									<div>
 										<input type="text" maxlength="10" class="form-control" name="threshold" 
 										onkeypress="return isNumberKey(event)" id="threshold"></input>
 									</div>
 								</div>
+								<div>
+									<label class="control-label">Control Loop Schema</label>
+									<div>
+										<select id="controlLoopSchema" name="controlLoopSchema"></select>
+									</div>
+								</div>
+								<div>
+									<label class="control-label">Closed Loop Event Status</label>
+									<div>
+										<select id="closedLoopEventStatus" name="closedLoopEventStatus"></select>
+									</div>
+								</div>                
 							</div>
 						</div>
 					</div>
@@ -289,7 +273,16 @@
 			class="btn btn-primary">Cancel</button>
 	</div>
 	
-	<script>
+	<script language="javascript">
+    // helper that make jquery objects visibles or invisible
+    // to use instead of show to keep placeholder size correct
+    jQuery.fn.visible = function() {
+        return this.css('visibility', 'visible');
+    };
+    jQuery.fn.invisible = function() {
+        return this.css('visibility', 'hidden');
+    };
+
 		var generateTUUID = function(count){
 			var d = new Date().getTime();
 			var tuuid = 'xxxxxxxx-xxxx-txxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function(c){
@@ -298,30 +291,17 @@
 				return (c == 'x' ? r : (r*0x3|0*8)).toString(16);
 			});
 			$("#formId" + count + " #tuuid").val(tuuid);
-		}
-		
-		$("#add_one_more").click(function(event) {
-			event.preventDefault();
-			if ($("#nav_Tabs li.active").length>0){
-				var oldCount = $("#nav_Tabs li.active").find("a").attr("id").slice(-1);
-				if (($('#formId'+oldCount+' #tcaTable .highlight').length > 0 ) &&
-						(!($('#formId'+oldCount+' #threshold').val()) || !($('#formId'+oldCount+' #fieldPathM').val())) ) {
-					$('#formId'+oldCount+' #tcaError').show();
-					return;
-				} else {
-					$('#formId'+oldCount+' .tcaErr').hide();
-					if ($('#formId'+oldCount+' #tcaTable .highlight').length > 0){
-						$('#formId'+oldCount+' #tcaTable .highlight td').text(
-								$('#formId'+oldCount+' #fieldPathM').val() + ' ' +
-								$('#formId'+oldCount+' #operator').val() + ' ' +
-								$('#formId'+oldCount+' #threshold').val());
-					}
-					$("#formId"+oldCount+" #tcaTable .highlight").removeClass("highlight")
-				}
-			}
-			var count = add_one_more();	
-			generateTUUID(count);
-		})
+		};
+
+
+    var propertiesToString = function(formIdNum) {
+      return $('#formId'+formIdNum+' #fieldPathM').find(':selected').text() + ' ' +
+				$('#formId'+formIdNum+' #operator').val() + ' ' +
+				$('#formId'+formIdNum+' #threshold').val() + ' ' +
+        $('#formId'+formIdNum+' #controlLoopSchema').val() + ' ' +
+        $('#formId'+formIdNum+' #closedLoopEventStatus').val();
+    };
+
 		loadPropertyWindow("tca");
 		
 		//load dropdown with policy options
@@ -340,79 +320,51 @@
 				}
 			}
 		}
-		
+
+		var fieldPathMLabel2Value = function(label) {
+			return Object.keys(defaults_props['tca']['fieldPathM']).find(key => defaults_props['tca']['fieldPathM'][key] == label)
+		}
+		var fieldPathMValue2Label = function(value) {
+			return defaults_props['tca']['fieldPathM'][value];
+		}
+
 		setASDCFields();
-		
-		//load metrics dropdown
-		if (elementMap["global"]){
-			for (var i = 0; i < (elementMap["global"].length); i++){
-				if ((elementMap["global"][i]["name"]) == "vf"){
-					var vfSel = elementMap["global"][i]["value"];	
-					if (vf_Services["shared"]["byVf"][vfSel]["kpi"]){
-						$.each((vf_Services["shared"]["byVf"][vfSel]["kpi"]), function(val, text) {
-			                $('#fieldPathM').append(
-			                    $('<option></option>').val(val).html(text)
-			                );
-			            });
-					}
-					break;
-				};
-			};
-		};
-		
+
 		var arr = elementMap[lastElementSelected];
-		
+
 		if (arr !== undefined) {
 			for (var x in arr){
 				var num = add_one_more();
-				var setCheck = true;
 				for (var i=0; i< arr[x].length; i++){
-					if (arr[x][i].name=='tcaEnab'){
-						$("#formId" + num + " #tcaEnab").prop("checked","true");
-						setCheck = false;
-					}
 					
 					if (arr[x][i].hasOwnProperty('serviceConfigurations')){
 						for (var j=0; j<arr[x][i]["serviceConfigurations"].length; j++){
 							$("#formId" + num + " #tcaTable").prepend("<tr><td>"
-									+arr[x][i]["serviceConfigurations"][j][0]+" "
-									//+(defaults_props['tca']['operator']).getKey(arr[x][i]["serviceConfigurations"][j][1])+" "
-									+(Object.keys(defaults_props['tca']['operator']).find(key => defaults_props['tca']['operator'][key] == (arr[x][i]["serviceConfigurations"][j][1])))+ " " 
-									+arr[x][i]["serviceConfigurations"][j][2]+"</td></tr>");
+									+fieldPathMValue2Label(arr[x][i]["serviceConfigurations"][j][0])+ " "
+									+(Object.keys(defaults_props['tca']['operator']).find(key => defaults_props['tca']['operator'][key] == (arr[x][i]["serviceConfigurations"][j][1])))+ " "
+									+arr[x][i]["serviceConfigurations"][j][2]+" "
+									+arr[x][i]["serviceConfigurations"][j][3]+" "
+									+arr[x][i]["serviceConfigurations"][j][4]+"</td></tr>");
 						}
 					} else {
 						$("#formId" + num + " #"+arr[x][i].name).val(arr[x][i].value);
 					}
 				}
-				if (setCheck){
-					$("#formId" + num + " #tcaEnab").prop("checked",false);
-				}
 				$('#go_properties_tab'+num).text($('#formId' +num+ ' #tname').val());
-				$("#formId"+num + " #properties_tab").hide();
+				$("#formId"+num + " #properties_tab").invisible();
 			}
 		} 
 	
 		$("#savePropsBtn").click(function(event) {
-			var num = $('#nav_Tabs .active a').attr('id').slice(-1);
-			var tabs = [];
-			$('#nav_Tabs li:not(:last)').each(function(){
-				tabs.push($(this).text());
-			});
-			var nonunique = uniquet(tabs);
+			var num = 1
 			if (($('#formId'+num+' #tcaTable .highlight').length > 0 ) &&
 					(!($('#formId'+num+' #threshold').val()) || !($('#formId'+num+' #fieldPathM').val())) ) {
 				$('#formId'+num+' #tcaError').show();
 				return;
-			} else if (nonunique){
-				$('#formId'+num+' #tcaUnique').show();
-				return;
 			} else {
 				$('#formId'+num+' .tcaErr').hide();
 				if ($('#formId'+num+' #tcaTable .highlight').length > 0){
-					$('#formId'+num+' #tcaTable .highlight td').text(
-							$('#formId'+num+' #fieldPathM').val() + ' ' +
-							$('#formId'+num+' #operator').val() + ' ' +
-							$('#formId'+num+' #threshold').val());
+					$('#formId'+num+' #tcaTable .highlight td').text(propertiesToString(num));
 				}
 				var saveP = {};
 				$('.formId').each(function(){
@@ -420,23 +372,11 @@
 					var header = $(this).find('.tcaParentItems').serializeArray();
 					var sconf = {};
 					var sconfa = [];
-					var checkNF = true;
 					$('#formId' +count+' #tcaTable tr').each(function(){
 						$('td', this).each(function(){
 							var splitTd = $(this).text().split(' ');
+              splitTd[0]=fieldPathMLabel2Value(splitTd[0]);
 							splitTd[1]=defaults_props['tca']['operator'][splitTd[1]];
-							var checkByKpi = vf_Services["shared"]["byKpi"][splitTd[0].replace(/\s/g, "")];
-							if (checkByKpi["fieldPath"]){
-								splitTd.push(Object.keys(vf_Services["shared"]["byKpi"][splitTd[0].replace(/\s/g, "")]["fieldPath"])[0]);
-							};
-							if ((checkByKpi["nfNamingCode"]) && (checkNF)){
-								$.grep(header, function(e,i){ 
-									if (e.name == "tnfc"){
-										header[i]["value"] = (Object.keys(checkByKpi["nfNamingCode"])[0]);
-									}
-								});
-								checkNF = false;
-							}
 							sconfa.push(splitTd);
 						});
 						
@@ -505,7 +445,7 @@
 			
 			$("#add_one_more").parent().before(' <li class="active"><a id="go_properties_tab'+count+'">New_Set</a><button id="tab_close'+count+'" type="button" class="close tab-close-popup" aria-hidden="true" style="margin-top: -30px;margin-right: 5px">&times;</button></li>');
 			$("#formId"+count).append(form);
-			$('#formId'+count+ ' #properties_tab').hide();
+			$('#formId'+count+ ' #properties_tab').invisible();
 			$(".formId").not($("#formId"+count)).css("display","none");
 			addCustListen(count);
 			setMultiSelect();
@@ -531,10 +471,7 @@
 					} else {
 						$('#formId'+oldCount+' .tcaErr').hide();
 						if ($('#formId'+oldCount+' #tcaTable .highlight').length > 0){
-							$('#formId'+oldCount+' #tcaTable .highlight td').text(
-									$('#formId'+oldCount+' #fieldPathM').val() + ' ' +
-									$('#formId'+oldCount+' #operator').val() + ' ' +
-									$('#formId'+oldCount+' #threshold').val());
+							$('#formId'+oldCount+' #tcaTable .highlight td').text(propertiesToString(oldCount));
 						}
 						$("#formId"+oldCount+" #tcaTable .highlight").removeClass("highlight")
 					}
@@ -559,19 +496,18 @@
 				} else {
 					$('#formId'+count+' .tcaErr').hide();
 					if ($('#formId'+count+' #tcaTable .highlight').length > 0){
-						$('#formId'+count+' #tcaTable .highlight td').text(
-								$('#formId'+count+' #fieldPathM').val() + ' ' +
-								$('#formId'+count+' #operator').val() + ' ' +
-								$('#formId'+count+' #threshold').val());
+						$('#formId'+count+' #tcaTable .highlight td').text(propertiesToString(num));
 					}
 					//$('#formId'+count+' #tcaTable .highlight').text();
 					$(this).addClass('highlight').siblings().removeClass('highlight');
 					var str = $(this).text().split(' ');
-					$('#formId'+count + ' #properties_tab').show();
-					if (str.length == 3){
-						$('#formId'+count+' #fieldPathM').val(str[0]).multiselect('refresh');
+					$('#formId'+count + ' #properties_tab').visible();
+					if (str.length == 5){
+						$('#formId'+count+' #fieldPathM').val(fieldPathMLabel2Value(str[0])).multiselect('refresh');
 						$('#formId'+count+' #operator').val(str[1]).multiselect('refresh');
 						$('#formId'+count+' #threshold').val(str[2]);
+            $('#formId'+count+' #controlLoopSchema').val(str[3]).multiselect('refresh');
+            $('#formId'+count+' #closedLoopEventStatus').val(str[4]).multiselect('refresh');
 					}
 					
 					if ((!(readOnly||readMOnly)) && ($('#formId'+count + ' #deleteThresh').prop('disabled'))) {
@@ -582,7 +518,7 @@
 			
 			$('#formId'+count+' #deleteThresh').on('click', function(){
 				$('#formId'+num+' .tcaErr').hide();
-				$('#formId'+count+ ' #properties_tab').hide();
+				$('#formId'+count+ ' #properties_tab').invisible();
 				$('#formId'+count+ ' #tcaTable .highlight').remove();
 				$('#formId'+count+ ' #deleteThresh').prop('disabled', true);
 			});
@@ -595,12 +531,9 @@
 				} else {
 					$('#formId'+count+' .tcaErr').hide();
 					if ($('#formId'+count+' #tcaTable .highlight').length > 0){
-						$('#formId'+count+' #tcaTable .highlight td').text(
-								$('#formId'+count+' #fieldPathM').val() + ' ' +
-								$('#formId'+count+' #operator').val() + ' ' +
-								$('#formId'+count+' #threshold').val());
+						$('#formId'+count+' #tcaTable .highlight td').text(propertiesToString(count));
 					}
-					$('#formId'+count+ ' #properties_tab').show();
+					$('#formId'+count+ ' #properties_tab').visible();
 					if (('#formId'+count+' #tcaTable .highlight').length > 0 ){
 						$('#formId'+count+' #tcaTable tr.highlight').removeClass('highlight');
 					}
@@ -608,7 +541,9 @@
 					$('#formId'+count+' #fieldPathM').prop("selectedIndex", 0).multiselect('refresh');
 					$('#formId'+count+' #operator').prop("selectedIndex", 0).multiselect('refresh');
 					$('#formId'+count+' #threshold').val("");
-					
+					$('#formId'+count+' #controlLoopSchema').prop("selectedIndex", 0).multiselect('refresh');
+					$('#formId'+count+' #closedLoopEventStatus').prop("selectedIndex", 0).multiselect('refresh');
+
 					if ($('#formId'+count + ' #deleteThresh').prop('disabled')) {
 						$('#formId'+count + ' #deleteThresh').prop('disabled', false);
 					}
diff --git a/src/main/resources/clds/globalClds.properties b/src/main/resources/clds/globalClds.properties
index ac4f0cf..d21afbc 100644
--- a/src/main/resources/clds/globalClds.properties
+++ b/src/main/resources/clds/globalClds.properties
@@ -21,4 +21,4 @@
 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
 ###
 
-globalCldsProps ={"tca":{"tname":"New_Set","tcaInt":"1","tcaVio":"1","tcaSev":{"NORMAL":"NORMAL","CRITICAL":"CRITICAL","MAJOR":"MAJOR","MINOR":"MINOR","WARNING":"WARNING"},"fieldPath":{"FIELDPATH_test_1":"FIELDPATH_test_1","FIELDPATH_test_2":"FIELDPATH_test_2"},"operator":{">":"GREATER","=":"EQUAL","<":"LESS"},"opsPolicy":{"POLICY_test_X":"POLICY_test_X","POLICY_test_Y":"POLICY_test_Y"}},"global":{"actionSet":{"vnfRecipe":"VNF", "enbRecipe":"eNodeB"},"location":{"SNDGCA64":"San Diego SAN3","ALPRGAED":"Alpharetta PDK1","LSLEILAA":"Lisle DPA3","MDTWNJC1":"FTL_C_location1","MDTWNJC2":"FTL_C_location2","MDTWNJ21":"FTL_L_location1","MDTWNJ22":"FTL_L_location2","RDM2WAGPLCP":"ISTFTL_location","RDM3":"RDM3WAGPLCP"}},"policy":{"pname":"0","timeout":345,"vnfRecipe":{"":"","restart":"Restart","rebuild":"Rebuild","migrate":"Migrate","healthCheck":"Health Check"},"enbRecipe":{"":"","reset":"Reset"},"maxRetries":"3","retryTimeLimit":180,"resource":{"vCTS":"vCTS","v3CDB":"v3CDB","vUDR":"vUDR","vCOM":"vCOM","vRAR":"vRAR","vLCS":"vLCS","vUDR-BE":"vUDR-BE","vDBE":"vDBE"},"parentPolicyConditions":{"Failure_Retries":"Failure: Max Retries Exceeded","Failure_Timeout":"Failure: Time Limit Exceeded","Failure_Guard":"Failure: Guard","Failure_Exception":"Failure: Exception","Failure":"Failure: Other","Success":"Success"}},"shared":{"byService":{"":{"vf":{"":""},"location":{"":""},"alarmCondition":{"":""}}},"byVf":{"":{"vfc":{"":""}}}}}
\ No newline at end of file
+globalCldsProps ={"tca":{"tname":"New_Set","tcaInt":"1","tcaVio":"1","eventName":{"vCPEvGMUXPacketLoss":"vCPEvGMUXPacketLoss","vLoadBalancer":"vLoadBalancer","vFirewallBroadcastPackets":"vFirewallBroadcastPackets"},"fieldPathM":{"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated":"receivedBroadcastPacketsAccumulated","$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta":"receivedDiscardedPacketsDelta"},"operator":{">":"GREATER",">=":"GREATER_OR_EQUAL","=":"EQUAL","<=":"LESS_OR_EQUAL","<":"LESS"},"opsPolicy":{"POLICY_test_X":"POLICY_test_X","POLICY_test_Y":"POLICY_test_Y"},"controlLoopSchema":{"":"","VM":"VM","VNF":"VNF"},"closedLoopEventStatus":{"":"","ONSET":"ONSET","ABATED":"ABATED"}},"global":{"actionSet":{"vnfRecipe":"VNF", "enbRecipe":"eNodeB"},"location":{"SNDGCA64":"San Diego SAN3","ALPRGAED":"Alpharetta PDK1","LSLEILAA":"Lisle DPA3","MDTWNJC1":"FTL_C_location1","MDTWNJC2":"FTL_C_location2","MDTWNJ21":"FTL_L_location1","MDTWNJ22":"FTL_L_location2","RDM2WAGPLCP":"ISTFTL_location","RDM3":"RDM3WAGPLCP"}},"policy":{"pname":"0","timeout":345,"vnfRecipe":{"":"","restart":"Restart","rebuild":"Rebuild","migrate":"Migrate","healthCheck":"Health Check"},"enbRecipe":{"":"","reset":"Reset"},"maxRetries":"3","retryTimeLimit":180,"resource":{"vCTS":"vCTS","v3CDB":"v3CDB","vUDR":"vUDR","vCOM":"vCOM","vRAR":"vRAR","vLCS":"vLCS","vUDR-BE":"vUDR-BE","vDBE":"vDBE"},"parentPolicyConditions":{"Failure_Retries":"Failure: Max Retries Exceeded","Failure_Timeout":"Failure: Time Limit Exceeded","Failure_Guard":"Failure: Guard","Failure_Exception":"Failure: Exception","Failure":"Failure: Other","Success":"Success"}},"shared":{"byService":{"":{"vf":{"":""},"location":{"":""},"alarmCondition":{"":""}}},"byVf":{"":{"vfc":{"":""}}}}}