diff --git a/Hometask_6/pom.xml b/Hometask_6/pom.xml new file mode 100644 index 0000000..fad4e10 --- /dev/null +++ b/Hometask_6/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + ru.geekbrains + gb-unittest + 1.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 11 + + + + + + + + org.junit.jupiter + junit-jupiter-api + 5.7.0 + test + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + + + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.0 + test + + + log4j + log4j + 1.2.17 + + + \ No newline at end of file diff --git a/Hometask_6/src/main/java/homework_6/Task2.java b/Hometask_6/src/main/java/homework_6/Task2.java new file mode 100644 index 0000000..1838504 --- /dev/null +++ b/Hometask_6/src/main/java/homework_6/Task2.java @@ -0,0 +1,38 @@ +package homework_6; + +import java.util.Arrays; + +public class Task2 { + + public int[] getNumbersAfterLast4(int[] array){ + + int[] result; + if (array == null){ + throw new NullPointerException(); + } + if (array.length == 0){ + throw new IllegalArgumentException("The length of array could not be 0 "); + } + + int count=-1; + for (int i = 0; i < array.length; i++) { + if (array[i]==4){ + count=i; + } + } + if (count==-1){ + throw new RuntimeException(); + } + if (count==array.length-1){ + return null; + } else { + result = new int[array.length-1 - count]; + for (int i = count+1; i < array.length; i++) { + result[i-count-1] = array[i]; + } + } + System.out.println(Arrays.toString(result)); + return result; + } + +} diff --git a/Hometask_6/src/main/java/homework_6/Task_3.java b/Hometask_6/src/main/java/homework_6/Task_3.java new file mode 100644 index 0000000..a976bbc --- /dev/null +++ b/Hometask_6/src/main/java/homework_6/Task_3.java @@ -0,0 +1,25 @@ +package homework_6; + +import java.util.Arrays; + +public class Task_3 { + public boolean chekElementsOfArray( int[] array){ + if (array == null){ + throw new NullPointerException(); + } + if (array.length == 0){ + throw new IllegalArgumentException("The length of array could not be 0 "); + } + long countOfOne = Arrays.stream(array) + .filter(x->x==1) + .count(); + long countOfFour = Arrays.stream(array) + .filter(x->x==4) + .count(); + if (countOfFour==0 || countOfOne==0){ + return false; + } + return countOfFour+countOfOne == array.length; + + } +} diff --git a/Hometask_6/src/main/java/homework_6/test.java b/Hometask_6/src/main/java/homework_6/test.java new file mode 100644 index 0000000..13662cb --- /dev/null +++ b/Hometask_6/src/main/java/homework_6/test.java @@ -0,0 +1,10 @@ +package homework_6; + +public class test { + public static void main(String[] args) { + int [] a = new int[0]; + for (int i : a) { + System.out.println(i); + } + } +} diff --git a/Hometask_6/src/main/java/server/ServerChat.java b/Hometask_6/src/main/java/server/ServerChat.java new file mode 100644 index 0000000..b702f02 --- /dev/null +++ b/Hometask_6/src/main/java/server/ServerChat.java @@ -0,0 +1,97 @@ +package server; + +import org.apache.log4j.Logger; + +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Date; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + + +public class ServerChat implements Chat { + private static final Logger logger = Logger.getLogger(ServerChat.class); + private ServerSocket serverSocket; + private Set clients; + private AuthenticationService authenticationService; + + public ServerChat() { + start(); + } + + + @Override + public AuthenticationService getAuthenticationService() { + return authenticationService; + } + + private void start() { + try { + serverSocket = new ServerSocket(9998); + String startMessage = "Server started"; + logger.info(startMessage); + clients = new HashSet<>(); + authenticationService = new AuthenticationService(); + + while (true) { + + System.out.println("Server is waiting for a connection ..."); + Socket socket = serverSocket.accept(); + ClientHandler clientHandler = new ClientHandler(socket, this); + System.out.println(String.format("[%s] Client[%s] is successfully logged in", new Date(), clientHandler.getName())); + } + } catch (Exception e) { + logger.error("An error :" +e.getMessage()); + e.printStackTrace(); + } + } + + + @Override + public synchronized void broadcastMessage(String message) { + for (ClientHandler client : clients) { + client.sendMessage(message); + } + logger.info(message); + } + + @Override + public synchronized boolean isNicknameOccupied(String nickname) { + for (ClientHandler client : clients) { + if (client.getName().equals(nickname)) { + return true; + } + } + return false; + } + + @Override + public synchronized void subscribe(ClientHandler client) { + clients.add(client); + logger.info(client.getName()+ "connected to server"); + + } + + @Override + public synchronized void unsubscribe(ClientHandler client) { + clients.remove(client); + logger.info(client.getName() + "disconnected from server"); + } + @Override + public void sendPrivateMessage(String privateMessage, ClientHandler clientHandler, String destName) { + ClientHandler dest = getClientByNickname(destName); + if (Objects.nonNull(dest)){ + + dest.sendMessage(String.format("[%s private 4u] : %s", clientHandler.getName(), privateMessage)); + } else { + clientHandler.sendMessage(String.format("[%s] is offline. Cannot send message", destName)); + } + } + private ClientHandler getClientByNickname( String name){ + for (ClientHandler s : clients) { + if (s.getName().equals(name)) return s; + } + return null; + } +} diff --git a/Hometask_6/src/main/resources/log4j.properties b/Hometask_6/src/main/resources/log4j.properties new file mode 100644 index 0000000..3c3c96f --- /dev/null +++ b/Hometask_6/src/main/resources/log4j.properties @@ -0,0 +1,16 @@ +# Root logger option +log4j.rootLogger=DEBUG, stdout, file + +# Redirect log messages to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +# Redirect log messages to a log file, support file rolling. +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=logs.log +log4j.appender.file.MaxFileSize=5MB +log4j.appender.file.MaxBackupIndex=10 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/Hometask_6/src/test/java/homework_6_test/Task_2_Test.java b/Hometask_6/src/test/java/homework_6_test/Task_2_Test.java new file mode 100644 index 0000000..711a564 --- /dev/null +++ b/Hometask_6/src/test/java/homework_6_test/Task_2_Test.java @@ -0,0 +1,57 @@ +package homework_6_test; + +import homework_6.Task2; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import java.util.stream.Stream; + + +public class Task_2_Test { + private Task2 t2 = new Task2(); + + @ParameterizedTest + @MethodSource("arraysProvider1") + void shouldReturnAnArrayOfIntNumbersFollowingTheLastFour(int[] expected, int[] source) { + Assertions.assertArrayEquals(expected, t2.getNumbersAfterLast4(source)); + } + @ParameterizedTest + @MethodSource("arraysProvider2") + void shouldReturnNullIfDigit4IsTheLastElementOfSourceArray(int[] expected, int[] source) { + Assertions.assertArrayEquals(expected, t2.getNumbersAfterLast4(source)); + } + + @Test + void shouldThrowNullPointerExceptionWhenInputIsNull(){ + Assertions.assertThrows(NullPointerException.class,()-> t2.getNumbersAfterLast4(null)); + } + @Test + void shouldIllegalArgumentExceptionWhenInputArrayContainsNoElements(){ + Assertions.assertThrows(IllegalArgumentException.class,()-> t2.getNumbersAfterLast4(new int[0])); + } + @Test + void shouldThrowRuntimeExceptionWhenInputArrayDoesNotContainDigit4(){ + Assertions.assertThrows(RuntimeException.class,()-> t2.getNumbersAfterLast4(new int[]{1,2,3,5,6})); + } + + private static Stream arraysProvider1() { + return Stream.of( + Arguments.arguments(new int[]{1, 7},new int[]{1,2,4,4,2,3,4,1,7}), + Arguments.arguments(null, new int[]{1,4}), + Arguments.arguments(null, new int[]{4}), + Arguments.arguments(new int[]{1}, new int[]{4,1}), + Arguments.arguments(new int[]{3,3,3,3,3,3,5}, new int[]{4,1,4,3,3,3,3,3,3,5}) + + ); + } + private static Stream arraysProvider2() { + return Stream.of( + Arguments.arguments(null, new int[]{1,4}), + Arguments.arguments(null, new int[]{4}), + Arguments.arguments(null, new int[]{1,2,3,3,3,3,3,3,4}) + + ); + } +} diff --git a/Hometask_6/src/test/java/homework_6_test/Task_3_Test.java b/Hometask_6/src/test/java/homework_6_test/Task_3_Test.java new file mode 100644 index 0000000..ab82757 --- /dev/null +++ b/Hometask_6/src/test/java/homework_6_test/Task_3_Test.java @@ -0,0 +1,39 @@ +package homework_6_test; + +import homework_6.Task_3; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +public class Task_3_Test { + Task_3 t3 = new Task_3(); + + @ParameterizedTest + @MethodSource("resultProvider") + void shouldCheckIfArrayContainsOnlyNumbers1and4(boolean expected, int[] source) { + Assertions.assertEquals(expected, t3.chekElementsOfArray(source)); + } + + @Test + void shouldThrowNullPointerExceptionWhenInputIsNull() { + Assertions.assertThrows(NullPointerException.class, () -> t3.chekElementsOfArray(null)); + } + @Test + void shouldIllegalArgumentExceptionWhenInputArrayContainsNoElements(){ + Assertions.assertThrows(IllegalArgumentException.class,()-> t3.chekElementsOfArray(new int[0])); + } + + private static Stream resultProvider() { + return Stream.of( + Arguments.arguments(true, new int[]{1, 1, 1, 4, 4, 1, 4, 4}), + Arguments.arguments(false, new int[]{1, 1, 1, 1, 1, 1}), + Arguments.arguments(false, new int[]{4, 4, 4, 4}), + Arguments.arguments(false, new int[]{1, 4, 4, 1, 1, 4, 3}) + + ); + } +} diff --git a/Hometask_6/target/classes/log4j.properties b/Hometask_6/target/classes/log4j.properties new file mode 100644 index 0000000..3c3c96f --- /dev/null +++ b/Hometask_6/target/classes/log4j.properties @@ -0,0 +1,16 @@ +# Root logger option +log4j.rootLogger=DEBUG, stdout, file + +# Redirect log messages to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +# Redirect log messages to a log file, support file rolling. +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=logs.log +log4j.appender.file.MaxFileSize=5MB +log4j.appender.file.MaxBackupIndex=10 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/Hometask_6/target/maven-status/maven-compiler-plugin/compile/default-cli/inputFiles.lst b/Hometask_6/target/maven-status/maven-compiler-plugin/compile/default-cli/inputFiles.lst new file mode 100644 index 0000000..e69de29