Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IlRomanenko - messenger #129

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions onwer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Романенко Илья Игоревич
15 changes: 15 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,21 @@
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
Expand Down
62 changes: 42 additions & 20 deletions src/main/java/track/lections/TcpEchoServer.java
Original file line number Diff line number Diff line change
@@ -1,41 +1,63 @@
package track.lections;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class TcpEchoServer {
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;
import java.util.Iterator;

class TCPEchoServer {
private static final int BUFSIZE = 32;


public static void main(String[] args) throws IOException {
if (args.length != 1) {
throw new IllegalArgumentException("Parameter: <Port>");
}

int servPort = Integer.parseInt(args[0]);

ServerSocket serverSocket = new ServerSocket(servPort);
Selector selector = SelectorProvider.provider().openSelector();

int recvMsgSize;
byte[] recieveBuf = new byte[BUFSIZE];
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);

while (true) {
Socket clntSock = serverSocket.accept();
serverChannel.socket().bind(new InetSocketAddress("localhost", servPort));

SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
serverChannel.register(selector, serverChannel.validOps());

InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();

while ((recvMsgSize = in.read(recieveBuf)) != -1) {
out.write(recieveBuf, 0, recvMsgSize);
}
ByteBuffer recvBuffer = ByteBuffer.allocate(BUFSIZE);

while (selector.select() > 0) {


clntSock.close();
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();

while (iterator.hasNext()) {
SelectionKey key = iterator.next();
SocketChannel clientChannel;

if (key.isAcceptable()) {
ServerSocketChannel clientServerChannel = (ServerSocketChannel) key.channel();
clientChannel = clientServerChannel.accept();

clientChannel.configureBlocking(false);
clientChannel.register(selector, clientChannel.validOps());

} else if (key.isReadable()) {
clientChannel = (SocketChannel)key.channel();
clientChannel.read(recvBuffer);
recvBuffer.flip();
clientChannel.write(recvBuffer);
clientChannel.close();
}
iterator.remove();
}
}
}
}
6 changes: 3 additions & 3 deletions src/main/java/track/lessons/l7threads/SimpleThread.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ public void run() {
t1.start();

for (int i = 0; i < 5; i++) {
System.out.println("Main:" + i);
System.out.println("MessageServerMain:" + i);
mysleep(1);
}
System.out.println("Main thread finished");
System.out.println("MessageServerMain thread finished");
}


Expand All @@ -60,7 +60,7 @@ public void run() {
thread.start();
System.out.println("Joining");
thread.join();
System.out.println("Main exit");
System.out.println("MessageServerMain exit");


}
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/track/messenger/MessageServerMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package track.messenger;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import track.messenger.net.MessengerServer;

/**
*
*/
public class MessageServerMain {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

MessengerServer server = (MessengerServer)context.getBean("messengerServer");
server.start();
}
}
37 changes: 37 additions & 0 deletions src/main/java/track/messenger/commands/ChatCreateCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package track.messenger.commands;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import track.messenger.messages.Message;
import track.messenger.messages.requests.ChatCreateMessage;
import track.messenger.messages.responses.StatusMessage;
import track.messenger.models.Chat;
import track.messenger.net.Session;
import track.messenger.store.MessageStore;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
@Service
public class ChatCreateCommand implements Command {

@Autowired
private MessageStore messageStore;

@Override
public void execute(Session session, Message message) {

ChatCreateMessage msg = (ChatCreateMessage) message;

Chat chat = messageStore.createChat(msg.getSenderId(), msg.getUsers(), msg.getChatName());

if (chat == null) {
session.send(new StatusMessage(StatusMessage.Status.FAIL));
} else {
session.send(new StatusMessage(StatusMessage.Status.OK));
}
}
}
40 changes: 40 additions & 0 deletions src/main/java/track/messenger/commands/ChatHistoryCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package track.messenger.commands;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import track.messenger.messages.Message;
import track.messenger.messages.requests.ChatHistoryMessage;
import track.messenger.messages.responses.ChatHistoryResultMessage;
import track.messenger.messages.responses.StatusMessage;
import track.messenger.net.Session;
import track.messenger.store.MessageStore;

