package org.peerbox.presenter; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.util.Enumeration; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.control.TextField; import javafx.stage.Window; import org.peerbox.app.manager.node.INodeManager; import org.peerbox.utils.DialogUtils; import org.peerbox.view.ViewNames; import org.peerbox.view.controls.ErrorLabel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; public class CreateNetworkController implements Initializable { private static final Logger logger = LoggerFactory.getLogger(CreateNetworkController.class); private INodeManager nodeManager; private NavigationService fNavigationService; @FXML private Button btnCreate; @FXML private TextField txtIPAddress; @FXML private ErrorLabel lblError; @Inject public CreateNetworkController(NavigationService navigationService, INodeManager nodeManager) { this.fNavigationService = navigationService; this.nodeManager = nodeManager; } public void initialize(URL arg0, ResourceBundle arg1) { String allIps = getAllIpAddresses(); Platform.runLater(() -> { if (allIps != null) { txtIPAddress.setText(allIps); } }); } private String getAllIpAddresses() { StringBuilder sb = new StringBuilder(); try { // iterate through interface list and retrieve their addresses. Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); if (interfaces != null) { while (interfaces.hasMoreElements()) { NetworkInterface netInt = interfaces.nextElement(); Enumeration<InetAddress> addresses = netInt.getInetAddresses(); if (addresses != null) { while (addresses.hasMoreElements()) { InetAddress inetAddr = addresses.nextElement(); // only consider IPv4 at the moment if (inetAddr instanceof Inet4Address) { String ip = inetAddr.getHostAddress(); sb.append(ip).append(", "); } } } } } } catch (SocketException e) { setError("Could not retrieving network interface list."); } sb.delete(sb.lastIndexOf(","), sb.length()); return sb.toString(); } @FXML public void navigateBackAction(ActionEvent event) { boolean goBack = true; clearError(); if (nodeManager.isConnected()) { goBack = showConfirmDeleteNetworkDialog(); } if (goBack) { nodeManager.leaveNetwork(); btnCreate.setText("Create"); logger.debug("Navigate back."); fNavigationService.navigateBack(); } } private boolean showConfirmDeleteNetworkDialog() { boolean yes = false; Window owner = txtIPAddress.getScene().getWindow(); Alert dlg = DialogUtils.createAlert(AlertType.CONFIRMATION); dlg.initOwner(owner); dlg.setTitle("Delete Network"); dlg.setHeaderText("Delete the network?"); dlg.setContentText("If you go back, your peer will be shut down and your network deleted. Continue?"); dlg.showAndWait(); yes = dlg.getResult() == ButtonType.OK; return yes; } @FXML public void createNetworkAction(ActionEvent event) { clearError(); if (!nodeManager.isConnected()) { if (nodeManager.createNetwork()) { btnCreate.setText("Continue"); logger.debug("Network created (Host address: {})", txtIPAddress.getText()); } else { setError("Could not create network."); logger.error("Could not create network (createNode returned false)."); } } fNavigationService.navigate(ViewNames.REGISTER_VIEW); } private void setError(String error) { lblError.setText(error); } private void clearError() { lblError.setText(""); } }