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(); + } + + } + } + } }