diff --git a/.project b/.project
new file mode 100644
index 0000000..c3a4148
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+
+
+ JavaFx
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/client/.classpath b/client/.classpath
new file mode 100644
index 0000000..ee89ad0
--- /dev/null
+++ b/client/.classpath
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/client/.project b/client/.project
new file mode 100644
index 0000000..3ee038d
--- /dev/null
+++ b/client/.project
@@ -0,0 +1,23 @@
+
+
+ client
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/client/.settings/org.eclipse.jdt.apt.core.prefs b/client/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100644
index 0000000..d4313d4
--- /dev/null
+++ b/client/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false
diff --git a/client/.settings/org.eclipse.jdt.core.prefs b/client/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2a51c07
--- /dev/null
+++ b/client/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/client/.settings/org.eclipse.m2e.core.prefs b/client/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/client/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/client/src/main/java/com/messages/Bubble/Bubble.java b/client/src/main/java/com/messages/bubble/Bubble.java
similarity index 99%
rename from client/src/main/java/com/messages/Bubble/Bubble.java
rename to client/src/main/java/com/messages/bubble/Bubble.java
index c62521d..065d79e 100644
--- a/client/src/main/java/com/messages/Bubble/Bubble.java
+++ b/client/src/main/java/com/messages/bubble/Bubble.java
@@ -7,7 +7,7 @@
import javafx.scene.shape.VLineTo;
public class Bubble extends Path{
-
+
/*Copyright {2015} {Terah Laweh}
Licensed under the Apache License, Version 2.0 (the "License");
@@ -93,7 +93,7 @@ private void drawRectBubbleRightCenterIndicator() {
new LineTo(3.0f, 2.5f)
);
}
-
+
protected double drawRectBubbleIndicatorRule = 0.2;
private void drawRectBubbleLeftCenterIndicator() {
diff --git a/client/src/main/java/com/messages/Bubble/BubbleSpec.java b/client/src/main/java/com/messages/bubble/BubbleSpec.java
similarity index 100%
rename from client/src/main/java/com/messages/Bubble/BubbleSpec.java
rename to client/src/main/java/com/messages/bubble/BubbleSpec.java
diff --git a/client/src/main/java/com/messages/Bubble/BubbledLabel.java b/client/src/main/java/com/messages/bubble/BubbledLabel.java
similarity index 100%
rename from client/src/main/java/com/messages/Bubble/BubbledLabel.java
rename to client/src/main/java/com/messages/bubble/BubbledLabel.java
diff --git "a/docs/\320\240\320\237\320\227 \320\240\320\237\320\236.docx" "b/docs/\320\240\320\237\320\227 \320\240\320\237\320\236.docx"
new file mode 100644
index 0000000..ae4fa0a
Binary files /dev/null and "b/docs/\320\240\320\237\320\227 \320\240\320\237\320\236.docx" differ
diff --git a/server/.classpath b/server/.classpath
new file mode 100644
index 0000000..58a3bad
--- /dev/null
+++ b/server/.classpath
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/server/.gitignore b/server/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/server/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/server/.project b/server/.project
new file mode 100644
index 0000000..37ee643
--- /dev/null
+++ b/server/.project
@@ -0,0 +1,23 @@
+
+
+ server
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/server/.settings/org.eclipse.jdt.apt.core.prefs b/server/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100644
index 0000000..d4313d4
--- /dev/null
+++ b/server/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false
diff --git a/server/.settings/org.eclipse.jdt.core.prefs b/server/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2a51c07
--- /dev/null
+++ b/server/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/server/.settings/org.eclipse.m2e.core.prefs b/server/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/server/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/server/src/main/java/com/messages/Message.java b/server/src/main/java/com/messages/Message.java
index ce4aed9..74dde99 100644
--- a/server/src/main/java/com/messages/Message.java
+++ b/server/src/main/java/com/messages/Message.java
@@ -13,6 +13,7 @@ public class Message implements Serializable {
private ArrayList list;
private ArrayList users;
+
private Status status;
private byte[] voiceMsg;
@@ -94,4 +95,5 @@ public Status getStatus() {
public void setVoiceMsg(byte[] voiceMsg) {
this.voiceMsg = voiceMsg;
}
+
}
diff --git a/server/src/main/java/com/server/AdminRoom.java b/server/src/main/java/com/server/AdminRoom.java
new file mode 100644
index 0000000..d750b18
--- /dev/null
+++ b/server/src/main/java/com/server/AdminRoom.java
@@ -0,0 +1,47 @@
+/**
+ *
+ */
+package com.server;
+
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+/**
+ * @author nadif
+ *
+ */
+public class AdminRoom
+ extends Room {
+
+ ArrayList list = new ArrayList<>();
+
+ AdminRoom(String roomName) {
+ super(roomName);
+ list.add("adam");
+ list.add("admin");
+ list.add("andrey");
+ list.add("alexey");
+ }
+
+
+ public boolean check(String name) {
+ if (list.contains(name))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ @Override
+ public HashSet getList() {
+ return this.users;
+ }
+
+}
+
+
diff --git a/server/src/main/java/com/server/Room.java b/server/src/main/java/com/server/Room.java
new file mode 100644
index 0000000..5faa7de
--- /dev/null
+++ b/server/src/main/java/com/server/Room.java
@@ -0,0 +1,79 @@
+/**
+ *
+ */
+package com.server;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.messages.Message;
+import com.messages.User;
+/**
+ * @author nadif
+ *
+ */
+public class Room {
+
+ protected HashSet users = new HashSet<>();
+ public static HashMap map = new HashMap<>();
+ static Logger logger = LoggerFactory.getLogger(Room.class);
+ private String roomName;
+
+
+ public String getroomName() {
+ return roomName;
+ }
+
+ public Room(String roomName) {
+
+ this.roomName = roomName;
+ }
+
+ public void addUser(ObjectOutputStream writer, Message message) {
+ String name = message.getName();
+
+ users.add(writer);
+ logger.info("User: " + name + " has been added to the " + roomName);
+ map.put(name, writer);
+ }
+
+ public void writeMessage(Message msg) throws IOException {
+ for (ObjectOutputStream writer : getList())
+ {
+
+ msg.setUserlist(Server.getNames());
+ msg.setUsers(Server.getUsers());
+ msg.setOnlineCount(Server.getNames().size());
+ try
+ {
+ writer.writeObject(msg);
+ writer.reset();
+
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public void removeFromList(User user) {
+ logger.info(getList().toString());
+ getList().remove(map.get(user.getName()));
+ //map.remove(user.getName());
+ logger.info("User: " + user.getName() + " has been delited from " + getroomName());
+ logger.info(getList().toString());
+ }
+
+ public HashSet getList() {
+ return this.users;
+ }
+}
+
+
+
diff --git a/server/src/main/java/com/server/Server.java b/server/src/main/java/com/server/Server.java
index 93ec063..6df7258 100644
--- a/server/src/main/java/com/server/Server.java
+++ b/server/src/main/java/com/server/Server.java
@@ -1,20 +1,25 @@
package com.server;
-import com.exception.DuplicateUsernameException;
-import com.messages.Message;
-import com.messages.MessageType;
-import com.messages.Status;
-import com.messages.User;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.exception.DuplicateUsernameException;
+import com.messages.Message;
+import com.messages.MessageType;
+import com.messages.Status;
+import com.messages.User;
+
public class Server {
/* Setting up variables */
@@ -23,6 +28,19 @@ public class Server {
private static HashSet writers = new HashSet<>();
private static ArrayList users = new ArrayList<>();
static Logger logger = LoggerFactory.getLogger(Server.class);
+ private static ArrayList messages = new ArrayList<>();
+ private static HashMap map = new HashMap<>();
+ private static Room userRoom = new Room("userRoom");
+ private static AdminRoom adminRoom = new AdminRoom("adminRoom");
+
+ public static HashMap getNames() {
+ return names;
+ }
+
+ public static ArrayList getUsers() {
+ return users;
+ }
+
public static void main(String[] args) throws Exception {
logger.info("The chat server is running.");
@@ -46,11 +64,15 @@ private static class Handler extends Thread {
private Logger logger = LoggerFactory.getLogger(Handler.class);
private User user;
+
+
+
public Handler(Socket socket) throws IOException {
this.socket = socket;
}
- public void run() {
+ @Override
+ public void run() {
logger.info("Attempting to connect a user...");
try (
InputStream is = socket.getInputStream();
@@ -62,19 +84,41 @@ public void run() {
Message firstMessage = (Message) input.readObject();
checkDuplicateUsername(firstMessage);
writers.add(output);
+ map.put(firstMessage.getName(), output);
+ if (adminRoom.check(firstMessage.getName()))
+ {
+ adminRoom.addUser(output, firstMessage);
+ }
+ userRoom.addUser(output, firstMessage);
sendNotification(firstMessage);
addToList();
+
while (socket.isConnected()) {
Message inputmsg = (Message) input.readObject();
if (inputmsg != null) {
logger.info(inputmsg.getName() + " has " + names.size());
switch (inputmsg.getType()) {
case USER:
- write(inputmsg);
+ SaveMessage(inputmsg);
+ if (adminRoom.check(inputmsg.getName()))
+ {
+ adminRoom.writeMessage(inputmsg);
+ }
+ else
+ {
+ userRoom.writeMessage(inputmsg);
+ }
break;
case VOICE:
- write(inputmsg);
+ if (adminRoom.check(inputmsg.getName()))
+ {
+ adminRoom.writeMessage(inputmsg);
+ }
+ else
+ {
+ userRoom.writeMessage(inputmsg);
+ }
break;
case CONNECTED:
addToList();
@@ -82,6 +126,9 @@ public void run() {
case STATUS:
changeStatus(inputmsg);
break;
+ case DISCONNECTED:
+ closeConnections();
+ break;
}
}
}
@@ -162,20 +209,25 @@ private Message addToList() throws IOException {
* Creates and sends a Message type to the listeners.
*/
private void write(Message msg) throws IOException {
+
for (ObjectOutputStream writer : writers) {
msg.setUserlist(names);
msg.setUsers(users);
msg.setOnlineCount(names.size());
- logger.info(writer.toString() + " " + msg.getName() + " " + msg.getUserlist().toString());
+ logger.info(
+ writer.toString() + " " + user.getName() + " " + msg.getName() + " "
+ + msg.getUserlist().toString());
try {
writer.writeObject(msg);
- writer.reset();
+ writer.reset();
+
} catch (Exception ex) {
closeConnections();
}
}
}
+
/*
* Once a user has been disconnected, we close the open connections and remove the writers
*/
@@ -183,6 +235,7 @@ private synchronized void closeConnections() {
logger.debug("closeConnections() method Enter");
logger.info("HashMap names:" + names.size() + " writers:" + writers.size() + " usersList size:" + users.size());
if (name != null) {
+ writers.remove(map.get(name));
names.remove(name);
logger.info("User: " + name + " has been removed!");
}
@@ -190,13 +243,45 @@ private synchronized void closeConnections() {
users.remove(user);
logger.info("User object: " + user + " has been removed!");
}
+ if (writers != null)
+ {
+ writers.remove(map.get(user.getName()));
+ logger.info("Object: " + map.get(user.getName()) + " has been removed");
+ }
+ if (adminRoom.check(user.getName()))
+ {
+ adminRoom.removeFromList(user);
+ }
+ userRoom.removeFromList(user);
+
try {
removeFromList();
} catch (Exception e) {
e.printStackTrace();
}
+
logger.info("HashMap names:" + names.size() + " writers:" + writers.size() + " usersList size:" + users.size());
logger.debug("closeConnections() method Exit");
}
+
+ private static void SaveMessage(Message msg) {
+ messages.add(msg);
+ }
+
+ private void LoadMessage(ObjectOutputStream writer) {
+ for (int i = 0; i < messages.size(); i++)
+ {
+ try
+ {
+ writer.writeObject(messages.get(i));
+ }
+ catch (Exception ex)
+ {
+ closeConnections();
+ }
+
+ }
+ }
+
}
}