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