import java.util.List;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
@Service
public class ChatHistoryCommand implements Command {

@Autowired
private MessageStore messageStore;

@Override
public void execute(Session session, Message message) {

ChatHistoryMessage msg = (ChatHistoryMessage) message;

List<Long> messagesIds = messageStore.getMessagesFromChat(msg.getChatId());

if (messagesIds == null) {
session.send(new StatusMessage(StatusMessage.Status.NOT_FOUND));
} else {
session.send(new ChatHistoryResultMessage(messagesIds));
}

}
}
45 changes: 45 additions & 0 deletions src/main/java/track/messenger/commands/ChatListCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package track.messenger.commands;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import track.messenger.messages.Message;
import track.messenger.messages.requests.ChatListMessage;
import track.messenger.messages.responses.ChatListResultMessage;
import track.messenger.messages.responses.StatusMessage;
import track.messenger.net.Session;
import track.messenger.store.MessageStore;

import java.util.List;
import java.util.Map;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
@Service
public class ChatListCommand implements Command {

@Autowired
private MessageStore messageStore;

@Override
public void execute(Session session, Message message) {
ChatListMessage msg = (ChatListMessage)message;

if (session.getUser() == null) {
session.send(new StatusMessage(StatusMessage.Status.FAIL));
return;
}

List<Map.Entry<Long, String>> list = messageStore.getChatsByUserId(session.getUser().getId());

if (list == null) {
session.send(new StatusMessage(StatusMessage.Status.NOT_FOUND));
} else {
session.send(new ChatListResultMessage(list));
}

}
}
16 changes: 16 additions & 0 deletions src/main/java/track/messenger/commands/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package track.messenger.commands;

import track.messenger.messages.Message;
import track.messenger.net.Session;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
public interface Command {

void execute(Session session, Message message);

}
55 changes: 55 additions & 0 deletions src/main/java/track/messenger/commands/CommandFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package track.messenger.commands;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import track.messenger.messages.Type;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
@Repository
public class CommandFactory {

private final Map<Type, Command> commandMap;

@Autowired
public CommandFactory(LoginCommand loginCommand, TextReceiveCommand textReceiveCommand, InfoCommand infoCommand,
UserCreateCommand userCreateCommand, UserListCommand userListCommand,
ChatCreateCommand chatCreateCommand, ChatHistoryCommand chatHistoryCommand,
ChatListCommand chatListCommand, TextSendCommand textSendCommand) {
Map<Type, Command> tmpCommandMap = new HashMap<>();
tmpCommandMap.put(Type.MSG_LOGIN, loginCommand);
tmpCommandMap.put(Type.MSG_INFO, infoCommand);

tmpCommandMap.put(Type.MSG_CREATE_USER, userCreateCommand);
tmpCommandMap.put(Type.MSG_USERS_LIST, userListCommand);

tmpCommandMap.put(Type.MSG_CHAT_CREATE, chatCreateCommand);
tmpCommandMap.put(Type.MSG_CHAT_HIST, chatHistoryCommand);
tmpCommandMap.put(Type.MSG_CHAT_LIST, chatListCommand);

tmpCommandMap.put(Type.MSG_TEXT, textReceiveCommand);

tmpCommandMap.put(Type.MSG_SEND_TEXT, textSendCommand);

commandMap = Collections.unmodifiableMap(tmpCommandMap);
instance = this;
}

public Command create(Type type) {
return commandMap.getOrDefault(type, null);
}

private static CommandFactory instance;

public static CommandFactory getInstance() {
return instance;
}
}
38 changes: 38 additions & 0 deletions src/main/java/track/messenger/commands/InfoCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package track.messenger.commands;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import track.messenger.messages.Message;
import track.messenger.messages.requests.InfoMessage;
import track.messenger.messages.responses.InfoResultMessage;
import track.messenger.messages.responses.StatusMessage;
import track.messenger.models.User;
import track.messenger.net.Session;
import track.messenger.store.UserStore;

/**
* Tehnotrack
* track.messenger.commands
* <p>
* Created by ilya on 11.04.17.
*/
@Service
public class InfoCommand implements Command {

@Autowired
private UserStore userStore;

@Override
public void execute(Session session, Message message) {
InfoMessage msg = (InfoMessage)message;

User user = userStore.getUserById(msg.getUserId());

if (user == null) {
session.send(new StatusMessage(StatusMessage.Status.NOT_FOUND));
} else {
session.send(new InfoResultMessage(user));
}

}
}
Loading