Refactor xacml-pdp to remove various statics
[policy/xacml-pdp.git] / main / src / main / java / org / onap / policy / pdpx / main / comm / XacmlPdpHearbeatPublisher.java
index 8ffccbe..2904474 100644 (file)
@@ -23,6 +23,8 @@ package org.onap.policy.pdpx.main.comm;
 import java.util.Timer;
 import java.util.TimerTask;
 import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
+import org.onap.policy.models.pdp.concepts.PdpStatus;
+import org.onap.policy.pdpx.main.XacmlState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,45 +32,75 @@ public class XacmlPdpHearbeatPublisher extends TimerTask {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpHearbeatPublisher.class);
 
-    private Timer timer;
-    private XacmlPdpMessage heartbeatMessage;
-    private static TopicSinkClient topicSinkClient;
-    private static volatile  boolean alive = false;
+    private final TopicSinkClient topicSinkClient;
+
+    /**
+     * Tracks the state of this PDP.
+     */
+    private final XacmlState currentState;
+
+    /**
+     * Current timer interval, in milliseconds.
+     */
+    private long intervalMs = 60000;
+
+    private Timer timer = null;
+
 
     /**
      * Constructor for instantiating XacmlPdpPublisher.
      *
-     * @param message of the PDP
-     * @param topicSinkClient used to send heartbeat message
+     * @param topicSinkClient used to send heart beat message
+     * @param state tracks the state of this PDP
      */
-    public XacmlPdpHearbeatPublisher(TopicSinkClient topicSinkClient, XacmlPdpMessage message ) {
+    public XacmlPdpHearbeatPublisher(TopicSinkClient topicSinkClient, XacmlState state) {
         this.topicSinkClient = topicSinkClient;
-        this.heartbeatMessage = message;
-        timer = new Timer(false);
-        timer.scheduleAtFixedRate(this, 0, 60000); // time interval temp hard coded now but will be parameterized
-        setAlive(true);
+        this.currentState = state;
     }
 
     @Override
     public void run() {
-        topicSinkClient.send(heartbeatMessage.formatPdpStatusMessage());
-        LOGGER.info("Sending Xacml PDP heartbeat to the PAP");
+        PdpStatus message = currentState.genHeartbeat();
+        LOGGER.info("Sending Xacml PDP heartbeat to the PAP - {}", message);
+
+        topicSinkClient.send(message);
     }
 
     /**
-     * Method to terminate the heartbeat.
+     * Method to terminate the heart beat.
      */
-    public void terminate() {
-        timer.cancel();
-        timer.purge();
-        setAlive(false);
+    public synchronized void terminate() {
+        if (timer != null) {
+            timer.cancel();
+            timer.purge();
+            timer = null;
+        }
     }
 
-    public static boolean isAlive() {
-        return alive;
+    /**
+     * Restarts the timer if the interval has changed. If the timer is not currently
+     * running, then it updates the interval, but does not start the timer.
+     *
+     * @param intervalMs desired interval, or {@code null} to leave it unchanged
+     */
+    public synchronized void restart(Long intervalMs) {
+        if (intervalMs != null && intervalMs > 0 && intervalMs != this.intervalMs) {
+            this.intervalMs = intervalMs;
+
+            if (timer != null) {
+                terminate();
+                start();
+            }
+        }
     }
 
-    public void setAlive(boolean alive) {
-        this.alive = alive;
+    /**
+     * Starts the timer.
+     */
+    public synchronized void start() {
+        if (timer == null) {
+            timer = new Timer(true);
+            timer.scheduleAtFixedRate(this, 0, this.intervalMs);
+        }
     }
 }