public Topology()

in client/idm/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java [156:509]


    public Topology() {
        modal = new BaseModal<>("resource-modal");
        body.add(modal.size(Modal.Size.Large));
        modal.setWindowClosedCallback(target -> modal.show(false));

        TopologyWebSocketBehavior websocket = new TopologyWebSocketBehavior();
        body.add(websocket);

        togglePanel = new TopologyTogglePanel("toggle", getPageReference());
        body.add(togglePanel);

        // -----------------------------------------
        // Add Zoom panel
        // -----------------------------------------
        ActionsPanel<Serializable> zoomActionPanel = new ActionsPanel<>("zoom", null);

        zoomActionPanel.add(new ActionLink<>() {

            private static final long serialVersionUID = -3722207913631435501L;

            @Override
            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                target.appendJavaScript("zoomIn($('#drawing')[0]);");
            }
        }, ActionLink.ActionType.ZOOM_IN, IdMEntitlement.CONNECTOR_LIST).disableIndicator().hideLabel();
        zoomActionPanel.add(new ActionLink<>() {

            private static final long serialVersionUID = -3722207913631435501L;

            @Override
            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                target.appendJavaScript("zoomOut($('#drawing')[0]);");
            }
        }, ActionLink.ActionType.ZOOM_OUT, IdMEntitlement.CONNECTOR_LIST).disableIndicator().hideLabel();

        body.add(zoomActionPanel);
        // -----------------------------------------

        // -----------------------------------------
        // Add Syncope (root topologynode)
        // -----------------------------------------
        String rootName = StringUtils.capitalize(Constants.SYNCOPE);
        final TopologyNode syncopeTopologyNode = new TopologyNode(rootName, rootName, TopologyNode.Kind.SYNCOPE);
        syncopeTopologyNode.setX(origX);
        syncopeTopologyNode.setY(origY);

        URI uri = WebClient.client(SyncopeConsoleSession.get().getService(SyncopeService.class)).getBaseURI();
        syncopeTopologyNode.setHost(uri.getHost());
        syncopeTopologyNode.setPort(uri.getPort());

        body.add(topologyNodePanel(Constants.SYNCOPE, syncopeTopologyNode, false));

        Map<Serializable, Map<Serializable, TopologyNode>> connections = new HashMap<>();
        Map<Serializable, TopologyNode> syncopeConnections = new HashMap<>();
        connections.put(syncopeTopologyNode.getKey(), syncopeConnections);

        // required to retrieve parent positions
        Map<String, TopologyNode> servers = new HashMap<>();
        Map<String, TopologyNode> connectors = new HashMap<>();
        // -----------------------------------------

        // -----------------------------------------
        // Add Connector Servers
        // -----------------------------------------
        ListView<URI> connectorServers = new ListView<>("connectorServers", csModel.getObject().getLeft()) {

            private static final long serialVersionUID = 6978621871488360380L;

            private final int size = csModel.getObject().getLeft().size() + 1;

            @Override
            protected void populateItem(final ListItem<URI> item) {
                int kx = size >= 4 ? 800 : (200 * size);

                int x = (int) Math.round(origX + kx * Math.cos(Math.PI + Math.PI * (item.getIndex() + 1) / size));
                int y = (int) Math.round(origY + 100 * Math.sin(Math.PI + Math.PI * (item.getIndex() + 1) / size));

                URI location = item.getModelObject();
                String url = location.toASCIIString();

                TopologyNode topologynode = new TopologyNode(url, url, TopologyNode.Kind.CONNECTOR_SERVER);

                topologynode.setHost(location.getHost());
                topologynode.setPort(location.getPort());
                topologynode.setX(x);
                topologynode.setY(y);

                servers.put(String.class.cast(topologynode.getKey()), topologynode);

                item.add(topologyNodePanel("cs", topologynode, false));

                syncopeConnections.put(url, topologynode);
                connections.put(url, new HashMap<>());
            }
        };

        connectorServers.setOutputMarkupId(true);
        body.add(connectorServers);
        // -----------------------------------------

        // -----------------------------------------
        // Add File Paths
        // -----------------------------------------
        ListView<URI> filePaths = new ListView<>("filePaths", csModel.getObject().getRight()) {

            private static final long serialVersionUID = 6978621871488360380L;

            private final int size = csModel.getObject().getRight().size() + 1;

            @Override
            protected void populateItem(final ListItem<URI> item) {
                int kx = size >= 4 ? 800 : (200 * size);

                int x = (int) Math.round(origX + kx * Math.cos(Math.PI * (item.getIndex() + 1) / size));
                int y = (int) Math.round(origY + 100 * Math.sin(Math.PI * (item.getIndex() + 1) / size));

                URI location = item.getModelObject();
                String url = location.toASCIIString();

                TopologyNode topologynode = new TopologyNode(url, url, TopologyNode.Kind.FS_PATH);

                topologynode.setHost(location.getHost());
                topologynode.setPort(location.getPort());
                topologynode.setX(x);
                topologynode.setY(y);

                servers.put(String.class.cast(topologynode.getKey()), topologynode);

                item.add(topologyNodePanel("fp", topologynode, false));

                syncopeConnections.put(url, topologynode);
                connections.put(url, new HashMap<>());
            }
        };

        filePaths.setOutputMarkupId(true);
        body.add(filePaths);
        // -----------------------------------------

        // -----------------------------------------
        // Add Connector Instances
        // -----------------------------------------
        ListView<List<ConnInstanceTO>> conns =
                new ListView<>("conns", new ArrayList<>(connModel.getObject().values())) {

            private static final long serialVersionUID = 697862187148836036L;

            @Override
            protected void populateItem(final ListItem<List<ConnInstanceTO>> item) {
                int size = item.getModelObject().size() + 1;

                ListView<ConnInstanceTO> conns = new ListView<>("conns", item.getModelObject()) {

                    private static final long serialVersionUID = 6978621871488360381L;

                    @Override
                    protected void populateItem(final ListItem<ConnInstanceTO> item) {
                        ConnInstanceTO conn = item.getModelObject();

                        TopologyNode topologynode = new TopologyNode(
                                conn.getKey(),
                                StringUtils.isBlank(conn.getDisplayName()) // [SYNCOPE-1233]
                                ? conn.getBundleName() : conn.getDisplayName(),
                                TopologyNode.Kind.CONNECTOR);

                        // Define the parent note
                        TopologyNode parent = servers.get(conn.getLocation());

                        // Set the position
                        int kx = size >= 6 ? 800 : (130 * size);

                        double hpos = conn.getLocation().
                                startsWith(CONNECTOR_SERVER_LOCATION_PREFIX) ? Math.PI : 0.0;

                        int x = (int) Math.round((Optional.ofNullable(parent).map(TopologyNode::getX).orElse(origX))
                                + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
                        int y = (int) Math.round((Optional.ofNullable(parent).map(TopologyNode::getY).orElse(origY))
                                + 100 * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));

                        topologynode.setConnectionDisplayName(conn.getBundleName());
                        topologynode.setX(x);
                        topologynode.setY(y);

                        connectors.put(String.class.cast(topologynode.getKey()), topologynode);
                        item.add(topologyNodePanel("conn", topologynode, conn.isErrored()));

                        // Update connections
                        Map<Serializable, TopologyNode> remoteConnections;
                        if (connections.containsKey(conn.getLocation())) {
                            remoteConnections = connections.get(conn.getLocation());
                        } else {
                            remoteConnections = new HashMap<>();
                            connections.put(conn.getLocation(), remoteConnections);
                        }
                        remoteConnections.put(conn.getKey(), topologynode);
                    }
                };

                conns.setOutputMarkupId(true);
                item.add(conns);
            }
        };

        conns.setOutputMarkupId(true);
        body.add(conns);
        // -----------------------------------------

        // -----------------------------------------
        // Add Resources
        // -----------------------------------------
        Collection<String> adminConns = new HashSet<>();
        connModel.getObject().values().forEach(connInstances -> adminConns.addAll(
                connInstances.stream().map(ConnInstanceTO::getKey).toList()));

        Set<String> adminRes = new HashSet<>();
        List<String> connToBeProcessed = new ArrayList<>();
        resModel.getObject().stream().
                filter(resourceTO -> adminConns.contains(resourceTO.getConnector())).
                forEach(resourceTO -> {
                    TopologyNode topologynode = new TopologyNode(
                            resourceTO.getKey(), resourceTO.getKey(), TopologyNode.Kind.RESOURCE);

                    Map<Serializable, TopologyNode> remoteConnections;
                    if (connections.containsKey(resourceTO.getConnector())) {
                        remoteConnections = connections.get(resourceTO.getConnector());
                    } else {
                        remoteConnections = new HashMap<>();
                        connections.put(resourceTO.getConnector(), remoteConnections);
                    }
                    remoteConnections.put(topologynode.getKey(), topologynode);

                    adminRes.add(resourceTO.getKey());

                    if (!connToBeProcessed.contains(resourceTO.getConnector())) {
                        connToBeProcessed.add(resourceTO.getConnector());
                    }
                });

        ListView<String> resources = new ListView<>("resources", connToBeProcessed) {

            private static final long serialVersionUID = 697862187148836038L;

            @Override
            protected void populateItem(final ListItem<String> item) {
                String connectorKey = item.getModelObject();

                ListView<TopologyNode> innerListView = new ListView<>("resources",
                        new ArrayList<>(connections.get(connectorKey).values())) {

                    private static final long serialVersionUID = -3447760771863754342L;

                    private final int size = getModelObject().size() + 1;

                    @Override
                    protected void populateItem(final ListItem<TopologyNode> item) {
                        TopologyNode topologynode = item.getModelObject();
                        TopologyNode parent = connectors.get(connectorKey);

                        // Set position
                        int kx = size >= 16 ? 800 : (48 * size);
                        int ky = size < 4 ? 100 : size < 6 ? 350 : 750;

                        double hpos = (parent == null || parent.getY() < syncopeTopologyNode.getY()) ? Math.PI : 0.0;

                        int x = (int) Math.round((Optional.ofNullable(parent).map(TopologyNode::getX).orElse(origX))
                                + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
                        int y = (int) Math.round((Optional.ofNullable(parent).map(TopologyNode::getY).orElse(origY))
                                + ky * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));

                        topologynode.setX(x);
                        topologynode.setY(y);

                        item.add(topologyNodePanel("res", topologynode, false));
                    }
                };

                innerListView.setOutputMarkupId(true);
                item.add(innerListView);
            }
        };

        resources.setOutputMarkupId(true);
        body.add(resources);
        // -----------------------------------------

        // -----------------------------------------
        // Create connections
        // -----------------------------------------
        WebMarkupContainer jsPlace = new WebMarkupContainerNoVeil("jsPlace");
        jsPlace.setOutputMarkupId(true);
        body.add(jsPlace);

        jsPlace.add(new Behavior() {

            private static final long serialVersionUID = 2661717818979056044L;

            @Override
            public void renderHead(final Component component, final IHeaderResponse response) {
                final StringBuilder jsPlumbConf = new StringBuilder();
                jsPlumbConf.append(String.format(Locale.US, "activate(%.2f);", 0.68f));

                createConnections(connections).forEach(jsPlumbConf::append);

                response.render(OnDomReadyHeaderItem.forScript(jsPlumbConf.toString()));
            }
        });

        jsPlace.add(new AbstractAjaxTimerBehavior(Duration.of(2, ChronoUnit.SECONDS)) {

            private static final long serialVersionUID = -4426283634345968585L;

            @Override
            protected void onTimer(final AjaxRequestTarget target) {
                if (websocket.connCheckDone(adminConns) && websocket.resCheckDone(adminRes)) {
                    stop(target);
                }

                target.appendJavaScript("checkConnection()");

                if (getUpdateInterval().getSeconds() < 5.0) {
                    setUpdateInterval(Duration.of(5, ChronoUnit.SECONDS));
                } else if (getUpdateInterval().getSeconds() < 10.0) {
                    setUpdateInterval(Duration.of(10, ChronoUnit.SECONDS));
                } else if (getUpdateInterval().getSeconds() < 15.0) {
                    setUpdateInterval(Duration.of(15, ChronoUnit.SECONDS));
                } else if (getUpdateInterval().getSeconds() < 20.0) {
                    setUpdateInterval(Duration.of(20, ChronoUnit.SECONDS));
                } else if (getUpdateInterval().getSeconds() < 30.0) {
                    setUpdateInterval(Duration.of(30, ChronoUnit.SECONDS));
                } else if (getUpdateInterval().getSeconds() < 60.0) {
                    setUpdateInterval(Duration.of(60, ChronoUnit.SECONDS));
                }
            }
        });
        // -----------------------------------------

        newlyCreatedContainer = new WebMarkupContainer("newlyCreatedContainer");
        newlyCreatedContainer.setOutputMarkupId(true);
        body.add(newlyCreatedContainer);

        newlyCreated = new ListView<>("newlyCreated", new ArrayList<>()) {

            private static final long serialVersionUID = 4949588177564901031L;

            @Override
            protected void populateItem(final ListItem<TopologyNode> item) {
                item.add(topologyNodePanel("el", item.getModelObject(), false));
            }
        };
        newlyCreated.setOutputMarkupId(true);
        newlyCreated.setReuseItems(true);

        newlyCreatedContainer.add(newlyCreated);
    }