From 96067eb04a1cce70f47f7cd4fc7d8de99f5f239d Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Thu, 20 Jun 2019 00:02:39 +0300 Subject: [PATCH 01/12] initial for HW3 --- .idea/compiler.xml | 13 ++ .idea/misc.xml | 14 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + basejava.iml | 2 + pom.xml | 48 +++++++ .../ru/javawebinar/basejava/MainArray.java | 82 ++++++++++++ .../basejava/MainTestArrayStorage.java | 45 +++++++ .../ru/javawebinar/basejava/model/Resume.java | 43 ++++++ .../storage/AbstractArrayStorage.java | 28 ++++ .../javawebinar/basejava/storage/Storage.java | 20 +++ .../basejava/storage/impl/ArrayStorage.java | 61 +++++++++ .../storage/impl/SortedArrayStorage.java | 45 +++++++ 13 files changed, 531 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 basejava.iml create mode 100644 pom.xml create mode 100644 src/main/java/ru/javawebinar/basejava/MainArray.java create mode 100644 src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java create mode 100644 src/main/java/ru/javawebinar/basejava/model/Resume.java create mode 100644 src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java create mode 100644 src/main/java/ru/javawebinar/basejava/storage/Storage.java create mode 100644 src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java create mode 100644 src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..c632526 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b661a5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/basejava.iml b/basejava.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/basejava.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d72946a --- /dev/null +++ b/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + ru.javawebinar + basejava + 1.0-SNAPSHOT + + + 1.2.3 + 1.7.25 + + + + basejava + package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + compile + + + + junit + junit + 4.12 + test + + + + \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/MainArray.java b/src/main/java/ru/javawebinar/basejava/MainArray.java new file mode 100644 index 0000000..927fa97 --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/MainArray.java @@ -0,0 +1,82 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.Storage; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Test for ru.javawebinar.basejava.storage.impl.ArrayStorage + */ +public class MainArray { + private final static Storage ARRAY_STORAGE = new ArrayStorage(); + + public static void main(String[] args) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + Resume r; + while (true) { + System.out.print("Введите одну из команд - (list | save uuid | delete uuid | get uuid | update uuid | clear | exit): "); + String[] params = reader.readLine().trim().toLowerCase().split(" "); + if (params.length < 1 || params.length > 2) { + System.out.println("Неверная команда."); + continue; + } + String uuid = null; + if (params.length == 2) { + uuid = params[1].intern(); + } + switch (params[0]) { + case "list": + printAll(); + break; + case "size": + System.out.println(ARRAY_STORAGE.size()); + break; + case "save": + r = new Resume(); + r.setUuid(uuid); + ARRAY_STORAGE.save(r); + printAll(); + break; + case "update": + r = new Resume(); + r.setUuid(uuid); + ARRAY_STORAGE.update(r); + printAll(); + break; + case "delete": + ARRAY_STORAGE.delete(uuid); + printAll(); + break; + case "get": + System.out.println(ARRAY_STORAGE.get(uuid)); + break; + case "clear": + ARRAY_STORAGE.clear(); + printAll(); + break; + case "exit": + return; + default: + System.out.println("Неверная команда."); + break; + } + } + } + + static void printAll() { + Resume[] all = ARRAY_STORAGE.getAll(); + System.out.println("----------------------------"); + if (all.length == 0) { + System.out.println("Empty"); + } else { + for (Resume r : all) { + System.out.println(r); + } + } + System.out.println("----------------------------"); + } +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java new file mode 100644 index 0000000..62ba20f --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java @@ -0,0 +1,45 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; +import ru.javawebinar.basejava.storage.Storage; + +/** + * Test ru.javawebinar.basejava.storage.impl.ArrayStorage + */ +public class MainTestArrayStorage { + static final Storage ARRAY_STORAGE = new SortedArrayStorage(); + + public static void main(String[] args) { + Resume r1 = new Resume(); + r1.setUuid("uuid1"); + Resume r2 = new Resume(); + r2.setUuid("uuid2"); + Resume r3 = new Resume(); + r3.setUuid("uuid3"); + + ARRAY_STORAGE.save(r1); + ARRAY_STORAGE.save(r2); + ARRAY_STORAGE.save(r3); + + System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.getUuid())); + System.out.println("Size: " + ARRAY_STORAGE.size()); + + System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); + + printAll(); + ARRAY_STORAGE.delete(r1.getUuid()); + printAll(); + ARRAY_STORAGE.clear(); + printAll(); + + System.out.println("Size: " + ARRAY_STORAGE.size()); + } + + static void printAll() { + System.out.println("\nGet All"); + for (Resume r : ARRAY_STORAGE.getAll()) { + System.out.println(r); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/model/Resume.java b/src/main/java/ru/javawebinar/basejava/model/Resume.java new file mode 100644 index 0000000..e78c859 --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/model/Resume.java @@ -0,0 +1,43 @@ +package ru.javawebinar.basejava.model; + +/** + * ru.javawebinar.basejava.model.Resume class + */ +public class Resume implements Comparable{ + + // Unique identifier + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Resume resume = (Resume) o; + + return uuid.equals(resume.uuid); + } + + @Override + public int hashCode() { + return uuid.hashCode(); + } + + @Override + public String toString() { + return uuid; + } + + @Override + public int compareTo(Resume o) { + return uuid.compareTo(o.uuid); + } +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java new file mode 100644 index 0000000..6212b52 --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -0,0 +1,28 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +/** + * Array based storage for Resumes + */ +public abstract class AbstractArrayStorage implements Storage { + protected static final int STORAGE_LIMIT = 10000; + + protected Resume[] storage = new Resume[STORAGE_LIMIT]; + protected int size = 0; + + public int size() { + return size; + } + + public Resume get(String uuid) { + int index = getIndex(uuid); + if (index == -1) { + System.out.println("Resume " + uuid + " not exist"); + return null; + } + return storage[index]; + } + + protected abstract int getIndex(String uuid); +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/Storage.java b/src/main/java/ru/javawebinar/basejava/storage/Storage.java new file mode 100644 index 0000000..2f7a1d9 --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/storage/Storage.java @@ -0,0 +1,20 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +public interface Storage { + + void clear(); + + void update(Resume r); + + void save(Resume r); + + Resume get(String uuid); + + void delete(String uuid); + + Resume[] getAll(); + + int size(); +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java new file mode 100644 index 0000000..9d2c21e --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -0,0 +1,61 @@ +package ru.javawebinar.basejava.storage.impl; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.AbstractArrayStorage; + +import java.util.Arrays; + +/** + * Array based storage for Resumes + */ +public class ArrayStorage extends AbstractArrayStorage { + + public void clear() { + Arrays.fill(storage, 0, size, null); + size = 0; + } + + public void update(Resume r) { + int index = getIndex(r.getUuid()); + if (index == -1) { + System.out.println("Resume " + r.getUuid() + " not exist"); + } else { + storage[index] = r; + } + } + + public void save(Resume r) { + if (getIndex(r.getUuid()) != -1) { + System.out.println("Resume " + r.getUuid() + " already exist"); + } else if (size >= STORAGE_LIMIT) { + System.out.println("Storage overflow"); + } else { + storage[size] = r; + size++; + } + } + + public void delete(String uuid) { + int index = getIndex(uuid); + if (index == -1) { + System.out.println("Resume " + uuid + " not exist"); + } else { + storage[index] = storage[size - 1]; + storage[size - 1] = null; + size--; + } + } + + public Resume[] getAll() { + return Arrays.copyOfRange(storage, 0, size); + } + + protected int getIndex(String uuid) { + for (int i = 0; i < size; i++) { + if (uuid.equals(storage[i].getUuid())) { + return i; + } + } + return -1; + } +} \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java new file mode 100644 index 0000000..096b483 --- /dev/null +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -0,0 +1,45 @@ +package ru.javawebinar.basejava.storage.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.AbstractArrayStorage; + +import java.util.Arrays; + +public class SortedArrayStorage extends AbstractArrayStorage { + protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); + + + @Override + public void clear() { + + } + + @Override + public void update(Resume r) { + + } + + @Override + public void save(Resume r) { + + } + + @Override + public void delete(String uuid) { + + } + + @Override + public Resume[] getAll() { + return new Resume[0]; + } + + @Override + protected int getIndex(String uuid) { + Resume searchKey = new Resume(); + searchKey.setUuid(uuid); + return Arrays.binarySearch(storage, 0, size, searchKey); + } +} \ No newline at end of file From 4a63d4af8f74d1ce65a41ac4cf6fca3c6843129d Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Thu, 20 Jun 2019 00:16:00 +0300 Subject: [PATCH 02/12] created 'impl' package, logback works now --- pom.xml | 8 +++++ .../storage/AbstractArrayStorage.java | 11 +++++++ .../basejava/storage/impl/ArrayStorage.java | 9 ------ .../storage/impl/SortedArrayStorage.java | 10 +------ src/main/resources/logback.xml | 29 +++++++++++++++++++ 5 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/logback.xml diff --git a/pom.xml b/pom.xml index d72946a..4b4df5b 100644 --- a/pom.xml +++ b/pom.xml @@ -37,12 +37,20 @@ compile + + ch.qos.logback + logback-classic + ${logback.version} + runtime + + junit junit 4.12 test + \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java index 6212b52..35bf5b8 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -2,6 +2,8 @@ import ru.javawebinar.basejava.model.Resume; +import java.util.Arrays; + /** * Array based storage for Resumes */ @@ -24,5 +26,14 @@ public Resume get(String uuid) { return storage[index]; } + public void clear() { + Arrays.fill(storage, 0, size, null); + size = 0; + } + + public Resume[] getAll() { + return Arrays.copyOfRange(storage, 0, size); + } + protected abstract int getIndex(String uuid); } \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index 9d2c21e..75f4105 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -10,11 +10,6 @@ */ public class ArrayStorage extends AbstractArrayStorage { - public void clear() { - Arrays.fill(storage, 0, size, null); - size = 0; - } - public void update(Resume r) { int index = getIndex(r.getUuid()); if (index == -1) { @@ -46,10 +41,6 @@ public void delete(String uuid) { } } - public Resume[] getAll() { - return Arrays.copyOfRange(storage, 0, size); - } - protected int getIndex(String uuid) { for (int i = 0; i < size; i++) { if (uuid.equals(storage[i].getUuid())) { diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index 096b483..fb9b9c9 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -11,11 +11,6 @@ public class SortedArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); - @Override - public void clear() { - - } - @Override public void update(Resume r) { @@ -31,10 +26,7 @@ public void delete(String uuid) { } - @Override - public Resume[] getAll() { - return new Resume[0]; - } + @Override protected int getIndex(String uuid) { diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..bdf004d --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,29 @@ + + + + + + + + ${TOPJAVA_ROOT}/log/topjava.log + + + UTF-8 + %date %-5level %logger{0} [%file:%line] %msg%n + + + + + + UTF-8 + %-5level %logger{0} [%file:%line] %msg%n + + + + + + + + + + \ No newline at end of file From fdd1df2a5b1fc6c6e55997994c4fd4420544ba43 Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Thu, 20 Jun 2019 14:10:12 +0300 Subject: [PATCH 03/12] working --- .../ru/javawebinar/basejava/model/Resume.java | 8 ++ .../basejava/storage/impl/ArrayStorage.java | 38 ++++--- .../storage/impl/SortedArrayStorage.java | 42 +++++-- .../storage/impl/SortedArrayStorageTest.java | 107 ++++++++++++++++++ 4 files changed, 174 insertions(+), 21 deletions(-) create mode 100644 src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java diff --git a/src/main/java/ru/javawebinar/basejava/model/Resume.java b/src/main/java/ru/javawebinar/basejava/model/Resume.java index e78c859..32b562d 100644 --- a/src/main/java/ru/javawebinar/basejava/model/Resume.java +++ b/src/main/java/ru/javawebinar/basejava/model/Resume.java @@ -8,6 +8,14 @@ public class Resume implements Comparable{ // Unique identifier private String uuid; + public Resume(){ + + } + + public Resume(String uuid) { + this.uuid = uuid; + } + public String getUuid() { return uuid; } diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index 75f4105..23328c3 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -1,5 +1,7 @@ package ru.javawebinar.basejava.storage.impl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.AbstractArrayStorage; @@ -9,31 +11,39 @@ * Array based storage for Resumes */ public class ArrayStorage extends AbstractArrayStorage { + protected final Logger log = LoggerFactory.getLogger(ArrayStorage.class); - public void update(Resume r) { - int index = getIndex(r.getUuid()); - if (index == -1) { - System.out.println("Resume " + r.getUuid() + " not exist"); + public void update(Resume resume) { + int index = getIndex(resume.getUuid()); + if (index < 0) { + log.error("Resume {} not exist", resume.getUuid()); } else { - storage[index] = r; + insert(resume,size); } } - public void save(Resume r) { - if (getIndex(r.getUuid()) != -1) { - System.out.println("Resume " + r.getUuid() + " already exist"); - } else if (size >= STORAGE_LIMIT) { - System.out.println("Storage overflow"); + public void save(Resume resume) { + int index = getIndex(resume.getUuid()); + if (index < 0) { + if (size >= STORAGE_LIMIT) { + log.error("Storage overflow"); + } else { + insert(resume,index); + size++; + } } else { - storage[size] = r; - size++; + log.error("Resume {} already exists", resume.getUuid());; } } + private void insert(Resume resume, int index) { + storage[index] = resume; + } + public void delete(String uuid) { int index = getIndex(uuid); - if (index == -1) { - System.out.println("Resume " + uuid + " not exist"); + if (index < 0) { + log.error("Resume {} does not exist", uuid); } else { storage[index] = storage[size - 1]; storage[size - 1] = null; diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index fb9b9c9..7373d1a 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -6,32 +6,60 @@ import ru.javawebinar.basejava.storage.AbstractArrayStorage; import java.util.Arrays; +import java.util.function.Consumer; public class SortedArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); @Override - public void update(Resume r) { - + public void update(Resume resume) { + int index = Arrays.binarySearch(storage, 0, size, resume); + if (index < 0) { + log.error("Resume {} does not exist", resume.getUuid()); + } else { + insert(resume, index); + } } @Override - public void save(Resume r) { + public void save(Resume resume) { + if (size == STORAGE_LIMIT) { + throw new IllegalStateException("Storage overflow."); + } + int index = Arrays.binarySearch(storage, 0, size, resume); + if (index < 0) { + // this is a new value to insert (not a duplicate). + index = - index - 1; + } else { + log.error("Resume {} already exist", resume.getUuid()); + } + insert(resume, index); + size++; + } + private void insert(Resume resume, int index) { + System.arraycopy(storage, index, storage, index + 1, size - index); + storage[index] = resume; } @Override public void delete(String uuid) { - + int index = getIndex(uuid); + if (index < 0) { + log.error("Resume {} does not exist", uuid); + } else { + System.arraycopy(storage, index+1, storage, index, size - index); + size--; + } } @Override protected int getIndex(String uuid) { - Resume searchKey = new Resume(); - searchKey.setUuid(uuid); - return Arrays.binarySearch(storage, 0, size, searchKey); + Resume resume = new Resume(); + resume.setUuid(uuid); + return Arrays.binarySearch(storage, 0, size, resume); } } \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java new file mode 100644 index 0000000..b81ea25 --- /dev/null +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java @@ -0,0 +1,107 @@ + + +package ru.javawebinar.basejava.storage.impl; + +import org.junit.Before; +import org.junit.Test; +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.Storage; + +import static org.junit.Assert.*; + +public class SortedArrayStorageTest { + + private Storage storage; + + @Before + public void setUp() throws Exception { + storage = new SortedArrayStorage(); + } + + @Test + public void emptySaveOneShouldHaveSizeOne(){ + Resume resume = new Resume("uuid1"); + storage.save(resume); + assertEquals(1, storage.size()); + } + + @Test + public void emptySaveTwoShouldHaveSizeOne(){ + Resume resume1 = new Resume("uuid2"); + Resume resume2 = new Resume("uuid1"); + storage.save(resume1); + storage.save(resume2); + assertEquals(2, storage.size()); + } + + @Test + public void update() { + } + + @Test + public void save() { + } + + @Test + public void delete() { + } + + @Test + public void getIndex() { + } + + + + +// @Test +// public void testCRUD() throws Exception { +// +// // Gets two random numbers +// Long random = getRandom(); +// Long updateRandom = getRandom(); +// +// // Resume is the domain object +// Resume resume = new Resume(); +// +// // The method findAll brings back all the objects from the DB +// Resume[] firstFindAll = storage.getAll(); +// +// // Resume gets mock values and is persisted. Id is returned +// resume = getMockResumeValues(resume, random); +// storage.save(resume); +// String uuid = resume.getUuid(); +// +// // Find the created object with the given Id and makes sure it has the right values +// resume = storage.get(uuid); +// assertNotNull("Object should exist", resume); +// checkMockResumeValues(resume, random); +// +// // Updates the object with new random values +// resume = getMockResumeValues(resume, updateRandom); +// storage.update(resume); +// +// // Find the updated object and makes sure it has the new values +// resume = storage.get(uuid); +// assertNotNull("Object should exist", resume); +// checkMockResumeValues(resume, updateRandom); +// +// // Gets all the objects from the database... +// Resume[] secondFindAll = storage.getAll(); +// +// // ...and makes sure there is one more object +// if (firstFindAll.length + 1 != secondFindAll.length) fail("The collection size should have increased by 1"); +// +// // The object is now deleted +// storage.delete(storage.get()resume); +// +// // Find the object and make sure it has been removed +// resume = em.find(Resume.class, id); +// assertNull("Object should not exist", resume); +// +// // Gets all the objects from the database... +// int thirdFindAll = findAll(); +// +// // ...and makes sure we have the original size +// if (firstFindAll != thirdFindAll) fail("The collection size should have be the same as original"); +// } +} \ No newline at end of file From f516b46f1f775cba81308b889b3d47eb003da966 Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Wed, 26 Jun 2019 13:17:46 +0300 Subject: [PATCH 04/12] not working --- .../basejava/storage/impl/ArrayStorage.java | 7 +- .../storage/impl/SortedArrayStorage.java | 9 +- .../storage/AbstractArrayStorageTest.java | 112 +++++++++++++++++ .../storage/impl/ArrayStorageTest.java | 45 +++++++ .../storage/impl/SortedArrayStorageTest.java | 119 +++++------------- 5 files changed, 192 insertions(+), 100 deletions(-) create mode 100644 src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java create mode 100644 src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index 23328c3..d4e0f37 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -5,7 +5,6 @@ import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.AbstractArrayStorage; -import java.util.Arrays; /** * Array based storage for Resumes @@ -18,7 +17,7 @@ public void update(Resume resume) { if (index < 0) { log.error("Resume {} not exist", resume.getUuid()); } else { - insert(resume,size); + insertAt(resume,size); } } @@ -28,7 +27,7 @@ public void save(Resume resume) { if (size >= STORAGE_LIMIT) { log.error("Storage overflow"); } else { - insert(resume,index); + insertAt(resume,index); size++; } } else { @@ -36,7 +35,7 @@ public void save(Resume resume) { } } - private void insert(Resume resume, int index) { + private void insertAt(Resume resume, int index) { storage[index] = resume; } diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index 7373d1a..77a2dbe 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -6,7 +6,6 @@ import ru.javawebinar.basejava.storage.AbstractArrayStorage; import java.util.Arrays; -import java.util.function.Consumer; public class SortedArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); @@ -18,7 +17,7 @@ public void update(Resume resume) { if (index < 0) { log.error("Resume {} does not exist", resume.getUuid()); } else { - insert(resume, index); + insertAt(resume, index); } } @@ -29,16 +28,16 @@ public void save(Resume resume) { } int index = Arrays.binarySearch(storage, 0, size, resume); if (index < 0) { - // this is a new value to insert (not a duplicate). + // this is a new value to insertAt (not a duplicate). index = - index - 1; } else { log.error("Resume {} already exist", resume.getUuid()); } - insert(resume, index); + insertAt(resume, index); size++; } - private void insert(Resume resume, int index) { + private void insertAt(Resume resume, int index) { System.arraycopy(storage, index, storage, index + 1, size - index); storage[index] = resume; } diff --git a/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java new file mode 100644 index 0000000..41f5dd0 --- /dev/null +++ b/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java @@ -0,0 +1,112 @@ +package ru.javawebinar.basejava.storage; + +import org.junit.Before; +import org.junit.Test; +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + +import java.util.Arrays; +import java.util.Enumeration; + +import static org.junit.Assert.*; + +public class AbstractArrayStorageTest { + + private Storage storage; + + private String uuid; + + @Before + public void setUp() throws Exception { + storage = new SortedArrayStorage(); + initialiseParameters(); + } + + @Test + public void Crud(){ + String newUuid = create(); + getById(newUuid); + getAll(); + update(newUuid); + delete(newUuid); + } + + + private void initialiseParameters() { + uuid = "uuid"; + } + + /// + /// Creates this instance. + /// + /// The id of the new record. + private String create() { + //Arrange + Resume resume = new Resume(); + resume.setUuid(uuid); + + //Act + storage.save(resume); + + //Assert + assertNotEquals("Creating new record does not return id", null, resume.getUuid()); + + return resume.getUuid(); + } + + /// + /// Updates the specified id. + /// + /// The id. + private void update (String uuid) { + //Arrange + Resume resume = storage.get(uuid); + resume.setUuid("newuuid"); + + //Act + storage.update(resume); + Resume updated = storage.get(uuid); + + //Assert + assertEquals("newuuid", updated.getUuid(), "Record is not updated." ); + } + + /// + /// Gets all. + /// + private void getAll(){ + //Act + Resume[] items = storage.getAll(); + + //Assert + assertTrue("getAll returned no items.",items.length > 0); + assertEquals(uuid, items[0].getUuid()); + } + + + /// + /// Gets the by ID. + /// + /// The id of the resume. + private void getById(String uuid) { + //Act + Resume resume = storage.get(uuid); + + //Assert + assertNotNull("getByID returned null.", resume); + assertEquals(uuid, resume.getUuid()); + } + + + private void delete(String uuid) { + //Act + storage.delete(uuid); + Resume resume = storage.get(uuid); + + //Assert + assertNull("Record is not deleted.", resume); + } + + +} \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java new file mode 100644 index 0000000..da003ef --- /dev/null +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java @@ -0,0 +1,45 @@ +package ru.javawebinar.basejava.storage.impl; + +import org.junit.Test; +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.Storage; + +/** + * Test ru.javawebinar.basejava.storage.impl.ArrayStorage + */ +public class ArrayStorageTest { + static final Storage ARRAY_STORAGE = new ArrayStorage(); + + public static void main(String[] args) { + Resume r1 = new Resume(); + r1.setUuid("uuid1"); + Resume r2 = new Resume(); + r2.setUuid("uuid2"); + Resume r3 = new Resume(); + r3.setUuid("uuid3"); + + ARRAY_STORAGE.save(r1); + ARRAY_STORAGE.save(r2); + ARRAY_STORAGE.save(r3); + + System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.getUuid())); + System.out.println("Size: " + ARRAY_STORAGE.size()); + + System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); + + printAll(); + ARRAY_STORAGE.delete(r1.getUuid()); + printAll(); + ARRAY_STORAGE.clear(); + printAll(); + + System.out.println("Size: " + ARRAY_STORAGE.size()); + } + + static void printAll() { + System.out.println("\nGet All"); + for (Resume r : ARRAY_STORAGE.getAll()) { + System.out.println(r); + } + } +} \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java index b81ea25..47b3cd6 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java @@ -1,107 +1,44 @@ - - package ru.javawebinar.basejava.storage.impl; -import org.junit.Before; -import org.junit.Test; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.Storage; -import static org.junit.Assert.*; - +/** + * Test ru.javawebinar.basejava.storage.impl.ArrayStorage + */ public class SortedArrayStorageTest { + static final Storage ARRAY_STORAGE = new SortedArrayStorage(); - private Storage storage; + public static void main(String[] args) { + Resume r1 = new Resume(); + r1.setUuid("uuid1"); + Resume r2 = new Resume(); + r2.setUuid("uuid2"); + Resume r3 = new Resume(); + r3.setUuid("uuid3"); - @Before - public void setUp() throws Exception { - storage = new SortedArrayStorage(); - } + ARRAY_STORAGE.save(r1); + ARRAY_STORAGE.save(r2); + ARRAY_STORAGE.save(r3); - @Test - public void emptySaveOneShouldHaveSizeOne(){ - Resume resume = new Resume("uuid1"); - storage.save(resume); - assertEquals(1, storage.size()); - } + System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.getUuid())); + System.out.println("Size: " + ARRAY_STORAGE.size()); - @Test - public void emptySaveTwoShouldHaveSizeOne(){ - Resume resume1 = new Resume("uuid2"); - Resume resume2 = new Resume("uuid1"); - storage.save(resume1); - storage.save(resume2); - assertEquals(2, storage.size()); - } + System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); - @Test - public void update() { - } + printAll(); + ARRAY_STORAGE.delete(r1.getUuid()); + printAll(); + ARRAY_STORAGE.clear(); + printAll(); - @Test - public void save() { + System.out.println("Size: " + ARRAY_STORAGE.size()); } - @Test - public void delete() { + static void printAll() { + System.out.println("\nGet All"); + for (Resume r : ARRAY_STORAGE.getAll()) { + System.out.println(r); + } } - - @Test - public void getIndex() { - } - - - - -// @Test -// public void testCRUD() throws Exception { -// -// // Gets two random numbers -// Long random = getRandom(); -// Long updateRandom = getRandom(); -// -// // Resume is the domain object -// Resume resume = new Resume(); -// -// // The method findAll brings back all the objects from the DB -// Resume[] firstFindAll = storage.getAll(); -// -// // Resume gets mock values and is persisted. Id is returned -// resume = getMockResumeValues(resume, random); -// storage.save(resume); -// String uuid = resume.getUuid(); -// -// // Find the created object with the given Id and makes sure it has the right values -// resume = storage.get(uuid); -// assertNotNull("Object should exist", resume); -// checkMockResumeValues(resume, random); -// -// // Updates the object with new random values -// resume = getMockResumeValues(resume, updateRandom); -// storage.update(resume); -// -// // Find the updated object and makes sure it has the new values -// resume = storage.get(uuid); -// assertNotNull("Object should exist", resume); -// checkMockResumeValues(resume, updateRandom); -// -// // Gets all the objects from the database... -// Resume[] secondFindAll = storage.getAll(); -// -// // ...and makes sure there is one more object -// if (firstFindAll.length + 1 != secondFindAll.length) fail("The collection size should have increased by 1"); -// -// // The object is now deleted -// storage.delete(storage.get()resume); -// -// // Find the object and make sure it has been removed -// resume = em.find(Resume.class, id); -// assertNull("Object should not exist", resume); -// -// // Gets all the objects from the database... -// int thirdFindAll = findAll(); -// -// // ...and makes sure we have the original size -// if (firstFindAll != thirdFindAll) fail("The collection size should have be the same as original"); -// } } \ No newline at end of file From debfa1e79828d7efb7b8a3e696ee6900a344a26e Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Wed, 26 Jun 2019 15:48:59 +0300 Subject: [PATCH 05/12] working, refactoring almost done except the save method --- .../storage/AbstractArrayStorage.java | 31 ++++- .../basejava/storage/impl/ArrayStorage.java | 28 ++-- .../storage/impl/SortedArrayStorage.java | 41 ++---- .../storage/AbstractArrayStorageTest.java | 112 ---------------- .../storage/impl/ArrayStorageTest.java | 121 +++++++++++++---- .../storage/impl/SortedArrayStorageTest.java | 124 ++++++++++++++---- 6 files changed, 241 insertions(+), 216 deletions(-) delete mode 100644 src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java diff --git a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java index 35bf5b8..1a30c3b 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -1,6 +1,9 @@ package ru.javawebinar.basejava.storage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; import java.util.Arrays; @@ -9,6 +12,7 @@ */ public abstract class AbstractArrayStorage implements Storage { protected static final int STORAGE_LIMIT = 10000; + protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); protected Resume[] storage = new Resume[STORAGE_LIMIT]; protected int size = 0; @@ -20,7 +24,6 @@ public int size() { public Resume get(String uuid) { int index = getIndex(uuid); if (index == -1) { - System.out.println("Resume " + uuid + " not exist"); return null; } return storage[index]; @@ -35,5 +38,31 @@ public Resume[] getAll() { return Arrays.copyOfRange(storage, 0, size); } + protected abstract void insertAt(Resume resume, int index); + + @Override + public void update(Resume resume) { + int index = getIndex(resume); + if (index < 0) { + log.error("Resume {} does not exist", resume.getUuid()); + } else { + insertAt(resume, index); + } + } + + public void delete(String uuid) { + int index = getIndex(uuid); + if (index < 0) { + log.error("Resume {} does not exist", uuid); + } else { + fixAfterDelete(index); + size--; + } + } + + protected abstract void fixAfterDelete(int index); + + protected abstract int getIndex(Resume resume); + protected abstract int getIndex(String uuid); } \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index d4e0f37..d0b31b8 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -12,22 +12,18 @@ public class ArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(ArrayStorage.class); - public void update(Resume resume) { - int index = getIndex(resume.getUuid()); - if (index < 0) { - log.error("Resume {} not exist", resume.getUuid()); - } else { - insertAt(resume,size); - } + + protected int getIndex(Resume resume) { + return getIndex(resume.getUuid()); } public void save(Resume resume) { - int index = getIndex(resume.getUuid()); + int index = getIndex(resume); if (index < 0) { if (size >= STORAGE_LIMIT) { log.error("Storage overflow"); } else { - insertAt(resume,index); + insertAt(resume,size); size++; } } else { @@ -35,19 +31,13 @@ public void save(Resume resume) { } } - private void insertAt(Resume resume, int index) { + protected void insertAt(Resume resume, int index) { storage[index] = resume; } - public void delete(String uuid) { - int index = getIndex(uuid); - if (index < 0) { - log.error("Resume {} does not exist", uuid); - } else { - storage[index] = storage[size - 1]; - storage[size - 1] = null; - size--; - } + protected void fixAfterDelete(int index) { + storage[index] = storage[size - 1]; + storage[size - 1] = null; } protected int getIndex(String uuid) { diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index 77a2dbe..b1a4a91 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -1,35 +1,27 @@ package ru.javawebinar.basejava.storage.impl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.AbstractArrayStorage; import java.util.Arrays; public class SortedArrayStorage extends AbstractArrayStorage { - protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); - @Override - public void update(Resume resume) { - int index = Arrays.binarySearch(storage, 0, size, resume); - if (index < 0) { - log.error("Resume {} does not exist", resume.getUuid()); - } else { - insertAt(resume, index); - } + protected int getIndex(Resume resume) { + return Arrays.binarySearch(storage, 0, size, resume); } @Override public void save(Resume resume) { - if (size == STORAGE_LIMIT) { - throw new IllegalStateException("Storage overflow."); - } - int index = Arrays.binarySearch(storage, 0, size, resume); + int index = getIndex(resume); if (index < 0) { // this is a new value to insertAt (not a duplicate). - index = - index - 1; + if (size == STORAGE_LIMIT) { + throw new IllegalStateException("Storage overflow."); + } else { + index = -index - 1; + } } else { log.error("Resume {} already exist", resume.getUuid()); } @@ -37,28 +29,21 @@ public void save(Resume resume) { size++; } - private void insertAt(Resume resume, int index) { + protected void insertAt(Resume resume, int index) { System.arraycopy(storage, index, storage, index + 1, size - index); storage[index] = resume; } - @Override - public void delete(String uuid) { - int index = getIndex(uuid); - if (index < 0) { - log.error("Resume {} does not exist", uuid); - } else { - System.arraycopy(storage, index+1, storage, index, size - index); - size--; - } - } + protected void fixAfterDelete(int index) { + System.arraycopy(storage, index+1, storage, index, size - index); + } @Override protected int getIndex(String uuid) { Resume resume = new Resume(); resume.setUuid(uuid); - return Arrays.binarySearch(storage, 0, size, resume); + return getIndex(resume); } } \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java deleted file mode 100644 index 41f5dd0..0000000 --- a/src/test/java/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java +++ /dev/null @@ -1,112 +0,0 @@ -package ru.javawebinar.basejava.storage; - -import org.junit.Before; -import org.junit.Test; -import ru.javawebinar.basejava.model.Resume; -import ru.javawebinar.basejava.storage.impl.ArrayStorage; -import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; - -import java.util.Arrays; -import java.util.Enumeration; - -import static org.junit.Assert.*; - -public class AbstractArrayStorageTest { - - private Storage storage; - - private String uuid; - - @Before - public void setUp() throws Exception { - storage = new SortedArrayStorage(); - initialiseParameters(); - } - - @Test - public void Crud(){ - String newUuid = create(); - getById(newUuid); - getAll(); - update(newUuid); - delete(newUuid); - } - - - private void initialiseParameters() { - uuid = "uuid"; - } - - /// - /// Creates this instance. - /// - /// The id of the new record. - private String create() { - //Arrange - Resume resume = new Resume(); - resume.setUuid(uuid); - - //Act - storage.save(resume); - - //Assert - assertNotEquals("Creating new record does not return id", null, resume.getUuid()); - - return resume.getUuid(); - } - - /// - /// Updates the specified id. - /// - /// The id. - private void update (String uuid) { - //Arrange - Resume resume = storage.get(uuid); - resume.setUuid("newuuid"); - - //Act - storage.update(resume); - Resume updated = storage.get(uuid); - - //Assert - assertEquals("newuuid", updated.getUuid(), "Record is not updated." ); - } - - /// - /// Gets all. - /// - private void getAll(){ - //Act - Resume[] items = storage.getAll(); - - //Assert - assertTrue("getAll returned no items.",items.length > 0); - assertEquals(uuid, items[0].getUuid()); - } - - - /// - /// Gets the by ID. - /// - /// The id of the resume. - private void getById(String uuid) { - //Act - Resume resume = storage.get(uuid); - - //Assert - assertNotNull("getByID returned null.", resume); - assertEquals(uuid, resume.getUuid()); - } - - - private void delete(String uuid) { - //Act - storage.delete(uuid); - Resume resume = storage.get(uuid); - - //Assert - assertNull("Record is not deleted.", resume); - } - - -} \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java index da003ef..39005ab 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java @@ -1,45 +1,110 @@ package ru.javawebinar.basejava.storage.impl; +import org.junit.Before; import org.junit.Test; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + +import java.util.Arrays; +import java.util.Enumeration; + +import static org.junit.Assert.*; -/** - * Test ru.javawebinar.basejava.storage.impl.ArrayStorage - */ public class ArrayStorageTest { - static final Storage ARRAY_STORAGE = new ArrayStorage(); - public static void main(String[] args) { - Resume r1 = new Resume(); - r1.setUuid("uuid1"); - Resume r2 = new Resume(); - r2.setUuid("uuid2"); - Resume r3 = new Resume(); - r3.setUuid("uuid3"); + private Storage storage; - ARRAY_STORAGE.save(r1); - ARRAY_STORAGE.save(r2); - ARRAY_STORAGE.save(r3); + private String uuid = "uuid"; - System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.getUuid())); - System.out.println("Size: " + ARRAY_STORAGE.size()); + @Before + public void setUp() throws Exception { + storage = new ArrayStorage(); + } + + /** + * Resume the crud. + */ + @Test + public void Crud(){ + String newUuid = create(); + getById(newUuid); + getAll(); + update(newUuid); + delete(newUuid); + } - System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); + /** + * Creates this instance. + * @return The id of the new record. + */ + private String create() { + //Arrange + Resume resume = new Resume(); + resume.setUuid(uuid); - printAll(); - ARRAY_STORAGE.delete(r1.getUuid()); - printAll(); - ARRAY_STORAGE.clear(); - printAll(); + //Act + storage.save(resume); - System.out.println("Size: " + ARRAY_STORAGE.size()); + //Assert + assertNotEquals("Creating new record does not return id", null, resume.getUuid()); + + return resume.getUuid(); } - static void printAll() { - System.out.println("\nGet All"); - for (Resume r : ARRAY_STORAGE.getAll()) { - System.out.println(r); - } + /** + * Updates the specified id. + * @param uuid The id. + */ + private void update (String uuid) { + //Arrange + Resume newResume = new Resume(); + newResume.setUuid(uuid); + + //Act + storage.update(newResume); + Resume updated = storage.get(uuid); + + //Assert + assertEquals("Updated object does not equal", updated, newResume); + } + + /** + * Gets all. + */ + private void getAll(){ + //Act + Resume[] items = storage.getAll(); + + //Assert + assertTrue("getAll returned no items.",items.length > 0); + assertEquals(uuid, items[0].getUuid()); + } + + /** + * Gets the by ID. + * @param uuid The id of the resume. + */ + private void getById(String uuid) { + //Act + Resume resume = storage.get(uuid); + + //Assert + assertNotNull("getByID returned null.", resume); + assertEquals(uuid, resume.getUuid()); + } + + /** + * Deletes the specified ID. + * @param uuid The id. + */ + private void delete(String uuid) { + //Act + storage.delete(uuid); + Resume resume = storage.get(uuid); + + //Assert + assertNull("Record is not deleted.", resume); } } \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java index 47b3cd6..886ae7f 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java @@ -1,44 +1,112 @@ package ru.javawebinar.basejava.storage.impl; +import org.junit.Before; +import org.junit.Test; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + +import java.util.Arrays; +import java.util.Enumeration; + +import static org.junit.Assert.*; -/** - * Test ru.javawebinar.basejava.storage.impl.ArrayStorage - */ public class SortedArrayStorageTest { - static final Storage ARRAY_STORAGE = new SortedArrayStorage(); - public static void main(String[] args) { - Resume r1 = new Resume(); - r1.setUuid("uuid1"); - Resume r2 = new Resume(); - r2.setUuid("uuid2"); - Resume r3 = new Resume(); - r3.setUuid("uuid3"); + private Storage storage; + + private String uuid = "uuid"; + + @Before + public void setUp() throws Exception { + storage = new SortedArrayStorage(); + } - ARRAY_STORAGE.save(r1); - ARRAY_STORAGE.save(r2); - ARRAY_STORAGE.save(r3); + /** + * Resume the crud. + */ + @Test + public void Crud(){ + String newUuid = create(); + getById(newUuid); + getAll(); + update(newUuid); + delete(newUuid); + } - System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.getUuid())); - System.out.println("Size: " + ARRAY_STORAGE.size()); + /** + * Creates this instance. + * @return The id of the new record. + */ + private String create() { + //Arrange + Resume resume = new Resume(); + resume.setUuid(uuid); - System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); + //Act + storage.save(resume); - printAll(); - ARRAY_STORAGE.delete(r1.getUuid()); - printAll(); - ARRAY_STORAGE.clear(); - printAll(); + //Assert + assertNotEquals("Creating new record does not return id", null, resume.getUuid()); - System.out.println("Size: " + ARRAY_STORAGE.size()); + return resume.getUuid(); } - static void printAll() { - System.out.println("\nGet All"); - for (Resume r : ARRAY_STORAGE.getAll()) { - System.out.println(r); - } + /** + * Updates the specified id. + * @param uuid The id. + */ + private void update (String uuid) { + //Arrange + Resume newResume = new Resume(); + newResume.setUuid(uuid); + + //Act + storage.update(newResume); + Resume updated = storage.get(uuid); + + //Assert + assertEquals("Updated object does not equal", updated, newResume); } + + /** + * Gets all. + */ + private void getAll(){ + //Act + Resume[] items = storage.getAll(); + + //Assert + assertTrue("getAll returned no items.",items.length > 0); + assertEquals(uuid, items[0].getUuid()); + } + + + /** + * Gets the by ID. + * @param uuid The id of the resume. + */ + private void getById(String uuid) { + //Act + Resume resume = storage.get(uuid); + + //Assert + assertNotNull("getByID returned null.", resume); + assertEquals(uuid, resume.getUuid()); + } + + /** + * Deletes the specified ID. + * @param uuid The id. + */ + private void delete(String uuid) { + //Act + storage.delete(uuid); + Resume resume = storage.get(uuid); + + //Assert + assertNull("Record is not deleted.", resume); + } + } \ No newline at end of file From 959e17b6666315406c237c4cad6ab068309a960b Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Wed, 26 Jun 2019 16:08:21 +0300 Subject: [PATCH 06/12] ready to review help needed!!! --- pom.xml | 14 ++++ .../ru/javawebinar/basejava/MainArray.java | 5 +- .../basejava/MainTestArrayStorage.java | 39 +++++++++- .../storage/AbstractArrayStorage.java | 24 +++--- .../basejava/storage/impl/ArrayStorage.java | 19 +++-- .../storage/impl/SortedArrayStorage.java | 22 +++--- src/test/java/IntegrationMainTest.java | 76 +++++++++++++++++++ .../storage/impl/ArrayStorageTest.java | 39 ++++++---- .../storage/impl/SortedArrayStorageTest.java | 22 +++--- 9 files changed, 201 insertions(+), 59 deletions(-) create mode 100644 src/test/java/IntegrationMainTest.java diff --git a/pom.xml b/pom.xml index 4b4df5b..19e8aea 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,14 @@ ${java.version} + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + -Dfile.encoding=UTF-8 + + @@ -51,6 +59,12 @@ test + + org.assertj + assertj-core + 3.12.2 + test + \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/MainArray.java b/src/main/java/ru/javawebinar/basejava/MainArray.java index 927fa97..0a40979 100644 --- a/src/main/java/ru/javawebinar/basejava/MainArray.java +++ b/src/main/java/ru/javawebinar/basejava/MainArray.java @@ -1,8 +1,9 @@ package ru.javawebinar.basejava; import ru.javawebinar.basejava.model.Resume; -import ru.javawebinar.basejava.storage.impl.ArrayStorage; import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; import java.io.BufferedReader; import java.io.IOException; @@ -12,7 +13,7 @@ * Test for ru.javawebinar.basejava.storage.impl.ArrayStorage */ public class MainArray { - private final static Storage ARRAY_STORAGE = new ArrayStorage(); + private final static Storage ARRAY_STORAGE = new SortedArrayStorage(); public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); diff --git a/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java index 62ba20f..f6c8359 100644 --- a/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java @@ -1,14 +1,20 @@ package ru.javawebinar.basejava; import ru.javawebinar.basejava.model.Resume; -import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; /** * Test ru.javawebinar.basejava.storage.impl.ArrayStorage */ + +/** + * Test for your ArrayStorage implementation + */ public class MainTestArrayStorage { static final Storage ARRAY_STORAGE = new SortedArrayStorage(); + static int ARRAY_STORAGE_LIMIT = 10_000; public static void main(String[] args) { Resume r1 = new Resume(); @@ -17,6 +23,8 @@ public static void main(String[] args) { r2.setUuid("uuid2"); Resume r3 = new Resume(); r3.setUuid("uuid3"); + Resume r2new = new Resume(); + r2new.setUuid("uuid2"); ARRAY_STORAGE.save(r1); ARRAY_STORAGE.save(r2); @@ -27,6 +35,14 @@ public static void main(String[] args) { System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); + ARRAY_STORAGE.save(r2new); + + ARRAY_STORAGE.update(r2new); + System.out.println("Get r2new: " + ARRAY_STORAGE.get(r2new.getUuid())); + + ARRAY_STORAGE.get("uuid111"); + ARRAY_STORAGE.delete("uuid111"); + printAll(); ARRAY_STORAGE.delete(r1.getUuid()); printAll(); @@ -34,6 +50,27 @@ public static void main(String[] args) { printAll(); System.out.println("Size: " + ARRAY_STORAGE.size()); + + try { + for (int i = 0; i <= ARRAY_STORAGE_LIMIT - 1; i++) { + Resume r = new Resume(); + r.setUuid("uuid" + i); + ARRAY_STORAGE.save(r); + } + } catch (NullPointerException ex) { + System.out.println("<--NPE at size: " + ARRAY_STORAGE.size()); + System.out.println("<---" + ARRAY_STORAGE.size()); + } + + Resume r = new Resume(); + try { + r.setUuid("uuid" + ARRAY_STORAGE_LIMIT); + } catch (IllegalStateException ex) { + System.out.println(ex.getMessage()); + } + + // почему не печатает для ArrayStorage??? + System.out.println("Size: " + ARRAY_STORAGE.size()); } static void printAll() { diff --git a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java index 1a30c3b..f759c95 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -3,7 +3,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.javawebinar.basejava.model.Resume; -import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; import java.util.Arrays; @@ -11,8 +10,8 @@ * Array based storage for Resumes */ public abstract class AbstractArrayStorage implements Storage { - protected static final int STORAGE_LIMIT = 10000; - protected final Logger log = LoggerFactory.getLogger(SortedArrayStorage.class); + public static final int STORAGE_LIMIT = 10_000; + protected final Logger log = LoggerFactory.getLogger(AbstractArrayStorage.class); protected Resume[] storage = new Resume[STORAGE_LIMIT]; protected int size = 0; @@ -21,14 +20,6 @@ public int size() { return size; } - public Resume get(String uuid) { - int index = getIndex(uuid); - if (index == -1) { - return null; - } - return storage[index]; - } - public void clear() { Arrays.fill(storage, 0, size, null); size = 0; @@ -38,9 +29,14 @@ public Resume[] getAll() { return Arrays.copyOfRange(storage, 0, size); } - protected abstract void insertAt(Resume resume, int index); + public Resume get(String uuid) { + int index = getIndex(uuid); + if (index < 0) { + return null; + } + return storage[index]; + } - @Override public void update(Resume resume) { int index = getIndex(resume); if (index < 0) { @@ -60,6 +56,8 @@ public void delete(String uuid) { } } + protected abstract void insertAt(Resume resume, int index); + protected abstract void fixAfterDelete(int index); protected abstract int getIndex(Resume resume); diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index d0b31b8..bf29e4f 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -12,34 +12,37 @@ public class ArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(ArrayStorage.class); - - protected int getIndex(Resume resume) { - return getIndex(resume.getUuid()); - } - public void save(Resume resume) { int index = getIndex(resume); if (index < 0) { if (size >= STORAGE_LIMIT) { - log.error("Storage overflow"); + throw new IllegalStateException("Storage overflow."); +// log.error("Storage overflow"); } else { - insertAt(resume,size); + insertAt(resume, size); size++; } } else { - log.error("Resume {} already exists", resume.getUuid());; + log.error("Resume {} already exists", resume.getUuid()); } } + @Override protected void insertAt(Resume resume, int index) { storage[index] = resume; } + @Override protected void fixAfterDelete(int index) { storage[index] = storage[size - 1]; storage[size - 1] = null; } + @Override + protected int getIndex(Resume resume) { + return getIndex(resume.getUuid()); + } + protected int getIndex(String uuid) { for (int i = 0; i < size; i++) { if (uuid.equals(storage[i].getUuid())) { diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index b1a4a91..f5dffdd 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -7,11 +7,6 @@ public class SortedArrayStorage extends AbstractArrayStorage { - - protected int getIndex(Resume resume) { - return Arrays.binarySearch(storage, 0, size, resume); - } - @Override public void save(Resume resume) { int index = getIndex(resume); @@ -20,25 +15,34 @@ public void save(Resume resume) { if (size == STORAGE_LIMIT) { throw new IllegalStateException("Storage overflow."); } else { + size++; index = -index - 1; + insertAt(resume, index); +// size++; } } else { log.error("Resume {} already exist", resume.getUuid()); } - insertAt(resume, index); - size++; } + @Override protected void insertAt(Resume resume, int index) { + System.out.println("index: " + index); + + //Если закомментировать эту строку, то все CRUD тесты проходит, но в массив помещается не больше 16 элементов System.arraycopy(storage, index, storage, index + 1, size - index); storage[index] = resume; } - + @Override protected void fixAfterDelete(int index) { - System.arraycopy(storage, index+1, storage, index, size - index); + System.arraycopy(storage, index + 1, storage, index, size - index); } + @Override + protected int getIndex(Resume resume) { + return Arrays.binarySearch(storage, 0, size, resume); + } @Override protected int getIndex(String uuid) { diff --git a/src/test/java/IntegrationMainTest.java b/src/test/java/IntegrationMainTest.java new file mode 100644 index 0000000..fb50bae --- /dev/null +++ b/src/test/java/IntegrationMainTest.java @@ -0,0 +1,76 @@ +import org.junit.Before; +import org.junit.Test; +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.Storage; +import ru.javawebinar.basejava.storage.impl.ArrayStorage; +import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class IntegrationMainTest { + static int ARRAY_STORAGE_LIMIT = 10_000; + + private Storage storageA; + private Storage storageS; + + private List storages = new ArrayList<>(); + + + @Before + public void setUp() throws Exception { + storageA = new ArrayStorage(); + storageS = new SortedArrayStorage(); + + storages.add(storageA); + storages.add(storageS); + } + + @Test + public void main() { + Resume r1 = new Resume(); + r1.setUuid("uuid1"); + Resume r2 = new Resume(); + r2.setUuid("uuid2"); + Resume r3 = new Resume(); + r3.setUuid("uuid3"); + Resume r2new = new Resume(); + r2new.setUuid("uuid2"); + + storages.forEach(storage -> storage.save(r1)); + storages.forEach(storage -> storage.save(r2)); + storages.forEach(storage -> storage.save(r3)); + assertThat(storageS.getAll()).isEqualTo(storageA.getAll()); + + storages.forEach(storage -> storage.save(r2new)); + assertThat(storageS.getAll()).isEqualTo(storageA.getAll()); + + storages.forEach(storage -> storage.update(r2new)); + assertThat(storageS.getAll()).isEqualTo(storageA.getAll()); + + storages.forEach(storage -> storage.get("uuid111")); + storages.forEach(storage -> storage.delete("uuid111")); + + assertThat(storageS.getAll()).isEqualTo(storageA.getAll()); + + storages.forEach(storage -> storage.delete(r1.getUuid())); + //fail caused by ordering +// assertThat(storageS.getAll()).isEqualTo(storageA.getAll()); + + try { + for (int i = 0; i <= ARRAY_STORAGE_LIMIT - 1; i++) { + Resume r = new Resume(); + r.setUuid("uuid" + i); + storages.forEach(storage -> storage.save(r)); + } + } catch (NullPointerException ex) { +// assertThat(storageS.getAll()).isNotEqualTo(storageA.getAll()); + storages.forEach(storage -> + System.out.println("<---" + storage.size())); + } + + } +} diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java index 39005ab..b1d3690 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java @@ -4,13 +4,9 @@ import org.junit.Test; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.Storage; -import ru.javawebinar.basejava.storage.impl.ArrayStorage; -import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; - -import java.util.Arrays; -import java.util.Enumeration; import static org.junit.Assert.*; +import static ru.javawebinar.basejava.storage.AbstractArrayStorage.STORAGE_LIMIT; public class ArrayStorageTest { @@ -23,11 +19,8 @@ public void setUp() throws Exception { storage = new ArrayStorage(); } - /** - * Resume the crud. - */ @Test - public void Crud(){ + public void Crud() { String newUuid = create(); getById(newUuid); getAll(); @@ -35,8 +28,25 @@ public void Crud(){ delete(newUuid); } + @Test(expected = IllegalStateException.class) + public void Overflow(){ + //Arrange + for (int i = 0; i <= STORAGE_LIMIT-1; i++) { + Resume r = new Resume(); + r.setUuid("uuid" + i); + storage.save(r); + } + + //Act + Resume r = new Resume(); + r.setUuid("uuid" + STORAGE_LIMIT); + storage.save(r); + } + + /** * Creates this instance. + * * @return The id of the new record. */ private String create() { @@ -55,11 +65,12 @@ private String create() { /** * Updates the specified id. + * * @param uuid The id. */ - private void update (String uuid) { + private void update(String uuid) { //Arrange - Resume newResume = new Resume(); + Resume newResume = new Resume(); newResume.setUuid(uuid); //Act @@ -73,17 +84,18 @@ private void update (String uuid) { /** * Gets all. */ - private void getAll(){ + private void getAll() { //Act Resume[] items = storage.getAll(); //Assert - assertTrue("getAll returned no items.",items.length > 0); + assertTrue("getAll returned no items.", items.length > 0); assertEquals(uuid, items[0].getUuid()); } /** * Gets the by ID. + * * @param uuid The id of the resume. */ private void getById(String uuid) { @@ -97,6 +109,7 @@ private void getById(String uuid) { /** * Deletes the specified ID. + * * @param uuid The id. */ private void delete(String uuid) { diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java index 886ae7f..ef68e45 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java @@ -4,11 +4,6 @@ import org.junit.Test; import ru.javawebinar.basejava.model.Resume; import ru.javawebinar.basejava.storage.Storage; -import ru.javawebinar.basejava.storage.impl.ArrayStorage; -import ru.javawebinar.basejava.storage.impl.SortedArrayStorage; - -import java.util.Arrays; -import java.util.Enumeration; import static org.junit.Assert.*; @@ -23,11 +18,8 @@ public void setUp() throws Exception { storage = new SortedArrayStorage(); } - /** - * Resume the crud. - */ @Test - public void Crud(){ + public void Crud() { String newUuid = create(); getById(newUuid); getAll(); @@ -37,6 +29,7 @@ public void Crud(){ /** * Creates this instance. + * * @return The id of the new record. */ private String create() { @@ -55,11 +48,12 @@ private String create() { /** * Updates the specified id. + * * @param uuid The id. */ - private void update (String uuid) { + private void update(String uuid) { //Arrange - Resume newResume = new Resume(); + Resume newResume = new Resume(); newResume.setUuid(uuid); //Act @@ -73,18 +67,19 @@ private void update (String uuid) { /** * Gets all. */ - private void getAll(){ + private void getAll() { //Act Resume[] items = storage.getAll(); //Assert - assertTrue("getAll returned no items.",items.length > 0); + assertTrue("getAll returned no items.", items.length > 0); assertEquals(uuid, items[0].getUuid()); } /** * Gets the by ID. + * * @param uuid The id of the resume. */ private void getById(String uuid) { @@ -98,6 +93,7 @@ private void getById(String uuid) { /** * Deletes the specified ID. + * * @param uuid The id. */ private void delete(String uuid) { From d4636008069946b323756e69af0f0e0aed2501d9 Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Sun, 30 Jun 2019 23:50:22 +0300 Subject: [PATCH 07/12] to review --- .idea/misc.xml | 28 +++++++++++++++++++ .../basejava/MainTestArrayStorage.java | 1 - .../ru/javawebinar/basejava/model/Resume.java | 8 ------ .../storage/AbstractArrayStorage.java | 18 ++++++------ .../basejava/storage/impl/ArrayStorage.java | 15 ++++------ .../storage/impl/SortedArrayStorage.java | 28 +++++++------------ .../storage/impl/ArrayStorageTest.java | 8 +++--- .../storage/impl/SortedArrayStorageTest.java | 18 ++++++++++++ 8 files changed, 75 insertions(+), 49 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 4b661a5..657bdd8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,31 @@ + + + + \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java index f6c8359..65fcd3a 100644 --- a/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/MainTestArrayStorage.java @@ -59,7 +59,6 @@ public static void main(String[] args) { } } catch (NullPointerException ex) { System.out.println("<--NPE at size: " + ARRAY_STORAGE.size()); - System.out.println("<---" + ARRAY_STORAGE.size()); } Resume r = new Resume(); diff --git a/src/main/java/ru/javawebinar/basejava/model/Resume.java b/src/main/java/ru/javawebinar/basejava/model/Resume.java index 32b562d..e78c859 100644 --- a/src/main/java/ru/javawebinar/basejava/model/Resume.java +++ b/src/main/java/ru/javawebinar/basejava/model/Resume.java @@ -8,14 +8,6 @@ public class Resume implements Comparable{ // Unique identifier private String uuid; - public Resume(){ - - } - - public Resume(String uuid) { - this.uuid = uuid; - } - public String getUuid() { return uuid; } diff --git a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java index f759c95..b57d505 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -10,10 +10,10 @@ * Array based storage for Resumes */ public abstract class AbstractArrayStorage implements Storage { - public static final int STORAGE_LIMIT = 10_000; + protected static final int STORAGE_LIMIT = 10_000; protected final Logger log = LoggerFactory.getLogger(AbstractArrayStorage.class); - protected Resume[] storage = new Resume[STORAGE_LIMIT]; + protected final Resume[] storage = new Resume[STORAGE_LIMIT]; protected int size = 0; public int size() { @@ -33,16 +33,18 @@ public Resume get(String uuid) { int index = getIndex(uuid); if (index < 0) { return null; + } else { + log.error("Resume with id {} does not exist", uuid); } return storage[index]; } public void update(Resume resume) { - int index = getIndex(resume); + int index = getIndex(resume.getUuid()); if (index < 0) { log.error("Resume {} does not exist", resume.getUuid()); } else { - insertAt(resume, index); + storage[index] = resume; } } @@ -51,16 +53,16 @@ public void delete(String uuid) { if (index < 0) { log.error("Resume {} does not exist", uuid); } else { - fixAfterDelete(index); + doDelete(index); size--; } } - protected abstract void insertAt(Resume resume, int index); + protected abstract void doSave(Resume resume, int index); - protected abstract void fixAfterDelete(int index); + protected abstract void doDelete(int index); - protected abstract int getIndex(Resume resume); +// protected abstract int getIndex(Resume resume); protected abstract int getIndex(String uuid); } \ No newline at end of file diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java index bf29e4f..eaa9dc3 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/ArrayStorage.java @@ -13,13 +13,12 @@ public class ArrayStorage extends AbstractArrayStorage { protected final Logger log = LoggerFactory.getLogger(ArrayStorage.class); public void save(Resume resume) { - int index = getIndex(resume); + int index = getIndex(resume.getUuid()); if (index < 0) { if (size >= STORAGE_LIMIT) { - throw new IllegalStateException("Storage overflow."); -// log.error("Storage overflow"); + log.error("Storage overflow at :" + size); } else { - insertAt(resume, size); + doSave(resume, size); size++; } } else { @@ -28,21 +27,17 @@ public void save(Resume resume) { } @Override - protected void insertAt(Resume resume, int index) { + protected void doSave(Resume resume, int index) { storage[index] = resume; } @Override - protected void fixAfterDelete(int index) { + protected void doDelete(int index) { storage[index] = storage[size - 1]; storage[size - 1] = null; } @Override - protected int getIndex(Resume resume) { - return getIndex(resume.getUuid()); - } - protected int getIndex(String uuid) { for (int i = 0; i < size; i++) { if (uuid.equals(storage[i].getUuid())) { diff --git a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java index f5dffdd..c7ff12c 100644 --- a/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java +++ b/src/main/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java @@ -9,16 +9,16 @@ public class SortedArrayStorage extends AbstractArrayStorage { @Override public void save(Resume resume) { - int index = getIndex(resume); + int index = getIndex(resume.getUuid()); + if (index < 0) { - // this is a new value to insertAt (not a duplicate). + // this is a new value to doSave (not a duplicate). if (size == STORAGE_LIMIT) { - throw new IllegalStateException("Storage overflow."); + log.error("Storage overflow at :" + size); } else { - size++; index = -index - 1; - insertAt(resume, index); -// size++; + doSave(resume, index); + size++; } } else { log.error("Resume {} already exist", resume.getUuid()); @@ -26,28 +26,20 @@ public void save(Resume resume) { } @Override - protected void insertAt(Resume resume, int index) { - System.out.println("index: " + index); - - //Если закомментировать эту строку, то все CRUD тесты проходит, но в массив помещается не больше 16 элементов - System.arraycopy(storage, index, storage, index + 1, size - index); + protected void doSave(Resume resume, int index) { storage[index] = resume; } @Override - protected void fixAfterDelete(int index) { + protected void doDelete(int index) { System.arraycopy(storage, index + 1, storage, index, size - index); } - @Override - protected int getIndex(Resume resume) { - return Arrays.binarySearch(storage, 0, size, resume); - } - @Override protected int getIndex(String uuid) { Resume resume = new Resume(); resume.setUuid(uuid); - return getIndex(resume); + if (size == 0) return -1; + return Arrays.binarySearch(storage, 0, size, resume); } } \ No newline at end of file diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java index b1d3690..e99e197 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java @@ -6,9 +6,9 @@ import ru.javawebinar.basejava.storage.Storage; import static org.junit.Assert.*; -import static ru.javawebinar.basejava.storage.AbstractArrayStorage.STORAGE_LIMIT; public class ArrayStorageTest { + protected static final int STORAGE_LIMIT = 10_000; private Storage storage; @@ -28,10 +28,10 @@ public void Crud() { delete(newUuid); } - @Test(expected = IllegalStateException.class) - public void Overflow(){ + @Test + public void Overflow() { //Arrange - for (int i = 0; i <= STORAGE_LIMIT-1; i++) { + for (int i = 0; i <= STORAGE_LIMIT - 1; i++) { Resume r = new Resume(); r.setUuid("uuid" + i); storage.save(r); diff --git a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java index ef68e45..db45e12 100644 --- a/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java +++ b/src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java @@ -9,6 +9,8 @@ public class SortedArrayStorageTest { + protected static final int STORAGE_LIMIT = 10_000; + private Storage storage; private String uuid = "uuid"; @@ -27,6 +29,22 @@ public void Crud() { delete(newUuid); } + @Test + public void Overflow() { + //Arrange + for (int i = 0; i <= STORAGE_LIMIT - 1; i++) { + Resume r = new Resume(); + r.setUuid("uuid" + String.format("%05d", i)); + storage.save(r); + } + + //Act + Resume r = new Resume(); + r.setUuid("uuid" + STORAGE_LIMIT); + storage.save(r); + } + + /** * Creates this instance. * From 4dd64bb2e5235b119869f689b1f0d211b62a60e6 Mon Sep 17 00:00:00 2001 From: Lev Tikhonov Date: Mon, 1 Jul 2019 12:34:07 +0300 Subject: [PATCH 08/12] WIP --- .idea/basejava.iml | 11 + .idea/compiler.xml | 13 - .idea/misc.xml | 13 +- .idea/modules.xml | 8 + .idea/qaplug_profiles.xml | 941 ++++++++++++++++++ .idea/vcs.xml | 2 +- basejava.iml | 2 - pom.xml | 70 -- src/main/resources/logback.xml | 29 - .../ru/javawebinar/basejava/MainArray.java | 0 .../basejava/MainTestArrayStorage.java | 0 .../ru/javawebinar/basejava/model/Resume.java | 0 .../storage/AbstractArrayStorage.java | 26 +- .../javawebinar/basejava/storage/Storage.java | 0 .../basejava/storage/impl/ArrayStorage.java | 21 +- .../storage/impl/SortedArrayStorage.java | 22 +- src/test/java/IntegrationMainTest.java | 76 -- .../storage/impl/ArrayStorageTest.java | 123 --- .../storage/impl/SortedArrayStorageTest.java | 126 --- 19 files changed, 987 insertions(+), 496 deletions(-) create mode 100644 .idea/basejava.iml delete mode 100644 .idea/compiler.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/qaplug_profiles.xml delete mode 100644 basejava.iml delete mode 100644 pom.xml delete mode 100644 src/main/resources/logback.xml rename src/{main/java => }/ru/javawebinar/basejava/MainArray.java (100%) rename src/{main/java => }/ru/javawebinar/basejava/MainTestArrayStorage.java (100%) rename src/{main/java => }/ru/javawebinar/basejava/model/Resume.java (100%) rename src/{main/java => }/ru/javawebinar/basejava/storage/AbstractArrayStorage.java (66%) rename src/{main/java => }/ru/javawebinar/basejava/storage/Storage.java (100%) rename src/{main/java => }/ru/javawebinar/basejava/storage/impl/ArrayStorage.java (54%) rename src/{main/java => }/ru/javawebinar/basejava/storage/impl/SortedArrayStorage.java (54%) delete mode 100644 src/test/java/IntegrationMainTest.java delete mode 100644 src/test/java/ru/javawebinar/basejava/storage/impl/ArrayStorageTest.java delete mode 100644 src/test/java/ru/javawebinar/basejava/storage/impl/SortedArrayStorageTest.java diff --git a/.idea/basejava.iml b/.idea/basejava.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/.idea/basejava.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index c632526..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 657bdd8..08b78fd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -19,22 +19,17 @@