diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..53d2375
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+/pitiupi/build/
+/pitiupi/dist/
+/pitiupi.chat/build/
+/pitiupi.chat/dist/
+/pitiupi.chat/nbproject/private/
+/pitiupi.screenCast/build/
+/pitiupi.screenCast/dist/
diff --git a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java
index f894a65..3b707fa 100644
--- a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java
+++ b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java
@@ -94,7 +94,7 @@ public class ChatWindow extends javax.swing.JDialog {
if (jTextArea1.getText().trim().length() == 0) {
return;
}
- ChatMessage message = new ChatMessage(mainWindow.getName(), jTextArea1.getText());
+ ChatMessage message = new ChatMessage(mainWindow.getUserName(), jTextArea1.getText());
this.sendChatMessage(message);
jTextArea1.setText("");
}
diff --git a/pitiupi.screenCast/.idea/workspace.xml b/pitiupi.screenCast/.idea/workspace.xml
new file mode 100644
index 0000000..96dbbb3
--- /dev/null
+++ b/pitiupi.screenCast/.idea/workspace.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1784745206049
+
+
+ 1784745206049
+
+
+
+
\ No newline at end of file
diff --git a/pitiupi/src/pitiupi/GUI/Login.java b/pitiupi/src/pitiupi/GUI/Login.java
index 3bac894..20b2a37 100644
--- a/pitiupi/src/pitiupi/GUI/Login.java
+++ b/pitiupi/src/pitiupi/GUI/Login.java
@@ -1,8 +1,3 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
package pitiupi.GUI;
import java.awt.BorderLayout;
@@ -11,6 +6,7 @@ import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
+import java.util.prefs.Preferences;
import javax.swing.JButton;
import javax.swing.JDialog;
@@ -26,9 +22,14 @@ import javax.swing.JTextField;
* multicast que será utilizada pela comunicação.
*
* @author flavio
+ * @author tony
*/
public final class Login extends JDialog {
+ private static final Preferences prefs = Preferences.userNodeForPackage(Login.class);
+ private static final String PREF_NOME = "lastUserName";
+ private static final String PREF_PORTA = "lastPort";
+
JLabel nameLabel = new JLabel("Name: ");
JLabel portLabel = new JLabel("Port: ");
@@ -47,8 +48,12 @@ public final class Login extends JDialog {
public void initComponents() {
this.setTitle("Login");
- portField.setModel(new javax.swing.SpinnerNumberModel(8000, 8000, 9000, 1));
- nameField.setText(System.getProperty("user.name"));
+
+ String nomeSalvo = prefs.get(PREF_NOME, System.getProperty("user.name"));
+ int portaSalva = prefs.getInt(PREF_PORTA, 8000);
+
+ portField.setModel(new javax.swing.SpinnerNumberModel(portaSalva, 8000, 9000, 1));
+ nameField.setText(nomeSalvo);
JPanel topPanel = new JPanel(new GridBagLayout());
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
@@ -87,6 +92,15 @@ public final class Login extends JDialog {
this.add(buttonPanel, BorderLayout.SOUTH);
okButton.addActionListener((ActionEvent e) -> {
+ try {
+ portField.commitEdit();
+ } catch (java.text.ParseException ex) {
+ return;
+ }
+
+ prefs.put(PREF_NOME, nameField.getText());
+ prefs.putInt(PREF_PORTA, (Integer) portField.getValue());
+
Login.this.setVisible(false);
});
diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java
index 23b0bfc..f1276aa 100644
--- a/pitiupi/src/pitiupi/GUI/MainWindow.java
+++ b/pitiupi/src/pitiupi/GUI/MainWindow.java
@@ -41,8 +41,8 @@ public class MainWindow extends javax.swing.JFrame {
private Socket socket;
- private final String userName;
- private final int port;
+ private String userName;
+ private int port;
private PluginLoader pluginManager;
private final List plugins;
@@ -137,4 +137,28 @@ public class MainWindow extends javax.swing.JFrame {
public List getPlugins() {
return plugins;
}
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ updateStatus();
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ reconnect();
+ updateStatus();
+ }
+
+ private void updateStatus() {
+ this.status.setText("Connected on port " + this.port + " name " + this.userName);
+ }
+
+ private void reconnect() {
+ if (this.socket != null) {
+ this.socket.close();
+ }
+ this.socket = new Socket(this);
+ this.socket.start();
+ }
+
}
diff --git a/pitiupi/src/pitiupi/GUI/MenuBar.java b/pitiupi/src/pitiupi/GUI/MenuBar.java
index 88b89ee..1e3a4a8 100644
--- a/pitiupi/src/pitiupi/GUI/MenuBar.java
+++ b/pitiupi/src/pitiupi/GUI/MenuBar.java
@@ -16,6 +16,8 @@ import javax.swing.JMenuBar;
*
* @author flavio
* @author Gustavo
+ * @author tony
+ *
*/
public class MenuBar extends JMenuBar {
@@ -67,9 +69,14 @@ public class MenuBar extends JMenuBar {
mainWindow.exit();
}
- private void setupMenuActionPerformed(java.awt.event.ActionEvent evt) {
+
+ private void setupMenuActionPerformed(java.awt.event.ActionEvent evt) {
Login login = new Login();
login.setVisible(true);
+
+ mainWindow.setUserName(login.getName());
+ mainWindow.setPort(login.getPort());
+
login.dispose();
}
diff --git a/pitiupi/src/pitiupi/Main.java b/pitiupi/src/pitiupi/Main.java
index 584c75f..9e07887 100644
--- a/pitiupi/src/pitiupi/Main.java
+++ b/pitiupi/src/pitiupi/Main.java
@@ -12,6 +12,7 @@ import java.util.logging.Logger;
/**
*
* @author flavio
+ * @author tony
*/
public class Main {
/**
@@ -39,16 +40,17 @@ public class Main {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(pitiupi.GUI.MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
- //
- /* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
+ pitiupi.GUI.Login login = new pitiupi.GUI.Login();
+ login.setVisible(true);
+
pitiupi.GUI.MainWindow main;
- main = new pitiupi.GUI.MainWindow(System.getProperty("user.name"), 8000);
+ main = new pitiupi.GUI.MainWindow(login.getName(), login.getPort());
main.setVisible(true);
- }
+ }
});
}
diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java
index 5225000..4de8a4b 100644
--- a/pitiupi/src/pitiupi/control/HeartbeatManager.java
+++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java
@@ -14,6 +14,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import pitiupi.GUI.MainWindow;
import pitiupi.net.HeartbeatMessage;
+import java.util.UUID;
/**
* Gerencia o mecanismo de heartbeat da aplicação.
*
@@ -32,6 +33,7 @@ public class HeartbeatManager {
private final Map peers = new ConcurrentHashMap<>();
private final List listeners = new CopyOnWriteArrayList<>();
private ScheduledExecutorService scheduler;
+ private final String instanceId = UUID.randomUUID().toString();
public HeartbeatManager(MainWindow mainWindow) {
this.mainWindow = mainWindow;
@@ -51,7 +53,7 @@ public class HeartbeatManager {
private void announce() {
try {
- HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName());
+ HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName(), instanceId);
mainWindow.getSocket().send(msg.toByteArray());
} catch (IOException ex) {
Logger.getLogger(HeartbeatManager.class.getName()).log(Level.WARNING, "Falha ao enviar heartbeat", ex);
@@ -70,13 +72,14 @@ public class HeartbeatManager {
* @param msg mensagem de heartbeat recebida.
* @param from endereço de rede do usuário que enviou a mensagem.
*/
+
public void receiveHeartbeat(HeartbeatMessage msg, InetAddress from) {
// ignora o próprio heartbeat
- if (msg.getUserName().equals(mainWindow.getUserName())) {
+ if (msg.getInstanceId().equals(instanceId) ) {
return;
}
- String key = from.getHostAddress() + "#" + msg.getUserName();
+ String key = msg.getInstanceId();
boolean isNew = !peers.containsKey(key);
PeerInfo peer = peers.computeIfAbsent(key, k -> new PeerInfo(msg.getUserName(), from, msg.getTimestamp()));
diff --git a/pitiupi/src/pitiupi/net/HeartbeatMessage.java b/pitiupi/src/pitiupi/net/HeartbeatMessage.java
index 04e0cf3..5a07ec8 100644
--- a/pitiupi/src/pitiupi/net/HeartbeatMessage.java
+++ b/pitiupi/src/pitiupi/net/HeartbeatMessage.java
@@ -11,9 +11,11 @@ public class HeartbeatMessage extends Message {
private final String userName;
private final long timestamp;
+ private final String instanceId;
- public HeartbeatMessage(String userName) {
+ public HeartbeatMessage(String userName, String instanceId) {
this.userName = userName;
+ this.instanceId = instanceId;
this.timestamp = System.currentTimeMillis();
}
@@ -24,4 +26,8 @@ public class HeartbeatMessage extends Message {
public long getTimestamp() {
return timestamp;
}
+
+ public String getInstanceId() {
+ return instanceId;
+ }
}
diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java
index e60e0ed..139484a 100644
--- a/pitiupi/src/pitiupi/net/Socket.java
+++ b/pitiupi/src/pitiupi/net/Socket.java
@@ -33,6 +33,7 @@ public class Socket extends Thread {
private MulticastSocket multicastSocket;
private InetAddress address;
private MainWindow main;
+ private volatile boolean running = true;
public final static String INET_ADDR = "224.0.0.3";
/**
@@ -71,6 +72,19 @@ public class Socket extends Thread {
multicastSocket.send(msgPacket);
}
+ public void close() {
+ running = false;
+ if (multicastSocket != null) {
+ try {
+ multicastSocket.leaveGroup(address);
+ } catch (IOException ex) {
+
+ }
+ multicastSocket.close();
+ }
+ }
+
+
/**
* Inicia o loop de recepção de mensagens da aplicação.
*
@@ -84,16 +98,21 @@ public class Socket extends Thread {
*/
public void receive() throws UnknownHostException, IOException, ClassNotFoundException {
byte[] buf = new byte[256000];
- while (true) {
+ while (running) {
DatagramPacket msgPacket = new DatagramPacket(buf, buf.length);
- multicastSocket.receive(msgPacket);
-
+ try {
+ multicastSocket.receive(msgPacket);
+ } catch (IOException ex) {
+ if (!running) {
+ break;
+ }
+ throw ex;
+ }
HeartbeatMessage heartbeat = tryParseHeartbeat(msgPacket.getData());
if (heartbeat != null) {
main.getHeartbeatManager().receiveHeartbeat(heartbeat, msgPacket.getAddress());
continue;
}
-
for (Plugin plugin : main.getPlugins()) {
System.out.println(msgPacket.getAddress().toString());
plugin.receiveMessage(msgPacket.getData());