Search in sources :

Example 11 with Edge

use of org.opennms.features.topology.api.topo.Edge in project opennms by OpenNMS.

the class RealUltimateLayoutAlgorithm method updateLayout.

@Override
public void updateLayout(Graph graph) {
    final Layout graphLayout = graph.getLayout();
    SparseGraph<VertexRef, EdgeRef> jungGraph = new SparseGraph<VertexRef, EdgeRef>();
    Collection<? extends Vertex> vertices = graph.getDisplayVertices();
    for (Vertex v : vertices) {
        jungGraph.addVertex(v);
    }
    Collection<? extends Edge> edges = graph.getDisplayEdges();
    for (Edge e : edges) {
        jungGraph.addEdge(e, e.getSource().getVertex(), e.getTarget().getVertex());
    }
    Dimension size = selectLayoutSize(graph);
    Dimension paddedSize = new Dimension((int) (size.getWidth() * .75), (int) (size.getHeight() * .75));
    doISOMLayout(graphLayout, jungGraph, size);
    doSpringLayout(graphLayout, jungGraph, size, SPRING_LAYOUT_REPULSION);
    doFRLayout(graphLayout, jungGraph, paddedSize, (int) (size.getWidth() / 8.0), (int) (size.getHeight() / 8.0));
    doSpringLayout(graphLayout, jungGraph, size, SPRING_LAYOUT_REPULSION);
}
Also used : SparseGraph(edu.uci.ics.jung.graph.SparseGraph) Vertex(org.opennms.features.topology.api.topo.Vertex) NonStupidISOMLayout(org.opennms.features.topology.app.internal.jung.ISOMLayoutAlgorithm.NonStupidISOMLayout) Layout(org.opennms.features.topology.api.Layout) FRLayout(edu.uci.ics.jung.algorithms.layout.FRLayout) SpringLayout(edu.uci.ics.jung.algorithms.layout.SpringLayout) EdgeRef(org.opennms.features.topology.api.topo.EdgeRef) Dimension(java.awt.Dimension) VertexRef(org.opennms.features.topology.api.topo.VertexRef) Edge(org.opennms.features.topology.api.topo.Edge)

Example 12 with Edge

use of org.opennms.features.topology.api.topo.Edge in project opennms by OpenNMS.

the class HierarchyLayoutAlgorithm method convert.

private edu.uci.ics.jung.graph.DirectedGraph<VertexRef, Edge> convert(final Graph g) {
    if (!isFullyLevelAware(g)) {
        throw new IllegalStateException("The graph is not LevelAware. Cannot apply Hierarchy Layout. Aborting");
    }
    // We need to sort the elements. For this purpose we use the DirectedOrderedSparseMultigraph
    final edu.uci.ics.jung.graph.DirectedGraph<VertexRef, Edge> jungGraph = new DirectedOrderedSparseMultigraph<>();
    final Collection<Vertex> displayVertices = g.getDisplayVertices();
    // Sort by level
    final List<Vertex> sortedVertices = displayVertices.stream().filter(v -> v instanceof LevelAware).sorted(new Comparator<Vertex>() {

        @Override
        public int compare(Vertex o1, Vertex o2) {
            return Integer.compare(((LevelAware) o1).getLevel(), ((LevelAware) o2).getLevel());
        }
    }).collect(Collectors.toList());
    // Build the graph
    for (VertexRef v : sortedVertices) {
        jungGraph.addVertex(v);
    }
    // The order of edges does not matter
    for (Edge e : g.getDisplayEdges()) {
        jungGraph.addEdge(e, e.getSource().getVertex(), e.getTarget().getVertex());
    }
    return jungGraph;
}
Also used : Vertex(org.opennms.features.topology.api.topo.Vertex) DirectedOrderedSparseMultigraph(edu.uci.ics.jung.graph.DirectedOrderedSparseMultigraph) DirectedOrderedSparseMultigraph(edu.uci.ics.jung.graph.DirectedOrderedSparseMultigraph) Comparator(java.util.Comparator) VertexRef(org.opennms.features.topology.api.topo.VertexRef) Edge(org.opennms.features.topology.api.topo.Edge) LevelAware(org.opennms.features.topology.api.topo.LevelAware)

Example 13 with Edge

use of org.opennms.features.topology.api.topo.Edge in project opennms by OpenNMS.

the class VertexHopGraphProvider method getVertices.

