From ca3baecf8808701b616096a65b118b5b01f514d1 Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Mon, 5 Feb 2024 21:17:17 +0300 Subject: [PATCH] Realize HW04 --- config_templates/sql/initDB.sql | 3 +- parent-web/pom.xml | 78 +++++++++++++++++++ parent/pom.xml | 17 +++- .../masterjava/persist/dao/UserDao.java | 5 +- .../masterjava/upload/UploadServlet.java | 5 +- .../masterjava/upload/UserProcessor.java | 8 +- .../masterjava/xml/schema/CityType.java | 6 +- .../masterjava/xml/schema/FlagType.java | 6 +- .../masterjava/xml/schema/GroupType.java | 4 +- .../masterjava/xml/schema/ObjectFactory.java | 8 +- .../masterjava/xml/schema/Payload.java | 2 +- .../masterjava/xml/schema/Project.java | 6 +- .../javaops/masterjava/xml/schema/User.java | 2 +- .../masterjava/xml/util/JaxbMarshaller.java | 9 ++- .../masterjava/xml/util/JaxbParser.java | 5 +- .../masterjava/xml/util/JaxbUnmarshaller.java | 7 +- .../main/webapp/WEB-INF/templates/upload.html | 2 +- .../masterjava/xml/util/JaxbParserTest.java | 3 +- 18 files changed, 141 insertions(+), 35 deletions(-) diff --git a/config_templates/sql/initDB.sql b/config_templates/sql/initDB.sql index 888ba81..9176d3c 100644 --- a/config_templates/sql/initDB.sql +++ b/config_templates/sql/initDB.sql @@ -10,6 +10,7 @@ CREATE TABLE users ( id INTEGER PRIMARY KEY DEFAULT nextval('user_seq'), full_name TEXT NOT NULL, email TEXT NOT NULL, - flag user_flag NOT NULL + flag user_flag NOT NULL, + UNIQUE (email) ); diff --git a/parent-web/pom.xml b/parent-web/pom.xml index 57c9ba5..d58b978 100644 --- a/parent-web/pom.xml +++ b/parent-web/pom.xml @@ -26,6 +26,44 @@ false + + org.codehaus.cargo + cargo-maven3-plugin + 1.10.8 + + + tomcat9x + + UTF-8 + + + + org.postgresql + postgresql + + + + + + + ${masterjava.config}/context.xml + conf/Catalina/localhost/ + context.xml.default + + + + + + ${project.groupId} + ${project.artifactId} + war + + ${project.build.finalName} + + + + + @@ -54,6 +92,46 @@ 3.1.0 provided + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.0 + + + jakarta.activation + jakarta.activation-api + + + + + + + com.sun.xml.bind + jaxb-impl + 4.0.2 + runtime + + + com.sun.activation + jakarta.activation-api + + + + + + + org.glassfish.jaxb + jaxb-runtime + 4.0.2 + runtime + + + com.sun.activation + jakarta.activation-api + + + diff --git a/parent/pom.xml b/parent/pom.xml index 3249d86..6a068da 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -11,7 +11,7 @@ Parent - 1.8 + 17 UTF-8 UTF-8 @@ -108,6 +108,21 @@ 4.12 test + diff --git a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java index e0230cc..05c2112 100644 --- a/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java +++ b/persist/src/main/java/ru/javaops/masterjava/persist/dao/UserDao.java @@ -2,9 +2,11 @@ import com.bertoncelj.jdbi.entitymapper.EntityMapperFactory; import org.skife.jdbi.v2.sqlobject.*; +import org.skife.jdbi.v2.sqlobject.customizers.BatchChunkSize; import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapperFactory; import ru.javaops.masterjava.persist.model.User; +import java.util.Iterator; import java.util.List; @RegisterMapperFactory(EntityMapperFactory.class) @@ -26,7 +28,6 @@ public User insert(User user) { @SqlUpdate("INSERT INTO users (id, full_name, email, flag) VALUES (:id, :fullName, :email, CAST(:flag AS user_flag)) ") abstract void insertWitId(@BindBean User user); - @SqlQuery("SELECT * FROM users ORDER BY full_name, email LIMIT :it") public abstract List getWithLimit(@Bind int limit); @@ -34,4 +35,6 @@ public User insert(User user) { @SqlUpdate("TRUNCATE users") @Override public abstract void clean(); + @SqlBatch("INSERT INTO users (full_name, email, flag) VALUES (:fullName, :email, CAST(:flag AS user_flag))") + public abstract void insertAll(@BindBean List users, @BatchChunkSize int chunkSize); } diff --git a/web/upload/src/main/java/ru/javaops/masterjava/upload/UploadServlet.java b/web/upload/src/main/java/ru/javaops/masterjava/upload/UploadServlet.java index 2b54f69..5e5d7c8 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/upload/UploadServlet.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/upload/UploadServlet.java @@ -3,7 +3,6 @@ import org.thymeleaf.context.WebContext; import ru.javaops.masterjava.persist.model.User; -import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -21,7 +20,6 @@ public class UploadServlet extends HttpServlet { private final UserProcessor userProcessor = new UserProcessor(); - @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { final WebContext webContext = new WebContext(req, resp, req.getServletContext(), req.getLocale()); @@ -39,7 +37,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I throw new IllegalStateException("Upload file have not been selected"); } try (InputStream is = filePart.getInputStream()) { - List users = userProcessor.process(is); + int chunkSize = Integer.parseInt(req.getParameter("chunkSize")); + List users = userProcessor.process(is, chunkSize); webContext.setVariable("users", users); engine.process("result", webContext, resp.getWriter()); } diff --git a/web/upload/src/main/java/ru/javaops/masterjava/upload/UserProcessor.java b/web/upload/src/main/java/ru/javaops/masterjava/upload/UserProcessor.java index 5cb3deb..8311e2e 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/upload/UserProcessor.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/upload/UserProcessor.java @@ -1,5 +1,7 @@ package ru.javaops.masterjava.upload; +import ru.javaops.masterjava.persist.DBIProvider; +import ru.javaops.masterjava.persist.dao.UserDao; import ru.javaops.masterjava.persist.model.User; import ru.javaops.masterjava.persist.model.UserFlag; import ru.javaops.masterjava.xml.schema.ObjectFactory; @@ -7,7 +9,7 @@ import ru.javaops.masterjava.xml.util.JaxbUnmarshaller; import ru.javaops.masterjava.xml.util.StaxStreamProcessor; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBException; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.XMLEvent; import java.io.InputStream; @@ -16,8 +18,9 @@ public class UserProcessor { private static final JaxbParser jaxbParser = new JaxbParser(ObjectFactory.class); + private final UserDao userDao = DBIProvider.getDao(UserDao.class); - public List process(final InputStream is) throws XMLStreamException, JAXBException { + public List process(final InputStream is, int chunkSize) throws XMLStreamException, JAXBException { final StaxStreamProcessor processor = new StaxStreamProcessor(is); List users = new ArrayList<>(); @@ -27,6 +30,7 @@ public List process(final InputStream is) throws XMLStreamException, JAXBE final User user = new User(xmlUser.getValue(), xmlUser.getEmail(), UserFlag.valueOf(xmlUser.getFlag().value())); users.add(user); } + userDao.insertAll(users, chunkSize); return users; } } diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java index 0615e8c..744e50b 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java @@ -1,9 +1,9 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.*; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** *

Java class for cityType complex type. diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java index eda39fa..ef73676 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java @@ -1,10 +1,10 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlEnumValue; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlEnumValue; +import jakarta.xml.bind.annotation.XmlType; /** *

Java class for flagType. diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java index d504164..f886192 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java @@ -1,9 +1,9 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.XmlEnum; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlEnum; +import jakarta.xml.bind.annotation.XmlType; /** *

Java class for groupType. diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java index bfb3932..62d0744 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java @@ -1,9 +1,11 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; + +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.annotation.XmlElementDecl; +import jakarta.xml.bind.annotation.XmlRegistry; + import javax.xml.namespace.QName; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java index 9d4cc30..a1f1c52 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java @@ -1,7 +1,7 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.*; import java.util.ArrayList; import java.util.List; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java index 180a997..2c86119 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java @@ -1,9 +1,9 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.*; -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.ArrayList; import java.util.List; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java index 1959b96..21b5d2e 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java @@ -1,6 +1,6 @@ package ru.javaops.masterjava.xml.schema; -import javax.xml.bind.annotation.*; +import jakarta.xml.bind.annotation.*; import java.util.ArrayList; import java.util.List; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java index 507825d..5d38eee 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java @@ -1,9 +1,10 @@ package ru.javaops.masterjava.xml.util; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.PropertyException; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.PropertyException; + import javax.xml.validation.Schema; import java.io.StringWriter; import java.io.Writer; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java index 8aff555..8253480 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java @@ -1,9 +1,10 @@ package ru.javaops.masterjava.xml.util; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; + import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import java.io.IOException; diff --git a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java index f9f29c2..a34f1ab 100644 --- a/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java +++ b/web/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java @@ -1,8 +1,9 @@ package ru.javaops.masterjava.xml.util; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; + import javax.xml.stream.XMLStreamReader; import javax.xml.validation.Schema; import java.io.InputStream; diff --git a/web/upload/src/main/webapp/WEB-INF/templates/upload.html b/web/upload/src/main/webapp/WEB-INF/templates/upload.html index d48c312..0af39b0 100644 --- a/web/upload/src/main/webapp/WEB-INF/templates/upload.html +++ b/web/upload/src/main/webapp/WEB-INF/templates/upload.html @@ -3,7 +3,7 @@ Upload XML -

+

Select xml file to upload


diff --git a/web/upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/web/upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java index 4754b17..44e6c41 100644 --- a/web/upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java +++ b/web/upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java @@ -1,12 +1,13 @@ package ru.javaops.masterjava.xml.util; import com.google.common.io.Resources; +import jakarta.xml.bind.JAXBElement; import org.junit.Test; import ru.javaops.masterjava.xml.schema.CityType; import ru.javaops.masterjava.xml.schema.ObjectFactory; import ru.javaops.masterjava.xml.schema.Payload; -import javax.xml.bind.JAXBElement; + import javax.xml.namespace.QName; public class JaxbParserTest {