(rest) - added broadcast for links,configs,exceptions,files and fixed edit node (gui) - added handling of broadcast links, different rendering for wireless links, removal of wirelesss links on stop

This commit is contained in:
Blake J. Harnden 2018-09-17 11:57:47 -07:00
parent e7a56cc3ad
commit f062e2868d
11 changed files with 307 additions and 44 deletions

View file

@ -20,6 +20,8 @@ public interface ICoreClient {
boolean start() throws IOException;
boolean stop() throws IOException;
void updateState(SessionState state);
boolean setState(SessionState state) throws IOException;
@ -56,6 +58,8 @@ public interface ICoreClient {
boolean createNode(CoreNode node) throws IOException;
boolean editNode(CoreNode node) throws IOException;
boolean deleteNode(CoreNode node) throws IOException;
boolean createLink(CoreLink link) throws IOException;

View file

@ -15,6 +15,7 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Data
public class CoreRestClient implements ICoreClient {
@ -55,6 +56,10 @@ public class CoreRestClient implements ICoreClient {
}
for (CoreLink link : session.getLinks()) {
if (link.getInterfaceOne() != null || link.getInterfaceTwo() != null) {
link.setType(LinkTypes.WIRED.getValue());
}
networkGraph.addLink(link);
}
@ -157,6 +162,17 @@ public class CoreRestClient implements ICoreClient {
return setState(SessionState.INSTANTIATION);
}
@Override
public boolean stop() throws IOException {
List<CoreLink> wirelessLinks = networkGraph.getGraph().getEdges().stream()
.filter(CoreLink::isWireless)
.collect(Collectors.toList());
wirelessLinks.forEach(networkGraph::removeWirelessLink);
networkGraph.getGraphViewer().repaint();
return setState(SessionState.SHUTDOWN);
}
@Override
public void updateState(SessionState state) {
sessionState = state;
@ -292,6 +308,12 @@ public class CoreRestClient implements ICoreClient {
return WebUtils.postJson(url, node);
}
@Override
public boolean editNode(CoreNode node) throws IOException {
String url = getUrl(String.format("sessions/%s/nodes/%s", sessionId, node.getId()));
return WebUtils.putJson(url, node);
}
@Override
public boolean deleteNode(CoreNode node) throws IOException {
String url = getUrl(String.format("/sessions/%s/nodes/%s", sessionId, node.getId()));

View file

@ -20,6 +20,9 @@ public class CoreLink {
@JsonIgnore
private boolean visible = true;
@JsonProperty("message_type")
private Integer messageType;
private Integer type = 1;
@JsonProperty("node_one")
@ -41,4 +44,8 @@ public class CoreLink {
this.weight = (float) id;
this.loaded = false;
}
public boolean isWireless() {
return interfaceOne == null && interfaceTwo == null;
}
}

View file

@ -0,0 +1,31 @@
package com.core.data;
import java.util.HashMap;
import java.util.Map;
public enum LinkTypes {
WIRELESS(0),
WIRED(1);
private static final Map<Integer, LinkTypes> LOOKUP = new HashMap<>();
static {
for (LinkTypes state : LinkTypes.values()) {
LOOKUP.put(state.getValue(), state);
}
}
private final int value;
LinkTypes(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
public static LinkTypes get(int value) {
return LOOKUP.get(value);
}
}

View file

@ -0,0 +1,36 @@
package com.core.data;
import java.util.HashMap;
import java.util.Map;
public enum MessageFlags {
ADD(1),
DELETE(2),
CRI(4),
LOCAL(8),
STRING(16),
TEXT(32),
TTY(64);
private static final Map<Integer, MessageFlags> LOOKUP = new HashMap<>();
static {
for (MessageFlags state : MessageFlags.values()) {
LOOKUP.put(state.getValue(), state);
}
}
private final int value;
MessageFlags(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
public static MessageFlags get(int value) {
return LOOKUP.get(value);
}
}

View file

@ -1,10 +1,7 @@
package com.core.graph;
import com.core.Controller;
import com.core.data.CoreInterface;
import com.core.data.CoreLink;
import com.core.data.CoreNode;
import com.core.data.NodeType;
import com.core.data.*;
import com.core.ui.Toast;
import com.core.utils.IconUtils;
import com.google.common.base.Supplier;
@ -20,6 +17,7 @@ import edu.uci.ics.jung.visualization.annotations.AnnotationControls;
import edu.uci.ics.jung.visualization.control.EditingModalGraphMouse;
import edu.uci.ics.jung.visualization.control.GraphMouseListener;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.renderers.Renderer;
import lombok.Data;
import org.apache.commons.net.util.SubnetUtils;
@ -30,7 +28,6 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.util.*;
import java.util.List;
@ -90,9 +87,25 @@ public class NetworkGraph {
});
// edge render properties
renderContext.setEdgeStrokeTransformer(edge -> new BasicStroke(1));
renderContext.setEdgeShapeTransformer(edge -> new Rectangle2D.Float(0, 0, 1, 10));
renderContext.setEdgeFillPaintTransformer(edge -> Color.BLACK);
renderContext.setEdgeStrokeTransformer(edge -> {
LinkTypes linkType = LinkTypes.get(edge.getType());
if (LinkTypes.WIRELESS == linkType) {
float[] dash = {15.0f};
return new BasicStroke(5, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND,
0, dash, 0);
} else {
return new BasicStroke(5);
}
});
renderContext.setEdgeShapeTransformer(EdgeShape.line(graph));
renderContext.setEdgeDrawPaintTransformer(edge -> {
LinkTypes linkType = LinkTypes.get(edge.getType());
if (LinkTypes.WIRELESS == linkType) {
return Color.BLUE;
} else {
return Color.BLACK;
}
});
renderContext.setEdgeIncludePredicate(predicate -> predicate.element.isVisible());
graphViewer.setVertexToolTipTransformer(renderContext.getVertexLabelTransformer());
@ -144,6 +157,15 @@ public class NetworkGraph {
logger.debug("graph moved node({}): {},{}", node.getName(), x, y);
node.getPosition().setX(x);
node.getPosition().setY(y);
// upate node when session is active
if (controller.getCoreClient().isRunning()) {
try {
controller.getCoreClient().editNode(node);
} catch (IOException ex) {
Toast.error("failed to update node location");
}
}
}
}
});
@ -224,7 +246,7 @@ public class NetworkGraph {
link.setInterfaceTwo(interfaceTwo);
}
boolean isVisible = !isWirelessLink(nodeOne, nodeTwo);
boolean isVisible = !checkForWirelessNode(nodeOne, nodeTwo);
link.setVisible(isVisible);
logger.info("adding user created edge: {}", link);
@ -342,7 +364,7 @@ public class NetworkGraph {
return node.getType() == NodeType.EMANE || node.getType() == NodeType.WLAN;
}
private boolean isWirelessLink(CoreNode nodeOne, CoreNode nodeTwo) {
private boolean checkForWirelessNode(CoreNode nodeOne, CoreNode nodeTwo) {
boolean result = isWirelessNode(nodeOne);
return result || isWirelessNode(nodeTwo);
}
@ -363,12 +385,23 @@ public class NetworkGraph {
CoreNode nodeOne = nodeMap.get(link.getNodeOne());
CoreNode nodeTwo = nodeMap.get(link.getNodeTwo());
boolean isVisible = !isWirelessLink(nodeOne, nodeTwo);
boolean isVisible = !checkForWirelessNode(nodeOne, nodeTwo);
link.setVisible(isVisible);
graph.addEdge(link, nodeOne, nodeTwo);
}
public void removeWirelessLink(CoreLink link) {
logger.info("deleting link: {}", link);
CoreNode nodeOne = nodeMap.get(link.getNodeOne());
CoreNode nodeTwo = nodeMap.get(link.getNodeTwo());
CoreLink existingLink = graph.findEdge(nodeOne, nodeTwo);
if (existingLink != null) {
graph.removeEdge(existingLink);
}
}
public void removeLink(CoreLink link) {
graphViewer.getPickedEdgeState().pick(link, false);
graph.removeEdge(link);

View file

@ -2,7 +2,6 @@ package com.core.ui;
import com.core.Controller;
import com.core.data.NodeType;
import com.core.data.SessionState;
import com.core.utils.IconUtils;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXListView;
@ -266,7 +265,7 @@ public class GraphToolbar extends VBox {
private void stopSession() {
try {
boolean result = controller.getCoreClient().setState(SessionState.SHUTDOWN);
boolean result = controller.getCoreClient().stop();
if (result) {
controller.sessionStopped();
Toast.success("Session Stopped");

View file

@ -1,9 +1,7 @@
package com.core.websocket;
import com.core.Controller;
import com.core.data.CoreEvent;
import com.core.data.CoreNode;
import com.core.data.SessionState;
import com.core.data.*;
import com.core.utils.JsonUtils;
import io.socket.client.IO;
import io.socket.client.Socket;
@ -27,37 +25,69 @@ public class CoreWebSocket {
socket.on(Socket.EVENT_CONNECT, args -> {
logger.info("connected to web socket");
});
socket.on("node", args -> {
for (Object arg : args) {
try {
CoreNode node = JsonUtils.read(arg.toString(), CoreNode.class);
logger.info("core node update: {}", node);
controller.getNetworkGraph().setNodeLocation(node);
} catch (IOException ex) {
logger.error("error getting core node", ex);
}
}
});
socket.on("event", args -> {
for (Object arg : args) {
try {
CoreEvent event = JsonUtils.read(arg.toString(), CoreEvent.class);
logger.info("core event: {}", event);
SessionState state = SessionState.get(event.getEventType().getValue());
if (state != null) {
logger.info("event updating session state: {}", state);
controller.getCoreClient().updateState(state);
}
} catch (IOException ex) {
logger.error("error getting core event", ex);
}
}
});
socket.on("node", this::handleNodes);
socket.on("event", this::handleEvents);
socket.on("config", this::handleConfigs);
socket.on("link", this::handleLinks);
socket.on(Socket.EVENT_DISCONNECT, args -> {
logger.info("disconnected from web socket");
});
}
private void handleNodes(Object... args) {
for (Object arg : args) {
try {
CoreNode node = JsonUtils.read(arg.toString(), CoreNode.class);
logger.info("core node update: {}", node);
controller.getNetworkGraph().setNodeLocation(node);
} catch (IOException ex) {
logger.error("error getting core node", ex);
}
}
}
private void handleEvents(Object... args) {
for (Object arg : args) {
try {
CoreEvent event = JsonUtils.read(arg.toString(), CoreEvent.class);
logger.info("handling broadcast event: {}", event);
SessionState state = SessionState.get(event.getEventType().getValue());
if (state != null) {
logger.info("event updating session state: {}", state);
controller.getCoreClient().updateState(state);
}
} catch (IOException ex) {
logger.error("error getting core event", ex);
}
}
}
private void handleLinks(Object... args) {
for (Object arg : args) {
try {
CoreLink link = JsonUtils.read(arg.toString(), CoreLink.class);
logger.info("handling broadcast link: {}", link);
MessageFlags flag = MessageFlags.get(link.getMessageType());
if (MessageFlags.DELETE == flag) {
logger.info("delete");
controller.getNetworkGraph().removeWirelessLink(link);
} else if (MessageFlags.ADD == flag) {
link.setLoaded(true);
controller.getNetworkGraph().addLink(link);
}
controller.getNetworkGraph().getGraphViewer().repaint();
} catch (IOException ex) {
logger.error("error handling broadcast link", ex);
}
}
}
private void handleConfigs(Object... args) {
for (Object arg : args) {
logger.info("handling broadcast config: {}", arg);
}
}
public void start() {
logger.info("attempting to connect to web socket!");
socketThread = new Thread(socket::connect);