diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java index 9d99aa7..4facd60 100644 --- a/pitiupi/src/pitiupi/GUI/MainWindow.java +++ b/pitiupi/src/pitiupi/GUI/MainWindow.java @@ -6,6 +6,7 @@ package pitiupi.GUI; import pitiupi.control.ConnectionManager; +import pitiupi.control.GuiManager; import pitiupi.control.PluginManager; import javax.swing.JMenu; @@ -28,18 +29,13 @@ import pitiupi.control.HeartbeatManager; */ public class MainWindow extends javax.swing.JFrame { - private final MenuBar menuBar; - private javax.swing.JScrollPane jScrollPane1; + private MenuBar menuBar; private javax.swing.JLabel status; - private javax.swing.JPanel statusPanel; - private javax.swing.JTabbedPane tabbedPane; - private OnlineUsersPanel onlineUsersPanel; + private final ConnectionManager connectionManager; + private final PluginManager pluginManager; + private final GuiManager guiManager; - private String userName; - - private ConnectionManager connectionManager; - private PluginManager pluginManager; /** * Cria a janela principal da aplicação. @@ -48,74 +44,79 @@ public class MainWindow extends javax.swing.JFrame { * @param port porta utilizada na comunicação multicast. */ public MainWindow(String userName, int port) { - this.userName = userName; + initMenu(); pluginManager = new PluginManager(this); + + connectionManager = new ConnectionManager(this, userName, pluginManager, port); + guiManager = new GuiManager(this); + + initUserPanel(); + initStatusPanel(); + loadPlugins(); - connectionManager = new ConnectionManager(this, pluginManager, port); - - menuBar = new MenuBar(this); - - initComponents(); - } - - private void initComponents() { - this.setJMenuBar(menuBar); - this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - this.setTitle("Share My Sheet"); - - jScrollPane1 = new javax.swing.JScrollPane(); - tabbedPane = new javax.swing.JTabbedPane(); - statusPanel = new javax.swing.JPanel(); - status = new javax.swing.JLabel(); - - jScrollPane1.setViewportView(tabbedPane); - statusPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT)); - updateStatus(); - statusPanel.add(status); - - this.getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); - this.getContentPane().add(statusPanel, java.awt.BorderLayout.PAGE_END); - - this.onlineUsersPanel = new OnlineUsersPanel(); - this.connectionManager.addPeerListener(onlineUsersPanel); - this.getContentPane().add(this.onlineUsersPanel, java.awt.BorderLayout.LINE_END); - this.pack(); this.setSize(new java.awt.Dimension(1024, 768)); } + private void initMenu() { + menuBar = new MenuBar(this); + + this.setJMenuBar(menuBar); + this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + this.setTitle("Share My Sheet"); + + javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); + javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane(); + + jScrollPane1.setViewportView(tabbedPane); + + this.getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); + } + + private void initUserPanel() { + OnlineUsersPanel onlineUsersPanel = new OnlineUsersPanel(); + this.connectionManager.addPeerListener(onlineUsersPanel); + this.getContentPane().add(onlineUsersPanel, java.awt.BorderLayout.LINE_END); + } + + private void initStatusPanel() { + javax.swing.JPanel statusPanel = new javax.swing.JPanel(); + status = new javax.swing.JLabel(); + + statusPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT)); + updateStatus(); + statusPanel.add(status); + + this.getContentPane().add(statusPanel, java.awt.BorderLayout.PAGE_END); + } + public void exit() { this.setVisible(false); this.dispose(); System.exit(0); } - public String getUserName(){ - return this.userName; - } - public ConnectionManager getConnectionManager() { return connectionManager; } public void loadPlugins() { - pluginManager.loadPlugins(); + pluginManager.loadPlugins(connectionManager, guiManager); } - + public void addMenu(JMenu menu) { this.menuBar.addPlugin(menu); } - public void setUserName(String userName) { - this.userName = userName; + connectionManager.setUserName(userName); updateStatus(); } private void updateStatus() { - this.status.setText("Connected on port " + connectionManager + " name " + this.userName); + this.status.setText("Connected on port " + connectionManager + " name " + connectionManager.getUserName()); } } diff --git a/pitiupi/src/pitiupi/control/ConnectionManager.java b/pitiupi/src/pitiupi/control/ConnectionManager.java index 4b744d8..3956b68 100644 --- a/pitiupi/src/pitiupi/control/ConnectionManager.java +++ b/pitiupi/src/pitiupi/control/ConnectionManager.java @@ -12,23 +12,26 @@ import java.net.InetAddress; public class ConnectionManager { private final String pitiupiIdentifier; - private PluginManager pluginManager; + private final PluginManager pluginManager; - private HeartbeatManager heartbeatManager; + private final HeartbeatManager heartbeatManager; private SocketTCP socketTCP; private SocketUDP socketUDP; + private String username; private int port; - public ConnectionManager(MainWindow main, PluginManager pluginManager, int port) { + public ConnectionManager(MainWindow main, String username, PluginManager pluginManager, int port) { this.pluginManager = pluginManager; + + this.username = username; this.port = port; pitiupiIdentifier = "Pitiupi.Alice.2026"; reconnect(); - heartbeatManager = new HeartbeatManager(main, this); + heartbeatManager = new HeartbeatManager(this); heartbeatManager.start(); } @@ -49,23 +52,18 @@ public class ConnectionManager { } } - public boolean sendUdpMulticast(Message message) { + public void sendUdpMulticast(Message message) { try { socketUDP.sendMulticast(message); - return true; - } catch (Exception ex) { - return false; + } catch (Exception _) { + System.err.println("Error sending UDP Multicast"); } } - public void broadcastLocal(Message message) { + public void broadcastLocal(byte[] message) { pluginManager.handlePublicMessage(message); } - public boolean sendLocal(byte[] message, String receiverId) { - return pluginManager.handlePrivateMessage(message, receiverId); - } - public void addPeerListener(PeerListener peerListener) { heartbeatManager.addPeerListener(peerListener); } @@ -101,4 +99,12 @@ public class ConnectionManager { this.socketUDP.start(); this.socketTCP.start(); } + + public String getUserName() { + return this.username; + } + + public void setUserName(String userName) { + this.username = userName; + } } diff --git a/pitiupi/src/pitiupi/control/GuiManager.java b/pitiupi/src/pitiupi/control/GuiManager.java new file mode 100644 index 0000000..210451a --- /dev/null +++ b/pitiupi/src/pitiupi/control/GuiManager.java @@ -0,0 +1,17 @@ +package pitiupi.control; + +import pitiupi.GUI.MainWindow; + +import javax.swing.*; + +public class GuiManager { + private MainWindow mainWindow; + + public GuiManager(MainWindow mainWindow) { + this.mainWindow = mainWindow; + } + + public void addMenu(JMenu menu) { + mainWindow.addMenu(menu); + } +} diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java index bbdf84e..7bc566e 100644 --- a/pitiupi/src/pitiupi/control/HeartbeatManager.java +++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java @@ -28,8 +28,6 @@ public class HeartbeatManager { private static final long HEARTBEAT_INTERVAL_MS = 5000; private static final long PEER_TIMEOUT_MS = 15000; // ~3 batimentos perdidos - - private final MainWindow mainWindow; private final ConnectionManager connectionManager; private final Map peers = new ConcurrentHashMap<>(); private final List listeners = new CopyOnWriteArrayList<>(); @@ -39,11 +37,8 @@ public class HeartbeatManager { /** * Cria um gerenciador de heartbeat associado à janela principal da aplicação. * - * @param mainWindow janela principal utilizada para obter o nome do usuário - * e o socket de comunicação. */ - public HeartbeatManager(MainWindow mainWindow, ConnectionManager connectionManager) { - this.mainWindow = mainWindow; + public HeartbeatManager(ConnectionManager connectionManager) { this.connectionManager = connectionManager; } @@ -66,7 +61,7 @@ public class HeartbeatManager { } private void announce() { - HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName(), instanceId); + HeartbeatMessage msg = new HeartbeatMessage(connectionManager.getUserName(), instanceId); connectionManager.sendUdpMulticast(msg); } diff --git a/pitiupi/src/pitiupi/control/PluginLoader.java b/pitiupi/src/pitiupi/control/PluginLoader.java index 7a40dd9..96915eb 100644 --- a/pitiupi/src/pitiupi/control/PluginLoader.java +++ b/pitiupi/src/pitiupi/control/PluginLoader.java @@ -31,7 +31,7 @@ public class PluginLoader { this.mainWindow = main; } - public void loadPlugins(List plugins, HashSet loadedJars) { + public void loadPlugins(List plugins, HashSet loadedJars, ConnectionManager connectionManager, GuiManager guiManager) { File pluginDir = new File("plugins"); File[] jarFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar")); @@ -59,7 +59,7 @@ public class PluginLoader { for (Plugin plugin : serviceLoader) { System.out.println("Loading: " + plugin.getName()); - plugin.createPlugin(this.mainWindow); + plugin.createPlugin(connectionManager, guiManager); plugins.add(plugin); loadedJars.add(file.getName()); } diff --git a/pitiupi/src/pitiupi/control/PluginManager.java b/pitiupi/src/pitiupi/control/PluginManager.java index 08ea55c..1a11f60 100644 --- a/pitiupi/src/pitiupi/control/PluginManager.java +++ b/pitiupi/src/pitiupi/control/PluginManager.java @@ -1,7 +1,6 @@ package pitiupi.control; import pitiupi.GUI.MainWindow; -import pitiupi.net.Message; import pitiupi.net.tcp.TcpConnection; import pitiupi.plugin.Plugin; import pitiupi.plugin.PrivateConnectionPlugin; @@ -11,7 +10,7 @@ import java.util.HashSet; import java.util.List; public class PluginManager { - private PluginLoader pluginLoader; + private final PluginLoader pluginLoader; private final List plugins; private final HashSet loadedJars; @@ -21,11 +20,11 @@ public class PluginManager { this.loadedJars = new HashSet<>(); } - public void loadPlugins() { - pluginLoader.loadPlugins(plugins, loadedJars); + public void loadPlugins(ConnectionManager connectionManager, GuiManager guiManager) { + pluginLoader.loadPlugins(plugins, loadedJars, connectionManager, guiManager); } - public void handlePublicMessage(Message msg) { + public void handlePublicMessage(byte[] msg) { for (Plugin plugin : plugins) { plugin.receiveMessage(msg); } @@ -38,16 +37,14 @@ public class PluginManager { return null; } - public boolean handlePrivateMessage(byte[] msg, String receiverId) { - Plugin plugin = getPlugin(receiverId); - if (plugin == null) return false; + public void handlePrivateMessage(TcpConnection connection, byte[] msg) { + Plugin plugin = getPlugin(connection.getReceiver()); + if (plugin == null) return; if (plugin instanceof PrivateConnectionPlugin privatePlugin) { - privatePlugin.receiveBytes(msg); - return true; + privatePlugin.receiveBytes(connection, msg); } - return false; } public boolean handleConnection(TcpConnection connection, String receiverId) { diff --git a/pitiupi/src/pitiupi/net/tcp/SocketTCP.java b/pitiupi/src/pitiupi/net/tcp/SocketTCP.java index 8e61292..a08e309 100644 --- a/pitiupi/src/pitiupi/net/tcp/SocketTCP.java +++ b/pitiupi/src/pitiupi/net/tcp/SocketTCP.java @@ -1,10 +1,8 @@ package pitiupi.net.tcp; -import pitiupi.GUI.MainWindow; import pitiupi.control.ConnectionManager; import pitiupi.control.PluginManager; import pitiupi.net.Message; -import pitiupi.plugin.Plugin; import pitiupi.plugin.PrivateConnectionPlugin; import java.io.*; @@ -38,12 +36,13 @@ public class SocketTCP extends Thread { private final ConnectionManager connectionManager; + private final PluginManager pluginManager; + + private final TcpConnectionManager tcpConnectionManager; + private ServerSocket serverSocket; private InetAddress address; - private final ConnectionManager connectionManager; - private final PluginManager pluginManager; - private volatile boolean running = true; /** @@ -303,38 +302,20 @@ public class SocketTCP extends Thread { SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(bytes); - if (sysMessage == null) { - pluginManager.handlePublicMessage(message); - continue; - } - - switch (sysMessage.getType()) { - case CONNECTION_CLOSED, INTERNAL_ERROR -> { - tcpConnectionManager.closeConnection(connection); - return; - } - case MESSAGE_REJECTED -> { - logger.log(Level.SEVERE, "Somehow sent something that was not an Message"); - } - default -> {} - } - } - else { - SysInfoMessage.sendSystemInfo( - connection, - SysInfoType.MESSAGE_REJECTED, - "Public messages must be instances of Message" - ); - } + if (sysMessage == null) { + pluginManager.handlePublicMessage(bytes); + continue; } - catch (ClassNotFoundException ex) { - SysInfoMessage.sendSystemInfo( - connection, - SysInfoType.INTERNAL_ERROR, - "class Message not found." - ); - logger.log(Level.SEVERE, null, ex); - tcpConnectionManager.closeConnection(connection); + + switch (sysMessage.getType()) { + case CONNECTION_CLOSED, INTERNAL_ERROR -> { + tcpConnectionManager.closeConnection(connection); + return; + } + case MESSAGE_REJECTED -> { + logger.log(Level.SEVERE, "Somehow sent something that was not an Message"); + } + default -> {} } } catch (SocketTimeoutException ex) { @@ -367,7 +348,7 @@ public class SocketTCP extends Thread { SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(message); if (sysMessage == null) { - pluginManager.handlePrivateMessage(message, connection.getReceiver()); + pluginManager.handlePrivateMessage(connection, message); continue; } @@ -441,7 +422,6 @@ public class SocketTCP extends Thread { ); } - @Override public void run() { receive(); diff --git a/pitiupi/src/pitiupi/net/udp/SocketUDP.java b/pitiupi/src/pitiupi/net/udp/SocketUDP.java index 638d42d..fbb6708 100644 --- a/pitiupi/src/pitiupi/net/udp/SocketUDP.java +++ b/pitiupi/src/pitiupi/net/udp/SocketUDP.java @@ -40,8 +40,8 @@ public class SocketUDP extends Thread { private InetAddress address; - private ConnectionManager connectionManager; - private PluginManager pluginManager; + private final ConnectionManager connectionManager; + private final PluginManager pluginManager; private volatile boolean running = true; public final static String INET_ADDR = "224.0.0.3"; @@ -159,10 +159,7 @@ public class SocketUDP extends Thread { continue; } - for (Plugin plugin : main.getPlugins()) { - System.out.println(msgPacket.getAddress().toString()); - pluginManager.handlePublicMessage(msgPacket.getData()); - } + pluginManager.handlePublicMessage(msgPacket.getData()); } } diff --git a/pitiupi/src/pitiupi/plugin/Plugin.java b/pitiupi/src/pitiupi/plugin/Plugin.java index 108deb1..321335b 100644 --- a/pitiupi/src/pitiupi/plugin/Plugin.java +++ b/pitiupi/src/pitiupi/plugin/Plugin.java @@ -5,6 +5,8 @@ package pitiupi.plugin; import pitiupi.GUI.MainWindow; +import pitiupi.control.ConnectionManager; +import pitiupi.control.GuiManager; import pitiupi.net.Message; import pitiupi.net.tcp.TcpConnection; @@ -30,7 +32,7 @@ public interface Plugin { * * @param window janela principal da aplicação. */ - public void createPlugin(MainWindow window); + public void createPlugin(ConnectionManager connectionManager, GuiManager guiManager); /** * Retorna uma mensagem utilizada pelo plugin.