From 6424a3723660855866bc3231dbd1c25acca6dd5f Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Fri, 3 Mar 2017 22:20:02 +0300 Subject: [PATCH 01/11] jhb --- src/main/java/track/lessons/lesson1/HelloWorld.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/track/lessons/lesson1/HelloWorld.java b/src/main/java/track/lessons/lesson1/HelloWorld.java index af1b38a2..e4934132 100755 --- a/src/main/java/track/lessons/lesson1/HelloWorld.java +++ b/src/main/java/track/lessons/lesson1/HelloWorld.java @@ -1,4 +1,4 @@ -package lessons.lesson1; +package track.lessons.lesson1; /** * From 1b313d39a43dac0a8dc145743ce3b275d973244e Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Fri, 3 Mar 2017 22:24:49 +0300 Subject: [PATCH 02/11] Added OWNER --- OWNER.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 OWNER.md diff --git a/OWNER.md b/OWNER.md new file mode 100644 index 00000000..ecd47806 --- /dev/null +++ b/OWNER.md @@ -0,0 +1 @@ +Tsoy Alexander Vladimirovich, CA-11 From f0c9b1e7f1c8713a7218fb1b688e5975f1df7d3d Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Fri, 3 Mar 2017 23:27:15 +0300 Subject: [PATCH 03/11] count words 1st solution --- .../track/lessons/lesson1/CountWords.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/track/lessons/lesson1/CountWords.java b/src/main/java/track/lessons/lesson1/CountWords.java index 66ca28dc..6d1ccb7b 100644 --- a/src/main/java/track/lessons/lesson1/CountWords.java +++ b/src/main/java/track/lessons/lesson1/CountWords.java @@ -1,6 +1,7 @@ package track.lessons.lesson1; import java.io.File; +import java.util.Scanner; /** * Задание 1: Реализовать два метода @@ -31,7 +32,17 @@ public class CountWords { * @return - целое число - сумма всех чисел из файла */ public long countNumbers(File file) throws Exception { - return 0; + Scanner s = new Scanner(file); + int count = 0; + while (s.hasNext()) { + if (s.hasNextInt()) { + count += s.nextInt(); + s.nextLine(); + } else { + s.nextLine(); + } + } + return count; } @@ -43,7 +54,19 @@ public long countNumbers(File file) throws Exception { * @return - результирующая строка */ public String concatWords(File file) throws Exception { - return null; + Scanner s = new Scanner(file); + String str = ""; + while (s.hasNext()) { + if (s.hasNextInt()) { + s.nextLine(); + } else { + String next = s.nextLine(); + if (!next.equals("")) + str += next + " "; + } + } + str = str.trim(); + return str; } } From c895e7b26e40e3aa40135389bb1e7a87b403485d Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Tue, 14 Mar 2017 17:44:43 +0300 Subject: [PATCH 04/11] added string builder --- .../track/lessons/lesson1/CountWords.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/track/lessons/lesson1/CountWords.java b/src/main/java/track/lessons/lesson1/CountWords.java index 6d1ccb7b..5645528c 100644 --- a/src/main/java/track/lessons/lesson1/CountWords.java +++ b/src/main/java/track/lessons/lesson1/CountWords.java @@ -32,14 +32,14 @@ public class CountWords { * @return - целое число - сумма всех чисел из файла */ public long countNumbers(File file) throws Exception { - Scanner s = new Scanner(file); + Scanner scan = new Scanner(file); int count = 0; - while (s.hasNext()) { - if (s.hasNextInt()) { - count += s.nextInt(); - s.nextLine(); + while (scan.hasNext()) { + if (scan.hasNextInt()) { + count += scan.nextInt(); + scan.nextLine(); } else { - s.nextLine(); + scan.nextLine(); } } return count; @@ -54,19 +54,19 @@ public long countNumbers(File file) throws Exception { * @return - результирующая строка */ public String concatWords(File file) throws Exception { - Scanner s = new Scanner(file); - String str = ""; - while (s.hasNext()) { - if (s.hasNextInt()) { - s.nextLine(); + Scanner scan = new Scanner(file); + StringBuilder strbld = new StringBuilder(); + while (scan.hasNext()) { + if (scan.hasNextInt()) { + scan.nextLine(); } else { - String next = s.nextLine(); - if (!next.equals("")) - str += next + " "; + String next = scan.nextLine(); + if (!next.equals("")) { + strbld.append(next + " "); + } } } - str = str.trim(); - return str; + return strbld.toString().trim(); } } From 795a25793488263970b79388cc85f674a2eedb46 Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Tue, 14 Mar 2017 17:55:48 +0300 Subject: [PATCH 05/11] fixed int --- src/main/java/track/lessons/lesson1/CountWords.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/track/lessons/lesson1/CountWords.java b/src/main/java/track/lessons/lesson1/CountWords.java index 5645528c..e73c4624 100644 --- a/src/main/java/track/lessons/lesson1/CountWords.java +++ b/src/main/java/track/lessons/lesson1/CountWords.java @@ -33,7 +33,7 @@ public class CountWords { */ public long countNumbers(File file) throws Exception { Scanner scan = new Scanner(file); - int count = 0; + long count = 0; while (scan.hasNext()) { if (scan.hasNextInt()) { count += scan.nextInt(); From 8485d266ef7d3bdc3cbd6c642b9d52f21cffc5c2 Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Thu, 16 Mar 2017 04:19:26 +0300 Subject: [PATCH 06/11] solved task, added tests --- .../track/lessons/lesson3/MyArrayList.java | 31 +++- .../track/lessons/lesson3/MyLinkedList.java | 102 +++++++++++- .../java/track/lessons/lesson3/Queue.java | 6 + .../java/track/lessons/lesson3/Stack.java | 6 + .../lessons/lesson3/MyLinkedListTest.java | 146 ++++++++++++++++++ 5 files changed, 281 insertions(+), 10 deletions(-) create mode 100644 src/main/java/track/lessons/lesson3/Queue.java create mode 100644 src/main/java/track/lessons/lesson3/Stack.java diff --git a/src/main/java/track/lessons/lesson3/MyArrayList.java b/src/main/java/track/lessons/lesson3/MyArrayList.java index ce723809..a7e3fc4a 100644 --- a/src/main/java/track/lessons/lesson3/MyArrayList.java +++ b/src/main/java/track/lessons/lesson3/MyArrayList.java @@ -11,31 +11,50 @@ */ public class MyArrayList extends List { - public MyArrayList() { + int[] array; + public MyArrayList() { + array = new int[0]; } public MyArrayList(int capacity) { - + array = new int[capacity]; } @Override void add(int item) { - + int[] temp = new int[array.length + 1]; + System.arraycopy(array,0,temp,0,array.length); + temp[temp.length - 1] = item; + array = temp; } @Override int remove(int idx) throws NoSuchElementException { - return 0; + if (idx >= array.length || idx < 0) { + throw new NoSuchElementException(); + } else { + int removed; + removed = array[idx]; + int[] temp = new int[array.length - 1]; + System.arraycopy(array,0,temp,0,idx); + System.arraycopy(array, idx + 1, temp, idx, temp.length - idx); + array = temp; + return removed; + } } @Override int get(int idx) throws NoSuchElementException { - return 0; + if (idx >= array.length || idx < 0) { + throw new NoSuchElementException(); + } else { + return array[idx]; + } } @Override int size() { - return 0; + return array.length; } } diff --git a/src/main/java/track/lessons/lesson3/MyLinkedList.java b/src/main/java/track/lessons/lesson3/MyLinkedList.java index 3478df6e..c4127f57 100644 --- a/src/main/java/track/lessons/lesson3/MyLinkedList.java +++ b/src/main/java/track/lessons/lesson3/MyLinkedList.java @@ -6,7 +6,7 @@ * Должен наследовать List * Односвязный список */ -public class MyLinkedList extends List { +public class MyLinkedList extends List implements Stack, Queue { /** * private - используется для сокрытия этого класса от других. @@ -26,22 +26,116 @@ private static class Node { } } + private Node head; + private Node tail; + private int counter = 0; + + @Override + public void push(int value) { + add(value); + } + + @Override + public int pop() { + if (head == null) { + throw new NoSuchElementException(); + } + final int returnval = head.val; + head = head.prev; + if (head != null) { + head.next = null; + } else { + tail = null; + } + counter--; + return returnval; + } + + @Override + public void enqueue(int value) { + add(value); + } + + @Override + public int dequeue() { + if (head == null) { + throw new NoSuchElementException(); + } + final int returnval = tail.val; + tail = tail.next; + if (tail != null) { + tail.prev = null; + } else { + head = null; + } + counter--; + return returnval; + } + @Override void add(int item) { + if (head == null) { + head = new Node(null,null,item); + tail = head; + counter = 1; + } else { + head.next = new Node(head,null,item); + head = head.next; + counter++; + } } @Override int remove(int idx) throws NoSuchElementException { - return 0; + if (idx >= counter || idx < 0) { + throw new NoSuchElementException(); + } else { + Node current = tail; + for (int i = 0; i < idx; i++) { + current = current.next; + } + final int returnval = current.val; + if (current.prev != null) { + current.prev.next = current.next; + } else { + tail = current.next; + if (tail != null) { + tail.prev = null; + } else { + head = null; + } + } + if (current.next != null) { + current.next.prev = current.prev; + } else { + head = current.prev; + if (head != null) { + head.next = null; + } else { + tail = null; + } + } + counter--; + return returnval; + } } @Override int get(int idx) throws NoSuchElementException { - return 0; + if (idx >= counter || idx < 0) { + throw new NoSuchElementException(); + } else { + Node current = tail; + for (int i = 0; i < idx; i++) { + current = current.next; + } + int returnval = current.val; + return returnval; + } } @Override int size() { - return 0; + return counter; } } diff --git a/src/main/java/track/lessons/lesson3/Queue.java b/src/main/java/track/lessons/lesson3/Queue.java new file mode 100644 index 00000000..3c7a5a6c --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Queue.java @@ -0,0 +1,6 @@ +package track.lessons.lesson3; + +public interface Queue { + void enqueue(int value); + int dequeue(); +} diff --git a/src/main/java/track/lessons/lesson3/Stack.java b/src/main/java/track/lessons/lesson3/Stack.java new file mode 100644 index 00000000..d1635802 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Stack.java @@ -0,0 +1,6 @@ +package track.lessons.lesson3; + +public interface Stack { + void push(int value); + int pop(); +} diff --git a/src/test/java/track/lessons/lesson3/MyLinkedListTest.java b/src/test/java/track/lessons/lesson3/MyLinkedListTest.java index ce7042eb..142ceb31 100644 --- a/src/test/java/track/lessons/lesson3/MyLinkedListTest.java +++ b/src/test/java/track/lessons/lesson3/MyLinkedListTest.java @@ -1,6 +1,8 @@ package track.lessons.lesson3; +import java.util.LinkedList; import java.util.NoSuchElementException; +import java.util.Random; import org.junit.Assert; import org.junit.Test; @@ -56,4 +58,148 @@ public void listRemove() throws Exception { Assert.assertTrue(list.size() == 0); } + + @Test(expected = NoSuchElementException.class) + public void emptyQueue() throws Exception { + Queue queue = new MyLinkedList(); + queue.dequeue(); + } + + @Test(expected = NoSuchElementException.class) + public void emptyStack() throws Exception { + Stack stack = new MyLinkedList(); + stack.pop(); + } + + @Test + public void queueAddRemove() throws Exception { + Queue queue = new MyLinkedList(); + queue.enqueue(1); + queue.enqueue(2); + queue.enqueue(3); + + Assert.assertEquals(1, queue.dequeue()); + Assert.assertEquals(2, queue.dequeue()); + Assert.assertEquals(3, queue.dequeue()); + } + + @Test + public void stackAddRemove() throws Exception { + Stack stack = new MyLinkedList(); + stack.push(1); + stack.push(2); + stack.push(3); + + Assert.assertEquals(3, stack.pop()); + Assert.assertEquals(2, stack.pop()); + Assert.assertEquals(1, stack.pop()); + } + + private void queueTestNOperations(int n) + { + MyLinkedList queue = new MyLinkedList(); + Random r=new Random(); + LinkedList goodQueue=new LinkedList(); + int num; + for(int i=0;i goodStack=new LinkedList(); + int num; + for(int i=0;i Date: Thu, 16 Mar 2017 04:33:27 +0300 Subject: [PATCH 07/11] fixed style --- src/main/java/track/lessons/lesson3/Queue.java | 3 +++ src/main/java/track/lessons/lesson3/Stack.java | 3 +++ src/test/java/track/lessons/lesson1/CountWordsTest.java | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/track/lessons/lesson3/Queue.java b/src/main/java/track/lessons/lesson3/Queue.java index 3c7a5a6c..55aa4453 100644 --- a/src/main/java/track/lessons/lesson3/Queue.java +++ b/src/main/java/track/lessons/lesson3/Queue.java @@ -1,6 +1,9 @@ package track.lessons.lesson3; public interface Queue { + void enqueue(int value); + int dequeue(); + } diff --git a/src/main/java/track/lessons/lesson3/Stack.java b/src/main/java/track/lessons/lesson3/Stack.java index d1635802..a11c808b 100644 --- a/src/main/java/track/lessons/lesson3/Stack.java +++ b/src/main/java/track/lessons/lesson3/Stack.java @@ -1,6 +1,9 @@ package track.lessons.lesson3; public interface Stack { + void push(int value); + int pop(); + } diff --git a/src/test/java/track/lessons/lesson1/CountWordsTest.java b/src/test/java/track/lessons/lesson1/CountWordsTest.java index 51c6fab5..da80f55f 100644 --- a/src/test/java/track/lessons/lesson1/CountWordsTest.java +++ b/src/test/java/track/lessons/lesson1/CountWordsTest.java @@ -4,6 +4,7 @@ import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; /** @@ -18,13 +19,14 @@ public static void init() { file = new File("words.txt"); } - + @Ignore @Test public void countNumbers() throws Exception { CountWords countWords = new CountWords(); Assert.assertEquals(42, countWords.countNumbers(file)); } + @Ignore @Test public void concatWords() throws Exception { CountWords countWords = new CountWords(); From 4830572e795fc2c7118a6e5ebb026dca8edc0c5c Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Mon, 20 Mar 2017 05:37:16 +0300 Subject: [PATCH 08/11] fixed initial array capacity, added resizing, fixed pop/dequeue operations --- .../track/lessons/lesson3/MyArrayList.java | 41 ++++++---- .../track/lessons/lesson3/MyLinkedList.java | 79 ++++++++----------- 2 files changed, 56 insertions(+), 64 deletions(-) diff --git a/src/main/java/track/lessons/lesson3/MyArrayList.java b/src/main/java/track/lessons/lesson3/MyArrayList.java index a7e3fc4a..933f2709 100644 --- a/src/main/java/track/lessons/lesson3/MyArrayList.java +++ b/src/main/java/track/lessons/lesson3/MyArrayList.java @@ -4,7 +4,7 @@ /** * Должен наследовать List - * + *

* Должен иметь 2 конструктора * - без аргументов - создает внутренний массив дефолтного размера на ваш выбор * - с аргументом - начальный размер массива @@ -12,9 +12,11 @@ public class MyArrayList extends List { int[] array; + int length; + static final int DEFAULT_CAPACITY = 10; public MyArrayList() { - array = new int[0]; + array = new int[DEFAULT_CAPACITY]; } public MyArrayList(int capacity) { @@ -23,30 +25,35 @@ public MyArrayList(int capacity) { @Override void add(int item) { - int[] temp = new int[array.length + 1]; - System.arraycopy(array,0,temp,0,array.length); - temp[temp.length - 1] = item; - array = temp; + if (length > 0.5 * array.length || array.length == 0) { + int[] temp = new int[2 * length + 1]; + System.arraycopy(array, 0, temp, 0, length); + temp[length] = item; + array = temp; + } + array[length] = item; + length++; } @Override int remove(int idx) throws NoSuchElementException { - if (idx >= array.length || idx < 0) { + if (idx >= length || idx < 0) { throw new NoSuchElementException(); - } else { - int removed; - removed = array[idx]; - int[] temp = new int[array.length - 1]; - System.arraycopy(array,0,temp,0,idx); - System.arraycopy(array, idx + 1, temp, idx, temp.length - idx); - array = temp; - return removed; } + if (length < 0.25 * array.length) { + int[] temp = new int[length * 2]; + System.arraycopy(temp, 0, array, 0, length); + } + int removed; + removed = array[idx]; + System.arraycopy(array, idx + 1, array, idx, length - idx - 1); + length--; + return removed; } @Override int get(int idx) throws NoSuchElementException { - if (idx >= array.length || idx < 0) { + if (idx >= length || idx < 0) { throw new NoSuchElementException(); } else { return array[idx]; @@ -55,6 +62,6 @@ int get(int idx) throws NoSuchElementException { @Override int size() { - return array.length; + return length; } } diff --git a/src/main/java/track/lessons/lesson3/MyLinkedList.java b/src/main/java/track/lessons/lesson3/MyLinkedList.java index c4127f57..6a2f3e13 100644 --- a/src/main/java/track/lessons/lesson3/MyLinkedList.java +++ b/src/main/java/track/lessons/lesson3/MyLinkedList.java @@ -37,18 +37,7 @@ public void push(int value) { @Override public int pop() { - if (head == null) { - throw new NoSuchElementException(); - } - final int returnval = head.val; - head = head.prev; - if (head != null) { - head.next = null; - } else { - tail = null; - } - counter--; - return returnval; + return remove(counter - 1); } @Override @@ -58,28 +47,17 @@ public void enqueue(int value) { @Override public int dequeue() { - if (head == null) { - throw new NoSuchElementException(); - } - final int returnval = tail.val; - tail = tail.next; - if (tail != null) { - tail.prev = null; - } else { - head = null; - } - counter--; - return returnval; + return remove(0); } @Override void add(int item) { if (head == null) { - head = new Node(null,null,item); + head = new Node(null, null, item); tail = head; counter = 1; } else { - head.next = new Node(head,null,item); + head.next = new Node(head, null, item); head = head.next; counter++; } @@ -87,37 +65,44 @@ void add(int item) { @Override int remove(int idx) throws NoSuchElementException { + Node current = null; if (idx >= counter || idx < 0) { throw new NoSuchElementException(); - } else { - Node current = tail; + } else if (idx < 0.5 * counter) { + current = tail; for (int i = 0; i < idx; i++) { current = current.next; } - final int returnval = current.val; - if (current.prev != null) { - current.prev.next = current.next; + } else { + current = head; + for (int i = 0; i < counter - idx - 1; i++) { + current = current.prev; + } + } + final int returnval = current.val; + if (current.prev != null) { + current.prev.next = current.next; + } else { + tail = current.next; + if (tail != null) { + tail.prev = null; } else { - tail = current.next; - if (tail != null) { - tail.prev = null; - } else { - head = null; - } + head = null; } - if (current.next != null) { - current.next.prev = current.prev; + } + if (current.next != null) { + current.next.prev = current.prev; + } else { + head = current.prev; + if (head != null) { + head.next = null; } else { - head = current.prev; - if (head != null) { - head.next = null; - } else { - tail = null; - } + tail = null; } - counter--; - return returnval; } + counter--; + return returnval; + } @Override From 84e72a477678c3e5effb17b432785d162b2df522 Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Thu, 23 Mar 2017 03:29:11 +0300 Subject: [PATCH 09/11] first draft --- src/main/java/track/container/Container.java | 114 +++++++++++++++++- .../track/container/JsonConfigReader.java | 28 ++++- src/main/java/track/container/Main.java | 33 ++++- .../java/track/container/config/Bean.java | 3 + .../java/track/container/config/Property.java | 3 + .../lessons/lesson3/MyArrayListTest.java | 1 - .../track/lessons/lesson4/ContainerTest.java | 44 +++++++ 7 files changed, 216 insertions(+), 10 deletions(-) diff --git a/src/main/java/track/container/Container.java b/src/main/java/track/container/Container.java index 36c4bd9d..e6818f52 100755 --- a/src/main/java/track/container/Container.java +++ b/src/main/java/track/container/Container.java @@ -1,8 +1,17 @@ package track.container; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; import java.util.List; +import java.util.Map; import track.container.config.Bean; +import track.container.config.Property; + +import static track.container.config.ValueType.REF; +import static track.container.config.ValueType.VAL; + /** * Основной класс контейнера @@ -10,17 +19,67 @@ */ public class Container { + List beans; + Map objByName; + Map objByClassName; // Реализуйте этот конструктор, используется в тестах! public Container(List beans) { - + this.beans = beans; + objByName = new HashMap<>(); + objByClassName = new HashMap<>(); } /** - * Вернуть объект по имени бина из конфига - * Например, Car car = (Car) container.getById("carBean") + * Вернуть объект по имени бина из конфига + * Например, Car car = (Car) container.getById("carBean") */ - public Object getById(String id) { + public Object getById(String id) throws Exception { + for (Bean bean : beans) { + String objId = bean.getId(); + if (objId.equals(id)) { + Object object = objByName.get(objId); + if (object == null) { + Class cls = Class.forName(bean.getClassName()); + object = (Object) cls.newInstance(); + for (Map.Entry entry : bean.getProperties().entrySet()) { + if (entry.getValue().getType() == VAL) { + Class[] arg = new Class[1]; + arg[0] = int.class; + Method method = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method.invoke(object, Integer.parseInt(entry.getValue().getValue())); + } else if (entry.getValue().getType() == REF) { + Class[] arg = new Class[1]; + Class cls1 = null; + Object object1 = null; + String id1 = entry.getValue().getValue(); + for (Bean bean1 : beans) { + String objId1 = bean1.getId(); + if (objId1.equals(id1)) { + cls1 = Class.forName(bean1.getClassName()); + for (Map.Entry entry1 : bean.getProperties().entrySet()) { + if (entry1.getValue().getType() == REF && + entry1.getValue().getValue().equals(id)) { + throw new Exception(); + } + } + object1 = getById(objId1); + } + } + arg[0] = cls1; + Method method1 = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method1.invoke(object, object1); + } + } + objByName.put(id, object); + } + return object; + } + } return null; } @@ -28,7 +87,52 @@ public Object getById(String id) { * Вернуть объект по имени класса * Например, Car car = (Car) container.getByClass("track.container.beans.Car") */ - public Object getByClass(String className) { + public Object getByClass(String className) throws Exception { + for (Bean bean : beans) { + String clsName = bean.getClassName(); + if (clsName.equals(className)) { + Object object = objByName.get(clsName); + if (object == null) { + Class cls = Class.forName(bean.getClassName()); + object = (Object) cls.newInstance(); + for (Map.Entry entry : bean.getProperties().entrySet()) { + if (entry.getValue().getType() == VAL) { + Class[] arg = new Class[1]; + arg[0] = int.class; + Method method = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method.invoke(object, Integer.parseInt(entry.getValue().getValue())); + } else if (entry.getValue().getType() == REF) { + Class[] arg = new Class[1]; + Class cls1 = null; + Object object1 = null; + String id1 = entry.getValue().getValue(); + for (Bean bean1 : beans) { + String objId1 = bean1.getId(); + if (objId1.equals(id1)) { + cls1 = Class.forName(bean1.getClassName()); + for (Map.Entry entry1 : bean.getProperties().entrySet()) { + if (entry1.getValue().getType() == REF && + entry1.getValue().getValue().equals(bean.getId())) { + throw new Exception(); + } + } + object1 = getByClass(bean1.getClassName()); + } + } + arg[0] = cls1; + Method method1 = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method1.invoke(object, object1); + } + } + objByName.put(clsName, object); + } + return object; + } + } return null; } } diff --git a/src/main/java/track/container/JsonConfigReader.java b/src/main/java/track/container/JsonConfigReader.java index 76eb69ff..22a48592 100755 --- a/src/main/java/track/container/JsonConfigReader.java +++ b/src/main/java/track/container/JsonConfigReader.java @@ -1,11 +1,16 @@ package track.container; import java.io.File; +import java.io.IOException; +import java.util.Arrays; import java.util.List; +import com.fasterxml.jackson.databind.ObjectMapper; import track.container.config.Bean; import track.container.config.ConfigReader; import track.container.config.InvalidConfigurationException; +import track.lections.lection4.Item; +import track.lections.lection4.Person; /** * TODO: Реализовать @@ -14,6 +19,27 @@ public class JsonConfigReader implements ConfigReader { @Override public List parseBeans(File configFile) throws InvalidConfigurationException { - return null; + + ObjectMapper mapper = new ObjectMapper(); + Beans beans = null; + try { + beans = mapper.readValue(configFile, Beans.class); + return Arrays.asList(beans.getBeans()); + } catch (IOException e) { + return null; + } + } + + +} + +class Beans { + private Bean[] beans; + + public Beans() { + } + + public Bean[] getBeans() { + return beans; } } diff --git a/src/main/java/track/container/Main.java b/src/main/java/track/container/Main.java index 8fdc23e6..34d788a8 100755 --- a/src/main/java/track/container/Main.java +++ b/src/main/java/track/container/Main.java @@ -1,11 +1,22 @@ package track.container; +import track.container.beans.Car; +import track.container.beans.Engine; +import track.container.beans.Gear; +import track.container.config.Bean; +import track.container.config.ConfigReader; +import track.container.config.InvalidConfigurationException; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.List; + /** * */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { /* @@ -20,7 +31,23 @@ public static void main(String[] args) { // // Car car = (Car) container.getByClass("track.container.beans.Car"); // car = (Car) container.getById("carBean"); - - + ConfigReader reader = new JsonConfigReader(); + List beans = reader.parseBeans(new File("src/main/resources/config.json")); + for (Bean bean : beans) { + System.out.println(bean); + } + Container container = new Container(beans); + Gear gear = (Gear) container.getById("gearBean"); + System.out.println(gear); + Engine engine = (Engine) container.getById("engineBean"); + System.out.println(engine); + Car car = (Car) container.getById("carBean"); + System.out.println(car); +// Gear gear1 = (Gear) container.getByClass("track.container.beans.Gear"); +// System.out.println(gear1); +// Engine engine1 = (Engine) container.getByClass("track.container.beans.Engine"); +// System.out.println(engine1); + Car car1 = (Car) container.getByClass("track.container.beans.Car"); + System.out.println(car1.getEngine()); } } diff --git a/src/main/java/track/container/config/Bean.java b/src/main/java/track/container/config/Bean.java index b7948199..77c4ed99 100755 --- a/src/main/java/track/container/config/Bean.java +++ b/src/main/java/track/container/config/Bean.java @@ -19,6 +19,9 @@ public class Bean { */ private Map properties; // Набор полей бина ИмяПоля-Значение + public Bean() { + + } public Bean(String id, String className, Map properties) { this.id = id; this.className = className; diff --git a/src/main/java/track/container/config/Property.java b/src/main/java/track/container/config/Property.java index af06fc5b..c8e3bfbe 100755 --- a/src/main/java/track/container/config/Property.java +++ b/src/main/java/track/container/config/Property.java @@ -9,6 +9,9 @@ public class Property { private String value; // Значение поля private ValueType type; // Метка ссылочное значение или примитив + public Property() { + } + public Property(String name, String value, ValueType type) { this.name = name; this.value = value; diff --git a/src/test/java/track/lessons/lesson3/MyArrayListTest.java b/src/test/java/track/lessons/lesson3/MyArrayListTest.java index e7e4ab64..cdac7ce4 100644 --- a/src/test/java/track/lessons/lesson3/MyArrayListTest.java +++ b/src/test/java/track/lessons/lesson3/MyArrayListTest.java @@ -16,7 +16,6 @@ public void testResize1() { for (int i = 0; i < 1000; i++) { list.add(i); } - Assert.assertTrue(list.size() == 1000); } diff --git a/src/test/java/track/lessons/lesson4/ContainerTest.java b/src/test/java/track/lessons/lesson4/ContainerTest.java index 06aa96d6..1e56e8c3 100755 --- a/src/test/java/track/lessons/lesson4/ContainerTest.java +++ b/src/test/java/track/lessons/lesson4/ContainerTest.java @@ -1,4 +1,48 @@ package track.lessons.lesson4; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import track.container.Container; +import track.container.JsonConfigReader; +import track.container.beans.Car; +import track.container.beans.Engine; +import track.container.beans.Gear; +import track.container.config.Bean; +import track.container.config.ConfigReader; +import track.container.config.InvalidConfigurationException; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.List; + public class ContainerTest { + + private static Container container; + @BeforeClass + public static void init() throws InvalidConfigurationException { + ConfigReader reader = new JsonConfigReader(); + List beans = reader.parseBeans(new File("src/main/resources/config.json")); + container = new Container(beans); + } + + @Test + public void getByIdTest() throws Exception { + Gear gear = (Gear) container.getById("gearBean"); + Assert.assertTrue("Gear{count=6}".equals(gear.toString())); + Engine engine = (Engine) container.getById("engineBean"); + Assert.assertTrue("Engine{power=200}".equals(engine.toString())); + Car car = (Car) container.getById("carBean"); + Assert.assertTrue("Car{gear=Gear{count=6}, engine=Engine{power=200}}".equals(car.toString())); + } + + @Test + public void getByClassTest() throws Exception { + Gear gear = (Gear) container.getByClass("track.container.beans.Gear"); + Assert.assertTrue("Gear{count=6}".equals(gear.toString())); + Engine engine = (Engine) container.getByClass("track.container.beans.Engine"); + Assert.assertTrue("Engine{power=200}".equals(engine.toString())); + Car car = (Car) container.getByClass("track.container.beans.Car"); + Assert.assertTrue("Car{gear=Gear{count=6}, engine=Engine{power=200}}".equals(car.toString())); + } } From dff8231613dfa2d2dfb93b958d50f55c7114f811 Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Thu, 23 Mar 2017 23:38:38 +0300 Subject: [PATCH 10/11] solved task container --- src/main/java/track/container/Container.java | 142 ++++++++++-------- src/main/java/track/container/Main.java | 10 +- .../java/track/container/config/Bean.java | 1 + .../track/lessons/lesson4/ContainerTest.java | 1 + 4 files changed, 88 insertions(+), 66 deletions(-) diff --git a/src/main/java/track/container/Container.java b/src/main/java/track/container/Container.java index e6818f52..ba923d47 100755 --- a/src/main/java/track/container/Container.java +++ b/src/main/java/track/container/Container.java @@ -19,9 +19,9 @@ */ public class Container { - List beans; - Map objByName; - Map objByClassName; + private List beans; + private Map objByName; + private Map objByClassName; // Реализуйте этот конструктор, используется в тестах! public Container(List beans) { @@ -30,11 +30,20 @@ public Container(List beans) { objByClassName = new HashMap<>(); } + public Map getMapByName() { + return objByName; + } + + public Map getMapByClass() { + return objByClassName; + } + /** * Вернуть объект по имени бина из конфига * Например, Car car = (Car) container.getById("carBean") */ - public Object getById(String id) throws Exception { + public Object getById(String id) throws ClassNotFoundException, IllegalAccessException, + InstantiationException, NoSuchMethodException, CyclicReferenceException, InvocationTargetException { for (Bean bean : beans) { String objId = bean.getId(); if (objId.equals(id)) { @@ -44,38 +53,13 @@ public Object getById(String id) throws Exception { object = (Object) cls.newInstance(); for (Map.Entry entry : bean.getProperties().entrySet()) { if (entry.getValue().getType() == VAL) { - Class[] arg = new Class[1]; - arg[0] = int.class; - Method method = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); - method.invoke(object, Integer.parseInt(entry.getValue().getValue())); + parseValue(entry, cls, object); } else if (entry.getValue().getType() == REF) { - Class[] arg = new Class[1]; - Class cls1 = null; - Object object1 = null; - String id1 = entry.getValue().getValue(); - for (Bean bean1 : beans) { - String objId1 = bean1.getId(); - if (objId1.equals(id1)) { - cls1 = Class.forName(bean1.getClassName()); - for (Map.Entry entry1 : bean.getProperties().entrySet()) { - if (entry1.getValue().getType() == REF && - entry1.getValue().getValue().equals(id)) { - throw new Exception(); - } - } - object1 = getById(objId1); - } - } - arg[0] = cls1; - Method method1 = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); - method1.invoke(object, object1); + parseRef(bean, entry, cls, object); } } objByName.put(id, object); + objByClassName.put(bean.getClassName(), object); } return object; } @@ -87,52 +71,84 @@ public Object getById(String id) throws Exception { * Вернуть объект по имени класса * Например, Car car = (Car) container.getByClass("track.container.beans.Car") */ - public Object getByClass(String className) throws Exception { + public Object getByClass(String className) throws ClassNotFoundException, IllegalAccessException, + InstantiationException, NoSuchMethodException, CyclicReferenceException, InvocationTargetException { for (Bean bean : beans) { String clsName = bean.getClassName(); if (clsName.equals(className)) { - Object object = objByName.get(clsName); + Object object = objByClassName.get(clsName); if (object == null) { Class cls = Class.forName(bean.getClassName()); object = (Object) cls.newInstance(); for (Map.Entry entry : bean.getProperties().entrySet()) { if (entry.getValue().getType() == VAL) { - Class[] arg = new Class[1]; - arg[0] = int.class; - Method method = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); - method.invoke(object, Integer.parseInt(entry.getValue().getValue())); + parseValue(entry, cls, object); } else if (entry.getValue().getType() == REF) { - Class[] arg = new Class[1]; - Class cls1 = null; - Object object1 = null; - String id1 = entry.getValue().getValue(); - for (Bean bean1 : beans) { - String objId1 = bean1.getId(); - if (objId1.equals(id1)) { - cls1 = Class.forName(bean1.getClassName()); - for (Map.Entry entry1 : bean.getProperties().entrySet()) { - if (entry1.getValue().getType() == REF && - entry1.getValue().getValue().equals(bean.getId())) { - throw new Exception(); - } - } - object1 = getByClass(bean1.getClassName()); - } - } - arg[0] = cls1; - Method method1 = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); - method1.invoke(object, object1); + parseRef(bean, entry, cls, object); } } - objByName.put(clsName, object); + objByClassName.put(clsName, object); + objByName.put(bean.getId(), object); } return object; } } return null; } + + private void parseRef(Bean bean, Map.Entry entry, Class cls, Object object) throws ClassNotFoundException, CyclicReferenceException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + Class[] arg = new Class[1]; + Class cls1 = null; + Object object1 = null; + String id1 = entry.getValue().getValue(); + for (Bean bean1 : beans) { + String objId1 = bean1.getId(); + if (objId1.equals(id1)) { + cls1 = Class.forName(bean1.getClassName()); + for (Map.Entry entry1 : bean.getProperties().entrySet()) { + if (entry1.getValue().getType() == REF && + entry1.getValue().getValue().equals(bean.getId())) { + throw new CyclicReferenceException(); + } + } + object1 = getById(objId1); + } + } + arg[0] = cls1; + Method method1 = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method1.invoke(object, object1); + } + + private void parseValue(Map.Entry entry, Class cls, Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class[] arg = new Class[1]; + Object value; + try { + value = Integer.parseInt(entry.getValue().getValue()); + arg[0] = int.class; + } catch (NumberFormatException e) { + try { + value = Double.parseDouble(entry.getValue().getValue()); + arg[0] = double.class; + } catch (NumberFormatException ex) { + value = entry.getValue().getValue(); + arg[0] = String.class; + } + } + Method method = cls.getDeclaredMethod("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1), arg); + method.invoke(object, value); + } +} + +class CyclicReferenceException extends Exception { + + public CyclicReferenceException() { + } + + public CyclicReferenceException(String message) { + super(message); + } } diff --git a/src/main/java/track/container/Main.java b/src/main/java/track/container/Main.java index 34d788a8..51e92685 100755 --- a/src/main/java/track/container/Main.java +++ b/src/main/java/track/container/Main.java @@ -10,6 +10,7 @@ import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; /** * @@ -43,11 +44,14 @@ public static void main(String[] args) throws Exception { System.out.println(engine); Car car = (Car) container.getById("carBean"); System.out.println(car); + System.out.println(container.getMapByName()); + System.out.println(container.getMapByClass()); // Gear gear1 = (Gear) container.getByClass("track.container.beans.Gear"); // System.out.println(gear1); -// Engine engine1 = (Engine) container.getByClass("track.container.beans.Engine"); -// System.out.println(engine1); + // Engine engine1 = (Engine) container.getByClass("track.container.beans.Engine"); + // System.out.println(engine1); Car car1 = (Car) container.getByClass("track.container.beans.Car"); - System.out.println(car1.getEngine()); + System.out.println(car1.getEngine().getPower() + 45); + System.out.println(container.getMapByClass()); } } diff --git a/src/main/java/track/container/config/Bean.java b/src/main/java/track/container/config/Bean.java index 77c4ed99..787dc971 100755 --- a/src/main/java/track/container/config/Bean.java +++ b/src/main/java/track/container/config/Bean.java @@ -22,6 +22,7 @@ public class Bean { public Bean() { } + public Bean(String id, String className, Map properties) { this.id = id; this.className = className; diff --git a/src/test/java/track/lessons/lesson4/ContainerTest.java b/src/test/java/track/lessons/lesson4/ContainerTest.java index 1e56e8c3..83cb5d1a 100755 --- a/src/test/java/track/lessons/lesson4/ContainerTest.java +++ b/src/test/java/track/lessons/lesson4/ContainerTest.java @@ -19,6 +19,7 @@ public class ContainerTest { private static Container container; + @BeforeClass public static void init() throws InvalidConfigurationException { ConfigReader reader = new JsonConfigReader(); From 545b18330a10f585272b6fbd240b093cd7f3449b Mon Sep 17 00:00:00 2001 From: Alexander Tsoy Date: Mon, 24 Apr 2017 22:03:01 +0300 Subject: [PATCH 11/11] fixes --- src/main/java/track/container/Container.java | 60 +++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/src/main/java/track/container/Container.java b/src/main/java/track/container/Container.java index ba923d47..62a46636 100755 --- a/src/main/java/track/container/Container.java +++ b/src/main/java/track/container/Container.java @@ -51,11 +51,13 @@ public Object getById(String id) throws ClassNotFoundException, IllegalAccessExc if (object == null) { Class cls = Class.forName(bean.getClassName()); object = (Object) cls.newInstance(); - for (Map.Entry entry : bean.getProperties().entrySet()) { - if (entry.getValue().getType() == VAL) { - parseValue(entry, cls, object); - } else if (entry.getValue().getType() == REF) { - parseRef(bean, entry, cls, object); + if (bean.getProperties() != null) { + for (Map.Entry entry : bean.getProperties().entrySet()) { + if (entry.getValue().getType() == VAL) { + parseValue(entry, cls, object); + } else if (entry.getValue().getType() == REF) { + parseRef(bean, entry, cls, object); + } } } objByName.put(id, object); @@ -80,11 +82,13 @@ public Object getByClass(String className) throws ClassNotFoundException, Illega if (object == null) { Class cls = Class.forName(bean.getClassName()); object = (Object) cls.newInstance(); - for (Map.Entry entry : bean.getProperties().entrySet()) { - if (entry.getValue().getType() == VAL) { - parseValue(entry, cls, object); - } else if (entry.getValue().getType() == REF) { - parseRef(bean, entry, cls, object); + if (bean.getProperties() != null) { + for (Map.Entry entry : bean.getProperties().entrySet()) { + if (entry.getValue().getType() == VAL) { + parseValue(entry, cls, object); + } else if (entry.getValue().getType() == REF) { + parseRef(bean, entry, cls, object); + } } } objByClassName.put(clsName, object); @@ -105,20 +109,28 @@ private void parseRef(Bean bean, Map.Entry entry, Class cls String objId1 = bean1.getId(); if (objId1.equals(id1)) { cls1 = Class.forName(bean1.getClassName()); - for (Map.Entry entry1 : bean.getProperties().entrySet()) { - if (entry1.getValue().getType() == REF && - entry1.getValue().getValue().equals(bean.getId())) { - throw new CyclicReferenceException(); + if (bean.getProperties() != null) { + for (Map.Entry entry1 : bean.getProperties().entrySet()) { + if (entry1.getValue().getType() == REF && + entry1.getValue().getValue().equals(bean.getId())) { + throw new CyclicReferenceException(); + } } } object1 = getById(objId1); } } arg[0] = cls1; - Method method1 = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); - method1.invoke(object, object1); + Method[] methods = cls.getMethods(); + Method method = null; + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1))) { + method = methods[i]; + } + } + method.invoke(object, object1); } private void parseValue(Map.Entry entry, Class cls, Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { @@ -136,9 +148,15 @@ private void parseValue(Map.Entry entry, Class cls, Object arg[0] = String.class; } } - Method method = cls.getDeclaredMethod("set" + - entry.getValue().getName().substring(0, 1).toUpperCase() + - entry.getValue().getName().substring(1), arg); + Method[] methods = cls.getMethods(); + Method method = null; + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("set" + + entry.getValue().getName().substring(0, 1).toUpperCase() + + entry.getValue().getName().substring(1))) { + method = methods[i]; + } + } method.invoke(object, value); } }