package org.onap.policy.pdpx.main.startstop;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Properties;
-
-import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
+import lombok.Getter;
+import lombok.Setter;
+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;
import org.onap.policy.models.pdp.concepts.PdpStatus;
-import org.onap.policy.models.pdp.concepts.PdpUpdate;
import org.onap.policy.models.pdp.enums.PdpMessageType;
-import org.onap.policy.models.pdp.enums.PdpState;
import org.onap.policy.pdpx.main.PolicyXacmlPdpRuntimeException;
-import org.onap.policy.pdpx.main.comm.XacmlPdpMessage;
-import org.onap.policy.pdpx.main.comm.XacmlPdpPapRegistration;
+import org.onap.policy.pdpx.main.XacmlState;
+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.XacmlPdpRestServer;
+import org.onap.policy.pdpx.main.rest.XacmlPdpAafFilter;
+import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager;
+import org.onap.policy.pdpx.main.rest.XacmlPdpRestController;
+import org.onap.policy.pdpx.main.rest.XacmlPdpStatisticsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final String[] MSG_TYPE_NAMES = {"messageName"};
private static final String TOPIC = "POLICY-PDP-PAP";
+ @Getter
+ @Setter
+ private static XacmlPdpActivator current = null;
+
// 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.
*/
private final MessageTypeDispatcher msgDispatcher;
- /**
- * Listens for {@link PdpStateChange} messages from the PAP.
- */
- private final XacmlPdpStateChangeListener pdpStateChangeListener;
-
- /**
- * Listens for {@link PdpUpdate} messages from the PAP.
- */
- private final XacmlPdpUpdateListener pdpUpdateListener;
-
- /**
- * The current activator.
- */
- private static XacmlPdpActivator current = null;
-
- private volatile boolean alive = false;
-
- private XacmlPdpPapRegistration register;
-
- private XacmlPdpMessage message;
-
/**
* Instantiate the activator for policy xacml pdp as a complete service.
*
* @param topicProperties properties used to configure the topics
*/
public XacmlPdpActivator(final XacmlPdpParameterGroup xacmlPdpParameterGroup, Properties topicProperties) {
- TopicEndpoint.manager.addTopicSinks(topicProperties);
- TopicEndpoint.manager.addTopicSources(topicProperties);
+ LOGGER.info("Activator initializing using {} and {}", xacmlPdpParameterGroup, topicProperties);
+
+ TopicEndpointManager.getManager().addTopicSinks(topicProperties);
+ TopicEndpointManager.getManager().addTopicSources(topicProperties);
+
+ final XacmlPdpHearbeatPublisher heartbeat;
+ final TopicSinkClient sinkClient;
+ final XacmlState state;
+ final RestServer restServer;
try {
- TopicSinkClient sinkClient = new TopicSinkClient(TOPIC);
+ XacmlPdpApplicationManager appmgr =
+ new XacmlPdpApplicationManager(Paths.get(xacmlPdpParameterGroup.getApplicationPath()));
+ XacmlPdpApplicationManager.setCurrent(appmgr);
+
+ XacmlPdpStatisticsManager stats = new XacmlPdpStatisticsManager();
+ XacmlPdpStatisticsManager.setCurrent(stats);
+ stats.setTotalPolicyTypesCount(appmgr.getPolicyTypeCount());
+ stats.setTotalPolicyCount(appmgr.getPolicyCount());
+
+ state = new XacmlState(appmgr);
+
this.xacmlPdpParameterGroup = xacmlPdpParameterGroup;
this.msgDispatcher = new MessageTypeDispatcher(MSG_TYPE_NAMES);
- this.pdpStateChangeListener = new XacmlPdpStateChangeListener(sinkClient);
- this.pdpUpdateListener = new XacmlPdpUpdateListener(sinkClient);
- this.register = new XacmlPdpPapRegistration(sinkClient);
- this.message = new XacmlPdpMessage();
+
+ sinkClient = new TopicSinkClient(TOPIC);
+ heartbeat = new XacmlPdpHearbeatPublisher(sinkClient, state);
+
+ /*
+ * since the dispatcher isn't registered with the topic yet, we can go ahead
+ * and register the listeners with it.
+ */
+ msgDispatcher.register(PdpMessageType.PDP_STATE_CHANGE.name(),
+ new XacmlPdpStateChangeListener(sinkClient, state));
+ 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);
}
xacmlPdpParameterGroup.getRestServerParameters().setName(xacmlPdpParameterGroup.getName());
// @formatter:off
- addAction("XACML PDP parameters", () -> ParameterService.register(xacmlPdpParameterGroup),
+ addAction("XACML PDP parameters",
+ () -> ParameterService.register(xacmlPdpParameterGroup),
() -> ParameterService.deregister(xacmlPdpParameterGroup.getName()));
- addAction("PdpStateChange Dispatcher",
- () -> msgDispatcher.register(PdpMessageType.PDP_STATE_CHANGE.name(), this.pdpStateChangeListener),
- () -> msgDispatcher.unregister(PdpMessageType.PDP_STATE_CHANGE.name()));
-
- addAction("PdpUpdate Dispatcher",
- () -> msgDispatcher.register(PdpMessageType.PDP_UPDATE.name(), this.pdpUpdateListener),
- () -> msgDispatcher.unregister(PdpMessageType.PDP_UPDATE.name()));
-
addAction("Message Dispatcher",
- () -> registerMsgDispatcher(),
- () -> unregisterMsgDispatcher());
+ this::registerMsgDispatcher,
+ this::unregisterMsgDispatcher);
addAction("topics",
- () -> TopicEndpoint.manager.start(),
- () -> TopicEndpoint.manager.shutdown());
-
- addAction("Create REST server",
- () -> {
- restServer = new XacmlPdpRestServer(xacmlPdpParameterGroup.getRestServerParameters(),
- xacmlPdpParameterGroup.getApplicationPath());
- },
- () -> {
- restServer = null;
- });
+ 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("REST server",
- () -> restServer.start(),
- () -> restServer.stop());
-
- addAction("set alive", () -> setAlive(true), () -> setAlive(false));
-
- addAction("Initial Registration with PAP",
- () -> {
- register.pdpRegistration(message.formatStatusMessage(PdpState.PASSIVE));
- },
- () -> {
- register.pdpRegistration(message.formatStatusMessage(PdpState.TERMINATED));
- });
+ restServer::start,
+ restServer::stop);
+
// @formatter:on
+ }
- current = this;
+ /*
+ * Method used to send a terminate message to the PAP.
+ */
+ private void sendTerminateMessage(TopicSinkClient sinkClient, XacmlState state) {
+ PdpStatus terminateStatus = state.terminatePdpMessage();
+ sinkClient.send(terminateStatus);
}
/**
* 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);
}
}
* 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);
}
}
-
- /**
- * Returns the alive status of xacml pdp service.
- *
- * @return the alive
- */
- @Override
- public boolean isAlive() {
- return alive;
- }
-
- /**
- * Change the alive status of xacml pdp service.
- *
- * @param status the status
- */
- private void setAlive(final boolean status) {
- alive = status;
- }
-
- public static XacmlPdpActivator getCurrent() {
- return current;
- }
-
- public static void setCurrent(XacmlPdpActivator current) {
- XacmlPdpActivator.current = current;
- }
}