@Override
public List<Vertex> getVertices(Criteria... criteria) {
    // If we have a IgnoreHopCriteria, just return all existing vertices
    for (Criteria criterium : criteria) {
        try {
            IgnoreHopCriteria ignoreHopCriteria = (IgnoreHopCriteria) criterium;
            return m_delegate.getVertices();
        } catch (ClassCastException e) {
        }
    }
    // Otherwise consider vertices szl and focus nodes
    Set<VertexRef> focusNodes = getFocusNodes(criteria);
    int maxSemanticZoomLevel = getMaxSemanticZoomLevel(criteria);
    // Clear the existing semantic zoom level values
    m_semanticZoomLevels.clear();
    int semanticZoomLevel = 0;
    // If we didn't find any matching nodes among the focus nodes...
    if (focusNodes.size() < 1) {
        // ...then return an empty list of vertices, but include collapsed vertices
        collapseVertices(Collections.emptySet(), getCollapsibleCriteria(criteria, false));
    }
    Map<VertexRef, Set<VertexRef>> neighborMap = new HashMap<VertexRef, Set<VertexRef>>();
    List<Edge> edges = m_delegate.getEdges(criteria);
    for (Edge edge : edges) {
        VertexRef src = edge.getSource().getVertex();
        VertexRef tgt = edge.getTarget().getVertex();
        Set<VertexRef> srcNeighbors = neighborMap.get(src);
        if (srcNeighbors == null) {
            srcNeighbors = new HashSet<VertexRef>();
            neighborMap.put(src, srcNeighbors);
        }
        srcNeighbors.add(tgt);
        Set<VertexRef> tgtNeighbors = neighborMap.get(tgt);
        if (tgtNeighbors == null) {
            tgtNeighbors = new HashSet<VertexRef>();
            neighborMap.put(tgt, tgtNeighbors);
        }
        tgtNeighbors.add(src);
    }
    Set<Vertex> processed = new HashSet<Vertex>();
    Set<VertexRef> neighbors = new HashSet<VertexRef>();
    Set<VertexRef> workingSet = new HashSet<VertexRef>(focusNodes);
    // Put a limit on the SZL in case we infinite loop for some reason
    while (semanticZoomLevel <= maxSemanticZoomLevel && workingSet.size() > 0) {
        neighbors.clear();
        for (VertexRef vertexRef : workingSet) {
            // Only consider Vertex if it is actually not filtered by the criteria (which it might)
            Vertex vertex = getVertex(vertexRef, criteria);
            if (vertex != null) {
                if (m_semanticZoomLevels.containsKey(vertexRef)) {
                    throw new IllegalStateException("Calculating semantic zoom level for vertex that has already been calculated: " + vertexRef.toString());
                }
                m_semanticZoomLevels.put(vertexRef, semanticZoomLevel);
                Set<VertexRef> refs = neighborMap.get(vertexRef);
                if (refs != null) {
                    neighbors.addAll(refs);
                }
                processed.add(vertex);
            }
        }
        neighbors.removeAll(processed);
        workingSet.clear();
        workingSet.addAll(neighbors);
        // Increment the semantic zoom level
        semanticZoomLevel++;
    }
    processed = collapseVertices(processed, getCollapsedCriteria(criteria));
    return new ArrayList<Vertex>(processed);
}
Also used : Vertex(org.opennms.features.topology.api.topo.Vertex) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) CollapsibleCriteria(org.opennms.features.topology.api.topo.CollapsibleCriteria) Criteria(org.opennms.features.topology.api.topo.Criteria) DefaultVertexRef(org.opennms.features.topology.api.topo.DefaultVertexRef) VertexRef(org.opennms.features.topology.api.topo.VertexRef) Edge(org.opennms.features.topology.api.topo.Edge) HashSet(java.util.HashSet)

Example 14 with Edge

use of org.opennms.features.topology.api.topo.Edge in project opennms by OpenNMS.

the class EnhancedLinkdTopologyProviderTest method testLoadSimpleGraph.

