diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..33d3da8 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + common + 1.0-SNAPSHOT + jar + Common + + + + \ No newline at end of file diff --git a/mail-api/pom.xml b/mail-api/pom.xml new file mode 100644 index 0000000..6f90fdd --- /dev/null +++ b/mail-api/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + parent + ru.javaops + 1.0-SNAPSHOT + ../parent/pom.xml + + + mail-api + 1.0-SNAPSHOT + Mail-api + jar + + + + ru.javaops + common + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/mail-service/pom.xml b/mail-service/pom.xml new file mode 100644 index 0000000..8870a21 --- /dev/null +++ b/mail-service/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../parent-web/pom.xml + 1.0-SNAPSHOT + + + mail-service + 1.0-SNAPSHOT + Mail-service + war + + + mail-service + + + + + ru.javaops + mail-api + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/parent-web/pom.xml b/parent-web/pom.xml new file mode 100644 index 0000000..4d4d689 --- /dev/null +++ b/parent-web/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + parent-web + pom + 1.0-SNAPSHOT + Parent Web + + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.0 + + false + + + + + + + + ${project.groupId} + common + ${project.version} + + + javax.servlet + javax.servlet-api + 3.1.0 + + + + + + + + + \ No newline at end of file diff --git a/parent/pom.xml b/parent/pom.xml new file mode 100644 index 0000000..d7b056d --- /dev/null +++ b/parent/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + ru.javaops + parent + pom + 1.0-SNAPSHOT + Parent + + + 1.8 + UTF-8 + UTF-8 + + + + install + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20.1 + + -Dfile.encoding=UTF-8 + + + + + + + + com.google.guava + guava + 23.3-jre + + + one.util + streamex + RELEASE + + + + + junit + junit + 4.12 + test + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8809434..5b1a0e6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,119 +4,19 @@ ru.javaops masterjava - jar + pom 1.0-SNAPSHOT Master Java https://github.com/JavaOPs/masterjava - - 1.8 - UTF-8 - UTF-8 - - - - masterjava - install - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.20.1 - - -Dfile.encoding=UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - benchmarks - - - org.openjdk.jmh.Main - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - - - org.openjdk.jmh - jmh-core - RELEASE - - - org.openjdk.jmh - jmh-generator-annprocess - RELEASE - provided - - - com.google.guava - guava - 21.0 - - - one.util - streamex - RELEASE - - - - com.j2html - j2html - RELEASE - - - - - junit - junit - 4.12 - test - - - - - - - - + + upload + common + webapp + mail-service + mail-api + test + diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java deleted file mode 100644 index cef46e5..0000000 --- a/src/main/java/ru/javaops/masterjava/service/MailService.java +++ /dev/null @@ -1,141 +0,0 @@ -package ru.javaops.masterjava.service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.*; -import java.util.stream.Collectors; - -public class MailService { - private static final String OK = "OK"; - - private static final String INTERRUPTED_BY_FAULTS_NUMBER = "+++ Interrupted by faults number"; - private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; - private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; - - private final ExecutorService mailExecutor = Executors.newFixedThreadPool(8); - - public GroupResult sendToList(final String template, final Set emails) throws Exception { - final CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); - - List> futures = emails.stream() - .map(email -> completionService.submit(() -> sendToUser(template, email))) - .collect(Collectors.toList()); - - return new Callable() { - private int success = 0; - private List failed = new ArrayList<>(); - - @Override - public GroupResult call() { - while (!futures.isEmpty()) { - try { - Future future = completionService.poll(10, TimeUnit.SECONDS); - if (future == null) { - return cancelWithFail(INTERRUPTED_BY_TIMEOUT); - } - futures.remove(future); - MailResult mailResult = future.get(); - if (mailResult.isOk()) { - success++; - } else { - failed.add(mailResult); - if (failed.size() >= 5) { - return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); - } - } - } catch (ExecutionException e) { - return cancelWithFail(e.getCause().toString()); - } catch (InterruptedException e) { - return cancelWithFail(INTERRUPTED_EXCEPTION); - } - } -/* - for (Future future : futures) { - MailResult mailResult; - try { - mailResult = future.get(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - return cancelWithFail(INTERRUPTED_EXCEPTION); - } catch (ExecutionException e) { - return cancelWithFail(e.getCause().toString()); - } catch (TimeoutException e) { - return cancelWithFail(INTERRUPTED_BY_TIMEOUT); - } - if (mailResult.isOk()) { - success++; - } else { - failed.add(mailResult); - if (failed.size() >= 5) { - return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); - } - } - } -*/ - return new GroupResult(success, failed, null); - } - - private GroupResult cancelWithFail(String cause) { - futures.forEach(f -> f.cancel(true)); - return new GroupResult(success, failed, cause); - } - }.call(); - } - - // dummy realization - public MailResult sendToUser(String template, String email) throws Exception { - try { - Thread.sleep(500); //delay - } catch (InterruptedException e) { - // log cancel; - return null; - } - return Math.random() < 0.7 ? MailResult.ok(email) : MailResult.error(email, "Error"); - } - - public static class MailResult { - private final String email; - private final String result; - - private static MailResult ok(String email) { - return new MailResult(email, OK); - } - - private static MailResult error(String email, String error) { - return new MailResult(email, error); - } - - public boolean isOk() { - return OK.equals(result); - } - - private MailResult(String email, String cause) { - this.email = email; - this.result = cause; - } - - @Override - public String toString() { - return '(' + email + ',' + result + ')'; - } - } - - public static class GroupResult { - private final int success; // number of successfully sent email - private final List failed; // failed emails with causes - private final String failedCause; // global fail cause - - public GroupResult(int success, List failed, String failedCause) { - this.success = success; - this.failed = failed; - this.failedCause = failedCause; - } - - @Override - public String toString() { - return "Success: " + success + '\n' + - "Failed: " + failed.toString() + '\n' + - (failedCause == null ? "" : "Failed cause" + failedCause); - } - } -} \ No newline at end of file diff --git a/test/pom.xml b/test/pom.xml new file mode 100644 index 0000000..805d56d --- /dev/null +++ b/test/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + + + ru.javaops + parent + ../parent/pom.xml + 1.0-SNAPSHOT + + + test + 1.0-SNAPSHOT + Test + jar + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + + + + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + provided + + + \ No newline at end of file diff --git a/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java b/test/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java b/test/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MatrixBenchmark.java diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/test/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java rename to test/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java diff --git a/upload/pom.xml b/upload/pom.xml new file mode 100644 index 0000000..700ec04 --- /dev/null +++ b/upload/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../parent-web/pom.xml + 1.0-SNAPSHOT + + + upload + 1.0-SNAPSHOT + war + Upload + + + upload + + + + + ru.javaops + common + ${project.version} + + + + com.j2html + j2html + 1.6.0 + + + org.thymeleaf + thymeleaf + 3.0.0.ALPHA03 + + + \ No newline at end of file diff --git a/upload/src/main/java/ru/javaops/masterjava/ThymeleafEngine.java b/upload/src/main/java/ru/javaops/masterjava/ThymeleafEngine.java new file mode 100644 index 0000000..9344e74 --- /dev/null +++ b/upload/src/main/java/ru/javaops/masterjava/ThymeleafEngine.java @@ -0,0 +1,24 @@ +package ru.javaops.masterjava; + +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.WebContext; +import org.thymeleaf.templatemode.TemplateMode; +import org.thymeleaf.templateresolver.ServletContextTemplateResolver; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ThymeleafEngine { + private static final TemplateEngine templateEngine = new TemplateEngine(); + private static final ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(); + static { + resolver.setTemplateMode(TemplateMode.HTML); + resolver.setSuffix(".html"); + resolver.setPrefix("WEB-INF/templates/"); + templateEngine.setTemplateResolver(resolver); + } + + public static void process(HttpServletResponse response, String template, WebContext ctx) throws IOException { + templateEngine.process(template, ctx, response.getWriter()); + } +} diff --git a/upload/src/main/java/ru/javaops/masterjava/UserServlet.java b/upload/src/main/java/ru/javaops/masterjava/UserServlet.java new file mode 100644 index 0000000..17b97e1 --- /dev/null +++ b/upload/src/main/java/ru/javaops/masterjava/UserServlet.java @@ -0,0 +1,116 @@ +package ru.javaops.masterjava; + +import org.thymeleaf.context.WebContext; +import ru.javaops.masterjava.model.User; +import ru.javaops.masterjava.model.UserFlag; +import ru.javaops.masterjava.xml.schema.ObjectFactory; +import ru.javaops.masterjava.xml.util.JaxbParser; +import ru.javaops.masterjava.xml.util.StaxStreamProcessor; + +import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +@WebServlet(urlPatterns = "/", loadOnStartup = 1) +@MultipartConfig +public class UserServlet extends HttpServlet { + private final static Logger LOGGER = + Logger.getLogger(UserServlet.class.getCanonicalName()); + private static final long serialVersionUID = 2L; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + final WebContext ctx = new WebContext(request, response, request.getServletContext(), request.getLocale()); + ThymeleafEngine.process(response, "upload", ctx); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + final WebContext ctx = new WebContext(request, response, request.getServletContext(), request.getLocale()); +// Collection parts = request.getParts(); +// for (Part part : parts) { +// System.out.println("Part Name:" + part.getName()); +// System.out.println("Part: "+part); +// System.out.println("Header: "); +// for (String headerName : part.getHeaderNames()) { +// System.out.println(headerName + " -> " + part.getHeader(headerName)); +// } +// System.out.println("Part Size: " + part.getSize()+"\n----------------------------"); +// InputStream inputStream = part.getInputStream(); +// Reader reader = new InputStreamReader(inputStream); +// BufferedReader bufferedReader = new BufferedReader(reader); +// while(bufferedReader.ready()){ +// String s = bufferedReader.readLine(); +// System.out.println(s); +// } +// System.out.println("==============================================="); +// } +// List users = getUsersByStax(request); + List users = null; + try { + users = getUsersByStaxJaxb(request); + ctx.setVariable("users", users); + ctx.setVariable("file", request.getPart("file").getSubmittedFileName()); + ThymeleafEngine.process(response, "users", ctx); + } catch (ServletException | IOException | XMLStreamException | JAXBException e) { + ctx.setVariable("exception", e); + String fileName = request.getPart("file").getSubmittedFileName(); + ctx.setVariable("file", "".equals(fileName) ? "File is not selected" : fileName); + ThymeleafEngine.process(response, "exception", ctx); + e.printStackTrace(); + } + } + + private List getUsersByStax(HttpServletRequest request) throws IOException, ServletException { + List users = new ArrayList<>(); + try (InputStream inputStream = request.getPart("file").getInputStream(); + StaxStreamProcessor staxProcessor = new StaxStreamProcessor(inputStream)) { + while (staxProcessor.doUntil(XMLEvent.START_ELEMENT, "User")) { + XMLStreamReader reader = staxProcessor.getReader(); + String email = reader.getAttributeValue("", "email"); + String flag = reader.getAttributeValue("", "flag"); + String fullName = reader.getElementText(); + users.add(new User(fullName, email, UserFlag.valueOf(flag))); +// reader.close(); + } + } catch (XMLStreamException e) { + LOGGER.log(Level.INFO, "Error while reading file: " + request.getPart("file").getSubmittedFileName()); + e.printStackTrace(); + } + return users; + } + + private List getUsersByStaxJaxb(HttpServletRequest request) throws ServletException, IOException, XMLStreamException, JAXBException { + JaxbParser jaxbParser = new JaxbParser(ObjectFactory.class); + List users = new ArrayList<>(); + try (InputStream inputStream = request.getPart("file").getInputStream(); + StaxStreamProcessor staxProcessor = new StaxStreamProcessor(inputStream)) { + while (staxProcessor.doUntil(XMLEvent.START_ELEMENT, "User")) { + XMLStreamReader reader = staxProcessor.getReader(); + JAXBContext jaxbContext = JAXBContext.newInstance("ru.javaops.masterjava.xml.schema"); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + JAXBElement xmlUser = unmarshaller.unmarshal(reader, ru.javaops.masterjava.xml.schema.User.class); + users.add(new User(xmlUser.getValue().getValue(), + xmlUser.getValue().getEmail(), + UserFlag.valueOf(xmlUser.getValue().getFlag().value()))); +// reader.close(); + } + } + return users; + } +} + \ No newline at end of file diff --git a/upload/src/main/java/ru/javaops/masterjava/model/User.java b/upload/src/main/java/ru/javaops/masterjava/model/User.java new file mode 100644 index 0000000..d7c3f8c --- /dev/null +++ b/upload/src/main/java/ru/javaops/masterjava/model/User.java @@ -0,0 +1,63 @@ +package ru.javaops.masterjava.model; + +import java.util.Objects; + +public class User { + private final Integer id; + private final String fullName; + private final String email; + private final UserFlag flag; + + public User(String fullName, String email, UserFlag flag) { + this(null, fullName, email, flag); + } + + public User(Integer id, String fullName, String email, UserFlag flag) { + this.id = id; + this.fullName = fullName; + this.email = email; + this.flag = flag; + } + + public Integer getId() { + return id; + } + + public String getFullName() { + return fullName; + } + + public String getEmail() { + return email; + } + + public UserFlag getFlag() { + return flag; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(fullName, user.fullName) && + Objects.equals(email, user.email) && + flag == user.flag; + } + + @Override + public int hashCode() { + return Objects.hash(id, fullName, email, flag); + } + + @Override + public String toString() { + return "User (" + + "id=" + id + + ", fullName='" + fullName + '\'' + + ", email='" + email + '\'' + + ", flag=" + flag + + ')'; + } +} diff --git a/upload/src/main/java/ru/javaops/masterjava/model/UserFlag.java b/upload/src/main/java/ru/javaops/masterjava/model/UserFlag.java new file mode 100644 index 0000000..341cc44 --- /dev/null +++ b/upload/src/main/java/ru/javaops/masterjava/model/UserFlag.java @@ -0,0 +1,7 @@ +package ru.javaops.masterjava.model; + +public enum UserFlag { + active, + deleted, + superuser; +} diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/CityType.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/CityType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/FlagType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/GroupType.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/ObjectFactory.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/Payload.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/Payload.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/Project.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/Project.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/Project.java diff --git a/src/main/java/ru/javaops/masterjava/xml/schema/User.java b/upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/schema/User.java rename to upload/src/main/java/ru/javaops/masterjava/xml/schema/User.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbMarshaller.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbParser.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/JaxbUnmarshaller.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/Schemas.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/Schemas.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/StaxStreamProcessor.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java similarity index 100% rename from src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/XPathProcessor.java diff --git a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java b/upload/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java similarity index 93% rename from src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java rename to upload/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java index 019eeed..083febb 100644 --- a/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java +++ b/upload/src/main/java/ru/javaops/masterjava/xml/util/XsltProcessor.java @@ -40,4 +40,8 @@ public void transform(Reader sourceReader, Writer result) throws TransformerExce public static String getXsltHeader(String xslt) { return "\n"; } + + public void setParameter(String name, String value) { + xformer.setParameter(name, value); + } } diff --git a/src/main/resources/cities.xsl b/upload/src/main/resources/cities.xsl similarity index 100% rename from src/main/resources/cities.xsl rename to upload/src/main/resources/cities.xsl diff --git a/upload/src/main/resources/groups.xsl b/upload/src/main/resources/groups.xsl new file mode 100644 index 0000000..c5ade36 --- /dev/null +++ b/upload/src/main/resources/groups.xsl @@ -0,0 +1,37 @@ + + + + + + + + + + <xsl:value-of select="$projectName"/> groups + + + +

