Novos menus e envio de mensagens
This commit is contained in:
1 parent
6538dac8af
commit
7c9e61ce0f
55 files changed
+682
-367
No files matched your search
@@ -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=
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File renamed without changes.
@@ -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) {
|
|
||||||
this.chatWindow.receiveChatMessage(msg);
|
|
||||||
}
|
}
|
||||||
} catch (IOException | ClassNotFoundException ex) {
|
|
||||||
System.out.println(ex.toString());
|
|
||||||
|
@Override
|
||||||
|
public void receiveMessage(Message message) {
|
||||||
|
if (message instanceof ChatMessage msg) {
|
||||||
|
this.chatWindow.receiveChatMessage(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,8 +64,5 @@ public class ChatPlugin implements Plugin {
|
|||||||
return "Pitiupi.Chat.Example";
|
return "Pitiupi.Chat.Example";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Message getMessage() {
|
|
||||||
return new ChatMessage();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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 "";
|
||||||
|
}
|
||||||
|
}
|
||||||
File renamed without changes.
@@ -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,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) {
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
-3
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package pitiupi.model.Messages;
|
package pitiupi.models.Messages;
|
||||||
|
|
||||||
import pitiupi.net.tcp.TcpConnection;
|
import pitiupi.net.tcp.TcpConnection;
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package pitiupi.model.Messages;
|
package pitiupi.models.Messages;
|
||||||
|
|
||||||
public enum InfoType {
|
public enum InfoType {
|
||||||
CONNECTION_REJECTED,
|
CONNECTION_REJECTED,
|
||||||
+14
-1
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user