Merge "Add template and tosca model entities and repositories"
diff --git a/src/main/java/org/onap/clamp/loop/CsarInstaller.java b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
index 371f88e..16351b8 100644
--- a/src/main/java/org/onap/clamp/loop/CsarInstaller.java
+++ b/src/main/java/org/onap/clamp/loop/CsarInstaller.java
@@ -31,7 +31,6 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 
 import org.json.simple.parser.ParseException;
@@ -45,7 +44,7 @@
 import org.onap.clamp.clds.sdc.controller.installer.MicroService;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.clds.util.drawing.SvgFacade;
-import org.onap.clamp.loop.deploy.DeployParameters;
+import org.onap.clamp.loop.deploy.DcaeDeployParameters;
 import org.onap.clamp.loop.service.Service;
 import org.onap.clamp.loop.service.ServiceRepository;
 import org.onap.clamp.policy.Policy;
@@ -98,7 +97,7 @@
     @Autowired
     private SvgFacade svgFacade;
 
-   /**
+    /**
     * Verify whether Csar is deployed.
     * 
     * @param csar The Csar Handler
@@ -241,7 +240,7 @@
     }
 
     private JsonObject createGlobalPropertiesJson(BlueprintArtifact blueprintArtifact, Loop newLoop) {
-        return new DeployParameters(blueprintArtifact, newLoop).getDeploymentParametersinJson();
+        return DcaeDeployParameters.getDcaeDeploymentParametersInJson(blueprintArtifact, newLoop);
     }
 
     private static JsonObject createVfModuleProperties(CsarHandler csar) {
diff --git a/src/main/java/org/onap/clamp/loop/LoopController.java b/src/main/java/org/onap/clamp/loop/LoopController.java
index 72726fa..64874a3 100644
--- a/src/main/java/org/onap/clamp/loop/LoopController.java
+++ b/src/main/java/org/onap/clamp/loop/LoopController.java
@@ -117,4 +117,14 @@
         Loop loop = loopService.getLoop(loopName);
         return loop != null ? loop.getSvgRepresentation() : null;
     }
+
+    /**
+     * Refresh the Operational Policy Json representation of the loop.
+     *
+     * @param loopName The loop name
+     * @return The refreshed Loop
+     */
+    public Loop refreshOpPolicyJsonRepresentation(String loopName) {
+        return loopService.refreshOpPolicyJsonRepresentation(loopName);
+    }
 }
diff --git a/src/main/java/org/onap/clamp/loop/LoopService.java b/src/main/java/org/onap/clamp/loop/LoopService.java
index 85e24cd..e520296 100644
--- a/src/main/java/org/onap/clamp/loop/LoopService.java
+++ b/src/main/java/org/onap/clamp/loop/LoopService.java
@@ -105,4 +105,20 @@
         return loopsRepository.findById(loopName)
                 .orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName));
     }
+
+    /**
+    * Api to refresh the Operational Policy UI window.
+    * 
+    * @param loopName The loop Name
+    * @return The refreshed loop object
+    */
+    public Loop refreshOpPolicyJsonRepresentation(String loopName) {
+        Loop loop = findClosedLoopByName(loopName);
+        Set<OperationalPolicy> policyList = loop.getOperationalPolicies();
+        for (OperationalPolicy policy : policyList) {
+            policy.updateJsonRepresentation();
+        }
+        loop.setOperationalPolicies(policyList);
+        return loopsRepository.save(loop);
+    }
 }
diff --git a/src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
similarity index 75%
rename from src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java
rename to src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
index c994af7..1a75f71 100644
--- a/src/main/java/org/onap/clamp/loop/deploy/DeployParameters.java
+++ b/src/main/java/org/onap/clamp/loop/deploy/DcaeDeployParameters.java
@@ -35,33 +35,14 @@
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.yaml.snakeyaml.Yaml;
 
