Integrate using Policy Type to find Matchable
[policy/xacml-pdp.git] / main / src / main / java / org / onap / policy / pdpx / main / startstop / XacmlPdpActivator.java
index 2a881d4..8d21395 100644 (file)
@@ -22,13 +22,13 @@ package org.onap.policy.pdpx.main.startstop;
 
 import java.nio.file.Paths;
 import java.util.Arrays;
-import java.util.Properties;
 import lombok.Getter;
 import lombok.Setter;
-import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
+import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
 import org.onap.policy.common.endpoints.event.comm.TopicSource;
 import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient;
 import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClientException;
+import org.onap.policy.common.endpoints.http.server.RestServer;
 import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
 import org.onap.policy.common.parameters.ParameterService;
 import org.onap.policy.common.utils.services.ServiceManagerContainer;
@@ -40,8 +40,9 @@ import org.onap.policy.pdpx.main.comm.XacmlPdpHearbeatPublisher;
 import org.onap.policy.pdpx.main.comm.listeners.XacmlPdpStateChangeListener;
 import org.onap.policy.pdpx.main.comm.listeners.XacmlPdpUpdateListener;
 import org.onap.policy.pdpx.main.parameters.XacmlPdpParameterGroup;
+import org.onap.policy.pdpx.main.rest.XacmlPdpAafFilter;
 import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager;
-import org.onap.policy.pdpx.main.rest.XacmlPdpRestServer;
+import org.onap.policy.pdpx.main.rest.XacmlPdpRestController;
 import org.onap.policy.pdpx.main.rest.XacmlPdpStatisticsManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,11 +66,6 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
     // The parameters of this policy xacml pdp activator
     private final XacmlPdpParameterGroup xacmlPdpParameterGroup;
 
-    /**
-     * The XACML PDP REST API server.
-     */
-    private XacmlPdpRestServer restServer;
-
     /**
      * Listens for messages on the topic, decodes them into a {@link PdpStatus} message, and then
      * dispatches them to appropriate listener.
@@ -80,31 +76,34 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
      * Instantiate the activator for policy xacml pdp as a complete service.
      *
      * @param xacmlPdpParameterGroup the parameters for the xacml pdp service
-     * @param topicProperties properties used to configure the topics
      */
-    public XacmlPdpActivator(final XacmlPdpParameterGroup xacmlPdpParameterGroup, Properties topicProperties) {
-        LOGGER.info("Activator initializing using {} and {}", xacmlPdpParameterGroup, topicProperties);
+    public XacmlPdpActivator(final XacmlPdpParameterGroup xacmlPdpParameterGroup) {
+        LOGGER.info("Activator initializing using {}", xacmlPdpParameterGroup);
 
-        TopicEndpoint.manager.addTopicSinks(topicProperties);
-        TopicEndpoint.manager.addTopicSources(topicProperties);
+        TopicEndpointManager.getManager().addTopics(xacmlPdpParameterGroup.getTopicParameterGroup());
 
-        XacmlPdpHearbeatPublisher heartbeat;
+        final XacmlPdpHearbeatPublisher heartbeat;
+        final TopicSinkClient sinkClient;
+        final XacmlState state;
+        final RestServer restServer;
 
         try {
             XacmlPdpApplicationManager appmgr =
-                            new XacmlPdpApplicationManager(Paths.get(xacmlPdpParameterGroup.getApplicationPath()));
+                            new XacmlPdpApplicationManager(Paths.get(xacmlPdpParameterGroup.getApplicationPath()),
+                                    xacmlPdpParameterGroup.getPolicyApiParameters());
             XacmlPdpApplicationManager.setCurrent(appmgr);
 
             XacmlPdpStatisticsManager stats = new XacmlPdpStatisticsManager();
             XacmlPdpStatisticsManager.setCurrent(stats);
             stats.setTotalPolicyTypesCount(appmgr.getPolicyTypeCount());
+            stats.setTotalPolicyCount(appmgr.getPolicyCount());
 
-            XacmlState state = new XacmlState(appmgr);
+            state = new XacmlState(appmgr);
 
             this.xacmlPdpParameterGroup = xacmlPdpParameterGroup;
             this.msgDispatcher = new MessageTypeDispatcher(MSG_TYPE_NAMES);
 
-            TopicSinkClient sinkClient = new TopicSinkClient(TOPIC);
+            sinkClient = new TopicSinkClient(TOPIC);
             heartbeat = new XacmlPdpHearbeatPublisher(sinkClient, state);
 
             /*
@@ -116,6 +115,9 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
             msgDispatcher.register(PdpMessageType.PDP_UPDATE.name(),
                             new XacmlPdpUpdateListener(sinkClient, state, heartbeat, appmgr));
 
+            restServer = new RestServer(xacmlPdpParameterGroup.getRestServerParameters(), XacmlPdpAafFilter.class,
+                                XacmlPdpRestController.class);
+
         } catch (RuntimeException | TopicSinkClientException e) {
             throw new PolicyXacmlPdpRuntimeException(e.getMessage(), e);
         }
@@ -132,24 +134,32 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
             this::unregisterMsgDispatcher);
 
         addAction("topics",
-            TopicEndpoint.manager::start,
-            TopicEndpoint.manager::shutdown);
+            TopicEndpointManager.getManager()::start,
+            TopicEndpointManager.getManager()::shutdown);
 
+        addAction("Terminate PDP",
+            () -> { },
+            () -> sendTerminateMessage(sinkClient, state));
         // initial heart beats act as registration messages
         addAction("Heartbeat Publisher",
             heartbeat::start,
             heartbeat::terminate);
 
-        addAction("Create REST server",
-            () -> restServer = new XacmlPdpRestServer(xacmlPdpParameterGroup.getRestServerParameters()),
-            () -> restServer = null);
-
         addAction("REST server",
-            () -> restServer.start(),
-            () -> restServer.stop());
+            restServer::start,
+            restServer::stop);
+
         // @formatter:on
     }
 
+    /*
+     * Method used to send a terminate message to the PAP.
+     */
+    private void sendTerminateMessage(TopicSinkClient sinkClient, XacmlState state) {
+        PdpStatus terminateStatus = state.terminatePdpMessage();
+        sinkClient.send(terminateStatus);
+    }
+
     /**
      * Get the parameters used by the activator.
      *
@@ -181,7 +191,7 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
      * Registers the dispatcher with the topic source(s).
      */
     private void registerMsgDispatcher() {
-        for (TopicSource source : TopicEndpoint.manager.getTopicSources(Arrays.asList(TOPIC))) {
+        for (TopicSource source : TopicEndpointManager.getManager().getTopicSources(Arrays.asList(TOPIC))) {
             source.register(msgDispatcher);
         }
     }
@@ -190,7 +200,7 @@ public class XacmlPdpActivator extends ServiceManagerContainer {
      * Unregisters the dispatcher from the topic source(s).
      */
     private void unregisterMsgDispatcher() {
-        for (TopicSource source : TopicEndpoint.manager.getTopicSources(Arrays.asList(TOPIC))) {
+        for (TopicSource source : TopicEndpointManager.getManager().getTopicSources(Arrays.asList(TOPIC))) {
             source.unregister(msgDispatcher);
         }
     }