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
+107 -112

No files matched your search

+48 -47
View File
@@ -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());
}
}
@@ -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;
}
}
@@ -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 PEER_TIMEOUT_MS = 15000; // ~3 batimentos perdidos
private final MainWindow mainWindow;
private final ConnectionManager connectionManager;
private final Map<String, PeerInfo> peers = new ConcurrentHashMap<>();
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.
*
* @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);
}
@@ -31,7 +31,7 @@ public class PluginLoader {
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[] 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());
}
+8 -11
View File
@@ -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<Plugin> plugins;
private final HashSet<String> 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) {
+6 -26
View File
@@ -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;
/**
@@ -304,7 +303,7 @@ public class SocketTCP extends Thread {
SysInfoMessage sysMessage = SysInfoMessage.parseSystemInfo(bytes);
if (sysMessage == null) {
pluginManager.handlePublicMessage(message);
pluginManager.handlePublicMessage(bytes);
continue;
}
@@ -319,24 +318,6 @@ public class SocketTCP extends Thread {
default -> {}
}
}
else {
SysInfoMessage.sendSystemInfo(
connection,
SysInfoType.MESSAGE_REJECTED,
"Public messages must be instances of Message"
);
}
}
catch (ClassNotFoundException ex) {
SysInfoMessage.sendSystemInfo(
connection,
SysInfoType.INTERNAL_ERROR,
"class Message not found."
);
logger.log(Level.SEVERE, null, ex);
tcpConnectionManager.closeConnection(connection);
}
}
catch (SocketTimeoutException ex) {
if (connection.hasTimedOut()) {
tcpConnectionManager.closeConnection(connection, "Connection timeout");
@@ -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();
+2 -5
View File
@@ -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,12 +159,9 @@ public class SocketUDP extends Thread {
continue;
}
for (Plugin plugin : main.getPlugins()) {
System.out.println(msgPacket.getAddress().toString());
pluginManager.handlePublicMessage(msgPacket.getData());
}
}
}
/**
* Tenta identificar os dados recebidos como uma mensagem de heartbeat.
+3 -1
View File
@@ -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.