Novos menus e envio de mensagens

This commit is contained in:
GustavoHMDS committed 2026-10-02 20:29:35 -03:00
1 parent 6538dac8af
commit 7c9e61ce0f
55 files changed
+683 -368

No files matched your search

+3 -3
View File
@@ -1,6 +1,6 @@
#Tue, 29 Sep 2026 11:11:06 -0300 #Fri, 02 Oct 2026 20:11:21 -0300
C\:\\Users\\Gustavo\\OneDrive\\Documentos\\Faculdade\\2026_2\\Monitoria\\pitiupi\\pitiupi.chat= C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi.chat=
C\:\\Users\\Gustavo\\OneDrive\\Documentos\\Faculdade\\2026_2\\Monitoria\\pitiupi\\pitiupi= C\:\\Users\\extre\\OneDrive\\Documentos\\Faculdade\\2026_02\\Monitoria\\Pitiupi\\pitiupi=
+15 -14
View File
@@ -4,28 +4,29 @@
*/ */
package pitiupi.chat.GUI; package pitiupi.chat.GUI;
import java.awt.event.ActionEvent; import pitiupi.models.Menus.MulticastMenus.MulticastMenu;
import javax.swing.JMenu; import pitiupi.models.Menus.MulticastMenus.MulticastSubMenu;
import java.util.List;
/** /**
* *
* @author flavio * @author flavio
*/ */
public class ChatMenu extends JMenu { public class ChatMenu extends MulticastSubMenu {
ChatMulticastMenu chatMulticastMenu;
private final ChatWindow chatWindow;
private javax.swing.JMenuItem menuItem;
public ChatMenu(ChatWindow chatWindow) { public ChatMenu(ChatWindow chatWindow) {
this.chatWindow = chatWindow; this.chatMulticastMenu = new ChatMulticastMenu(chatWindow);
this.setText("Chat");
menuItem = new javax.swing.JMenuItem();
menuItem.setText("Show Chat Window");
menuItem.addActionListener(this::chatMenuActionPerformed);
this.add(menuItem);
} }
private void chatMenuActionPerformed(ActionEvent ae) { @Override
this.chatWindow.setVisible(true); public String getText() {
return "Chat";
}
@Override
public List<MulticastMenu> getMenus() {
return List.of(chatMulticastMenu);
} }
} }
@@ -0,0 +1,21 @@
package pitiupi.chat.GUI;
import pitiupi.models.Menus.MulticastMenus.MulticastActionMenu;;
public class ChatMulticastMenu extends MulticastActionMenu {
ChatWindow chatWindow;
public ChatMulticastMenu(ChatWindow chatWindow) {
this.chatWindow = chatWindow;
}
@Override
public String getText() {
return "Show Chat Window";
}
@Override
public void onClick() {
chatWindow.setVisible(true);
}
}
@@ -5,30 +5,28 @@
*/ */
package pitiupi.chat.GUI; package pitiupi.chat.GUI;
import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import pitiupi.chat.net.ChatMessage; import pitiupi.chat.net.ChatMessage;
import pitiupi.GUI.MainWindow;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.net.Message; import pitiupi.models.Messages.Message;
import javax.swing.*;
/** /**
* *
* @author flavio * @author flavio
*/ */
public class ChatWindow extends javax.swing.JDialog { public class ChatWindow extends JDialog {
private javax.swing.JButton jButton1; private JButton jButton1;
private javax.swing.JEditorPane jEditorPane1; private JEditorPane jEditorPane1;
private javax.swing.JPanel jPanel1; private JPanel jPanel1;
private javax.swing.JPanel jPanel2; private JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1; private JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2; private JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1; private JSplitPane jSplitPane1;
private javax.swing.JTextArea jTextArea1; private JTextArea jTextArea1;
private final ConnectionManager connectionManager; private final ConnectionManager connectionManager;
@@ -44,23 +42,23 @@ public class ChatWindow extends javax.swing.JDialog {
*/ */
private void initComponents() { private void initComponents() {
this.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); this.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
this.setTitle("Chat Window"); this.setTitle("Chat Window");
this.setBounds(new java.awt.Rectangle(0, 0, 800, 600)); this.setBounds(new java.awt.Rectangle(0, 0, 800, 600));
this.getContentPane().setLayout(new java.awt.BorderLayout(5, 5)); this.getContentPane().setLayout(new java.awt.BorderLayout(5, 5));
this.setPreferredSize(new java.awt.Dimension(800, 600)); this.setPreferredSize(new java.awt.Dimension(800, 600));
jSplitPane1 = new javax.swing.JSplitPane(); jSplitPane1 = new JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane(); jScrollPane1 = new JScrollPane();
jEditorPane1 = new javax.swing.JEditorPane(); jEditorPane1 = new JEditorPane();
jPanel1 = new javax.swing.JPanel(); jPanel1 = new JPanel();
jScrollPane2 = new javax.swing.JScrollPane(); jScrollPane2 = new JScrollPane();
jTextArea1 = new javax.swing.JTextArea(); jTextArea1 = new JTextArea();
jPanel2 = new javax.swing.JPanel(); jPanel2 = new JPanel();
jButton1 = new javax.swing.JButton(); jButton1 = new JButton();
jSplitPane1.setDividerLocation(500); jSplitPane1.setDividerLocation(500);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
jEditorPane1.setContentType("text/html"); jEditorPane1.setContentType("text/html");
jPanel1.setLayout(new java.awt.BorderLayout()); jPanel1.setLayout(new java.awt.BorderLayout());
jTextArea1.setColumns(20); jTextArea1.setColumns(20);
@@ -5,14 +5,14 @@
*/ */
package pitiupi.chat.net; package pitiupi.chat.net;
import pitiupi.net.Message;
import pitiupi.net.Message; import pitiupi.models.Messages.Message;
/** /**
* *
* @author flavio * @author flavio
*/ */
public class ChatMessage extends Message{ public class ChatMessage extends Message {
private String text; private String text;
private String name; private String name;
@@ -4,46 +4,43 @@
*/ */
package pitiupi.chat.plugin; package pitiupi.chat.plugin;
import java.io.ByteArrayInputStream; import java.util.ArrayList;
import java.io.IOException; import java.util.Collection;
import java.io.ObjectInputStream; import java.util.List;
import pitiupi.GUI.MainWindow;
import pitiupi.chat.GUI.ChatMenu; import pitiupi.chat.GUI.ChatMenu;
import pitiupi.chat.GUI.ChatWindow; import pitiupi.chat.GUI.ChatWindow;
import pitiupi.chat.net.ChatMessage; import pitiupi.chat.net.ChatMessage;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager; import pitiupi.control.GuiManager;
import pitiupi.net.Message; import pitiupi.models.Menus.MenuCategory;
import pitiupi.plugin.Plugin; import pitiupi.models.Messages.Message;
import pitiupi.models.Plugin;
/** /**
* *
* @author flavio * @author flavio
*/ */
public class ChatPlugin implements Plugin { public class ChatPlugin extends Plugin {
private ChatWindow chatWindow; private ChatWindow chatWindow;
public ChatPlugin() {
}
@Override @Override
public void createPlugin(ConnectionManager connectionManager, GuiManager guiManager) { public void createPlugin(ConnectionManager connectionManager, GuiManager guiManager) {
this.chatWindow = new ChatWindow(connectionManager); this.chatWindow = new ChatWindow(connectionManager);
guiManager.addMenu(new ChatMenu(chatWindow)); guiManager.createMenu(MenuCategory.Social, new ChatMenu(chatWindow));
} }
@Override @Override
public void receiveMessage(byte[] message) { public List<Class<? extends Message>> getMessages() {
ByteArrayInputStream bis = new ByteArrayInputStream(message); return List.of(ChatMessage.class);
ObjectInputStream ois; }
try {
ois = new ObjectInputStream(bis);
if (ois.readObject() instanceof ChatMessage msg) { @Override
this.chatWindow.receiveChatMessage(msg); public void receiveMessage(Message message) {
} if (message instanceof ChatMessage msg) {
} catch (IOException | ClassNotFoundException ex) { this.chatWindow.receiveChatMessage(msg);
System.out.println(ex.toString());
} }
} }
@@ -67,8 +64,5 @@ public class ChatPlugin implements Plugin {
return "Pitiupi.Chat.Example"; return "Pitiupi.Chat.Example";
} }
@Override
public Message getMessage() {
return new ChatMessage();
}
} }
+7 -48
View File
@@ -1,11 +1,13 @@
package GUI; package GUI;
import pitiupi.models.Menus.MenuCategory;
import pitiupi.models.Menus.MulticastMenus.MulticastSubMenu;
import plugin.MultiProtocolChat; import plugin.MultiProtocolChat;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
public class ChatMenu extends JMenu { public class ChatMenu extends MulticastSubMenu {
private final MultiProtocolChat multiProtocolChat; private final MultiProtocolChat multiProtocolChat;
public ChatMenu(MultiProtocolChat multiProtocolChat) { public ChatMenu(MultiProtocolChat multiProtocolChat) {
@@ -28,54 +30,11 @@ public class ChatMenu extends JMenu {
} }
private void showPrivateChatDialog() { private void showPrivateChatDialog() {
JDialog dialog = new JDialog(
SwingUtilities.getWindowAncestor(this),
"Novo chat privado",
Dialog.ModalityType.APPLICATION_MODAL
);
JTextField ipField = new JTextField(); }
JButton startButton = new JButton("Iniciar"); @Override
JButton cancelButton = new JButton("Cancelar"); public String getText() {
return "MP-Chat";
JPanel contentPanel = new JPanel(new BorderLayout(10, 10));
contentPanel.setBorder(
BorderFactory.createEmptyBorder(10, 10, 10, 10)
);
JPanel ipPanel = new JPanel(new BorderLayout(5, 5));
ipPanel.add(new JLabel("IP:"), BorderLayout.WEST);
ipPanel.add(ipField, BorderLayout.CENTER);
JPanel buttonsPanel = new JPanel(
new FlowLayout(FlowLayout.RIGHT)
);
buttonsPanel.add(cancelButton);
buttonsPanel.add(startButton);
JLabel errorLabel = new JLabel("Não foi possível estabelecer a conexão.");
errorLabel.setForeground(Color.RED);
errorLabel.setVisible(false);
contentPanel.add(errorLabel, BorderLayout.NORTH);
contentPanel.add(ipPanel, BorderLayout.CENTER);
contentPanel.add(buttonsPanel, BorderLayout.SOUTH);
cancelButton.addActionListener(e -> dialog.dispose());
startButton.addActionListener(e -> {
String ip = ipField.getText();
if (multiProtocolChat.openConnection(ip)) dialog.dispose();
else errorLabel.setVisible(true);
});
dialog.setContentPane(contentPanel);
dialog.pack();
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(this));
dialog.setVisible(true);
} }
} }
@@ -0,0 +1,38 @@
package GUI;
import control.ChatController;
import pitiupi.models.Menus.UnicastMenus.UnicastActionMenu;
import pitiupi.models.User;
import plugin.MultiProtocolChat;
import javax.swing.*;
import java.awt.*;
import java.net.InetAddress;
public class PrivateChatMenu extends UnicastActionMenu {
PrivateChatWindow privateChatWindow;
private final MultiProtocolChat multiProtocolChat;
private final ChatController chatController;
public PrivateChatMenu(PrivateChatWindow PrivateChatWindow, MultiProtocolChat multiProtocolChat, ChatController chatController) {
this.privateChatWindow = PrivateChatWindow;
this.multiProtocolChat = multiProtocolChat;
this.chatController = chatController;
}
@Override
public void onClick(User user) {
if (multiProtocolChat.openConnection(user.getAddress())
else errorLabel.setVisible(true);
dialog.setContentPane(contentPanel);
dialog.pack();
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(privateChatWindow));
dialog.setVisible(true);
}
@Override
public String getText() {
return "start Private Chat";
}
}
@@ -0,0 +1,21 @@
package GUI;
import pitiupi.models.Menus.MulticastMenus.MulticastActionMenu;
public class PublicChatMenu extends MulticastActionMenu {
PublicChatWindow publicChatWindow;
PublicChatMenu(PublicChatWindow publicChatWindow) {
this.publicChatWindow = publicChatWindow;
}
@Override
public void onClick() {
publicChatWindow.setVisible(true);
}
@Override
public String getText() {
return "";
}
}
+14 -2
View File
@@ -6,18 +6,21 @@ import GUI.PrivateChatWindow;
import GUI.PublicChatWindow; import GUI.PublicChatWindow;
import net.MpChatMessage; import net.MpChatMessage;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.PeerListener;
import pitiupi.models.User;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
import javax.swing.*; import javax.swing.*;
import java.net.InetAddress;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
public class ChatController { public class ChatController implements PeerListener {
ConnectionManager connectionManager; ConnectionManager connectionManager;
ChatMenu chatMenu; ChatMenu chatMenu;
PublicChatWindow publicChatWindow; PublicChatWindow publicChatWindow;
private final HashMap<TcpConnection, JMenuItem> chatMenus;
private final HashMap<TcpConnection, ChatWindow> chatWindows; private final HashMap<TcpConnection, ChatWindow> chatWindows;
public ChatController(ConnectionManager connectionManager, ChatMenu chatMenu) { public ChatController(ConnectionManager connectionManager, ChatMenu chatMenu) {
@@ -58,4 +61,13 @@ public class ChatController {
public void receivePrivate(TcpConnection tcpConnection, MpChatMessage message) { public void receivePrivate(TcpConnection tcpConnection, MpChatMessage message) {
chatWindows.get(tcpConnection).receiveMessage(message); chatWindows.get(tcpConnection).receiveMessage(message);
} }
public void openChatWindow(InetAddress address) {
}
@Override
public void onPeersChanged(List<User> list) {
}
} }
+1 -1
View File
@@ -1,6 +1,6 @@
package net; package net;
import pitiupi.net.Message; import pitiupi.models.Messages.Message;
public class MpChatMessage extends Message { public class MpChatMessage extends Message {
private String nome; private String nome;
@@ -5,9 +5,9 @@ import control.ChatController;
import net.MpChatMessage; import net.MpChatMessage;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager; import pitiupi.control.GuiManager;
import pitiupi.net.Message; import pitiupi.models.Messages.Message;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
import pitiupi.plugin.PrivateConnectionPlugin; import pitiupi.models.Plugin;
import javax.swing.*; import javax.swing.*;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -15,7 +15,7 @@ import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.net.InetAddress; import java.net.InetAddress;
public class MultiProtocolChat implements PrivateConnectionPlugin{ public class MultiProtocolChat extends Plugin {
ChatController chatController; ChatController chatController;
ConnectionManager connectionManager; ConnectionManager connectionManager;
GuiManager guiManager; GuiManager guiManager;
@@ -47,7 +47,7 @@ public class MultiProtocolChat implements PrivateConnectionPlugin{
ChatMenu chatMenu = new ChatMenu(this); ChatMenu chatMenu = new ChatMenu(this);
chatController = new ChatController(connectionManager, chatMenu); chatController = new ChatController(connectionManager, chatMenu);
guiManager.addMenu(chatMenu); guiManager.addMulticastMenu(chatMenu);
} }
@Override @Override
@@ -61,23 +61,25 @@ public class MultiProtocolChat implements PrivateConnectionPlugin{
chatController.receivePublic(mpChatMessage); chatController.receivePublic(mpChatMessage);
} }
@Override @Override
public void receivePrivateConnection(TcpConnection tcpConnection) { public boolean receivePrivateConnection(TcpConnection connection) {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
chatController.addChatWindow(tcpConnection); chatController.addChatWindow(connection);
}); });
return true;
} }
@Override @Override
public void receiveBytes(TcpConnection connection, byte[] bytes) { public boolean receiveBytes(TcpConnection connection, byte[] bytes) {
MpChatMessage mpChatMessage = parseMessage(bytes); MpChatMessage mpChatMessage = parseMessage(bytes);
chatController.receivePrivate(connection, mpChatMessage); chatController.receivePrivate(connection, mpChatMessage);
return true;
} }
@Override @Override
public void onSocketClosed(TcpConnection tcpConnection) { public boolean onSocketClosed(TcpConnection connection) {
chatController.removeChatWindow(tcpConnection); chatController.removeChatWindow(connection);
return true;
} }
public boolean openConnection(String ip) { public boolean openConnection(String ip) {
-11
View File
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
+2 -2
View File
@@ -468,10 +468,10 @@ MeusPlugins
| |
+---services +---services
| |
+---pitiupi.model.Plugin +---pitiupi.models.Plugin
``` ```
O arquivo `pitiupi.model.Plugin` deve conter o nome completo das classes que O arquivo `pitiupi.models.Plugin` deve conter o nome completo das classes que
implementam a interface Plugin: implementam a interface Plugin:
``` ```
+14 -17
View File
@@ -7,11 +7,11 @@ package pitiupi.GUI;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager; import pitiupi.control.GuiManager;
import pitiupi.control.PluginManager; import pitiupi.control.plugins.PluginManager;
import javax.swing.JMenu; import javax.swing.*;
import pitiupi.control.HeartbeatManager; import java.awt.*;
/** /**
* Janela principal da aplicação. * Janela principal da aplicação.
@@ -27,16 +27,16 @@ import pitiupi.control.HeartbeatManager;
* @author tony * @author tony
* @author Gustavo * @author Gustavo
*/ */
public class MainWindow extends javax.swing.JFrame { public class MainWindow extends JFrame {
private MenuBar menuBar; private MenuBar menuBar;
private javax.swing.JLabel status; private JLabel status;
OnlineUsersPanel onlineUsersPanel;
private final ConnectionManager connectionManager; private final ConnectionManager connectionManager;
private final PluginManager pluginManager; private final PluginManager pluginManager;
private final GuiManager guiManager; private final GuiManager guiManager;
/** /**
* Cria a janela principal da aplicação. * Cria a janela principal da aplicação.
* *
@@ -47,13 +47,13 @@ public class MainWindow extends javax.swing.JFrame {
initMenu(); initMenu();
pluginManager = new PluginManager(); pluginManager = new PluginManager();
connectionManager = new ConnectionManager(this, userName, pluginManager, port); connectionManager = new ConnectionManager(this, userName, pluginManager, port);
guiManager = new GuiManager(this);
initUserPanel(); initUserPanel();
initStatusPanel(); initStatusPanel();
guiManager = new GuiManager(this, menuBar, onlineUsersPanel);
loadPlugins(); loadPlugins();
this.pack(); this.pack();
@@ -66,7 +66,7 @@ public class MainWindow extends javax.swing.JFrame {
this.setJMenuBar(menuBar); this.setJMenuBar(menuBar);
this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
this.setTitle("Share My Sheet"); this.setTitle("Pitiupi");
javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane(); javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane();
@@ -77,20 +77,20 @@ public class MainWindow extends javax.swing.JFrame {
} }
private void initUserPanel() { private void initUserPanel() {
OnlineUsersPanel onlineUsersPanel = new OnlineUsersPanel(); onlineUsersPanel = new OnlineUsersPanel();
this.connectionManager.addPeerListener(onlineUsersPanel); this.connectionManager.addPeerListener(onlineUsersPanel);
this.getContentPane().add(onlineUsersPanel, java.awt.BorderLayout.LINE_END); this.getContentPane().add(onlineUsersPanel, java.awt.BorderLayout.LINE_END);
} }
private void initStatusPanel() { private void initStatusPanel() {
javax.swing.JPanel statusPanel = new javax.swing.JPanel(); JPanel statusPanel = new JPanel();
status = new javax.swing.JLabel(); status = new JLabel();
statusPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT)); statusPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
updateStatus(); updateStatus();
statusPanel.add(status); statusPanel.add(status);
this.getContentPane().add(statusPanel, java.awt.BorderLayout.PAGE_END); this.getContentPane().add(statusPanel, BorderLayout.PAGE_END);
} }
public void exit() { public void exit() {
@@ -107,9 +107,6 @@ public class MainWindow extends javax.swing.JFrame {
pluginManager.loadPlugins(connectionManager, guiManager); pluginManager.loadPlugins(connectionManager, guiManager);
} }
public void addMenu(JMenu menu) {
this.menuBar.addPlugin(menu);
}
public void setUserName(String userName) { public void setUserName(String userName) {
connectionManager.setUserName(userName); connectionManager.setUserName(userName);
updateStatus(); updateStatus();
+50 -35
View File
@@ -5,8 +5,14 @@
*/ */
package pitiupi.GUI; package pitiupi.GUI;
import javax.swing.JMenu; import pitiupi.models.Menus.MenuCategory;
import javax.swing.JMenuBar;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
/** /**
* Barra de menus principal da aplicação. * Barra de menus principal da aplicação.
@@ -21,12 +27,14 @@ import javax.swing.JMenuBar;
*/ */
public class MenuBar extends JMenuBar { public class MenuBar extends JMenuBar {
private javax.swing.JMenuItem setupMenu; private JMenuItem preferencesMenu;
private javax.swing.JMenuItem aboutMenu; private JMenuItem aboutMenu;
private javax.swing.JMenu fileMenu; private JMenu fileMenu;
private javax.swing.JMenu helpMenu; private JMenu helpMenu;
private javax.swing.JMenu pluginMenu; private JMenu pluginMenu;
private javax.swing.JMenuItem exitMenu; private Map<MenuCategory, JMenu> categories;
private JMenuItem exitMenu;
private final MainWindow mainWindow; private final MainWindow mainWindow;
/** /**
@@ -40,42 +48,54 @@ public class MenuBar extends JMenuBar {
} }
private void initComponents() { private void initComponents() {
fileMenu = new javax.swing.JMenu(); initFileMenu();
exitMenu = new javax.swing.JMenuItem(); initPluginMenu();
helpMenu = new javax.swing.JMenu(); initHelpMenu();
pluginMenu = new javax.swing.JMenu(); }
setupMenu = new javax.swing.JMenuItem();
aboutMenu = new javax.swing.JMenuItem();
fileMenu.setText("File"); private void initFileMenu() {
exitMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK)); fileMenu = new JMenu("File");
exitMenu.setText("Exit"); exitMenu = new JMenuItem("Exit");
exitMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_DOWN_MASK));
exitMenu.addActionListener(this::exitMenuActionPerformed); exitMenu.addActionListener(this::exitMenuActionPerformed);
fileMenu.add(exitMenu); fileMenu.add(exitMenu);
this.add(fileMenu); this.add(fileMenu);
}
private void initPluginMenu() {
pluginMenu = new JMenu("Plugin");
categories = new HashMap<>();
for (MenuCategory category : MenuCategory.values()) {
JMenu newCategoryMenu = new JMenu(category.toString());
pluginMenu.add(newCategoryMenu);
categories.put(category, newCategoryMenu);
}
pluginMenu.setText("Plugin");
this.add(pluginMenu); this.add(pluginMenu);
}
helpMenu.setText("Help"); private void initHelpMenu() {
helpMenu = new JMenu("Help");
preferencesMenu = new JMenuItem("Preferences");
aboutMenu = new JMenuItem("About");
setupMenu.setText("Preferences"); preferencesMenu.addActionListener(this::setupMenuActionPerformed);
setupMenu.addActionListener(this::setupMenuActionPerformed); helpMenu.add(preferencesMenu);
helpMenu.add(setupMenu);
aboutMenu.setText("About");
aboutMenu.addActionListener(this::aboutMenuActionPerformed); aboutMenu.addActionListener(this::aboutMenuActionPerformed);
helpMenu.add(aboutMenu); helpMenu.add(aboutMenu);
this.add(helpMenu); this.add(helpMenu);
} }
private void exitMenuActionPerformed(java.awt.event.ActionEvent evt) { private void exitMenuActionPerformed(ActionEvent evt) {
mainWindow.exit(); mainWindow.exit();
} }
private void setupMenuActionPerformed(ActionEvent evt) {
private void setupMenuActionPerformed(java.awt.event.ActionEvent evt) {
Login login = new Login(); Login login = new Login();
login.setVisible(true); login.setVisible(true);
@@ -85,18 +105,13 @@ public class MenuBar extends JMenuBar {
login.dispose(); login.dispose();
} }
private void aboutMenuActionPerformed(java.awt.event.ActionEvent evt) { private void aboutMenuActionPerformed(ActionEvent evt) {
About about = new About(); About about = new About();
about.setVisible(true); about.setVisible(true);
} }
/** public void addPluginMenu(MenuCategory category, JMenuItem menu){
* Adiciona um menu fornecido por um plugin à seção de plugins da barra System.out.println("addPluginMenu");
* de menus. categories.get(category).add(menu);
*
* @param menu menu criado pelo plugin.
*/
public void addPlugin(JMenu menu){
this.pluginMenu.add(menu);
} }
} }
+60 -10
View File
@@ -2,14 +2,16 @@ package pitiupi.GUI;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.List; import java.util.List;
import javax.swing.BorderFactory; import java.util.Map;
import javax.swing.DefaultListModel; import java.util.function.Consumer;
import javax.swing.JList; import javax.swing.*;
import javax.swing.JPanel;
import javax.swing.JScrollPane; import pitiupi.models.Menus.MenuCategory;
import javax.swing.SwingUtilities; import pitiupi.models.User;
import pitiupi.model.User;
import pitiupi.control.PeerListener; import pitiupi.control.PeerListener;
/** /**
@@ -20,10 +22,16 @@ import pitiupi.control.PeerListener;
*/ */
public class OnlineUsersPanel extends JPanel implements PeerListener { public class OnlineUsersPanel extends JPanel implements PeerListener {
private final DefaultListModel<String> listModel; private final DefaultListModel<User> listModel;
private final JList<String> userList; private final JList<User> userList;
JPopupMenu menu;
private Map<MenuCategory, JMenu> categories;
public OnlineUsersPanel() { public OnlineUsersPanel() {
menu = new JPopupMenu();
categories = new HashMap<>();
initMenu();
setLayout(new BorderLayout()); setLayout(new BorderLayout());
setBorder(BorderFactory.createTitledBorder("Online")); setBorder(BorderFactory.createTitledBorder("Online"));
setPreferredSize(new Dimension(160, 0)); setPreferredSize(new Dimension(160, 0));
@@ -31,6 +39,48 @@ public class OnlineUsersPanel extends JPanel implements PeerListener {
listModel = new DefaultListModel<>(); listModel = new DefaultListModel<>();
userList = new JList<>(listModel); userList = new JList<>(listModel);
add(new JScrollPane(userList), BorderLayout.CENTER); add(new JScrollPane(userList), BorderLayout.CENTER);
setupUserListActions();
}
private void initMenu() {
for (MenuCategory category : MenuCategory.values()) {
JMenu newCategory = new JMenu(category.toString());
menu.add(newCategory);
categories.put(category, newCategory);
}
}
private void setupUserListActions() {
userList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = userList.locationToIndex(e.getPoint());
if (index == -1) {
return;
}
userList.setSelectedIndex(index);
menu.show(userList, e.getX(), e.getY());
}
});
}
public void initUnicastMenu(JMenuItem menuItem, Consumer<User> action) {
menuItem.addActionListener(e -> {
User user = userList.getSelectedValue();
if (user != null) {
action.accept(user);
}
});
}
public void addUnicastMenu(MenuCategory category, JMenuItem menuItem) {
categories.get(category).add(menuItem);
} }
/** /**
@@ -43,7 +93,7 @@ public class OnlineUsersPanel extends JPanel implements PeerListener {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
listModel.clear(); listModel.clear();
for (User peer : peers) { for (User peer : peers) {
listModel.addElement(peer.toString()); listModel.addElement(peer);
} }
}); });
} }
@@ -1,8 +1,9 @@
package pitiupi.control; package pitiupi.control;
import pitiupi.GUI.MainWindow; import pitiupi.GUI.MainWindow;
import pitiupi.model.Messages.HeartbeatMessage; import pitiupi.control.plugins.PluginManager;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.HeartbeatMessage;
import pitiupi.models.Messages.Message;
import pitiupi.net.tcp.SocketTCP; import pitiupi.net.tcp.SocketTCP;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
import pitiupi.net.udp.SocketUDP; import pitiupi.net.udp.SocketUDP;
@@ -63,7 +64,7 @@ public class ConnectionManager {
} }
public void broadcastLocal(byte[] message) { public void broadcastLocal(byte[] message) {
pluginManager.handlePublicMessage(message); pluginManager.handleMessage(message);
} }
public void addPeerListener(PeerListener peerListener) { public void addPeerListener(PeerListener peerListener) {
+81 -3
View File
@@ -1,17 +1,95 @@
package pitiupi.control; package pitiupi.control;
import pitiupi.GUI.MainWindow; import pitiupi.GUI.MainWindow;
import pitiupi.GUI.MenuBar;
import pitiupi.GUI.OnlineUsersPanel;
import pitiupi.models.Menus.*;
import pitiupi.models.Menus.MulticastMenus.MulticastActionMenu;
import pitiupi.models.Menus.MulticastMenus.MulticastMenu;
import pitiupi.models.Menus.MulticastMenus.MulticastSubMenu;
import pitiupi.models.Menus.UnicastMenus.UnicastActionMenu;
import pitiupi.models.Menus.UnicastMenus.UnicastMenu;
import pitiupi.models.Menus.UnicastMenus.UnicastSubMenu;
import javax.swing.*; import javax.swing.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class GuiManager { public class GuiManager {
private MainWindow mainWindow; private MainWindow mainWindow;
private MenuBar menuBar;
private OnlineUsersPanel onlineUsersPanel;
public GuiManager(MainWindow mainWindow) { private Logger logger;
public GuiManager(MainWindow mainWindow, MenuBar menuBar, OnlineUsersPanel onlineUsersPanel) {
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
this.menuBar = menuBar;
this.onlineUsersPanel = onlineUsersPanel;
this.logger = Logger.getLogger(GuiManager.class.getName());
} }
public void addMenu(JMenu menu) { public void createMenu(MenuCategory category, Menu menu) {
mainWindow.addMenu(menu); System.out.println(
menu.getClass().getSuperclass().getSuperclass()
);
System.out.println(
MulticastMenu.class
);
System.out.println(
menu.getClass().getSuperclass().getSuperclass()
== MulticastMenu.class
);
try {
JMenuItem newMenu = buildMenu(menu);
if (menu instanceof MulticastMenu) {
menuBar.addPluginMenu(category, newMenu);
}
if (menu instanceof UnicastMenu) {
onlineUsersPanel.addUnicastMenu(category, newMenu);
}
}
catch (IllegalArgumentException e) {
logger.log(Level.WARNING, e.getMessage());
}
}
private JMenuItem buildMenu(Menu menu) {
if (menu instanceof MulticastSubMenu multicastSubMenu) {
JMenu newMenu = new JMenu(menu.getText());
for (Menu child : multicastSubMenu.getMenus()) {
newMenu.add(buildMenu(child));
}
return newMenu;
}
if (menu instanceof UnicastSubMenu unicastSubMenu) {
JMenu newMenu = new JMenu(menu.getText());
for (Menu child : unicastSubMenu.getMenus()) {
newMenu.add(buildMenu(child));
}
return newMenu;
}
if (menu instanceof MulticastActionMenu multicastActionMenu) {
JMenuItem newMenu = new JMenuItem(menu.getText());
newMenu.addActionListener(e -> multicastActionMenu.onClick());
return newMenu;
}
if (menu instanceof UnicastActionMenu unicastActionMenu) {
JMenuItem newMenu = new JMenuItem(menu.getText());
onlineUsersPanel.initUnicastMenu(newMenu, unicastActionMenu::onClick);
return newMenu;
}
throw new IllegalArgumentException("Invalid menu type");
} }
} }
@@ -10,8 +10,8 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import pitiupi.model.User; import pitiupi.models.User;
import pitiupi.model.Messages.HeartbeatMessage; import pitiupi.models.Messages.HeartbeatMessage;
import java.util.UUID; import java.util.UUID;
/** /**
* Gerencia o mecanismo de heartbeat da aplicação. * Gerencia o mecanismo de heartbeat da aplicação.
@@ -1,6 +1,6 @@
package pitiupi.control; package pitiupi.control;
import pitiupi.model.User; import pitiupi.models.User;
import java.util.List; import java.util.List;
@@ -1,100 +0,0 @@
package pitiupi.control;
import pitiupi.GUI.MainWindow;
import pitiupi.Main;
import pitiupi.net.tcp.TcpConnection;
import pitiupi.model.Plugin;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ServiceLoader;
public class PluginManager {
private final List<Plugin> plugins;
private final HashSet<String> loadedJars;
public PluginManager() {
this.plugins = new ArrayList<>();
this.loadedJars = new HashSet<>();
}
public void handlePublicMessage(byte[] msg) {
for (Plugin plugin : plugins) {
plugin.receiveMessage(msg);
}
}
private Plugin getPlugin(String pluginId) {
for (Plugin plugin : plugins) {
if (plugin.getIdentifier().equals(pluginId)) return plugin;
}
return null;
}
public void handlePrivateMessage(TcpConnection connection, byte[] msg) {
Plugin plugin = getPlugin(connection.getReceiver());
if (plugin == null) return;
plugin.receiveBytes(connection, msg);
}
public boolean handleConnection(TcpConnection connection, String receiverId) {
Plugin plugin = getPlugin(receiverId);
if (plugin == null) return false;
plugin.receivePrivateConnection(connection);
return false;
}
public void handleDisconnection(TcpConnection connection, String receiverId) {
Plugin plugin = getPlugin(receiverId);
if (plugin == null) return;
plugin.onSocketClosed(connection);
}
public void loadPlugins(ConnectionManager connectionManager, GuiManager guiManager) {
File pluginDir = new File("plugins");
File[] jarFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar"));
if (jarFiles == null || jarFiles.length == 0) {
System.out.println("No plugins found in the " + pluginDir.getAbsolutePath() + " directory.");
return;
}
for (File file : jarFiles) {
if (loadedJars.contains(file.getName())) {
continue;
}
System.out.println("Discovered plugin package: " + file.getName());
try {
URLClassLoader classLoader = new URLClassLoader(
new URL[]{file.toURI().toURL()},
Main.class.getClassLoader()
);
ServiceLoader<Plugin> serviceLoader = ServiceLoader.load(Plugin.class, classLoader);
for (Plugin plugin : serviceLoader) {
System.out.println("Loading: " + plugin.getName());
plugin.createPlugin(connectionManager, guiManager);
plugins.add(plugin);
loadedJars.add(file.getName());
}
} catch (Exception e) {
System.out.println("Failed to load plugin " + file.getName());
e.printStackTrace();
}
}
}
}
@@ -0,0 +1,22 @@
package pitiupi.control.plugins;
import pitiupi.models.Plugin;
class LoadedPlugin {
private final Plugin plugin;
private final ClassLoader classLoader;
public LoadedPlugin(Plugin plugin, ClassLoader classLoader) {
this.plugin = plugin;
this.classLoader = classLoader;
}
public Plugin getPlugin() {
return plugin;
}
public ClassLoader getClassLoader() {
return classLoader;
}
}
@@ -0,0 +1,154 @@
package pitiupi.control.plugins;
import pitiupi.Main;
import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager;
import pitiupi.models.Messages.Message;
import pitiupi.net.tcp.TcpConnection;
import pitiupi.models.Plugin;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ServiceLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
public class PluginManager {
private final List<LoadedPlugin> loadedPlugins;
private final HashSet<String> loadedJars;
private final Logger logger;
public PluginManager() {
this.loadedPlugins = new ArrayList<>();
this.loadedJars = new HashSet<>();
logger = Logger.getLogger(getClass().getName());
}
public void handleMessage(byte[] msg) {
Message message = null;
for (LoadedPlugin loadedPlugin : loadedPlugins) {
message = deserialize(msg, loadedPlugin.getClassLoader());
if (message != null) break;
}
if (message == null) return;
for (LoadedPlugin loadedPlugin : loadedPlugins) {
Plugin plugin = loadedPlugin.getPlugin();
if (plugin.receiveAllTypes() && message.isPublic()) {
plugin.receiveMessage(message);
continue;
}
for (Class<? extends Message> messageType : plugin.getMessages()) {
if (messageType.isInstance(message)) {
plugin.receiveMessage(message);
break;
}
}
}
}
private Plugin getPlugin(String pluginId) {
for (LoadedPlugin loadedPlugin : loadedPlugins) {
if (loadedPlugin.getPlugin().getIdentifier().equals(pluginId))
return loadedPlugin.getPlugin();
}
return null;
}
public void handleMessageFromConnection(TcpConnection connection, byte[] msg) {
Plugin plugin = getPlugin(connection.getReceiver());
if (plugin == null) return;
plugin.receiveBytes(connection, msg);
}
public boolean handleConnection(TcpConnection connection, String receiverId) {
Plugin plugin = getPlugin(receiverId);
if (plugin == null) return false;
plugin.receivePrivateConnection(connection);
return false;
}
public void handleDisconnection(TcpConnection connection, String receiverId) {
Plugin plugin = getPlugin(receiverId);
if (plugin == null) return;
plugin.onSocketClosed(connection);
}
public void loadPlugins(ConnectionManager connectionManager, GuiManager guiManager) {
File pluginDir = new File("plugins");
File[] jarFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar"));
if (jarFiles == null || jarFiles.length == 0) {
System.out.println("No plugins found in the " + pluginDir.getAbsolutePath() + " directory.");
return;
}
for (File file : jarFiles) {
if (loadedJars.contains(file.getName())) {
continue;
}
System.out.println("Discovered plugin package: " + file.getName());
try {
URLClassLoader classLoader = new URLClassLoader(
new URL[]{file.toURI().toURL()},
Main.class.getClassLoader()
);
ServiceLoader<Plugin> serviceLoader = ServiceLoader.load(Plugin.class, classLoader);
for (Plugin plugin : serviceLoader) {
System.out.println("Loading: " + plugin.getName());
LoadedPlugin loadedPlugin = new LoadedPlugin(plugin, classLoader);
plugin.createPlugin(connectionManager, guiManager);
loadedPlugins.add(loadedPlugin);
loadedJars.add(file.getName());
}
} catch (Exception e) {
logger.log(Level.WARNING, "Failed to load plugin " + file.getName(), e);
}
}
}
private Message deserialize(byte[] data, ClassLoader classLoader) {
try {
ByteArrayInputStream input = new ByteArrayInputStream(data);
PluginObjectInputStream objectInput = new PluginObjectInputStream(input, classLoader);
Object object = objectInput.readObject();
if (!(object instanceof Message)) {
return null;
}
return (Message) object;
}
catch (ClassNotFoundException e) {
return null;
}
catch (IOException e) {
logger.log(Level.SEVERE, "Failed to load plugin package", e);
return null;
}
}
}
@@ -0,0 +1,20 @@
package pitiupi.control.plugins;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
public class PluginObjectInputStream extends ObjectInputStream {
private final ClassLoader classLoader;
public PluginObjectInputStream(InputStream input, ClassLoader classLoader) throws IOException {
super(input);
this.classLoader = classLoader;
}
@Override
protected Class<?> resolveClass(ObjectStreamClass description) throws ClassNotFoundException {
return Class.forName(description.getName(), false, classLoader);
}
}
@@ -1,6 +0,0 @@
package pitiupi.model.Menus;
public abstract class Menu {
public abstract String getText();
public abstract MenuCategory getCategory();
}
@@ -1,7 +0,0 @@
package pitiupi.model.Menus;
public enum MenuCategory {
JOGOS,
SOCIAL,
STREAMING
}
@@ -1,5 +0,0 @@
package pitiupi.model.Menus;
public abstract class MulticastMenu extends Menu {
public abstract void onClick();
}
@@ -1,7 +0,0 @@
package pitiupi.model.Menus;
import pitiupi.model.User;
public abstract class UnicastMenu extends Menu {
public abstract void onClick(User user);
}
@@ -0,0 +1,5 @@
package pitiupi.models.Menus;
public abstract class Menu {
public abstract String getText();
}
@@ -0,0 +1,7 @@
package pitiupi.models.Menus;
public enum MenuCategory {
Jogos,
Social,
Streaming
}
@@ -0,0 +1,5 @@
package pitiupi.models.Menus.MulticastMenus;
public abstract class MulticastActionMenu extends MulticastMenu{
public abstract void onClick();
}
@@ -0,0 +1,9 @@
package pitiupi.models.Menus.MulticastMenus;
import pitiupi.models.Menus.Menu;
public abstract class MulticastMenu extends Menu {
MulticastMenu() {
super();
}
}
@@ -0,0 +1,7 @@
package pitiupi.models.Menus.MulticastMenus;
import java.util.List;
public abstract class MulticastSubMenu extends MulticastMenu{
public abstract List<MulticastMenu> getMenus();
}
@@ -0,0 +1,7 @@
package pitiupi.models.Menus.UnicastMenus;
import pitiupi.models.User;
public abstract class UnicastActionMenu extends UnicastMenu{
public abstract void onClick(User user);
}
@@ -0,0 +1,8 @@
package pitiupi.models.Menus.UnicastMenus;
import pitiupi.models.Menus.Menu;
import pitiupi.models.User;
public abstract class UnicastMenu extends Menu {
UnicastMenu() {}
}
@@ -0,0 +1,7 @@
package pitiupi.models.Menus.UnicastMenus;
import java.util.List;
public abstract class UnicastSubMenu extends UnicastMenu{
public abstract List<UnicastMenu> getMenus();
}
@@ -1,6 +1,4 @@
package pitiupi.model.Messages; package pitiupi.models.Messages;
import pitiupi.model.Messages.Message;
/** /**
* Mensagem utilizada para sinalizar a presença de um usuário na rede. * Mensagem utilizada para sinalizar a presença de um usuário na rede.
@@ -1,4 +1,4 @@
package pitiupi.model.Messages; package pitiupi.models.Messages;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
@@ -1,4 +1,4 @@
package pitiupi.model.Messages; package pitiupi.models.Messages;
public enum InfoType { public enum InfoType {
CONNECTION_REJECTED, CONNECTION_REJECTED,
@@ -3,7 +3,7 @@
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package pitiupi.model.Messages; package pitiupi.models.Messages;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -24,6 +24,19 @@ import java.io.Serializable;
* @author flavio * @author flavio
*/ */
public abstract class Message implements Serializable{ public abstract class Message implements Serializable{
private boolean isPublic;
protected Message(){
isPublic = true;
}
protected Message(boolean isPublic){
this.isPublic = isPublic;
}
public boolean isPublic(){
return isPublic;
}
/** /**
* Serializa a mensagem para um vetor de bytes. * Serializa a mensagem para um vetor de bytes.
@@ -2,13 +2,15 @@
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template
*/ */
package pitiupi.model; package pitiupi.models;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.GuiManager; import pitiupi.control.GuiManager;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.Message;
import pitiupi.net.tcp.TcpConnection; import pitiupi.net.tcp.TcpConnection;
import java.util.List;
/** /**
* Interface base para plugins da aplicação. * Interface base para plugins da aplicação.
* *
@@ -18,7 +20,6 @@ import pitiupi.net.tcp.TcpConnection;
* @author flavio * @author flavio
*/ */
public abstract class Plugin { public abstract class Plugin {
public abstract String getName(); public abstract String getName();
public abstract String getAuthor(); public abstract String getAuthor();
public abstract String getVersion(); public abstract String getVersion();
@@ -39,7 +40,7 @@ public abstract class Plugin {
* *
* @return mensagem criada pelo plugin. * @return mensagem criada pelo plugin.
*/ */
public abstract Message getMessage(); public abstract List<Class<? extends Message>> getMessages();
/** /**
* Recebe uma mensagem enviada pela aplicação. * Recebe uma mensagem enviada pela aplicação.
@@ -49,8 +50,9 @@ public abstract class Plugin {
* *
* @param message mensagem serializada recebida. * @param message mensagem serializada recebida.
*/ */
public abstract void receiveMessage(byte[] message); public abstract void receiveMessage(Message message);
public boolean receiveAllTypes() {return false;}
public boolean receivePrivateConnection(TcpConnection connection) { public boolean receivePrivateConnection(TcpConnection connection) {
return false; return false;
} }
@@ -1,4 +1,4 @@
package pitiupi.model; package pitiupi.models;
import java.net.InetAddress; import java.net.InetAddress;
/** /**
@@ -1,8 +1,8 @@
package pitiupi.net.tcp; package pitiupi.net.tcp;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.Message;
import pitiupi.model.Messages.InfoMessage; import pitiupi.models.Messages.InfoMessage;
import pitiupi.model.Messages.InfoType; import pitiupi.models.Messages.InfoType;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
@@ -1,6 +1,6 @@
package pitiupi.net.tcp; package pitiupi.net.tcp;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.Message;
class HandshakeMessage extends Message { class HandshakeMessage extends Message {
private final boolean isPrivate; private final boolean isPrivate;
+6 -6
View File
@@ -1,10 +1,10 @@
package pitiupi.net.tcp; package pitiupi.net.tcp;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.PluginManager; import pitiupi.control.plugins.PluginManager;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.Message;
import pitiupi.model.Messages.InfoMessage; import pitiupi.models.Messages.InfoMessage;
import pitiupi.model.Messages.InfoType; import pitiupi.models.Messages.InfoType;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
@@ -304,7 +304,7 @@ public class SocketTCP extends Thread {
InfoMessage sysMessage = InfoMessage.parseSystemInfo(bytes); InfoMessage sysMessage = InfoMessage.parseSystemInfo(bytes);
if (sysMessage == null) { if (sysMessage == null) {
pluginManager.handlePublicMessage(bytes); pluginManager.handleMessage(bytes);
continue; continue;
} }
@@ -349,7 +349,7 @@ public class SocketTCP extends Thread {
InfoMessage sysMessage = InfoMessage.parseSystemInfo(message); InfoMessage sysMessage = InfoMessage.parseSystemInfo(message);
if (sysMessage == null) { if (sysMessage == null) {
pluginManager.handlePrivateMessage(connection, message); pluginManager.handleMessageFromConnection(connection, message);
continue; continue;
} }
@@ -1,9 +1,9 @@
package pitiupi.net.tcp; package pitiupi.net.tcp;
import pitiupi.model.Messages.InfoType; import pitiupi.models.Messages.InfoType;
import pitiupi.model.User; import pitiupi.models.User;
import pitiupi.control.PeerListener; import pitiupi.control.PeerListener;
import pitiupi.model.Messages.InfoMessage; import pitiupi.models.Messages.InfoMessage;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
+4 -4
View File
@@ -14,9 +14,9 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import pitiupi.control.ConnectionManager; import pitiupi.control.ConnectionManager;
import pitiupi.control.PluginManager; import pitiupi.control.plugins.PluginManager;
import pitiupi.model.Messages.HeartbeatMessage; import pitiupi.models.Messages.HeartbeatMessage;
import pitiupi.model.Messages.Message; import pitiupi.models.Messages.Message;
/** /**
* Gerencia a comunicação UDP multicast e unicast da aplicação. * Gerencia a comunicação UDP multicast e unicast da aplicação.
@@ -157,7 +157,7 @@ public class SocketUDP extends Thread {
continue; continue;
} }
pluginManager.handlePublicMessage(msgPacket.getData()); pluginManager.handleMessage(msgPacket.getData());
} }
} }