+ groups +

+ + + + + + + + + + + +
GroupType
+ + + +
+ + +
+
\ No newline at end of file diff --git a/src/main/resources/payload.xsd b/upload/src/main/resources/payload.xsd similarity index 100% rename from src/main/resources/payload.xsd rename to upload/src/main/resources/payload.xsd diff --git a/upload/src/main/webapp/WEB-INF/templates/exception.html b/upload/src/main/webapp/WEB-INF/templates/exception.html new file mode 100644 index 0000000..c935c7a --- /dev/null +++ b/upload/src/main/webapp/WEB-INF/templates/exception.html @@ -0,0 +1,17 @@ + + + + Exception + + +
+

Application Exception:

+ +

exception.message

+

File : File is not selected

+
    +
  • +
+ + + \ No newline at end of file diff --git a/upload/src/main/webapp/WEB-INF/templates/upload.html b/upload/src/main/webapp/WEB-INF/templates/upload.html new file mode 100644 index 0000000..76f75c6 --- /dev/null +++ b/upload/src/main/webapp/WEB-INF/templates/upload.html @@ -0,0 +1,14 @@ + + File Upload + + + +
+
+ File to upload: +
+
+ +
+ + diff --git a/upload/src/main/webapp/WEB-INF/templates/users.html b/upload/src/main/webapp/WEB-INF/templates/users.html new file mode 100644 index 0000000..350acef --- /dev/null +++ b/upload/src/main/webapp/WEB-INF/templates/users.html @@ -0,0 +1,28 @@ + + + + Uploaded users from XML + + +

