WIP bugfix

This commit is contained in:
GustavoHMDS committed 2026-09-29 03:04:56 -03:00
1 parent a86f4dbf82
commit cac549f1ee
9 files changed
+121 -126

No files matched your search

+49 -48
View File
@@ -6,6 +6,7 @@
package pitiupi.GUI; package pitiupi.GUI;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager;
import pitiupi.control.PluginManager; import pitiupi.control.PluginManager;
import javax.swing.JMenu; import javax.swing.JMenu;
@@ -28,18 +29,13 @@ import pitiupi.control.HeartbeatManager;
*/ */
public class MainWindow extends javax.swing.JFrame { public class MainWindow extends javax.swing.JFrame {
private final MenuBar menuBar; private MenuBar menuBar;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel status; 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. * 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. * @param port porta utilizada na comunicação multicast.
*/ */
public MainWindow(String userName, int port) { public MainWindow(String userName, int port) {
this.userName = userName; initMenu();
pluginManager = new PluginManager(this); pluginManager = new PluginManager(this);
connectionManager = new ConnectionManager(this, userName, pluginManager, port);
guiManager = new GuiManager(this);
initUserPanel();
initStatusPanel();
loadPlugins(); 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.pack();
this.setSize(new java.awt.Dimension(1024, 768)); 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() { public void exit() {
this.setVisible(false); this.setVisible(false);
this.dispose(); this.dispose();
System.exit(0); System.exit(0);
} }
public String getUserName(){
return this.userName;
}
public ConnectionManager getConnectionManager() { public ConnectionManager getConnectionManager() {
return connectionManager; return connectionManager;
} }
public void loadPlugins() { public void loadPlugins() {
pluginManager.loadPlugins(); pluginManager.loadPlugins(connectionManager, guiManager);
} }
public void addMenu(JMenu menu) { public void addMenu(JMenu menu) {
this.menuBar.addPlugin(menu); this.menuBar.addPlugin(menu);
} }
public void setUserName(String userName) { public void setUserName(String userName) {
this.userName = userName; connectionManager.setUserName(userName);
updateStatus(); updateStatus();
} }
private void updateStatus() { private void updateStatus() {
this.status.setText("Connected on port " + connectionManager + " name " + this.userName); this.status.setText("Connected on port " + connectionManager + " name " + connectionManager.getUserName());
} }
} }
@@ -12,23 +12,26 @@ import java.net.InetAddress;
public class ConnectionManager { public class ConnectionManager {
private final String pitiupiIdentifier; private final String pitiupiIdentifier;
private PluginManager pluginManager; private final PluginManager pluginManager;
private HeartbeatManager heartbeatManager; private final HeartbeatManager heartbeatManager;
private SocketTCP socketTCP; private SocketTCP socketTCP;
private SocketUDP socketUDP; private SocketUDP socketUDP;
private String username;
private int port; 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.pluginManager = pluginManager;
this.username = username;
this.port = port; this.port = port;
pitiupiIdentifier = "Pitiupi.Alice.2026"; pitiupiIdentifier = "Pitiupi.Alice.2026";
reconnect(); reconnect();
heartbeatManager = new HeartbeatManager(main, this); heartbeatManager = new HeartbeatManager(this);
heartbeatManager.start(); heartbeatManager.start();
} }
@@ -49,23 +52,18 @@ public class ConnectionManager {
} }
} }
public boolean sendUdpMulticast(Message message) { public void sendUdpMulticast(Message message) {
try { try {
socketUDP.sendMulticast(message); socketUDP.sendMulticast(message);
return true; } catch (Exception _) {
} catch (Exception ex) { System.err.println("Error sending UDP Multicast");
return false;
} }
} }
public void broadcastLocal(Message message) { public void broadcastLocal(byte[] message) {
pluginManager.handlePublicMessage(message); pluginManager.handlePublicMessage(message);
} }
public boolean sendLocal(byte[] message, String receiverId) {
return pluginManager.handlePrivateMessage(message, receiverId);
}
public void addPeerListener(PeerListener peerListener) { public void addPeerListener(PeerListener peerListener) {
heartbeatManager.addPeerListener(peerListener); heartbeatManager.addPeerListener(peerListener);
} }
@@ -101,4 +99,12 @@ public class ConnectionManager {
this.socketUDP.start(); this.socketUDP.start();
this.socketTCP.start(); this.socketTCP.start();
} }
public String getUserName() {
return this.username;
}
public void setUserName(String userName) {
this.username = userName;
}
} }
@@ -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);
}
}
@@ -28,8 +28,6 @@ public class HeartbeatManager {
private static final long HEARTBEAT_INTERVAL_MS = 5000; private static final long HEARTBEAT_INTERVAL_MS = 5000;
private static final long PEER_TIMEOUT_MS = 15000; // ~3 batimentos perdidos private static final long PEER_TIMEOUT_MS = 15000; // ~3 batimentos perdidos
private final MainWindow mainWindow;
private final ConnectionManager connectionManager; private final ConnectionManager connectionManager;
private final Map<String, PeerInfo> peers = new ConcurrentHashMap<>(); private final Map<String, PeerInfo> peers = new ConcurrentHashMap<>();
private final List<PeerListener> listeners = new CopyOnWriteArrayList<>(); private final List<PeerListener> listeners = new CopyOnWriteArrayList<>();
@@ -39,11 +37,8 @@ public class HeartbeatManager {
/** /**
* Cria um gerenciador de heartbeat associado à janela principal da aplicação. * 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) { public HeartbeatManager(ConnectionManager connectionManager) {
this.mainWindow = mainWindow;
this.connectionManager = connectionManager; this.connectionManager = connectionManager;
} }
@@ -66,7 +61,7 @@ public class HeartbeatManager {
} }
private void announce() { private void announce() {
HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName(), instanceId); HeartbeatMessage msg = new HeartbeatMessage(connectionManager.getUserName(), instanceId);
connectionManager.sendUdpMulticast(msg); connectionManager.sendUdpMulticast(msg);
} }
@@ -31,7 +31,7 @@ public class PluginLoader {
this.mainWindow = main; this.mainWindow = main;
} }
public void loadPlugins(List<Plugin> plugins, HashSet<String> loadedJars) { public void loadPlugins(List<Plugin> plugins, HashSet<String> loadedJars, ConnectionManager connectionManager, GuiManager guiManager) {
File pluginDir = new File("plugins"); File pluginDir = new File("plugins");
File[] jarFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar")); File[] jarFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar"));
@@ -59,7 +59,7 @@ public class PluginLoader {
for (Plugin plugin : serviceLoader) { for (Plugin plugin : serviceLoader) {
System.out.println("Loading: " + plugin.getName()); System.out.println("Loading: " + plugin.getName());
plugin.createPlugin(this.mainWindow); plugin.createPlugin(connectionManager, guiManager);
plugins.add(plugin); plugins.add(plugin);
loadedJars.add(file.getName()); loadedJars.add(file.getName());
} }
+8 -11
View File
@@ -1,7 +1,6 @@
package pitiupi.control; package pitiupi.control;
import pitiupi.GUI.MainWindow; import pitiupi.GUI.MainWindow;
import pitiupi.net.Message;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
import pitiupi.plugin.Plugin; import pitiupi.plugin.Plugin;
import pitiupi.plugin.PrivateConnectionPlugin; import pitiupi.plugin.PrivateConnectionPlugin;
@@ -11,7 +10,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
public class PluginManager { public class PluginManager {
private PluginLoader pluginLoader; private final PluginLoader pluginLoader;
private final List<Plugin> plugins; private final List<Plugin> plugins;
private final HashSet<String> loadedJars; private final HashSet<String> loadedJars;
@@ -21,11 +20,11 @@ public class PluginManager {
this.loadedJars = new HashSet<>(); this.loadedJars = new HashSet<>();
} }
public void loadPlugins() { public void loadPlugins(ConnectionManager connectionManager, GuiManager guiManager) {
pluginLoader.loadPlugins(plugins, loadedJars); pluginLoader.loadPlugins(plugins, loadedJars, connectionManager, guiManager);
} }
public void handlePublicMessage(Message msg) { public void handlePublicMessage(byte[] msg) {
for (Plugin plugin : plugins) { for (Plugin plugin : plugins) {
plugin.receiveMessage(msg); plugin.receiveMessage(msg);
} }
@@ -38,16 +37,14 @@ public class PluginManager {
return null; return null;
} }
public boolean handlePrivateMessage(byte[] msg, String receiverId) { public void handlePrivateMessage(TcpConnection connection, byte[] msg) {
Plugin plugin = getPlugin(receiverId); Plugin plugin = getPlugin(connection.getReceiver());
if (plugin == null) return false; if (plugin == null) return;
if (plugin instanceof PrivateConnectionPlugin privatePlugin) { if (plugin instanceof PrivateConnectionPlugin privatePlugin) {
privatePlugin.receiveBytes(msg); privatePlugin.receiveBytes(connection, msg);
return true;
} }
return false;
} }
public boolean handleConnection(TcpConnection connection, String receiverId) { public boolean handleConnection(TcpConnection connection, String receiverId) {
+18 -38
View File
@@ -1,10 +1,8 @@
package pitiupi.net.tcp; package pitiupi.net.tcp;
import pitiupi.GUI.MainWindow;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.PluginManager; import pitiupi.control.PluginManager;
import pitiupi.net.Message; import pitiupi.net.Message;
import pitiupi.plugin.Plugin;
import pitiupi.plugin.PrivateConnectionPlugin; import pitiupi.plugin.PrivateConnectionPlugin;
import java.io.*; import java.io.*;
@@ -38,12 +36,13 @@ public class SocketTCP extends Thread {
private final ConnectionManager connectionManager; private final ConnectionManager connectionManager;
private final PluginManager pluginManager;
private final TcpConnectionManager tcpConnectionManager;
private ServerSocket serverSocket; private ServerSocket serverSocket;
private InetAddress address; private InetAddress address;
private final ConnectionManager connectionManager;
private final PluginManager pluginManager;
private volatile boolean running = true; private volatile boolean running = true;
/** /**
@@ -303,38 +302,20 @@ public class SocketTCP extends Thread {
SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(bytes); SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(bytes);
if (sysMessage == null) { if (sysMessage == null) {
pluginManager.handlePublicMessage(message); pluginManager.handlePublicMessage(bytes);
continue; 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"
);
}
} }
catch (ClassNotFoundException ex) {
SysInfoMessage.sendSystemInfo( switch (sysMessage.getType()) {
connection, case CONNECTION_CLOSED, INTERNAL_ERROR -> {
SysInfoType.INTERNAL_ERROR, tcpConnectionManager.closeConnection(connection);
"class Message not found." return;
); }
logger.log(Level.SEVERE, null, ex); case MESSAGE_REJECTED -> {
tcpConnectionManager.closeConnection(connection); logger.log(Level.SEVERE, "Somehow sent something that was not an Message");
}
default -> {}
} }
} }
catch (SocketTimeoutException ex) { catch (SocketTimeoutException ex) {
@@ -367,7 +348,7 @@ public class SocketTCP extends Thread {
SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(message); SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(message);
if (sysMessage == null) { if (sysMessage == null) {
pluginManager.handlePrivateMessage(message, connection.getReceiver()); pluginManager.handlePrivateMessage(connection, message);
continue; continue;
} }
@@ -441,7 +422,6 @@ public class SocketTCP extends Thread {
); );
} }
@Override @Override
public void run() { public void run() {
receive(); receive();
+3 -6
View File
@@ -40,8 +40,8 @@ public class SocketUDP extends Thread {
private InetAddress address; private InetAddress address;
private ConnectionManager connectionManager; private final ConnectionManager connectionManager;
private PluginManager pluginManager; private final PluginManager pluginManager;
private volatile boolean running = true; private volatile boolean running = true;
public final static String INET_ADDR = "224.0.0.3"; public final static String INET_ADDR = "224.0.0.3";
@@ -159,10 +159,7 @@ public class SocketUDP extends Thread {
continue; continue;
} }
for (Plugin plugin : main.getPlugins()) { pluginManager.handlePublicMessage(msgPacket.getData());
System.out.println(msgPacket.getAddress().toString());
pluginManager.handlePublicMessage(msgPacket.getData());
}
} }
} }
+3 -1
View File
@@ -5,6 +5,8 @@
package pitiupi.plugin; package pitiupi.plugin;
import pitiupi.GUI.MainWindow; import pitiupi.GUI.MainWindow;
import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager;
import pitiupi.net.Message; import pitiupi.net.Message;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
@@ -30,7 +32,7 @@ public interface Plugin {
* *
* @param window janela principal da aplicação. * @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. * Retorna uma mensagem utilizada pelo plugin.