From 906ab79b4b68781b306b7b5ed1429d045492d733 Mon Sep 17 00:00:00 2001 From: maklakovss Date: Tue, 25 Sep 2018 23:35:47 +0500 Subject: [PATCH 1/5] dz2 create database --- build.gradle | 7 ++++-- .../java2/lesson8/BaseAuthService.java | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 96b7dd7..6424313 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ apply plugin: 'java' apply plugin: 'idea' -/* + // In this section you declare where to find the dependencies of your project repositories { // Use 'jcenter' for resolving your dependencies. @@ -23,6 +23,9 @@ repositories { dependencies { // The production code uses the SLF4J logging API at compile time compile 'org.slf4j:slf4j-api:1.7.22' + + compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.7.2' + // Declare the dependency for your favourite test framework you want to use in your tests. // TestNG is also supported by the Gradle Test task. Just change the @@ -30,4 +33,4 @@ dependencies { // 'test.useTestNG()' to your build script. testCompile 'junit:junit:4.12' } -*/ + diff --git a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java index 3415d24..8e01e36 100644 --- a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java @@ -1,5 +1,11 @@ package com.batiaev.java2.lesson8; +import org.sqlite.JDBC; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; @@ -35,12 +41,29 @@ public String getNick() { } private List entries; + private Connection conn; + + private final String DB_PATH = "C:\\dev\\java\\desktop\\coursejava2\\users.db"; + public BaseAuthService() { init(); } public int init() { + + try { + Class.forName("org.sqlite.JDBC"); + conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); + Statement stmt = conn.createStatement(); + boolean result = stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); + System.out.println(result); + } catch (SQLException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + entries = new ArrayList<>(); entries.add(new Entry("login1", "pass1", "nick1")); entries.add(new Entry("login2", "pass2", "nick2")); From 5bc7462de2cff2e583b01deb083304d22b4dd0c7 Mon Sep 17 00:00:00 2001 From: maklakovss Date: Tue, 25 Sep 2018 23:48:31 +0500 Subject: [PATCH 2/5] dz2 add default users --- .../java2/lesson8/BaseAuthService.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java index 8e01e36..8c28ee1 100644 --- a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java @@ -2,10 +2,7 @@ import org.sqlite.JDBC; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; +import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -56,8 +53,22 @@ public int init() { Class.forName("org.sqlite.JDBC"); conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); Statement stmt = conn.createStatement(); - boolean result = stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); - System.out.println(result); + stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); + stmt.execute("DELETE FROM users"); + PreparedStatement insert = conn.prepareStatement("INSERT INTO USERS (login,password,nick) VALUES(?,?,?)"); + insert.setString(1,"login1"); + insert.setString(2,"pass1"); + insert.setString(3,"nick1"); + insert.addBatch(); + insert.setString(1,"login2"); + insert.setString(2,"pass2"); + insert.setString(3,"nick2"); + insert.addBatch(); + insert.setString(1,"login3"); + insert.setString(2,"pass3"); + insert.setString(3,"nick3"); + insert.addBatch(); + insert.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { From 0eca37be8f112505f4866320826036989f77f768 Mon Sep 17 00:00:00 2001 From: Maklakov Sergey Date: Wed, 26 Sep 2018 11:26:24 +0500 Subject: [PATCH 3/5] users in DB --- .../batiaev/java2/lesson8/AuthService.java | 2 +- .../java2/lesson8/BaseAuthService.java | 191 +++++++++++++----- .../batiaev/java2/lesson8/ClientHandler.java | 2 +- 3 files changed, 142 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/batiaev/java2/lesson8/AuthService.java b/src/main/java/com/batiaev/java2/lesson8/AuthService.java index f04c5a7..5277b32 100644 --- a/src/main/java/com/batiaev/java2/lesson8/AuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/AuthService.java @@ -12,5 +12,5 @@ public interface AuthService { boolean login(String login, String pass); - boolean contains(String userName); + boolean contains(String nick, String userName); } diff --git a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java index 8c28ee1..062e38e 100644 --- a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java @@ -1,6 +1,6 @@ package com.batiaev.java2.lesson8; -import org.sqlite.JDBC; +//import org.sqlite.JDBC; import java.sql.*; import java.util.ArrayList; @@ -13,73 +13,108 @@ * @since 06/11/17 */ public class BaseAuthService implements AuthService { - private class Entry { - private String login; - private String password; - private String nick; - - public Entry(String login, String password, String nick) { - this.login = login; - this.password = password; - this.nick = nick; - } - - public String getLogin() { - return login; - } - - public String getPassword() { - return password; - } - - public String getNick() { - return nick; - } - } + private final String DB_PATH = "C:\\dev\\java\\desktop\\coursejava2\\users.db"; private List entries; private Connection conn; - - private final String DB_PATH = "C:\\dev\\java\\desktop\\coursejava2\\users.db"; - + private PreparedStatement addUserStatement; + private PreparedStatement selectUsersStatement; + private PreparedStatement updateNickStatement; + private PreparedStatement updatePasswordStatement; + private PreparedStatement deleteUserStatement; public BaseAuthService() { init(); } - public int init() { + public void init() { try { Class.forName("org.sqlite.JDBC"); - conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); + //conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); Statement stmt = conn.createStatement(); stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); - stmt.execute("DELETE FROM users"); - PreparedStatement insert = conn.prepareStatement("INSERT INTO USERS (login,password,nick) VALUES(?,?,?)"); - insert.setString(1,"login1"); - insert.setString(2,"pass1"); - insert.setString(3,"nick1"); - insert.addBatch(); - insert.setString(1,"login2"); - insert.setString(2,"pass2"); - insert.setString(3,"nick2"); - insert.addBatch(); - insert.setString(1,"login3"); - insert.setString(2,"pass3"); - insert.setString(3,"nick3"); - insert.addBatch(); - insert.executeBatch(); + + selectUsersStatement = conn.prepareStatement("SELECT login, password, nick FROM USERS WHERE nick = ?"); + addUserStatement = conn.prepareStatement("INSERT INTO USERS (login,password,nick) VALUES(?,?,?)"); + updateNickStatement = conn.prepareStatement("update USERS SET nick = ? WHERE login = ?"); + updatePasswordStatement = conn.prepareStatement("update USERS SET password = ? WHERE login = ?"); + deleteUserStatement = conn.prepareStatement("DELETE FROM USERS WHERE login=?"); + + loadUsersFromDB(); + + if (entries.size() == 0) { + for (int i = 0; i < 3; i++) { + addLogin("login" + i, "pass" + i, "nick" + i); + } + } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } + } + + private void addLogin(String login, String password, String nick) { + if (!contains(nick, login)) { + Entry entry = new Entry(login, password, nick); + try { + addUserStatement.setString(1, login); + addUserStatement.setString(2, password); + addUserStatement.setString(3, nick); + addUserStatement.execute(); + entries.add(entry); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + private void deleteUser(String login) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + deleteUserStatement.setString(1, login); + deleteUserStatement.execute(); + entries.remove(entry); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void updatePassword(String login, String password) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + updatePasswordStatement.setString(1, password); + updatePasswordStatement.setString(2, login); + updatePasswordStatement.execute(); + entry.setPassword(password); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + } - entries = new ArrayList<>(); - entries.add(new Entry("login1", "pass1", "nick1")); - entries.add(new Entry("login2", "pass2", "nick2")); - entries.add(new Entry("login3", "pass3", "nick3")); - return entries.size(); + private void updateNick(String login, String nick) { + try { + for (Entry entry : entries) { + if (entry.getLogin().equals(login)) { + updateNickStatement.setString(1, nick); + updateNickStatement.setString(2, login); + updateNickStatement.execute(); + entry.setNick(nick); + break; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } } @Override @@ -99,12 +134,66 @@ public boolean login(String login, String pass) { } @Override - public boolean contains(String userName) { + public boolean contains(String nick, String userName) { if (userName == null || userName.trim().isEmpty()) return false; + if (nick == null || nick.trim().isEmpty()) return false; for (Entry e : entries) { - if (userName.equals(e.getNick())) return true; + if (userName.equals(e.getLogin())) return true; + if (nick.equals(e.getNick())) return true; } return false; } + + private void loadUsersFromDB() { + if (entries == null) { + entries = new ArrayList<>(); + } else { + entries.clear(); + } + + try { + ResultSet rs = selectUsersStatement.executeQuery(); + while (rs.next()) { + String login = rs.getString(1); + String password = rs.getString(2); + String nick = rs.getString(3); + entries.add(new Entry(login, password, nick)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private class Entry { + private String login; + private String password; + private String nick; + + public Entry(String login, String password, String nick) { + this.login = login; + this.password = password; + this.nick = nick; + } + + public String getLogin() { + return login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + } } diff --git a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java index 9f975a4..b10e7a8 100644 --- a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java +++ b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java @@ -61,7 +61,7 @@ public void run() { } private boolean isUserExist(String userName) { - return server.getAuthService().contains(userName); + return server.getAuthService().contains(nick, userName); } private void sendPersonalMessage(String user, String message) { From 1463d445467149366b5655315be13ac92a261b0b Mon Sep 17 00:00:00 2001 From: Maklakov Sergey Date: Wed, 26 Sep 2018 18:07:59 +0500 Subject: [PATCH 4/5] change nick --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- .../batiaev/java2/lesson8/AuthService.java | 4 +++- .../java2/lesson8/BaseAuthService.java | 24 ++++++++++++------- .../batiaev/java2/lesson8/ClientHandler.java | 21 +++++++++++++++- .../com/batiaev/java2/lesson8/Command.java | 3 ++- .../com/batiaev/java2/lesson8/MyServer.java | 12 ++++++---- 6 files changed, 51 insertions(+), 17 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2bb29e6..e2fb696 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 25 22:22:22 MSK 2017 +#Wed Sep 26 15:18:39 YEKT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip diff --git a/src/main/java/com/batiaev/java2/lesson8/AuthService.java b/src/main/java/com/batiaev/java2/lesson8/AuthService.java index 5277b32..c953ef8 100644 --- a/src/main/java/com/batiaev/java2/lesson8/AuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/AuthService.java @@ -12,5 +12,7 @@ public interface AuthService { boolean login(String login, String pass); - boolean contains(String nick, String userName); + boolean contains(String nick); + + void changeNick(String login, String newNick); } diff --git a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java index 062e38e..0395e80 100644 --- a/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java +++ b/src/main/java/com/batiaev/java2/lesson8/BaseAuthService.java @@ -1,6 +1,6 @@ package com.batiaev.java2.lesson8; -//import org.sqlite.JDBC; +import org.sqlite.JDBC; import java.sql.*; import java.util.ArrayList; @@ -31,11 +31,11 @@ public void init() { try { Class.forName("org.sqlite.JDBC"); - //conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); + conn = DriverManager.getConnection(JDBC.PREFIX + DB_PATH); Statement stmt = conn.createStatement(); stmt.execute("CREATE TABLE IF NOT EXISTS users (login VARCHAR (50) UNIQUE NOT NULL PRIMARY KEY, password VARCHAR (250), nick VARCHAR (250) UNIQUE NOT NULL)"); - selectUsersStatement = conn.prepareStatement("SELECT login, password, nick FROM USERS WHERE nick = ?"); + selectUsersStatement = conn.prepareStatement("SELECT login, password, nick FROM USERS"); addUserStatement = conn.prepareStatement("INSERT INTO USERS (login,password,nick) VALUES(?,?,?)"); updateNickStatement = conn.prepareStatement("update USERS SET nick = ? WHERE login = ?"); updatePasswordStatement = conn.prepareStatement("update USERS SET password = ? WHERE login = ?"); @@ -56,7 +56,7 @@ public void init() { } private void addLogin(String login, String password, String nick) { - if (!contains(nick, login)) { + if (!contains(nick) && !containsLogin(login)) { Entry entry = new Entry(login, password, nick); try { addUserStatement.setString(1, login); @@ -101,7 +101,8 @@ private void updatePassword(String login, String password) { } } - private void updateNick(String login, String nick) { + @Override + public void changeNick(String login, String nick) { try { for (Entry entry : entries) { if (entry.getLogin().equals(login)) { @@ -134,17 +135,24 @@ public boolean login(String login, String pass) { } @Override - public boolean contains(String nick, String userName) { - if (userName == null || userName.trim().isEmpty()) return false; + public boolean contains(String nick) { if (nick == null || nick.trim().isEmpty()) return false; for (Entry e : entries) { - if (userName.equals(e.getLogin())) return true; if (nick.equals(e.getNick())) return true; } return false; } + private boolean containsLogin(String userName) { + if (userName == null || userName.trim().isEmpty()) return false; + + for (Entry e : entries) { + if (userName.equals(e.getLogin())) return true; + } + return false; + } + private void loadUsersFromDB() { if (entries == null) { entries = new ArrayList<>(); diff --git a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java index b10e7a8..9dbea35 100644 --- a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java +++ b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java @@ -21,6 +21,7 @@ public class ClientHandler extends Thread implements Closeable { private DataOutputStream out; private DataInputStream in; private String name = "unknown"; + private String login = ""; private boolean isAuth = false; private LocalDateTime connectTime = LocalDateTime.now(); @@ -48,6 +49,8 @@ public void run() { sendPrivateMessage(msg); } else if (msg.startsWith(Command.CHAT_MESSAGE.getText() + " ")) { sendChatMessage(msg); + } else if (msg.startsWith(Command.CHANGE_NICK.getText() + " ")) { + changeNick(msg); } } else { sendBroadcastMessage(name + " написал: " + msg); @@ -60,8 +63,24 @@ public void run() { System.out.println("Client disconnected"); } + private void changeNick(String msg) { + if(login.equals("")){ + return; + } + String newNick = msg.substring(Command.CHANGE_NICK.getText().length()).trim(); + + String userName = newNick; + if (isUserExist(userName)) { + sendMessage("Ник не изменен! '" + newNick + "' - уже занят"); + } else { + name = newNick; + server.changeNick(login, newNick); + sendMessage("Ник изменен на '" + newNick + "'!"); + } + } + private boolean isUserExist(String userName) { - return server.getAuthService().contains(nick, userName); + return server.getAuthService().contains(userName); } private void sendPersonalMessage(String user, String message) { diff --git a/src/main/java/com/batiaev/java2/lesson8/Command.java b/src/main/java/com/batiaev/java2/lesson8/Command.java index 878c971..2e17b38 100644 --- a/src/main/java/com/batiaev/java2/lesson8/Command.java +++ b/src/main/java/com/batiaev/java2/lesson8/Command.java @@ -11,7 +11,8 @@ public enum Command { AUTHOK_COMMAND("/authok"), DISCONNECTED("/disconnected"), PRIVATE_MESSAGE("/w"), - CHAT_MESSAGE("/clients"); + CHAT_MESSAGE("/clients"), + CHANGE_NICK("/nick"); public String getText() { return text; diff --git a/src/main/java/com/batiaev/java2/lesson8/MyServer.java b/src/main/java/com/batiaev/java2/lesson8/MyServer.java index aeb6d46..a638963 100644 --- a/src/main/java/com/batiaev/java2/lesson8/MyServer.java +++ b/src/main/java/com/batiaev/java2/lesson8/MyServer.java @@ -21,10 +21,6 @@ public class MyServer { private final List clients = Collections.synchronizedList(new ArrayList<>()); private AuthService authService; - public static void main(String[] args) { - new MyServer(new BaseAuthService()); - } - private MyServer(AuthService authService) { this.authService = authService; @@ -53,6 +49,10 @@ private MyServer(AuthService authService) { } } + public static void main(String[] args) { + new MyServer(new BaseAuthService()); + } + private void startKiller() { new Thread(() -> { while (true) { @@ -94,4 +94,8 @@ void sendPrivateMessage(String from, String userName, String message) { c.sendMessage(from + " написал лично " + userName + ": " + message); } } + + public void changeNick(String login, String newNick) { + authService.changeNick(login, newNick); + } } From 38a6e79e9fa00259ca5f86bb6e0e19e20c0f9e9b Mon Sep 17 00:00:00 2001 From: maklakovss Date: Wed, 26 Sep 2018 22:54:59 +0500 Subject: [PATCH 5/5] dz2 add login --- src/main/java/com/batiaev/java2/lesson8/ClientHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java index 9dbea35..f542ef8 100644 --- a/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java +++ b/src/main/java/com/batiaev/java2/lesson8/ClientHandler.java @@ -146,6 +146,7 @@ private void userAuth(String msg) { name = server.getAuthService().getNick(data[1], data[2]); if (name != null) { sendMessage("/authok " + name); + login = data[1]; isAuth = true; sendBroadcastMessage(name + " зашел в чат!"); } else {