From 7f1d86e929a18674c6a27a23f78d92b30847280b Mon Sep 17 00:00:00 2001 From: Kvitto Date: Tue, 24 Sep 2024 00:33:46 +0300 Subject: [PATCH 1/9] Prepare to Lesson 15 --- src/com/urise/webapp/ResumeTestData.java | 2 +- src/com/urise/webapp/storage/SqlStorage.java | 24 +++++++++---------- .../webapp/storage/AbstractStorageTest.java | 5 +++- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/com/urise/webapp/ResumeTestData.java b/src/com/urise/webapp/ResumeTestData.java index 73e3e4f..11ce90c 100644 --- a/src/com/urise/webapp/ResumeTestData.java +++ b/src/com/urise/webapp/ResumeTestData.java @@ -18,7 +18,7 @@ public static Resume createResume(String uuid, String fullName) { myContacts.put(ContactType.LINKEDIN, "https://www.linkedin.com/in/gkislin"); myContacts.put(ContactType.GITHUB, "https://github.com/gkislin"); myContacts.put(ContactType.STACKOVERFLOW, "https://stackoverflow.com/users/548473"); - myContacts.put(ContactType.HOME_PAGE, "http://gkislin.ru/"); +// myContacts.put(ContactType.HOME_PAGE, "http://gkislin.ru/"); Map mySections = myResume.getSections(); /* diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index a708f1f..7588c94 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -22,7 +22,7 @@ public void clear() { @Override public Resume get(String uuid) { - return sqlHelper.execute("" + + return sqlHelper.execute( " SELECT * FROM resume r " + " LEFT JOIN contact c " + " ON r.uuid = c.resume_uuid " + @@ -84,25 +84,23 @@ public void delete(String uuid) { @Override public List getAllSorted() { - return sqlHelper.execute("" + + return sqlHelper.execute( " SELECT * FROM resume r " + " LEFT JOIN contact c " + " ON r.uuid = c.resume_uuid " + " ORDER BY full_name, uuid", ps -> { ResultSet rs = ps.executeQuery(); Map resumeMap = new LinkedHashMap<>(); - if (rs.next()) { - do { - String uuid = rs.getString("uuid"); - Resume r = resumeMap.get(uuid); - if (r == null) { - r = new Resume(uuid, rs.getString("full_name")); - resumeMap.put(uuid, r); - } - addContact(rs, r); - } while (rs.next()); + while (rs.next()) { + String uuid = rs.getString("uuid"); + Resume r = resumeMap.get(uuid); + if (r == null) { + r = new Resume(uuid, rs.getString("full_name")); + resumeMap.put(uuid, r); + } + addContact(rs, r); } - return resumeMap.values().stream().toList(); + return new ArrayList<>(resumeMap.values()); }); } diff --git a/test/com/urise/webapp/storage/AbstractStorageTest.java b/test/com/urise/webapp/storage/AbstractStorageTest.java index c251622..23da38e 100644 --- a/test/com/urise/webapp/storage/AbstractStorageTest.java +++ b/test/com/urise/webapp/storage/AbstractStorageTest.java @@ -3,6 +3,7 @@ import com.urise.webapp.Config; import com.urise.webapp.exception.ExistStorageException; import com.urise.webapp.exception.NotExistStorageException; +import com.urise.webapp.model.ContactType; import com.urise.webapp.model.Resume; import org.junit.Before; import org.junit.Test; @@ -63,6 +64,8 @@ public void clear() throws Exception { @Test public void update() throws Exception { Resume newResume = createResume(UUID_1, "newFirstResume"); + newResume.addContact(ContactType.HOME_PAGE, "http://gkislin.ru/"); + newResume.getContacts().put(ContactType.MAIL, "edarg@wsfws.ru"); storage.update(newResume); Resume oldRes = storage.get(UUID_1); assertEquals(newResume, oldRes); @@ -77,7 +80,7 @@ public void updateNotExist() throws Exception { public void getAllSorted() throws Exception { List list = storage.getAllSorted(); assertEquals(3, list.size()); - assertEquals(list, Arrays.asList(RESUME_1, RESUME_2, RESUME_3)); + assertEquals(Arrays.asList(RESUME_1, RESUME_2, RESUME_3), list); } @Test From d867afcfc45acb1c7a9ea3f94e86f96db0e35f0b Mon Sep 17 00:00:00 2001 From: Kvitto Date: Fri, 27 Sep 2024 15:20:21 +0300 Subject: [PATCH 2/9] Lesson 15 --- src/com/urise/webapp/web/ResumeServlet.java | 24 +++++++++++++++++++ .../webapp/storage/AbstractStorageTest.java | 5 +++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/com/urise/webapp/web/ResumeServlet.java diff --git a/src/com/urise/webapp/web/ResumeServlet.java b/src/com/urise/webapp/web/ResumeServlet.java new file mode 100644 index 0000000..0363301 --- /dev/null +++ b/src/com/urise/webapp/web/ResumeServlet.java @@ -0,0 +1,24 @@ +package com.urise.webapp.web; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +public class ResumeServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + String name = request.getParameter("name"); + response.getWriter().write(name == null ? "Hello Senior Java Developer" : "Hello " + name + " - new Senior Java Developer"); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + } +} diff --git a/test/com/urise/webapp/storage/AbstractStorageTest.java b/test/com/urise/webapp/storage/AbstractStorageTest.java index 23da38e..0bda946 100644 --- a/test/com/urise/webapp/storage/AbstractStorageTest.java +++ b/test/com/urise/webapp/storage/AbstractStorageTest.java @@ -10,6 +10,7 @@ import java.io.File; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -80,7 +81,9 @@ public void updateNotExist() throws Exception { public void getAllSorted() throws Exception { List list = storage.getAllSorted(); assertEquals(3, list.size()); - assertEquals(Arrays.asList(RESUME_1, RESUME_2, RESUME_3), list); + List sortedList = Arrays.asList(RESUME_1, RESUME_2, RESUME_3); + Collections.sort(sortedList); + assertEquals(sortedList, list); } @Test From 24349e35b20dc6214371900cdcee74786d677cca Mon Sep 17 00:00:00 2001 From: Kvitto Date: Fri, 27 Sep 2024 15:25:09 +0300 Subject: [PATCH 3/9] HW15 SqlStorage.getAllSorted - getAllSorted() - through two separate query. --- src/com/urise/webapp/ResumeTestData.java | 2 +- src/com/urise/webapp/storage/SqlStorage.java | 110 +++++++++---------- 2 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/com/urise/webapp/ResumeTestData.java b/src/com/urise/webapp/ResumeTestData.java index 11ce90c..90bb164 100644 --- a/src/com/urise/webapp/ResumeTestData.java +++ b/src/com/urise/webapp/ResumeTestData.java @@ -82,7 +82,7 @@ public static Resume createResume(String uuid, String fullName) { "архитектурных шаблонов, UML, функционального программирования"); myQualifications.add("Родной русский, английский \"upper intermediate\""); mySections.put(SectionType.QUALIFICATION, new ListSection(myQualifications)); - +/* // EXPERIENCE section List myCompanies = new ArrayList<>(); myCompanies.add(new Company("Java Online Projects", "http://javaops.ru/", diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 7588c94..65237dd 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -24,35 +24,36 @@ public void clear() { public Resume get(String uuid) { return sqlHelper.execute( " SELECT * FROM resume r " + - " LEFT JOIN contact c " + - " ON r.uuid = c.resume_uuid " + - " WHERE r.uuid =? ", ps -> { - ps.setString(1, uuid); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new NotExistStorageException(uuid); - } - Resume r = new Resume(uuid, rs.getString("full_name")); - do { - addContact(rs, r); - } while (rs.next()); - return r; - }); + " LEFT JOIN contact c " + + " ON r.uuid = c.resume_uuid " + + " WHERE r.uuid =? ", + ps -> { + ps.setString(1, uuid); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + throw new NotExistStorageException(uuid); + } + Resume r = new Resume(uuid, rs.getString("full_name")); + do { + addContact(rs, r); + } while (rs.next()); + + return r; + }); } @Override public void update(Resume r) { sqlHelper.transactionalExecute(conn -> { - try (PreparedStatement ps = conn.prepareStatement( - "UPDATE resume SET full_name = ? WHERE uuid = ?")) { + try (PreparedStatement ps = conn.prepareStatement("UPDATE resume SET full_name = ? WHERE uuid = ?")) { ps.setString(1, r.getFullName()); ps.setString(2, r.getUuid()); - if (ps.executeUpdate() == 0) { + if (ps.executeUpdate() != 1) { throw new NotExistStorageException(r.getUuid()); } } - delContacts(r, conn); - addContacts(r, conn); + deleteContacts(conn, r); + insertContact(conn, r); return null; }); } @@ -60,13 +61,12 @@ public void update(Resume r) { @Override public void save(Resume r) { sqlHelper.transactionalExecute(conn -> { - try (PreparedStatement ps = conn.prepareStatement( - "INSERT INTO resume (full_name, uuid) VALUES (?,?)")) { - ps.setString(1, r.getFullName()); - ps.setString(2, r.getUuid()); + try (PreparedStatement ps = conn.prepareStatement("INSERT INTO resume (uuid, full_name) VALUES (?,?)")) { + ps.setString(1, r.getUuid()); + ps.setString(2, r.getFullName()); ps.execute(); } - addContacts(r, conn); + insertContact(conn, r); return null; }); } @@ -84,24 +84,24 @@ public void delete(String uuid) { @Override public List getAllSorted() { + Map map = new LinkedHashMap<>(); + sqlHelper.execute( + "SELECT * FROM resume r ORDER BY full_name, uuid", ps -> { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + map.put(rs.getString("uuid"), new Resume(rs.getString("uuid"), rs.getString("full_name"))); + } + return null; + }); return sqlHelper.execute( - " SELECT * FROM resume r " + - " LEFT JOIN contact c " + - " ON r.uuid = c.resume_uuid " + - " ORDER BY full_name, uuid", ps -> { - ResultSet rs = ps.executeQuery(); - Map resumeMap = new LinkedHashMap<>(); - while (rs.next()) { - String uuid = rs.getString("uuid"); - Resume r = resumeMap.get(uuid); - if (r == null) { - r = new Resume(uuid, rs.getString("full_name")); - resumeMap.put(uuid, r); - } - addContact(rs, r); - } - return new ArrayList<>(resumeMap.values()); - }); + "SELECT * FROM contact", ps -> { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + map.get(rs.getString("resume_uuid")) + .addContact(ContactType.valueOf(rs.getString("type")), rs.getString("value")); + } + return new ArrayList<>(map.values()); + }); } @Override @@ -112,16 +112,8 @@ public int size() { }); } - private static void addContact(ResultSet rs, Resume r) throws SQLException { - String type = rs.getString("type"); - if (type != null) { - r.addContact(ContactType.valueOf(type), rs.getString("value")); - } - } - - private static void addContacts(Resume r, Connection conn) throws SQLException { - try (PreparedStatement ps = conn.prepareStatement( - "INSERT INTO contact (resume_uuid, type, value) VALUES (?,?,?)")) { + private void insertContact(Connection conn, Resume r) throws SQLException { + try (PreparedStatement ps = conn.prepareStatement("INSERT INTO contact (resume_uuid, type, value) VALUES (?,?,?)")) { for (Map.Entry e : r.getContacts().entrySet()) { ps.setString(1, r.getUuid()); ps.setString(2, e.getKey().name()); @@ -132,12 +124,18 @@ private static void addContacts(Resume r, Connection conn) throws SQLException { } } - private void delContacts(Resume r, Connection conn) throws SQLException { - try (PreparedStatement ps = conn.prepareStatement( - "DELETE FROM contact WHERE resume_uuid=?")) { + private void deleteContacts(Connection conn, Resume r) { + sqlHelper.execute("DELETE FROM contact WHERE resume_uuid=?", ps -> { ps.setString(1, r.getUuid()); - ps.executeUpdate(); - } + ps.execute(); + return null; + }); } + private void addContact(ResultSet rs, Resume r) throws SQLException { + String value = rs.getString("value"); + if (value != null) { + r.addContact(ContactType.valueOf(rs.getString("type")), value); + } + } } \ No newline at end of file From 4ab40d135c1a81953067cd03e4195a2ae2f8e65a Mon Sep 17 00:00:00 2001 From: Kvitto Date: Sat, 28 Sep 2024 19:01:04 +0300 Subject: [PATCH 4/9] HW15 SqlStorage - getAllSorted() - functionality for storing resume sections has been added. --- src/com/urise/webapp/ResumeTestData.java | 13 +++-- src/com/urise/webapp/storage/SqlStorage.java | 58 +++++++++++++++++--- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/com/urise/webapp/ResumeTestData.java b/src/com/urise/webapp/ResumeTestData.java index 90bb164..a3092a5 100644 --- a/src/com/urise/webapp/ResumeTestData.java +++ b/src/com/urise/webapp/ResumeTestData.java @@ -1,13 +1,14 @@ package com.urise.webapp; -import com.urise.webapp.model.ContactType; -import com.urise.webapp.model.Resume; -import com.urise.webapp.model.Section; -import com.urise.webapp.model.SectionType; +import com.urise.webapp.model.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class ResumeTestData { + private ResumeTestData() {} + public static Resume createResume(String uuid, String fullName) { Resume myResume = new Resume(uuid, fullName); @@ -18,10 +19,10 @@ public static Resume createResume(String uuid, String fullName) { myContacts.put(ContactType.LINKEDIN, "https://www.linkedin.com/in/gkislin"); myContacts.put(ContactType.GITHUB, "https://github.com/gkislin"); myContacts.put(ContactType.STACKOVERFLOW, "https://stackoverflow.com/users/548473"); -// myContacts.put(ContactType.HOME_PAGE, "http://gkislin.ru/"); + myContacts.put(ContactType.HOME_PAGE, "http://gkislin.ru/"); Map mySections = myResume.getSections(); -/* + // OBJECTIVE section String myObjective = "Ведущий стажировок и корпоративного обучения по Java Web и Enterprise технологиям"; mySections.put(SectionType.OBJECTIVE, new TextSection(myObjective)); diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 65237dd..691f871 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -1,8 +1,7 @@ package com.urise.webapp.storage; import com.urise.webapp.exception.NotExistStorageException; -import com.urise.webapp.model.ContactType; -import com.urise.webapp.model.Resume; +import com.urise.webapp.model.*; import com.urise.webapp.sql.SqlHelper; import java.sql.*; @@ -37,7 +36,7 @@ public Resume get(String uuid) { do { addContact(rs, r); } while (rs.next()); - + getSections(r); return r; }); } @@ -52,8 +51,10 @@ public void update(Resume r) { throw new NotExistStorageException(r.getUuid()); } } - deleteContacts(conn, r); + deleteContact(conn, r); + deleteSection(conn, r); insertContact(conn, r); + insertSection(conn, r); return null; }); } @@ -67,6 +68,7 @@ public void save(Resume r) { ps.execute(); } insertContact(conn, r); + insertSection(conn, r); return null; }); } @@ -93,15 +95,17 @@ public List getAllSorted() { } return null; }); - return sqlHelper.execute( + sqlHelper.execute( "SELECT * FROM contact", ps -> { ResultSet rs = ps.executeQuery(); while (rs.next()) { map.get(rs.getString("resume_uuid")) .addContact(ContactType.valueOf(rs.getString("type")), rs.getString("value")); } - return new ArrayList<>(map.values()); + return null; }); + map.values().forEach(this::getSections); + return new ArrayList<>(map.values()); } @Override @@ -124,8 +128,28 @@ private void insertContact(Connection conn, Resume r) throws SQLException { } } - private void deleteContacts(Connection conn, Resume r) { - sqlHelper.execute("DELETE FROM contact WHERE resume_uuid=?", ps -> { + private void insertSection(Connection conn, Resume r) throws SQLException { + try (PreparedStatement ps = conn.prepareStatement("INSERT INTO section (resume_uuid, type, value) VALUES (?,?,?)")) { + for (Map.Entry e : r.getSections().entrySet()) { + ps.setString(1, r.getUuid()); + ps.setString(2, e.getKey().name()); + ps.setString(3, e.getValue().toString()); + ps.addBatch(); + } + ps.executeBatch(); + } + } + + private void deleteContact(Connection conn, Resume r) { + sqlHelper.execute("DELETE FROM contact WHERE resume_uuid=?", ps -> { + ps.setString(1, r.getUuid()); + ps.execute(); + return null; + }); + } + + private void deleteSection(Connection conn, Resume r) { + sqlHelper.execute("DELETE FROM section WHERE resume_uuid=?", ps -> { ps.setString(1, r.getUuid()); ps.execute(); return null; @@ -138,4 +162,22 @@ private void addContact(ResultSet rs, Resume r) throws SQLException { r.addContact(ContactType.valueOf(rs.getString("type")), value); } } + + private void getSections(Resume resume) { + sqlHelper.execute( + "SELECT * FROM section WHERE resume_uuid =?", + ps -> { + ps.setString(1, resume.getUuid()); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + SectionType type = SectionType.valueOf(rs.getString("type")); + resume.getSections().put(type, (type == SectionType.OBJECTIVE || type == SectionType.PERSONAL) ? + new TextSection(rs.getString("value")) : + new ListSection(List.of(rs.getString("value").split("\n")))); + } + return null; + }); + } + + } \ No newline at end of file From 58bfc710e1dc3aee3cba578c2b2c2b22476f5196 Mon Sep 17 00:00:00 2001 From: Kvitto Date: Sat, 28 Sep 2024 20:20:57 +0300 Subject: [PATCH 5/9] HW15 ResumeServlet - added connection to db.resumes - response all resumes to web table --- src/com/urise/webapp/web/ResumeServlet.java | 28 +++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/com/urise/webapp/web/ResumeServlet.java b/src/com/urise/webapp/web/ResumeServlet.java index 0363301..2f979c8 100644 --- a/src/com/urise/webapp/web/ResumeServlet.java +++ b/src/com/urise/webapp/web/ResumeServlet.java @@ -1,11 +1,16 @@ package com.urise.webapp.web; +import com.urise.webapp.Config; +import com.urise.webapp.model.Resume; +import com.urise.webapp.storage.Storage; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; public class ResumeServlet extends HttpServlet { @Override @@ -13,8 +18,27 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); - String name = request.getParameter("name"); - response.getWriter().write(name == null ? "Hello Senior Java Developer" : "Hello " + name + " - new Senior Java Developer"); + + Storage db = Config.get().getStorage(); + List resumes = db.getAllSorted(); + + PrintWriter writer = response.getWriter(); + StringBuilder sb = new StringBuilder(); + + sb.append("Resume Servlet"); + sb.append(""); + sb.append("

Resume Servlet

"); + sb.append(""); + resumes.forEach(resume -> { + sb.append("") + .append("") + .append("") + .append(""); + }); + sb.append("
").append(resume.getUuid()).append("").append(resume.getFullName()).append("
"); + sb.append(""); + + writer.append(sb.toString()); } @Override From 9fc8bbfb01cd593e0ac31ee543351c8cf5db1aea Mon Sep 17 00:00:00 2001 From: Kvitto Date: Mon, 30 Sep 2024 09:03:10 +0300 Subject: [PATCH 6/9] HW15 ResumeServlet - fix after review --- src/com/urise/webapp/storage/SqlStorage.java | 67 ++++++++++++++------ src/com/urise/webapp/web/ResumeServlet.java | 10 ++- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 691f871..67cebec 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -5,7 +5,10 @@ import com.urise.webapp.sql.SqlHelper; import java.sql.*; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; public class SqlStorage implements Storage { public final SqlHelper sqlHelper; @@ -21,24 +24,19 @@ public void clear() { @Override public Resume get(String uuid) { - return sqlHelper.execute( - " SELECT * FROM resume r " + - " LEFT JOIN contact c " + - " ON r.uuid = c.resume_uuid " + - " WHERE r.uuid =? ", + Resume resume = sqlHelper.execute( + "SELECT * FROM resume r WHERE r.uuid =?", ps -> { ps.setString(1, uuid); ResultSet rs = ps.executeQuery(); if (!rs.next()) { throw new NotExistStorageException(uuid); } - Resume r = new Resume(uuid, rs.getString("full_name")); - do { - addContact(rs, r); - } while (rs.next()); - getSections(r); - return r; + return new Resume(uuid, rs.getString("full_name")); }); + addContacts(resume); + addSections(resume); + return resume; } @Override @@ -104,7 +102,7 @@ public List getAllSorted() { } return null; }); - map.values().forEach(this::getSections); + map.values().forEach(this::addSections); return new ArrayList<>(map.values()); } @@ -133,13 +131,24 @@ private void insertSection(Connection conn, Resume r) throws SQLException { for (Map.Entry e : r.getSections().entrySet()) { ps.setString(1, r.getUuid()); ps.setString(2, e.getKey().name()); - ps.setString(3, e.getValue().toString()); + switch (e.getKey().ordinal()) { + case 0, 1 -> ps.setString(3, ((TextSection) e.getValue()).getContent()); + case 2, 3 -> ps.setString(3, listToString(((ListSection) e.getValue()).getItems())); + } ps.addBatch(); } ps.executeBatch(); } } + private String listToString(List list) { + StringBuilder sb = new StringBuilder(); + for (String s : list) { + sb.append(s).append("\n"); + } + return sb.toString(); + } + private void deleteContact(Connection conn, Resume r) { sqlHelper.execute("DELETE FROM contact WHERE resume_uuid=?", ps -> { ps.setString(1, r.getUuid()); @@ -156,6 +165,23 @@ private void deleteSection(Connection conn, Resume r) { }); } + private void addContacts(Resume r) { + sqlHelper.execute( + "SELECT * FROM contact c WHERE c.resume_uuid =?", + ps -> { + String uuid = r.getUuid(); + ps.setString(1, uuid); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + throw new NotExistStorageException(uuid); + } + do { + addContact(rs, r); + } while (rs.next()); + return null; + }); + } + private void addContact(ResultSet rs, Resume r) throws SQLException { String value = rs.getString("value"); if (value != null) { @@ -163,7 +189,7 @@ private void addContact(ResultSet rs, Resume r) throws SQLException { } } - private void getSections(Resume resume) { + private void addSections(Resume resume) { sqlHelper.execute( "SELECT * FROM section WHERE resume_uuid =?", ps -> { @@ -171,13 +197,16 @@ private void getSections(Resume resume) { ResultSet rs = ps.executeQuery(); while (rs.next()) { SectionType type = SectionType.valueOf(rs.getString("type")); - resume.getSections().put(type, (type == SectionType.OBJECTIVE || type == SectionType.PERSONAL) ? - new TextSection(rs.getString("value")) : - new ListSection(List.of(rs.getString("value").split("\n")))); + Section section = switch (type) { + case PERSONAL, OBJECTIVE -> new TextSection(rs.getString("value")); + case ACHIEVEMENT, QUALIFICATION -> + new ListSection(List.of(rs.getString("value").split("\n"))); + case EXPERIENCE, EDUCATION -> new CompanySection(new ArrayList<>()); + }; + resume.getSections().put(type, section); } return null; }); } - } \ No newline at end of file diff --git a/src/com/urise/webapp/web/ResumeServlet.java b/src/com/urise/webapp/web/ResumeServlet.java index 2f979c8..3268ad6 100644 --- a/src/com/urise/webapp/web/ResumeServlet.java +++ b/src/com/urise/webapp/web/ResumeServlet.java @@ -13,14 +13,20 @@ import java.util.List; public class ResumeServlet extends HttpServlet { + private Storage storage; + + @Override + public void init() throws ServletException { + storage = Config.get().getStorage(); + } + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); - Storage db = Config.get().getStorage(); - List resumes = db.getAllSorted(); + List resumes = storage.getAllSorted(); PrintWriter writer = response.getWriter(); StringBuilder sb = new StringBuilder(); From 6f45a18fb0fc0dbfc7784e29f6dce43471fee765 Mon Sep 17 00:00:00 2001 From: Kvitto Date: Mon, 30 Sep 2024 09:41:06 +0300 Subject: [PATCH 7/9] HW15 ResumeServlet - refactored getAllSorted() --- src/com/urise/webapp/storage/SqlStorage.java | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 67cebec..72e5286 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -93,16 +93,10 @@ public List getAllSorted() { } return null; }); - sqlHelper.execute( - "SELECT * FROM contact", ps -> { - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - map.get(rs.getString("resume_uuid")) - .addContact(ContactType.valueOf(rs.getString("type")), rs.getString("value")); - } - return null; - }); - map.values().forEach(this::addSections); + map.values().forEach(r -> { + addContacts(r); + addSections(r); + }); return new ArrayList<>(map.values()); } @@ -189,11 +183,11 @@ private void addContact(ResultSet rs, Resume r) throws SQLException { } } - private void addSections(Resume resume) { + private void addSections(Resume r) { sqlHelper.execute( "SELECT * FROM section WHERE resume_uuid =?", ps -> { - ps.setString(1, resume.getUuid()); + ps.setString(1, r.getUuid()); ResultSet rs = ps.executeQuery(); while (rs.next()) { SectionType type = SectionType.valueOf(rs.getString("type")); @@ -203,7 +197,7 @@ private void addSections(Resume resume) { new ListSection(List.of(rs.getString("value").split("\n"))); case EXPERIENCE, EDUCATION -> new CompanySection(new ArrayList<>()); }; - resume.getSections().put(type, section); + r.getSections().put(type, section); } return null; }); From 8ec01fee220b4a63d36b9ec7a1fb059bf681f920 Mon Sep 17 00:00:00 2001 From: Kvitto Date: Mon, 30 Sep 2024 13:25:22 +0300 Subject: [PATCH 8/9] HW15 ResumeServlet - added two methods: addAllContacts() & addAllSections() --- src/com/urise/webapp/storage/SqlStorage.java | 87 +++++++++++++------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 72e5286..2ab096e 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -93,10 +93,8 @@ public List getAllSorted() { } return null; }); - map.values().forEach(r -> { - addContacts(r); - addSections(r); - }); + addAllContacts(map); + addAllSections(map); return new ArrayList<>(map.values()); } @@ -125,9 +123,12 @@ private void insertSection(Connection conn, Resume r) throws SQLException { for (Map.Entry e : r.getSections().entrySet()) { ps.setString(1, r.getUuid()); ps.setString(2, e.getKey().name()); - switch (e.getKey().ordinal()) { - case 0, 1 -> ps.setString(3, ((TextSection) e.getValue()).getContent()); - case 2, 3 -> ps.setString(3, listToString(((ListSection) e.getValue()).getItems())); + switch (e.getKey()) { + case PERSONAL, OBJECTIVE -> ps.setString(3, ((TextSection) e.getValue()).getContent()); + case ACHIEVEMENT, QUALIFICATION -> + ps.setString(3, listToString(((ListSection) e.getValue()).getItems())); + case EXPERIENCE, EDUCATION -> { + } } ps.addBatch(); } @@ -143,35 +144,40 @@ private String listToString(List list) { return sb.toString(); } - private void deleteContact(Connection conn, Resume r) { - sqlHelper.execute("DELETE FROM contact WHERE resume_uuid=?", ps -> { + private void deleteContact(Connection conn, Resume r) throws SQLException { + try (PreparedStatement ps = conn.prepareStatement("DELETE FROM contact WHERE resume_uuid=?")) { ps.setString(1, r.getUuid()); ps.execute(); - return null; - }); + } } - private void deleteSection(Connection conn, Resume r) { - sqlHelper.execute("DELETE FROM section WHERE resume_uuid=?", ps -> { + private void deleteSection(Connection conn, Resume r) throws SQLException { + try (PreparedStatement ps = conn.prepareStatement("DELETE FROM section WHERE resume_uuid=?")) { ps.setString(1, r.getUuid()); ps.execute(); - return null; - }); + } + } + + private void addAllContacts(Map map) { + sqlHelper.execute("SELECT * FROM contact", + ps -> { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + addContact(rs, map.get(rs.getString("resume_uuid"))); + } + return null; + }); } private void addContacts(Resume r) { sqlHelper.execute( "SELECT * FROM contact c WHERE c.resume_uuid =?", ps -> { - String uuid = r.getUuid(); - ps.setString(1, uuid); + ps.setString(1, r.getUuid()); ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new NotExistStorageException(uuid); - } - do { + while (rs.next()) { addContact(rs, r); - } while (rs.next()); + } return null; }); } @@ -179,10 +185,23 @@ private void addContacts(Resume r) { private void addContact(ResultSet rs, Resume r) throws SQLException { String value = rs.getString("value"); if (value != null) { - r.addContact(ContactType.valueOf(rs.getString("type")), value); + r.addContact(ContactType.valueOf(rs.getString("type")), rs.getString("value")); } } + private void addAllSections(Map map) { + sqlHelper.execute( + "SELECT * FROM section", + ps -> { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + addSection(rs, map.get(rs.getString("resume_uuid"))); + } + return null; + } + ); + } + private void addSections(Resume r) { sqlHelper.execute( "SELECT * FROM section WHERE resume_uuid =?", @@ -190,17 +209,21 @@ private void addSections(Resume r) { ps.setString(1, r.getUuid()); ResultSet rs = ps.executeQuery(); while (rs.next()) { - SectionType type = SectionType.valueOf(rs.getString("type")); - Section section = switch (type) { - case PERSONAL, OBJECTIVE -> new TextSection(rs.getString("value")); - case ACHIEVEMENT, QUALIFICATION -> - new ListSection(List.of(rs.getString("value").split("\n"))); - case EXPERIENCE, EDUCATION -> new CompanySection(new ArrayList<>()); - }; - r.getSections().put(type, section); + addSection(rs, r); } return null; - }); + } + ); + } + + private static void addSection(ResultSet rs, Resume r) throws SQLException { + SectionType type = SectionType.valueOf(rs.getString("type")); + Section section = switch (type) { + case PERSONAL, OBJECTIVE -> new TextSection(rs.getString("value")); + case ACHIEVEMENT, QUALIFICATION -> new ListSection(List.of(rs.getString("value").split("\n"))); + case EXPERIENCE, EDUCATION -> new CompanySection(new ArrayList<>()); + }; + r.getSections().put(type, section); } } \ No newline at end of file From 65858274ae5737e829ba7f3cd70bca41f6d55ba6 Mon Sep 17 00:00:00 2001 From: Kvitto Date: Sun, 6 Oct 2024 15:27:04 +0300 Subject: [PATCH 9/9] Lesson 16 --- src/com/urise/webapp/model/ContactType.java | 63 +++++- src/com/urise/webapp/model/Resume.java | 8 + src/com/urise/webapp/storage/SqlStorage.java | 186 +++++++++--------- src/com/urise/webapp/util/JsonParser.java | 20 +- .../urise/webapp/util/JsonSectionAdapter.java | 1 + src/com/urise/webapp/web/ResumeServlet.java | 79 +++++--- 6 files changed, 214 insertions(+), 143 deletions(-) diff --git a/src/com/urise/webapp/model/ContactType.java b/src/com/urise/webapp/model/ContactType.java index 3a04374..a503c3b 100644 --- a/src/com/urise/webapp/model/ContactType.java +++ b/src/com/urise/webapp/model/ContactType.java @@ -8,17 +8,44 @@ public enum ContactType { PHONE("Тел."), MOBILE("Мобильный"), HOME_PHONE("Домашний тел."), - SKYPE("Skype"), - MAIL("Почта"), - LINKEDIN("Профиль LinkedIn"), - GITHUB("Профиль GitHub"), - STACKOVERFLOW("Профиль Stackoverflow"), - HOME_PAGE("Домашняя страница"); + SKYPE("Skype") { + @Override + public String toHtml0(String value) { + return getTitle() + ": " + toLink("skype:" + value, value); + } + }, + MAIL("Почта") { + @Override + public String toHtml0(String value) { + return getTitle() + ": " + toLink("mailto:" + value, value); + } + }, + LINKEDIN("Профиль LinkedIn") { + @Override + public String toHtml0(String value) { + return toLink(value); + } + }, + GITHUB("Профиль GitHub") { + @Override + public String toHtml0(String value) { + return toLink(value); + } + }, + STACKOVERFLOW("Профиль Stackoverflow") { + @Override + public String toHtml0(String value) { + return toLink(value); + } + }, + HOME_PAGE("Домашняя страница") { + @Override + public String toHtml0(String value) { + return toLink(value); + } + }; - private String title; - - ContactType() { - } + private final String title; ContactType(String title) { this.title = title; @@ -27,4 +54,20 @@ public enum ContactType { public String getTitle() { return title; } + + protected String toHtml0(String value) { + return title + ": " + value; + } + + public String toHtml(String value) { + return (value == null) ? "" : toHtml0(value); + } + + public String toLink(String href) { + return toLink(href, title); + } + + public static String toLink(String href, String title) { + return "" + title + ""; + } } diff --git a/src/com/urise/webapp/model/Resume.java b/src/com/urise/webapp/model/Resume.java index 6f6d9de..3e04a87 100644 --- a/src/com/urise/webapp/model/Resume.java +++ b/src/com/urise/webapp/model/Resume.java @@ -94,4 +94,12 @@ public void addContact(ContactType contactType, String value) { public void addSections(SectionType type, Section section) { sections.put(type, section); } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getContact(ContactType contactType) { + return contacts.get(contactType); + } } diff --git a/src/com/urise/webapp/storage/SqlStorage.java b/src/com/urise/webapp/storage/SqlStorage.java index 2ab096e..f014c92 100644 --- a/src/com/urise/webapp/storage/SqlStorage.java +++ b/src/com/urise/webapp/storage/SqlStorage.java @@ -3,6 +3,7 @@ import com.urise.webapp.exception.NotExistStorageException; import com.urise.webapp.model.*; import com.urise.webapp.sql.SqlHelper; +import com.urise.webapp.util.JsonParser; import java.sql.*; import java.util.ArrayList; @@ -24,19 +25,35 @@ public void clear() { @Override public Resume get(String uuid) { - Resume resume = sqlHelper.execute( - "SELECT * FROM resume r WHERE r.uuid =?", - ps -> { - ps.setString(1, uuid); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new NotExistStorageException(uuid); - } - return new Resume(uuid, rs.getString("full_name")); - }); - addContacts(resume); - addSections(resume); - return resume; + return sqlHelper.transactionalExecute(conn -> { + Resume r; + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM resume WHERE uuid =?")) { + ps.setString(1, uuid); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + throw new NotExistStorageException(uuid); + } + r = new Resume(uuid, rs.getString("full_name")); + } + + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM contact WHERE resume_uuid =?")) { + ps.setString(1, uuid); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + addContact(rs, r); + } + } + + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM section WHERE resume_uuid =?")) { + ps.setString(1, uuid); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + addSection(rs, r); + } + } + + return r; + }); } @Override @@ -49,10 +66,10 @@ public void update(Resume r) { throw new NotExistStorageException(r.getUuid()); } } - deleteContact(conn, r); - deleteSection(conn, r); - insertContact(conn, r); - insertSection(conn, r); + deleteContacts(conn, r); + deleteSections(conn, r); + insertContacts(conn, r); + insertSections(conn, r); return null; }); } @@ -60,15 +77,16 @@ public void update(Resume r) { @Override public void save(Resume r) { sqlHelper.transactionalExecute(conn -> { - try (PreparedStatement ps = conn.prepareStatement("INSERT INTO resume (uuid, full_name) VALUES (?,?)")) { - ps.setString(1, r.getUuid()); - ps.setString(2, r.getFullName()); - ps.execute(); - } - insertContact(conn, r); - insertSection(conn, r); - return null; - }); + try (PreparedStatement ps = conn.prepareStatement("INSERT INTO resume (uuid, full_name) VALUES (?,?)")) { + ps.setString(1, r.getUuid()); + ps.setString(2, r.getFullName()); + ps.execute(); + } + insertContacts(conn, r); + insertSections(conn, r); + return null; + } + ); } @Override @@ -84,18 +102,35 @@ public void delete(String uuid) { @Override public List getAllSorted() { - Map map = new LinkedHashMap<>(); - sqlHelper.execute( - "SELECT * FROM resume r ORDER BY full_name, uuid", ps -> { - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - map.put(rs.getString("uuid"), new Resume(rs.getString("uuid"), rs.getString("full_name"))); - } - return null; - }); - addAllContacts(map); - addAllSections(map); - return new ArrayList<>(map.values()); + return sqlHelper.transactionalExecute(conn -> { + Map resumes = new LinkedHashMap<>(); + + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM resume ORDER BY full_name, uuid")) { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + String uuid = rs.getString("uuid"); + resumes.put(uuid, new Resume(uuid, rs.getString("full_name"))); + } + } + + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM contact")) { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Resume r = resumes.get(rs.getString("resume_uuid")); + addContact(rs, r); + } + } + + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM section")) { + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Resume r = resumes.get(rs.getString("resume_uuid")); + addSection(rs, r); + } + } + + return new ArrayList<>(resumes.values()); + }); } @Override @@ -106,7 +141,7 @@ public int size() { }); } - private void insertContact(Connection conn, Resume r) throws SQLException { + private void insertContacts(Connection conn, Resume r) throws SQLException { try (PreparedStatement ps = conn.prepareStatement("INSERT INTO contact (resume_uuid, type, value) VALUES (?,?,?)")) { for (Map.Entry e : r.getContacts().entrySet()) { ps.setString(1, r.getUuid()); @@ -118,41 +153,29 @@ private void insertContact(Connection conn, Resume r) throws SQLException { } } - private void insertSection(Connection conn, Resume r) throws SQLException { + private void insertSections(Connection conn, Resume r) throws SQLException { try (PreparedStatement ps = conn.prepareStatement("INSERT INTO section (resume_uuid, type, value) VALUES (?,?,?)")) { for (Map.Entry e : r.getSections().entrySet()) { ps.setString(1, r.getUuid()); ps.setString(2, e.getKey().name()); - switch (e.getKey()) { - case PERSONAL, OBJECTIVE -> ps.setString(3, ((TextSection) e.getValue()).getContent()); - case ACHIEVEMENT, QUALIFICATION -> - ps.setString(3, listToString(((ListSection) e.getValue()).getItems())); - case EXPERIENCE, EDUCATION -> { - } - } + Section section = e.getValue(); + ps.setString(3, JsonParser.write(section, Section.class)); ps.addBatch(); } ps.executeBatch(); } } - private String listToString(List list) { - StringBuilder sb = new StringBuilder(); - for (String s : list) { - sb.append(s).append("\n"); - } - return sb.toString(); + private void deleteContacts(Connection conn, Resume r) throws SQLException { + deleteAttributes(conn, r, "DELETE FROM contact WHERE resume_uuid=?"); } - private void deleteContact(Connection conn, Resume r) throws SQLException { - try (PreparedStatement ps = conn.prepareStatement("DELETE FROM contact WHERE resume_uuid=?")) { - ps.setString(1, r.getUuid()); - ps.execute(); - } + private void deleteSections(Connection conn, Resume r) throws SQLException { + deleteAttributes(conn, r, "DELETE FROM section WHERE resume_uuid=?"); } - private void deleteSection(Connection conn, Resume r) throws SQLException { - try (PreparedStatement ps = conn.prepareStatement("DELETE FROM section WHERE resume_uuid=?")) { + private void deleteAttributes(Connection conn, Resume r, String sql) throws SQLException { + try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, r.getUuid()); ps.execute(); } @@ -185,45 +208,16 @@ private void addContacts(Resume r) { private void addContact(ResultSet rs, Resume r) throws SQLException { String value = rs.getString("value"); if (value != null) { - r.addContact(ContactType.valueOf(rs.getString("type")), rs.getString("value")); + r.addContact(ContactType.valueOf(rs.getString("type")), value); } } - private void addAllSections(Map map) { - sqlHelper.execute( - "SELECT * FROM section", - ps -> { - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - addSection(rs, map.get(rs.getString("resume_uuid"))); - } - return null; - } - ); - } - - private void addSections(Resume r) { - sqlHelper.execute( - "SELECT * FROM section WHERE resume_uuid =?", - ps -> { - ps.setString(1, r.getUuid()); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - addSection(rs, r); - } - return null; - } - ); - } - - private static void addSection(ResultSet rs, Resume r) throws SQLException { - SectionType type = SectionType.valueOf(rs.getString("type")); - Section section = switch (type) { - case PERSONAL, OBJECTIVE -> new TextSection(rs.getString("value")); - case ACHIEVEMENT, QUALIFICATION -> new ListSection(List.of(rs.getString("value").split("\n"))); - case EXPERIENCE, EDUCATION -> new CompanySection(new ArrayList<>()); - }; - r.getSections().put(type, section); + private void addSection(ResultSet rs, Resume r) throws SQLException { + String content = rs.getString("value"); + if (content != null) { + SectionType type = SectionType.valueOf(rs.getString("type")); + r.addSections(type, JsonParser.read(content, Section.class)); + } } } \ No newline at end of file diff --git a/src/com/urise/webapp/util/JsonParser.java b/src/com/urise/webapp/util/JsonParser.java index d6dd5a1..f908261 100644 --- a/src/com/urise/webapp/util/JsonParser.java +++ b/src/com/urise/webapp/util/JsonParser.java @@ -6,12 +6,10 @@ import java.io.Reader; import java.io.Writer; -import java.time.LocalDate; public class JsonParser { - private static final Gson GSON = new GsonBuilder() - .registerTypeAdapter(Section.class, new JsonSectionAdapter<>()) - .registerTypeAdapter(LocalDate.class, new LocalDateTypeAdapter()) + private static Gson GSON = new GsonBuilder() + .registerTypeAdapter(Section.class, new JsonSectionAdapter()) .create(); public static T read(Reader reader, Class clazz) { @@ -21,4 +19,16 @@ public static T read(Reader reader, Class clazz) { public static void write(T object, Writer writer) { GSON.toJson(object, writer); } -} + + public static T read(String content, Class clazz) { + return GSON.fromJson(content, clazz); + } + + public static String write(T object) { + return GSON.toJson(object); + } + + public static String write(T object, Class clazz) { + return GSON.toJson(object, clazz); + } +} \ No newline at end of file diff --git a/src/com/urise/webapp/util/JsonSectionAdapter.java b/src/com/urise/webapp/util/JsonSectionAdapter.java index 13ddbd7..2113163 100644 --- a/src/com/urise/webapp/util/JsonSectionAdapter.java +++ b/src/com/urise/webapp/util/JsonSectionAdapter.java @@ -22,6 +22,7 @@ public T deserialize(JsonElement json, Type type, JsonDeserializationContext con } } + @Override public JsonElement serialize(T section, Type type, JsonSerializationContext context) { JsonObject retValue = new JsonObject(); diff --git a/src/com/urise/webapp/web/ResumeServlet.java b/src/com/urise/webapp/web/ResumeServlet.java index 3268ad6..ad6e6c6 100644 --- a/src/com/urise/webapp/web/ResumeServlet.java +++ b/src/com/urise/webapp/web/ResumeServlet.java @@ -1,54 +1,69 @@ package com.urise.webapp.web; import com.urise.webapp.Config; +import com.urise.webapp.model.ContactType; import com.urise.webapp.model.Resume; import com.urise.webapp.storage.Storage; +import jakarta.servlet.ServletConfig; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.PrintWriter; -import java.util.List; public class ResumeServlet extends HttpServlet { - private Storage storage; + + private Storage storage; // = Config.get().getStorage(); @Override - public void init() throws ServletException { + public void init(ServletConfig config) throws ServletException { + super.init(config); storage = Config.get().getStorage(); } - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); - response.setCharacterEncoding("UTF-8"); - response.setContentType("text/html;charset=UTF-8"); - - List resumes = storage.getAllSorted(); - - PrintWriter writer = response.getWriter(); - StringBuilder sb = new StringBuilder(); - - sb.append("Resume Servlet"); - sb.append(""); - sb.append("

