[SYNCOPE-1238] Stop the AjaxTimerBehavior once all expected connectors and resources are covered
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/3ce92812 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/3ce92812 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/3ce92812 Branch: refs/heads/master Commit: 3ce928120d58c836bfe10addc4a549d1d049c48a Parents: e611d3e Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Wed Nov 22 16:55:26 2017 +0100 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Wed Nov 22 16:59:07 2017 +0100 ---------------------------------------------------------------------- .../client/console/topology/Topology.java | 18 +++++-- .../topology/TopologyWebSocketBehavior.java | 52 +++++++++++--------- 2 files changed, 42 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/3ce92812/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java index 722a545..fda5e0e 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.cxf.jaxrs.client.WebClient; @@ -163,7 +164,8 @@ public class Topology extends BasePage { } }); - body.add(new TopologyWebSocketBehavior()); + final TopologyWebSocketBehavior websocket = new TopologyWebSocketBehavior(); + body.add(websocket); togglePanel = new TopologyTogglePanel("toggle", getPageReference()); body.add(togglePanel); @@ -373,14 +375,15 @@ public class Topology extends BasePage { // ----------------------------------------- // Add Resources // ----------------------------------------- - final Collection<String> administrableConns = new HashSet<>(); + final Collection<String> adminConns = new HashSet<>(); connModel.getObject().values().forEach(connInstances -> { - administrableConns.addAll(connInstances.stream().map(EntityTO::getKey).collect(Collectors.toList())); + adminConns.addAll(connInstances.stream().map(EntityTO::getKey).collect(Collectors.toList())); }); + final Set<String> adminRes = new HashSet<>(); final List<String> connToBeProcessed = new ArrayList<>(); resModel.getObject().stream(). - filter((resourceTO) -> (administrableConns.contains(resourceTO.getConnector()))). + filter((resourceTO) -> (adminConns.contains(resourceTO.getConnector()))). forEachOrdered(resourceTO -> { final TopologyNode topologynode = new TopologyNode( resourceTO.getKey(), resourceTO.getKey(), TopologyNode.Kind.RESOURCE); @@ -392,6 +395,9 @@ public class Topology extends BasePage { connections.put(resourceTO.getConnector(), remoteConnections); } remoteConnections.put(topologynode.getKey(), topologynode); + + adminRes.add(resourceTO.getKey()); + if (!connToBeProcessed.contains(resourceTO.getConnector())) { connToBeProcessed.add(resourceTO.getConnector()); } @@ -479,6 +485,10 @@ public class Topology extends BasePage { @Override protected void onTimer(final AjaxRequestTarget target) { + if (websocket.connCheckDone(adminConns) && websocket.resCheckDone(adminRes)) { + stop(target); + } + target.appendJavaScript("checkConnection()"); if (getUpdateInterval().seconds() < 5.0) { http://git-wip-us.apache.org/repos/asf/syncope/blob/3ce92812/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java index 6346332..1134a00 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java @@ -21,6 +21,8 @@ package org.apache.syncope.client.console.topology; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -47,13 +49,15 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private final Map<String, String> resources = new HashMap<>(); + private final Map<String, String> resources = + Collections.<String, String>synchronizedMap(new HashMap<String, String>()); - private final Set<String> runningResCheck = new HashSet<>(); + private final Set<String> runningResCheck = Collections.synchronizedSet(new HashSet<String>()); - private final Map<String, String> connectors = new HashMap<>(); + private final Map<String, String> connectors = + Collections.<String, String>synchronizedMap(new HashMap<String, String>()); - private final Set<String> runningConnCheck = new HashSet<>(); + private final Set<String> runningConnCheck = Collections.synchronizedSet(new HashSet<String>()); private final ConnectorRestClient connectorRestClient = new ConnectorRestClient(); @@ -75,12 +79,10 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { "{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.UNKNOWN, ckey)); } - synchronized (runningConnCheck) { - if (runningConnCheck.contains(ckey)) { - LOG.debug("Running connection check for connector {}", ckey); - } else { - runningConnCheck.add(ckey); - } + if (runningConnCheck.contains(ckey)) { + LOG.debug("Running connection check for connector {}", ckey); + } else { + runningConnCheck.add(ckey); } SyncopeConsoleSession.get().execute(new ConnCheck(ckey)); @@ -96,12 +98,10 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { "{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.UNKNOWN, rkey)); } - synchronized (runningResCheck) { - if (runningResCheck.contains(rkey)) { - LOG.debug("Running connection check for resource {}", rkey); - } else { - runningResCheck.add(rkey); - } + if (runningResCheck.contains(rkey)) { + LOG.debug("Running connection check for resource {}", rkey); + } else { + runningResCheck.add(rkey); } SyncopeConsoleSession.get().execute(new ResCheck(rkey)); @@ -120,6 +120,14 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { } } + public boolean connCheckDone(final Collection<String> connectors) { + return this.connectors.keySet().containsAll(connectors); + } + + public boolean resCheckDone(final Collection<String> resources) { + return this.resources.keySet().containsAll(resources); + } + class ConnCheck implements Runnable { private final String key; @@ -151,10 +159,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.FAILURE, key); } - synchronized (runningConnCheck) { - connectors.put(key, res); - runningConnCheck.remove(key); - } + connectors.put(key, res); + runningConnCheck.remove(key); } finally { ThreadContext.detach(); } @@ -192,10 +198,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.FAILURE, key); } - synchronized (runningResCheck) { - resources.put(key, res); - runningResCheck.remove(key); - } + resources.put(key, res); + runningResCheck.remove(key); } finally { ThreadContext.detach(); }