Upload XML

+

Uploaded users from XML file -

+ + + + + + + + + + + + + + + + + +
Full NameEmailFlag
+ + \ No newline at end of file diff --git a/src/test/java/ru/javaops/masterjava/MainXml.java b/upload/src/test/java/ru/javaops/masterjava/MainXml.java similarity index 87% rename from src/test/java/ru/javaops/masterjava/MainXml.java rename to upload/src/test/java/ru/javaops/masterjava/MainXml.java index bcd5894..8f57825 100644 --- a/src/test/java/ru/javaops/masterjava/MainXml.java +++ b/upload/src/test/java/ru/javaops/masterjava/MainXml.java @@ -11,6 +11,7 @@ import ru.javaops.masterjava.xml.util.JaxbParser; import ru.javaops.masterjava.xml.util.Schemas; import ru.javaops.masterjava.xml.util.StaxStreamProcessor; +import ru.javaops.masterjava.xml.util.XsltProcessor; import javax.xml.stream.events.XMLEvent; import java.io.InputStream; @@ -49,6 +50,12 @@ public static void main(String[] args) throws Exception { System.out.println(); users = processByStax(projectName, payloadUrl); users.forEach(System.out::println); + + System.out.println(); + html = transform(projectName, payloadUrl); + try (Writer writer = Files.newBufferedWriter(Paths.get("out/groups.html"))) { + writer.write(html); + } } private static Set parseByJaxb(String projectName, URL payloadUrl) throws Exception { @@ -121,4 +128,13 @@ private static String toHtml(Set users, String projectName) { body().with(h1(projectName + " users"), table) ).render(); } + + private static String transform(String projectName, URL payloadUrl) throws Exception { + URL xsl = Resources.getResource("groups.xsl"); + try (InputStream xmlStream = payloadUrl.openStream(); InputStream xslStream = xsl.openStream()) { + XsltProcessor processor = new XsltProcessor(xslStream); + processor.setParameter("projectName", projectName); + return processor.transform(xmlStream); + } + } } diff --git a/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java b/upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java rename to upload/src/test/java/ru/javaops/masterjava/xml/util/JaxbParserTest.java diff --git a/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java b/upload/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java rename to upload/src/test/java/ru/javaops/masterjava/xml/util/StaxStreamProcessorTest.java diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java b/upload/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java rename to upload/src/test/java/ru/javaops/masterjava/xml/util/XPathProcessorTest.java diff --git a/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java b/upload/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java similarity index 100% rename from src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java rename to upload/src/test/java/ru/javaops/masterjava/xml/util/XsltProcessorTest.java diff --git a/src/test/resources/city.xml b/upload/src/test/resources/city.xml similarity index 100% rename from src/test/resources/city.xml rename to upload/src/test/resources/city.xml diff --git a/src/test/resources/payload.xml b/upload/src/test/resources/payload.xml similarity index 100% rename from src/test/resources/payload.xml rename to upload/src/test/resources/payload.xml diff --git a/webapp/pom.xml b/webapp/pom.xml new file mode 100644 index 0000000..679a103 --- /dev/null +++ b/webapp/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + + ru.javaops + parent-web + ../parent-web/pom.xml + 1.0-SNAPSHOT + + + webapp + 1.0-SNAPSHOT + war + Webapp + + + webapp + + + + + ru.javaops + mail-api + ${project.version} + + + + \ No newline at end of file