Resume Servlet

"); - sb.append(""); - resumes.forEach(resume -> { - sb.append("") - .append("") - .append("") - .append(""); - }); - sb.append("
").append(resume.getUuid()).append("").append(resume.getFullName()).append("
"); - sb.append(""); - - writer.append(sb.toString()); + String uuid = request.getParameter("uuid"); + String fullName = request.getParameter("fullName"); + Resume r = storage.get(uuid); + r.setFullName(fullName); + for (ContactType type : ContactType.values()) { + String value = request.getParameter(type.name()); + if (value != null && value.trim().length() != 0) { + r.addContact(type, value); + } else { + r.getContacts().remove(type); + } + } + storage.update(r); + response.sendRedirect("resume"); } - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String uuid = request.getParameter("uuid"); + String action = request.getParameter("action"); + if (action == null) { + request.setAttribute("resumes", storage.getAllSorted()); + request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response); + return; + } + Resume r; + switch (action) { + case "delete": + storage.delete(uuid); + response.sendRedirect("resume"); + return; + case "view": + case "edit": + r = storage.get(uuid); + break; + default: + throw new IllegalArgumentException("Action " + action + " is illegal"); + } + request.setAttribute("resume", r); + request.getRequestDispatcher( + ("view".equals(action) ? "/WEB-INF/jsp/view.jsp" : "/WEB-INF/jsp/edit.jsp") + ).forward(request, response); } -} +} \ No newline at end of file