@Test
public void testLoadSimpleGraph() throws Exception {
    assertEquals(8, m_topologyProvider.getVertices().size());
    assertEquals(9, m_topologyProvider.getEdges().size());
    Vertex v1 = m_topologyProvider.getVertex("nodes", "1");
    Vertex v2 = m_topologyProvider.getVertex("nodes", "2");
    Vertex v3 = m_topologyProvider.getVertex("nodes", "3");
    Vertex v4 = m_topologyProvider.getVertex("nodes", "4");
    Vertex v5 = m_topologyProvider.getVertex("nodes", "5");
    Vertex v6 = m_topologyProvider.getVertex("nodes", "6");
    assertEquals("node1", v1.getLabel());
    assertEquals("192.168.1.1", v1.getIpAddress());
    assertEquals(false, v1.isLocked());
    assertEquals(new Integer(1), v1.getNodeID());
    assertEquals(false, v1.isSelected());
    assertEquals(new Integer(0), v1.getX());
    assertEquals(new Integer(0), v1.getY());
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v1));
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v2));
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v3));
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v4));
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v5));
    assertEquals(0, m_topologyProvider.getSemanticZoomLevel(v6));
    assertEquals(3, m_topologyProvider.getEdgeIdsForVertex(v1).length);
    assertEquals(3, m_topologyProvider.getEdgeIdsForVertex(v2).length);
    assertEquals(2, m_topologyProvider.getEdgeIdsForVertex(v3).length);
    assertEquals(2, m_topologyProvider.getEdgeIdsForVertex(v4).length);
    assertEquals(2, m_topologyProvider.getEdgeIdsForVertex(v5).length);
    assertEquals(2, m_topologyProvider.getEdgeIdsForVertex(v6).length);
    for (Vertex vertex : m_topologyProvider.getVertices()) {
        assertEquals("nodes", vertex.getNamespace());
    // assertTrue(vertex.getIpAddress(), "127.0.0.1".equals(vertex.getIpAddress()) || "64.146.64.214".equals(vertex.getIpAddress()));
    }
    int countLLDP = 0;
    int countOSPF = 0;
    for (Edge edge : m_topologyProvider.getEdges()) {
        if (edge.getNamespace().equals(EnhancedLinkdTopologyProvider.LLDP_EDGE_NAMESPACE)) {
            countLLDP++;
        } else if (edge.getNamespace().equals(EnhancedLinkdTopologyProvider.OSPF_EDGE_NAMESPACE)) {
            countOSPF++;
        }
    }
    assertEquals(8, countLLDP);
    assertEquals(1, countOSPF);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Vertex(org.opennms.features.topology.api.topo.Vertex) AbstractVertex(org.opennms.features.topology.api.topo.AbstractVertex) SimpleLeafVertex(org.opennms.features.topology.api.topo.SimpleLeafVertex) Edge(org.opennms.features.topology.api.topo.Edge) Test(org.junit.Test)

Example 15 with Edge

use of org.opennms.features.topology.api.topo.Edge in project opennms by OpenNMS.

the class VEProviderGraphContainerTest method testContainerWithHopProvider.

