diff --git a/src/ArrayStorage.java b/src/ArrayStorage.java deleted file mode 100644 index 7aff0388..00000000 --- a/src/ArrayStorage.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Array based storage for Resumes - */ -public class ArrayStorage { - Resume[] storage = new Resume[10000]; - - void clear() { - } - - void save(Resume r) { - } - - Resume get(String uuid) { - return null; - } - - void delete(String uuid) { - } - - /** - * @return array, contains only Resumes in storage (without null) - */ - Resume[] getAll() { - return new Resume[0]; - } - - int size() { - return 0; - } -} diff --git a/src/MainTestArrayStorage.java b/src/MainTestArrayStorage.java deleted file mode 100644 index b15b81e2..00000000 --- a/src/MainTestArrayStorage.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Test for your ArrayStorage implementation - */ -public class MainTestArrayStorage { - static final ArrayStorage ARRAY_STORAGE = new ArrayStorage(); - - public static void main(String[] args) { - Resume r1 = new Resume(); - r1.uuid = "uuid1"; - Resume r2 = new Resume(); - r2.uuid = "uuid2"; - Resume r3 = new Resume(); - r3.uuid = "uuid3"; - - ARRAY_STORAGE.save(r1); - ARRAY_STORAGE.save(r2); - ARRAY_STORAGE.save(r3); - - System.out.println("Get r1: " + ARRAY_STORAGE.get(r1.uuid)); - System.out.println("Size: " + ARRAY_STORAGE.size()); - - System.out.println("Get dummy: " + ARRAY_STORAGE.get("dummy")); - - printAll(); - ARRAY_STORAGE.delete(r1.uuid); - 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); - } - } -} diff --git a/src/Resume.java b/src/Resume.java deleted file mode 100644 index 8de4e4b8..00000000 --- a/src/Resume.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Initial resume class - */ -public class Resume { - - // Unique identifier - String uuid; - - @Override - public String toString() { - return uuid; - } -} diff --git a/src/MainArray.java b/src/ru/javawebinar/basejava/MainArray.java similarity index 77% rename from src/MainArray.java rename to src/ru/javawebinar/basejava/MainArray.java index 063364db..d13b9b9d 100644 --- a/src/MainArray.java +++ b/src/ru/javawebinar/basejava/MainArray.java @@ -1,3 +1,9 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.ArrayStorage; +import ru.javawebinar.basejava.storage.Storage; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -7,13 +13,14 @@ * (just run, no need to understand) */ public class MainArray { - private final static ArrayStorage ARRAY_STORAGE = new ArrayStorage(); + private static final Storage ARRAY_STORAGE = new ArrayStorage(); public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - Resume r; + Resume resume; while (true) { - System.out.print("Введите одну из команд - (list | size | save uuid | delete uuid | get uuid | clear | exit): "); + System.out.print("Введите одну из команд - (list | size | save uuid | update uuid | delete uuid " + + "| get uuid | clear | exit): "); String[] params = reader.readLine().trim().toLowerCase().split(" "); if (params.length < 1 || params.length > 2) { System.out.println("Неверная команда."); @@ -31,11 +38,14 @@ public static void main(String[] args) throws IOException { System.out.println(ARRAY_STORAGE.size()); break; case "save": - r = new Resume(); - r.uuid = uuid; - ARRAY_STORAGE.save(r); + resume = new Resume(uuid); + ARRAY_STORAGE.save(resume); printAll(); break; + case "update": + resume = new Resume(uuid); + ARRAY_STORAGE.update(resume); + break; case "delete": ARRAY_STORAGE.delete(uuid); printAll(); diff --git a/src/ru/javawebinar/basejava/MainReflection.java b/src/ru/javawebinar/basejava/MainReflection.java new file mode 100644 index 00000000..4be1cc91 --- /dev/null +++ b/src/ru/javawebinar/basejava/MainReflection.java @@ -0,0 +1,20 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; + +import java.lang.reflect.Field; + +public class MainReflection { + + public static void main(String[] args) throws IllegalAccessException { + Resume r = new Resume(); + Field field = r.getClass().getDeclaredFields()[0]; + field.setAccessible(true); + System.out.println(field.getName()); + System.out.println(field.get(r)); + field.set(r, "new_uuid"); + //System.out.println(field(r)); + // TODO : invoke r.toString via reflection + System.out.println(r); + } +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/MainTestArrayStorage.java b/src/ru/javawebinar/basejava/MainTestArrayStorage.java new file mode 100644 index 00000000..e305bd14 --- /dev/null +++ b/src/ru/javawebinar/basejava/MainTestArrayStorage.java @@ -0,0 +1,45 @@ +package ru.javawebinar.basejava; + +import ru.javawebinar.basejava.model.Resume; +import ru.javawebinar.basejava.storage.SortedArrayStorage; +import ru.javawebinar.basejava.storage.Storage; + +public class MainTestArrayStorage { + static final Storage ARRAY_STORAGE = new SortedArrayStorage(); + + public static void main(String[] args) { + final Resume r1 = new Resume("uuid1"); + final Resume r2 = new Resume("uuid2"); + final Resume r6 = new Resume("uuid6"); + final Resume r3 = new Resume("uuid3"); + final Resume r4 = new Resume("uuid3"); + final Resume r5 = new Resume("uuid5"); + + ARRAY_STORAGE.save(r1); + ARRAY_STORAGE.save(r2); + ARRAY_STORAGE.save(r3); + ARRAY_STORAGE.save(r6); + ARRAY_STORAGE.save(r5); + + 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.update(r4); + 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); + } + } +} diff --git a/src/ru/javawebinar/basejava/exception/ExistStorageException.java b/src/ru/javawebinar/basejava/exception/ExistStorageException.java new file mode 100644 index 00000000..25742a9c --- /dev/null +++ b/src/ru/javawebinar/basejava/exception/ExistStorageException.java @@ -0,0 +1,7 @@ +package ru.javawebinar.basejava.exception; + +public class ExistStorageException extends StorageException{ + public ExistStorageException(String uuid) { + super("Резюме уже существует ID:" + uuid, uuid); + } +} diff --git a/src/ru/javawebinar/basejava/exception/NotExistStorageException.java b/src/ru/javawebinar/basejava/exception/NotExistStorageException.java new file mode 100644 index 00000000..41224ae5 --- /dev/null +++ b/src/ru/javawebinar/basejava/exception/NotExistStorageException.java @@ -0,0 +1,7 @@ +package ru.javawebinar.basejava.exception; + +public class NotExistStorageException extends StorageException{ + public NotExistStorageException(String uuid) { + super("Не найдено резюме ID:" + uuid, uuid); + } +} diff --git a/src/ru/javawebinar/basejava/exception/StorageException.java b/src/ru/javawebinar/basejava/exception/StorageException.java new file mode 100644 index 00000000..ccc8bb65 --- /dev/null +++ b/src/ru/javawebinar/basejava/exception/StorageException.java @@ -0,0 +1,14 @@ +package ru.javawebinar.basejava.exception; + +public class StorageException extends RuntimeException{ + private final String uuid; + + public StorageException(String message, String uuid) { + super(message); + this.uuid = uuid; + } + + public String getUuid() { + return uuid; + } +} diff --git a/src/ru/javawebinar/basejava/model/Resume.java b/src/ru/javawebinar/basejava/model/Resume.java new file mode 100644 index 00000000..fcd7c06a --- /dev/null +++ b/src/ru/javawebinar/basejava/model/Resume.java @@ -0,0 +1,45 @@ +package ru.javawebinar.basejava.model; + +import java.util.UUID; + +public class Resume implements Comparable{ + + private final String uuid; + + public Resume(){ + this(UUID.randomUUID().toString()); + } + + public Resume(String uuid) { + this.uuid = uuid; + } + + public String getUuid() { + return 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/ru/javawebinar/basejava/storage/AbstractArrayStorage.java b/src/ru/javawebinar/basejava/storage/AbstractArrayStorage.java new file mode 100644 index 00000000..f3335784 --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/AbstractArrayStorage.java @@ -0,0 +1,80 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.exception.ExistStorageException; +import ru.javawebinar.basejava.exception.NotExistStorageException; +import ru.javawebinar.basejava.exception.StorageException; +import ru.javawebinar.basejava.model.Resume; + +import java.util.Arrays; + +public abstract class AbstractArrayStorage implements Storage { + protected static final int STORAGE_LIMIT = 10_000; + protected Resume[] storage = new Resume[STORAGE_LIMIT]; + protected int size = 0; + + public int size() { + return size; + } + + public Resume[] getAll() { + return Arrays.copyOfRange(storage, 0, size); + } + + public final void save(Resume resume) { + int index = getIndex(resume.getUuid()); + + if (STORAGE_LIMIT <= size) { + throw new StorageException("Storage overflow!", resume.getUuid()); + } else if (index >= 0) { + throw new ExistStorageException(resume.getUuid()); + } + size++; + putResume(resume, index); + } + + public final void update(Resume resume) { + int index = getIndex(resume.getUuid()); + + if (index >= 0) { + storage[index] = resume; + System.out.println("Резюме успешно обновлено ID:" + resume.getUuid()); + } else { + throw new NotExistStorageException(resume.getUuid()); + } + } + + public final Resume get(String uuid) { + int index = getIndex(uuid); + if (index < 0) { + throw new NotExistStorageException(uuid); + } + return storage[index]; + } + + public final void delete(String uuid) { + int index = getIndex(uuid); + + if (index < 0) { + throw new NotExistStorageException(uuid); + } + shrinkArray(index); + size--; + System.out.println("Резюме удалено! ID:" + uuid); + } + + public void clear() { + + if(size > 0){ + Arrays.fill(storage, 0, size - 1, null); + size = 0; + System.out.println("Массив полностью очищен!"); + } + + } + + protected abstract int getIndex(String uuid); + + protected abstract void putResume(Resume resume, int index); + + protected abstract void shrinkArray(int index); +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/ArrayStorage.java b/src/ru/javawebinar/basejava/storage/ArrayStorage.java new file mode 100644 index 00000000..992b29a1 --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/ArrayStorage.java @@ -0,0 +1,28 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +public class ArrayStorage extends AbstractArrayStorage { + + @Override + protected int getIndex(String uuid) { + for (int i = 0; i < size; i++) { + if (uuid.equals(storage[i].getUuid())) { + return i; + } + } + return -1; + } + + @Override + protected void putResume(Resume resume, int index) { + storage[size-1] = resume; + System.out.println("Резюме успешно сохранено! ID:" + resume.getUuid()); + } + + @Override + protected void shrinkArray(int index) { + storage[index] = storage[size - 1]; + storage[size - 1] = null; + } +} diff --git a/src/ru/javawebinar/basejava/storage/SortedArrayStorage.java b/src/ru/javawebinar/basejava/storage/SortedArrayStorage.java new file mode 100644 index 00000000..45801395 --- /dev/null +++ b/src/ru/javawebinar/basejava/storage/SortedArrayStorage.java @@ -0,0 +1,26 @@ +package ru.javawebinar.basejava.storage; + +import ru.javawebinar.basejava.model.Resume; + +import java.util.Arrays; + +public class SortedArrayStorage extends AbstractArrayStorage { + + @Override + protected int getIndex(String uuid) { + Resume searchKey = new Resume(uuid); + return Arrays.binarySearch(storage, 0, size, searchKey); + } + + @Override + protected void putResume(Resume resume, int index) { + System.arraycopy(storage, -index - 1, storage, -index, size - index); + storage[-index - 1] = resume; + System.out.println("Резюме успешно добавлено в массив! ID:" + resume.getUuid()); + } + + @Override + protected void shrinkArray(int index) { + System.arraycopy(storage, index + 1, storage, index, size - index - 1); + } +} \ No newline at end of file diff --git a/src/ru/javawebinar/basejava/storage/Storage.java b/src/ru/javawebinar/basejava/storage/Storage.java new file mode 100644 index 00000000..2f7a1d9e --- /dev/null +++ b/src/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/test/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java b/test/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java new file mode 100644 index 00000000..8875fab4 --- /dev/null +++ b/test/ru/javawebinar/basejava/storage/AbstractArrayStorageTest.java @@ -0,0 +1,76 @@ +package ru.javawebinar.basejava.storage; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import ru.javawebinar.basejava.exception.ExistStorageException; +import ru.javawebinar.basejava.exception.NotExistStorageException; +import ru.javawebinar.basejava.model.Resume; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class AbstractArrayStorageTest { + + + private static final Storage storage = new ArrayStorage(); + + @BeforeEach + void beforeEach() { + storage.clear(); + final Resume r1 = new Resume("uuid1"); + final Resume r2 = new Resume("uuid2"); + final Resume r3 = new Resume("uuid3"); + + storage.save(r1); + storage.save(r2); + storage.save(r3); + } + + @Test + void size() { + assertEquals(3, storage.size()); + } + + @Test + void getAll() { + Resume[] testResume = {new Resume("uuid1"), new Resume("uuid2"), new Resume("uuid3")}; + assertArrayEquals(testResume, storage.getAll()); + } + + @Test + void save() { + Resume[] resumes = {new Resume("uuid1"), new Resume("uuid2"), new Resume("uuid3"), new Resume("uuid4")}; + storage.save(new Resume("uuid4")); + assertArrayEquals(resumes, storage.getAll()); + assertThrows(ExistStorageException.class, () -> storage.save(new Resume("uuid4"))); + } + + @Test + void update() { + Resume updatedResume = new Resume("uuid1"); + storage.update(updatedResume); + assertEquals(updatedResume, storage.get("uuid1")); + assertThrows(NotExistStorageException.class, () -> storage.update(new Resume("uuid55"))); + } + + @Test + void get() { + Resume updatedToGet = new Resume("uuid2"); + assertEquals(updatedToGet, storage.get("uuid2")); + } + + @Test + void delete() { + Resume[] testResume = {new Resume("uuid3"), new Resume("uuid2")}; + storage.delete("uuid1"); + assertArrayEquals(testResume, storage.getAll()); + } + + @Test + void clear() { + assertEquals(3, storage.size()); + storage.clear(); + assertEquals(0, storage.size()); + } +} \ No newline at end of file diff --git a/test/ru/javawebinar/basejava/storage/ArrayStorageTest.java b/test/ru/javawebinar/basejava/storage/ArrayStorageTest.java new file mode 100644 index 00000000..dfe3ad7b --- /dev/null +++ b/test/ru/javawebinar/basejava/storage/ArrayStorageTest.java @@ -0,0 +1,20 @@ +package ru.javawebinar.basejava.storage; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ArrayStorageTest { + + @Test + void getIndex() { + } + + @Test + void putResume() { + } + + @Test + void shrinkArray() { + } +} \ No newline at end of file