-public class DeployParameters  {
+/**
+ * To decode the bluprint input parameters.
+ */
+public class DcaeDeployParameters  {
 
-    private LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<String, JsonObject>();
-
-    /**
-     * Constructor.
-     * 
-     * @param blueprintArtifactList A list of blueprint artifacts
-     * @param loop The loop object
-     */
-    public DeployParameters(LinkedHashSet<BlueprintArtifact> blueprintArtifactList, Loop loop) {
-        this.init(blueprintArtifactList, loop);
-    }
-
-    /**
-     * Constructor.
-     * 
-     * @param blueprintArtifact One blueprint artifact
-     * @param loop The loop object
-     */
-    public DeployParameters(BlueprintArtifact blueprintArtifact, Loop loop) {
-        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<BlueprintArtifact>();
-        blueprintArtifactList.add(blueprintArtifact);
-        this.init(blueprintArtifactList, loop);
-    }
-
-    private void init(LinkedHashSet<BlueprintArtifact> blueprintArtifactList, Loop loop) {
+    private static LinkedHashMap<String, JsonObject> init(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
+            Loop loop) {
+        LinkedHashMap<String, JsonObject> deploymentParamMap = new LinkedHashMap<String, JsonObject>();
         String microServiceName = ((MicroServicePolicy) loop.getMicroServicePolicies().toArray()[0]).getName();
         // Add index to the microservice name from the 2nd blueprint artifact for now.
         // Update the microservice names, when able to link the microserivce <-> blueprint in the future
@@ -69,15 +50,18 @@
         for (BlueprintArtifact blueprintArtifact: blueprintArtifactList) {
             if (index > 0) {
                 deploymentParamMap.put(microServiceName + index, 
-                        generateDeployParameter(blueprintArtifact, microServiceName));
+                        generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             } else {
-                deploymentParamMap.put(microServiceName, generateDeployParameter(blueprintArtifact, microServiceName));
+                deploymentParamMap.put(microServiceName, 
+                        generateDcaeDeployParameter(blueprintArtifact, microServiceName));
             }
             index++;
         }
+        return deploymentParamMap;
     }
 
-    private JsonObject generateDeployParameter(BlueprintArtifact blueprintArtifact, String microServiceName) {
+    private static JsonObject generateDcaeDeployParameter(BlueprintArtifact blueprintArtifact,
+            String microServiceName) {
         JsonObject deployJsonBody = new JsonObject();
         Yaml yaml = new Yaml();
         Map<String, Object> inputsNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
@@ -95,7 +79,7 @@
         return deployJsonBody;
     }
 
-    private void addPropertyToNode(JsonObject node, String key, Object value) {
+    private static void addPropertyToNode(JsonObject node, String key, Object value) {
         if (value instanceof String) {
             node.addProperty(key, (String) value);
         } else if (value instanceof Number) {
@@ -114,7 +98,10 @@
      *
      * @return The deploymentParameters in Json
      */
-    public JsonObject getDeploymentParametersinJson() {
+    public static JsonObject getDcaeDeploymentParametersInJson(LinkedHashSet<BlueprintArtifact> blueprintArtifactList,
+            Loop loop) {
+        LinkedHashMap<String, JsonObject> deploymentParamMap = init(blueprintArtifactList, loop);
+
         JsonObject globalProperties = new JsonObject();
         JsonObject deployParamJson = new JsonObject();
         for (Map.Entry<String, JsonObject> mapElement: deploymentParamMap.entrySet()) {
@@ -124,4 +111,14 @@
         return globalProperties;
     }
 
+    /**
+     * Convert the object in Json.
+     *
+     * @return The deploymentParameters in Json
+     */
+    public static JsonObject getDcaeDeploymentParametersInJson(BlueprintArtifact blueprintArtifact, Loop loop) {
+        LinkedHashSet<BlueprintArtifact> blueprintArtifactList = new LinkedHashSet<BlueprintArtifact>();
+        blueprintArtifactList.add(blueprintArtifact);
+        return getDcaeDeploymentParametersInJson(blueprintArtifactList, loop);
+    }
 }
diff --git a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
index e8bf4a6..d9e8a57 100644
--- a/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
+++ b/src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
@@ -174,7 +174,7 @@
 
     @Override
     public JsonObject getJsonRepresentation() {
-         return jsonRepresentation;
+        return jsonRepresentation;
     }
 
     void setJsonRepresentation(JsonObject jsonRepresentation) {
@@ -282,4 +282,17 @@
         return result;
     }
 
+    /**
+    * Regenerate the Operational Policy Json Representation.
+    *
+    */
+    public void updateJsonRepresentation() {
+        try {
+            this.jsonRepresentation = OperationalPolicyRepresentationBuilder
+                    .generateOperationalPolicySchema(loop.getModelService());
+        } catch (JsonSyntaxException | IOException | NullPointerException e) {
+            logger.error("Unable to generate the operational policy Schema ... ", e);
+            this.jsonRepresentation = new JsonObject();
+        }
+    }
 }
diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index cf99625..a0a3eb1 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -238,6 +238,48 @@
 			</route>
 		</put>
 		<put
+			uri="/v2/loop/refreshOpPolicyJsonSchema/{loopName}"
+			outType="org.onap.clamp.loop.Loop"
+			produces="application/json">
+			<route>
+				<removeHeaders
+					pattern="*"
+					excludePattern="loopName" />
+				<doTry>
+					<log
+						loggingLevel="INFO"
+						message="Refresh Operational Policy UI for loop: ${header.loopName}" />
+					<to
+						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REFRESH OP Policy UI request')" />
+					<to
+						uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+					<to uri="direct:load-loop" />
+					<to
+						uri="bean:org.onap.clamp.loop.LoopController?method=refreshOpPolicyJsonRepresentation(${header.loopName})" />
+					<log
+						loggingLevel="INFO"
+						message="REFRESH request successfully executed for loop: ${header.loopName}" />
+					<to
+						uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('REFRESH request successfully executed','INFO',${exchangeProperty[loopObject]})" />
+					<to
+						uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
+					<doCatch>
+						<exception>java.lang.Exception</exception>
+						<handled>
+							<constant>false</constant>
+						</handled>
+						<to
+							uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=errorLog()" />
+						<log
+							loggingLevel="ERROR"
+							message="REFRESH request failed for loop: ${header.loopName}" />
+						<to
+							uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('REFRESH request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" />
+					</doCatch>
+				</doTry>
+			</route>
+		</put>
+		<put
 			uri="/v2/loop/undeploy/{loopName}"
 			outType="org.onap.clamp.loop.Loop"
 			produces="application/json">
diff --git a/src/main/resources/clds/camel/routes/loop-flows.xml b/src/main/resources/clds/camel/routes/loop-flows.xml
index 036e8ef..57d32f0 100644
--- a/src/main/resources/clds/camel/routes/loop-flows.xml
+++ b/src/main/resources/clds/camel/routes/loop-flows.xml
@@ -17,7 +17,6 @@
 			<stop />
 		</when>
 	</route>
-
 	<route id="update-policy-status-for-loop">
 		<from uri="direct:update-policy-status-for-loop" />
 		<setProperty propertyName="policyComponent">
diff --git a/src/main/resources/clds/camel/routes/policy-flows.xml b/src/main/resources/clds/camel/routes/policy-flows.xml
index 75ac66c..223498e 100644
--- a/src/main/resources/clds/camel/routes/policy-flows.xml
+++ b/src/main/resources/clds/camel/routes/policy-flows.xml
@@ -97,9 +97,9 @@
 				</simple>
 			</setHeader>
 			<log loggingLevel="INFO"
-				message="Endpoint to get policy deployment status: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed"></log>
+				message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log>
 			<toD
-				uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+				uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
 			<doFinally>
 				<to uri="direct:reset-raise-http-exception-flag" />
 				<to
diff --git a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
index 70d1b4a..26cc831 100644
--- a/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponseCacheTest.java
@@ -32,6 +32,9 @@
 
     public static DcaeInventoryCache inventoryCache = new DcaeInventoryCache();
 
+    /**
+     * Initialize the responses.
+     */
     @BeforeClass
     public static void createExample() {
         DcaeInventoryResponse response1 = new DcaeInventoryResponse();
diff --git a/src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java b/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java
similarity index 94%
rename from src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java
rename to src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java
index 8834ef6..75ca25c 100644
--- a/src/test/java/org/onap/clamp/loop/deploy/DeployParametersTest.java
+++ b/src/test/java/org/onap/clamp/loop/deploy/BlueprintInputParametersTest.java
@@ -41,7 +41,7 @@
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
 
-public class DeployParametersTest {
+public class BlueprintInputParametersTest {
 
     private BlueprintArtifact buildFakeBuildprintArtifact(String blueprintFilePath) throws IOException {
         BlueprintArtifact blueprintArtifact = Mockito.mock(BlueprintArtifact.class);
@@ -77,8 +77,7 @@
         umServiceSet.add(umService);
         Mockito.when(loop.getMicroServicePolicies()).thenReturn(umServiceSet);
 
-        DeployParameters deployParams = new DeployParameters(buildFakeCsarHandler(), loop);
-        JsonObject paramJson = deployParams.getDeploymentParametersinJson();
+        JsonObject paramJson = DcaeDeployParameters.getDcaeDeploymentParametersInJson(buildFakeCsarHandler(), loop);
 
         Assert.assertEquals(JsonUtils.GSON_JPA_MODEL.toJson(paramJson), 
             ResourceFileUtil.getResourceAsString("example/sdc/expected-result/deployment-parameters.json"));
diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
index 5ec9f46..9dcc4b3 100755
--- a/src/test/resources/http-cache/third_party_proxy.py
+++ b/src/test/resources/http-cache/third_party_proxy.py
@@ -237,7 +237,7 @@
         with open(cached_file_content, 'w+') as f:
                 f.write(self.data_string)
         return True
-     elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "GET":
+     elif (self.path.startswith("/policy/api/v1/policytypes/") or self.path.startswith("/policy/pap/v1/policies/deployed/")) and http_type == "GET":
         print "self.path start with /policy/api/v1/policytypes/, generating response json..."
         jsonGenerated =  "{\"policyTypeId\": \"onap.policies.controlloop.operational\",\"policyTypeVersion\": \"1.0.0\",\"policyId\": \"OPERATIONAL_z711F_v1_0_ResourceInstanceName1_tca\"}"
         print "jsonGenerated: " + jsonGenerated
diff --git a/ui-react/src/LoopUI.js b/ui-react/src/LoopUI.js
index 58fbce6..eb4ff6a 100644
--- a/ui-react/src/LoopUI.js
+++ b/ui-react/src/LoopUI.js
@@ -252,7 +252,7 @@
 				<Route path="/viewToscaPolicyModal" render={(routeProps) => (<ViewToscaPolicyModal {...routeProps} />)} />
 				<Route path="/viewBlueprintMicroServiceTemplatesModal" render={(routeProps) => (<ViewBlueprintMicroServiceTemplatesModal {...routeProps} />)} />
 				<Route path="/operationalPolicyModal"
-					render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} showAlert={this.showAlert}/>)} />
+					render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
 				<Route path="/configurationPolicyModal/:componentName" render={(routeProps) => (<ConfigurationPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
 				<Route path="/openLoop" render={(routeProps) => (<OpenLoopModal {...routeProps} loadLoopFunction={this.loadLoop} />)} />
 				<Route path="/loopProperties" render={(routeProps) => (<LoopPropertiesModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
diff --git a/ui-react/src/api/LoopCache.js b/ui-react/src/api/LoopCache.js
index 95eb931..c73ed62 100644
--- a/ui-react/src/api/LoopCache.js
+++ b/ui-react/src/api/LoopCache.js
@@ -53,13 +53,19 @@
 	}
 	
 	getOperationalPolicyJsonSchema() {
-		return this.loopJsonCache["operationalPolicySchema"];
+		return this.loopJsonCache["operationalPolicies"]["0"]["jsonRepresentation"];
 	}
 
 	getOperationalPolicies() {
 		return this.loopJsonCache["operationalPolicies"];
 	}
 
+	getOperationalPoliciesNoJsonSchema() {
+		var operationalPolicies = JSON.parse(JSON.stringify(this.loopJsonCache["operationalPolicies"]));
+		delete operationalPolicies[0]["jsonRepresentation"];
+		return operationalPolicies;
+	}
+
 	getGlobalProperties() {
 		return this.loopJsonCache["globalPropertiesJson"];
 	}
diff --git a/ui-react/src/api/LoopCache.test.js b/ui-react/src/api/LoopCache.test.js
index f67bc0a..471fa4d 100644
--- a/ui-react/src/api/LoopCache.test.js
+++ b/ui-react/src/api/LoopCache.test.js
@@ -49,13 +49,36 @@
           "operational_policy": {
             "controlLoop": {},
             "policies": []
-
           }
-        }
+        },
+       "jsonRepresentation": {
+        "schema": {}
+      }
       }];
       expect(loopCache.getOperationalPolicies()).toStrictEqual(opPolicy);
     });
 
+    it('getOperationalPoliciesNoJsonSchema', () => {
+      const opPolicy = [{
+        "name": "OPERATIONAL_h2NMX_v1_0_ResourceInstanceName1_tca",
+        "configurationsJson": {
+          "guard_policies": {},
+          "operational_policy": {
+            "controlLoop": {},
+            "policies": []
+          }
+        }
+      }];
+      expect(loopCache.getOperationalPoliciesNoJsonSchema()).toStrictEqual(opPolicy);
+    });
+
+    it('getOperationalPolicyJsonSchema', () => {
+      const jsonSchema = {
+          "schema": {}
+      };
+
+      expect(loopCache.getOperationalPolicyJsonSchema()).toStrictEqual(jsonSchema);
+    });
     it('getGlobalProperties', () => {
       const globelProp = {
         "dcaeDeployParameters": {
diff --git a/ui-react/src/api/LoopCache_mokeLoopJsonCache.json b/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
index c84b5b6..087ab5d 100644
--- a/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
+++ b/ui-react/src/api/LoopCache_mokeLoopJsonCache.json
@@ -93,6 +93,9 @@
           "controlLoop": {},
           "policies": []
         }
+      },
+      "jsonRepresentation": {
+        "schema": {}
       }
     }
   ],
diff --git a/ui-react/src/api/LoopService.js b/ui-react/src/api/LoopService.js
index e2e2348..ead2cf8 100644
--- a/ui-react/src/api/LoopService.js
+++ b/ui-react/src/api/LoopService.js
@@ -152,4 +152,27 @@
 				return "";
 			});
 	}
+
+	static refreshOpPolicyJson(loopName) {
+		return fetch('/restservices/clds/v2/loop/refreshOpPolicyJsonSchema/' + loopName, {
+			method: 'PUT',
+			headers: {
+				"Content-Type": "application/json"
+			},
+			credentials: 'same-origin'
+		})
+			.then(function (response) {
+				console.debug("Refresh Operational Policy Json Schema response received: ", response.status);
+				if (response.ok) {
+					return response.json();
+				} else {
+					console.error("Refresh Operational Policy Json Schema query failed");
+					return {};
+				}
+			})
+			.catch(function (error) {
+				console.error("Refresh Operational Policy Json Schema error received", error);
+				return {};
+			});
+	}
 }
diff --git a/ui-react/src/components/dialogs/Loop/DeployLoopModal.js b/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
index 9c9a16f..6468e9f 100644
--- a/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
+++ b/ui-react/src/components/dialogs/Loop/DeployLoopModal.js
@@ -37,11 +37,9 @@
 	padding: .25rem 1.5rem;
 `
 export default class DeployLoopModal extends React.Component {
-	state = {
-		loopCache: this.props.loopCache,
-		temporaryPropertiesJson: JSON.parse(JSON.stringify(this.props.loopCache.getGlobalProperties())),
-		show: true
-	};
+
+
+		
 	constructor(props, context) {
 		super(props, context);
 
@@ -50,6 +48,24 @@
 		this.handleChange = this.handleChange.bind(this);
 		this.refreshStatus = this.refreshStatus.bind(this);
 		this.renderDeployParam = this.renderDeployParam.bind(this);
+
+		const propertiesJson = JSON.parse(JSON.stringify(this.props.loopCache.getGlobalProperties()));
+		this.state = {
+			loopCache: this.props.loopCache,
+			temporaryPropertiesJson: propertiesJson,
+			show: true,
+			key: this.getInitialKeyValue(propertiesJson)
+		};
+	}
+	getInitialKeyValue(temporaryPropertiesJson) {
+		const deployJsonList = temporaryPropertiesJson["dcaeDeployParameters"];
+		let initialKey;
+		Object.keys(deployJsonList)
+			.filter((obj) => Object.keys(deployJsonList).indexOf(obj) === 0)
+			.map(obj =>
+				initialKey = obj
+		);
+		return initialKey;
 	}
 	componentWillReceiveProps(newProps) {
 		this.setState({
@@ -57,14 +73,7 @@
 			show: true
 		});
 	}
-	componentDidMount() {
-		const deployJsonList = this.state.temporaryPropertiesJson["dcaeDeployParameters"];
-		Object.keys(deployJsonList)
-			.filter((obj) => Object.keys(deployJsonList).indexOf(obj) === 0)
-			.map(obj =>
-				this.setState({key: obj})
-		);
-	}
+
 	handleClose(){
 		this.props.history.push('/');
 	}
@@ -117,7 +126,6 @@
 		);
 		return indents;
 	}
-
 	renderDeployParam(deployJson) {
 		var indents = [];
 		Object.keys(deployJson).map((item,key) =>
diff --git a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
index 5c5f024..dc7c0a4 100644
--- a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
+++ b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
@@ -25,6 +25,7 @@
 import Button from 'react-bootstrap/Button';
 import Modal from 'react-bootstrap/Modal';
 import styled from 'styled-components';
+import LoopCache from '../../../api/LoopCache';
 import LoopService from '../../../api/LoopService';
 import JSONEditor from '@json-editor/json-editor';
 
@@ -45,6 +46,7 @@
 		this.handleClose = this.handleClose.bind(this);
 		this.handleSave = this.handleSave.bind(this);
 		this.renderJsonEditor = this.renderJsonEditor.bind(this);
+		this.handleRefresh = this.handleRefresh.bind(this);
 		this.setDefaultJsonEditorOptions();
 	}
 
@@ -114,7 +116,7 @@
 			console.error("NO Operational policy schema found");
 			return;
 		}
-		var operationalPoliciesData = this.state.loopCache.getOperationalPolicies();
+		var operationalPoliciesData = this.state.loopCache.getOperationalPoliciesNoJsonSchema();
 
 		this.setState({
 				jsonEditor: new JSONEditor(document.getElementById("editor"),
@@ -122,6 +124,25 @@
 			})
 	}
 
+	handleRefresh() {
+		LoopService.refreshOpPolicyJson(this.state.loopCache.getLoopName()).then(data => {
+			var newLoopCache =  new LoopCache(data);
+			var schema_json = newLoopCache.getOperationalPolicyJsonSchema();
+			var operationalPoliciesData = newLoopCache.getOperationalPoliciesNoJsonSchema();
+			document.getElementById("editor").innerHTML = "";
+			this.setState({
+				loopCache: newLoopCache,
+				jsonEditor: new JSONEditor(document.getElementById("editor"),
+					{ schema: schema_json.schema, startval: operationalPoliciesData })
+			})
+			this.props.updateLoopFunction(data);
+			
+		})
+		.catch(error => {
+			console.error("Error while refreshing the Operational Policy Json Representation");
+		});
+	}
+
 	render() {
 		return (
 			<ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
@@ -135,10 +156,13 @@
 				<Modal.Footer>
 					<Button variant="secondary" onClick={this.handleClose}>
 						Close
-	            </Button>
+					</Button>
+					<Button variant="secondary" onClick={this.handleRefresh}>
+						Refresh
+					</Button>
 					<Button variant="primary" onClick={this.handleSave}>
 						Save Changes
-	            </Button>
+					</Button>
 				</Modal.Footer>
 			</ModalStyled>
 
diff --git a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
index 9c7da31..c10c6ff 100644
--- a/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
+++ b/ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.test.js
@@ -46,9 +46,9 @@
                         "controlLoop": {},
                         "policies": []
                     }
-                }
-             }],
-            "operationalPolicySchema": {"schema": {}}
+                },
+                "jsonRepresentation" : {"schema": {}}
+             }]
     });
     const historyMock = { push: jest.fn() };
     const flushPromises = () => new Promise(setImmediate);
@@ -57,7 +57,7 @@
       const handleClose = jest.spyOn(OperationalPolicyModal.prototype,'handleClose');
       const component = mount(<OperationalPolicyModal history={historyMock} loopCache={loopCache}/>)
 
-      component.find('[variant="secondary"]').prop('onClick')();
+      component.find('[variant="secondary"]').get(0).props.onClick();
 
       expect(handleClose).toHaveBeenCalledTimes(1);
       expect(component.state('show')).toEqual(false);
@@ -78,4 +78,17 @@
         expect(component.state('show')).toEqual(false);
         expect(historyMock.push.mock.calls[0]).toEqual([ '/']);
     });
+
+    it('Test handleRefresh', async () => {
+        const updateLoopFunction = jest.fn();
+        const handleRefresh = jest.spyOn(OperationalPolicyModal.prototype,'handleRefresh');
+        const component = mount(<OperationalPolicyModal loopCache={loopCache} updateLoopFunction={updateLoopFunction} />)
+
+        component.find('[variant="secondary"]').get(1).props.onClick();
+        await flushPromises();
+        component.update();
+
+        expect(handleRefresh).toHaveBeenCalledTimes(1);
+        expect(component.state('show')).toEqual(true);
+    });
 });
\ No newline at end of file