@Test
public void testContainerWithHopProvider() throws Exception {
    VertexHopGraphProvider vertexHopGraphProvider = new VertexHopGraphProvider(m_graphProvider);
    DefaultTopologyService topologyService = new DefaultTopologyService();
    SimpleMetaTopologyProvider simpleMetaTopologyProvider = new SimpleMetaTopologyProvider(vertexHopGraphProvider);
    topologyService.setServiceLocator(new SimpleServiceLocator(simpleMetaTopologyProvider));
    // Wrap the test GraphProvider in a VertexHopGraphProvider
    VEProviderGraphContainer graphContainer = new VEProviderGraphContainer();
    graphContainer.setSemanticZoomLevel(0);
    graphContainer.setTopologyService(topologyService);
    graphContainer.setMetaTopologyId(simpleMetaTopologyProvider.getId());
    graphContainer.setSelectedNamespace(vertexHopGraphProvider.getNamespace());
    m_graphContainer = graphContainer;
    // There should be zero vertices or edges if no focus vertices are set
    Graph graph = m_graphContainer.getGraph();
    assertEquals(0, graph.getDisplayVertices().size());
    assertEquals(0, graph.getDisplayEdges().size());
    // Add one focus vertex
    VertexHopGraphProvider.DefaultVertexHopCriteria hopCriteria = new VertexHopGraphProvider.DefaultVertexHopCriteria(new DefaultVertexRef("nodes", "v1"));
    m_graphContainer.addCriteria(hopCriteria);
    // This needs to be 2 because there is a SemanticZoomLevelCriteria in there also
    assertEquals(2, m_graphContainer.getCriteria().length);
    // Verify that a single vertex is in the graph
    graph = m_graphContainer.getGraph();
    assertEquals(1, graph.getDisplayVertices().size());
    assertEquals(0, graph.getDisplayEdges().size());
    expectVertex("nodes", "v1", "vertex");
    graph.visit(verifier());
    verify();
    verifyConnectedness(graph);
    reset();
    // Change SZL to 1
    m_graphContainer.setSemanticZoomLevel(1);
    assertEquals(2, m_graphContainer.getCriteria().length);
    // Focus vertex
    expectVertex("nodes", "v1", "vertex");
    expectVertex("nodes", "v2", "vertex");
    /*
			This is a problem with the VEProviderGraphContainer... it wraps a delegate GraphProvider
			in a MergingGraphProvider like so:

			VEProviderGraphContainer { MergingGraphProvider { VertexHopGraphProvider } } }

			But for the VertexHopProvider to calculate the SZL correctly, it needs to be aware of all
			edges, including those provided by the MergingGraphProvider. So we should rearrange things
			so that they are laid out like:

			VEProviderGraphContainer { VertexHopGraphProvider { MergingGraphProvider } } }

			We should decouple the MergingGraphProvider from the VEProviderGraphContainer and then just
			inject them in the correct order. When this problem is fixed, uncomment all of the lines that
			are commented out in this test.
		*/
    // expectVertex("nodes", "v3", "vertex");
    expectVertex("nodes", "v4", "vertex");
    expectEdge("nodes", "e1", "edge");
    // expectEdge("nodes", "e2", "edge");
    // expectEdge("nodes", "e3", "edge");
    expectEdge("nodes", "e4", "edge");
    graph = m_graphContainer.getGraph();
    // assertEquals(4, graph.getDisplayVertices().size());
    // assertEquals(5, graph.getDisplayEdges().size());
    assertEquals(3, graph.getDisplayVertices().size());
    assertEquals(2, graph.getDisplayEdges().size());
    graph.visit(verifier());
    verify();
    verifyConnectedness(graph);
    reset();
    // Add a collapsed criteria to the container
    Criteria collapsibleCriteria = new TestCriteria1();
    m_graphContainer.addCriteria(collapsibleCriteria);
    assertEquals(3, m_graphContainer.getCriteria().length);
    // Make sure that the TestCollapsibleCriteria is mapping "v2" and "v4" to the collapsed "test" vertex
    Map<VertexRef, Set<Vertex>> collapsed = VertexHopGraphProvider.getMapOfVerticesToCollapsedVertices(VertexHopGraphProvider.getCollapsedCriteria(m_graphContainer.getCriteria()));
    assertTrue(collapsed.containsKey(new DefaultVertexRef("nodes", "v2")));
    assertTrue(collapsed.containsKey(new DefaultVertexRef("nodes", "v4")));
    assertTrue(collapsed.get(new DefaultVertexRef("nodes", "v2")).equals(Collections.singleton(new DefaultVertexRef("nodes", "test"))));
    assertTrue(collapsed.get(new DefaultVertexRef("nodes", "v4")).equals(Collections.singleton(new DefaultVertexRef("nodes", "test"))));
    assertEquals(m_graphContainer.getGraph().getDisplayVertices().toString(), 3, m_graphContainer.getGraph().getDisplayVertices().size());
    assertEquals(m_graphContainer.getTopologyServiceClient().getGraphProviderBy("nodes").getVertices(new TestCriteria1()).toString(), 3, m_graphContainer.getTopologyServiceClient().getGraphProviderBy("nodes").getVertices(new TestCriteria1()).size());
    expectVertex("nodes", "v1", "vertex");
    expectVertex("nodes", "v3", "vertex");
    // Collapsed vertex that contains v2 and v4
    expectVertex("nodes", "test", "test");
    expectEdge("nodes", "collapsedTarget-e1", "edge");
    expectEdge("nodes", "collapsedSource-e2", "edge");
    expectEdge("nodes", "collapsedTarget-e3", "edge");
    expectEdge("nodes", "collapsedSource-e4", "edge");
    graph = m_graphContainer.getGraph();
    assertEquals(3, graph.getDisplayVertices().size());
    assertEquals(4, graph.getDisplayEdges().size());
    for (Edge edge : graph.getDisplayEdges()) {
        if (edge.getId().equals("collapsedTarget-e1")) {
            assertEquals("v1", edge.getSource().getVertex().getId());
            assertEquals("test", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsedSource-e2")) {
            assertEquals("test", edge.getSource().getVertex().getId());
            assertEquals("v3", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsedTarget-e3")) {
            assertEquals("v3", edge.getSource().getVertex().getId());
            assertEquals("test", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsedSource-e4")) {
            assertEquals("test", edge.getSource().getVertex().getId());
            assertEquals("v1", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("ncs1")) {
            assertEquals("v1", edge.getSource().getVertex().getId());
            assertEquals("v3", edge.getTarget().getVertex().getId());
        } else {
            fail("Unknown edge ID: " + edge.getId());
        }
    }
    graph.visit(verifier());
    verify();
    verifyConnectedness(graph);
    reset();
    // Remove the collapsed criteria and make sure that the state reverts correctly
    m_graphContainer.removeCriteria(collapsibleCriteria);
    graph = m_graphContainer.getGraph();
    // assertEquals(4, graph.getDisplayVertices().size());
    // assertEquals(5, graph.getDisplayEdges().size());
    assertEquals(3, graph.getDisplayVertices().size());
    assertEquals(2, graph.getDisplayEdges().size());
    collapsibleCriteria = new TestCriteria1();
    m_graphContainer.addCriteria(collapsibleCriteria);
    collapsibleCriteria = new TestCriteria2();
    m_graphContainer.addCriteria(collapsibleCriteria);
    assertEquals(4, m_graphContainer.getCriteria().length);
    graph = m_graphContainer.getGraph();
    assertEquals(3, m_graphContainer.getGraph().getDisplayVertices().size());
    /*
		 * One edge is missing because of the VertexHopGraphProvider issue mentioned above.
		assertEquals(
			ArrayUtils.toString(m_graphContainer.getGraph().getDisplayEdges()),
			5,
			m_graphContainer.getGraph().getDisplayEdges().size()
		);
		 */
    assertEquals(4, m_graphContainer.getGraph().getDisplayEdges().size());
    for (Edge edge : graph.getDisplayEdges()) {
        if (edge.getId().equals("collapsedTarget-e1")) {
            assertEquals("v1", edge.getSource().getVertex().getId());
            assertEquals("test", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsed-e2")) {
            assertEquals("test", edge.getSource().getVertex().getId());
            assertEquals("collapse-v3", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsed-e3")) {
            assertEquals("collapse-v3", edge.getSource().getVertex().getId());
            assertEquals("test", edge.getTarget().getVertex().getId());
        } else if (edge.getId().equals("collapsedSource-e4")) {
            assertEquals("test", edge.getSource().getVertex().getId());
            assertEquals("v1", edge.getTarget().getVertex().getId());
        /**
         * This edge is not found because of the issue mentioned above.
         *			} else if (edge.getId().equals("collapsedTarget-ncs1")) {
         *				assertEquals("v1", edge.getSource().getVertex().getId());
         *				assertEquals("collapse-v3", edge.getTarget().getVertex().getId());
         */
        } else {
            fail("Unknown edge ID: " + edge.getId());
        }
    }
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) DefaultTopologyService(org.opennms.features.topology.app.internal.service.DefaultTopologyService) SimpleServiceLocator(org.opennms.features.topology.app.internal.service.SimpleServiceLocator) VertexHopGraphProvider(org.opennms.features.topology.api.support.VertexHopGraphProvider) CollapsibleCriteria(org.opennms.features.topology.api.topo.CollapsibleCriteria) SemanticZoomLevelCriteria(org.opennms.features.topology.api.support.SemanticZoomLevelCriteria) Criteria(org.opennms.features.topology.api.topo.Criteria) SimpleMetaTopologyProvider(org.opennms.features.topology.api.topo.SimpleMetaTopologyProvider) Graph(org.opennms.features.topology.api.Graph) DefaultVertexRef(org.opennms.features.topology.api.topo.DefaultVertexRef) DefaultVertexRef(org.opennms.features.topology.api.topo.DefaultVertexRef) VertexRef(org.opennms.features.topology.api.topo.VertexRef) Edge(org.opennms.features.topology.api.topo.Edge) Test(org.junit.Test)

Aggregations

Edge (org.opennms.features.topology.api.topo.Edge)37 Vertex (org.opennms.features.topology.api.topo.Vertex)22 VertexRef (org.opennms.features.topology.api.topo.VertexRef)22 EdgeRef (org.opennms.features.topology.api.topo.EdgeRef)11 SparseGraph (edu.uci.ics.jung.graph.SparseGraph)10 Layout (org.opennms.features.topology.api.Layout)10 Point (org.opennms.features.topology.api.Point)8 ArrayList (java.util.ArrayList)7 Dimension (java.awt.Dimension)5 HashSet (java.util.HashSet)5 AbstractEdge (org.opennms.features.topology.api.topo.AbstractEdge)5 AbstractVertex (org.opennms.features.topology.api.topo.AbstractVertex)5 Set (java.util.Set)4 Test (org.junit.Test)4 DefaultVertexRef (org.opennms.features.topology.api.topo.DefaultVertexRef)4 SimpleLeafVertex (org.opennms.features.topology.api.topo.SimpleLeafVertex)4 HashMap (java.util.HashMap)3 CollapsibleCriteria (org.opennms.features.topology.api.topo.CollapsibleCriteria)3 Criteria (org.opennms.features.topology.api.topo.Criteria)3 FRLayout (edu.uci.ics.jung.algorithms.layout.FRLayout)2