diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..79c929e --- /dev/null +++ b/pom.xml @@ -0,0 +1,62 @@ + + 4.0.0 + com.geekhub.hw9 + HomeTaskWeek9 + war + 1.0 + + + 3.2.5.RELEASE + 3.0.1 + + + + + + org.springframework + spring-core + ${spring.version} + + + + org.springframework + spring-web + ${spring.version} + + + + org.springframework + spring-webmvc + ${spring.version} + + + + javax.servlet + javax.servlet-api + ${javax.servlet} + provided + + + + jstl + jstl + 1.2 + + + + + + HomeTaskWeek9 + + + maven-compiler-plugin + + 1.7 + 1.7 + + + + + + \ No newline at end of file diff --git a/src/com/geekhub/hw8/CreateFileServlet.java b/src/com/geekhub/hw8/CreateFileServlet.java deleted file mode 100644 index 940501f..0000000 --- a/src/com/geekhub/hw8/CreateFileServlet.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.geekhub.hw8; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet("/file/create") -public class CreateFileServlet extends HttpServlet { - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); - } -} diff --git a/src/com/geekhub/hw8/RemoveFileServlet.java b/src/com/geekhub/hw8/RemoveFileServlet.java deleted file mode 100644 index a6322e6..0000000 --- a/src/com/geekhub/hw8/RemoveFileServlet.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.geekhub.hw8; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet("/file/remove") -public class RemoveFileServlet extends HttpServlet { - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); - } -} diff --git a/src/com/geekhub/hw8/ViewDirectoryServlet.java b/src/com/geekhub/hw8/ViewDirectoryServlet.java deleted file mode 100644 index d915e71..0000000 --- a/src/com/geekhub/hw8/ViewDirectoryServlet.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.geekhub.hw8; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebInitParam; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -@WebServlet(value = "/dir/view", initParams = { - @WebInitParam(name = "root", value = "D:\\") -}) -public class ViewDirectoryServlet extends HttpServlet { - - private static Path ROOT_PATH; - - @Override - public void init(ServletConfig config) throws ServletException { - ROOT_PATH = Paths.get(config.getInitParameter("root")); - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - StringBuilder sb = new StringBuilder(); - sb.append(""); - - //TODO: Implement directory listing here - - sb.append(""); - resp.getWriter().write(sb.toString()); - } - - private void appendLink(StringBuilder sb, String text, Path path) { - //TODO: Implement link rendering based on path type (directory or file) - } -} diff --git a/src/com/geekhub/hw8/ViewFileServlet.java b/src/com/geekhub/hw8/ViewFileServlet.java deleted file mode 100644 index 263194b..0000000 --- a/src/com/geekhub/hw8/ViewFileServlet.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.geekhub.hw8; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.nio.file.Path; - -@WebServlet("/file/view") -public class ViewFileServlet extends HttpServlet { - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); - } -} diff --git a/src/main/java/com/geekhub/hw9/AppContextListener.java b/src/main/java/com/geekhub/hw9/AppContextListener.java new file mode 100644 index 0000000..ae55aca --- /dev/null +++ b/src/main/java/com/geekhub/hw9/AppContextListener.java @@ -0,0 +1,19 @@ +package com.geekhub.hw9; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +@WebListener +public class AppContextListener implements ServletContextListener{ + + @Override + public void contextInitialized(ServletContextEvent event) { + ServletContext context = event.getServletContext(); + context.setAttribute("context", context.getContextPath()); + } + + @Override + public void contextDestroyed(ServletContextEvent servletContextEvent) {} +} diff --git a/src/main/java/com/geekhub/hw9/CreateFileServlet.java b/src/main/java/com/geekhub/hw9/CreateFileServlet.java new file mode 100644 index 0000000..f06a00b --- /dev/null +++ b/src/main/java/com/geekhub/hw9/CreateFileServlet.java @@ -0,0 +1,42 @@ +package com.geekhub.hw9; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.file.*; + +@WebServlet("/file/create") +public class CreateFileServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String pathParam = (String) req.getSession().getAttribute("path"); + String filename = req.getParameter("filename"); + Path path = null; + try { + path = Paths.get(pathParam, filename); + } catch (InvalidPathException e) { + e.printStackTrace(); + } + String result = ""; + try { + if (Files.exists(Files.createFile(path))) { + result = String.format("File \"%s\" created successfully!", filename); + } + } catch (FileAlreadyExistsException x) { + result = String.format("File \"%s\" already exists!", filename); + } catch (IOException x) { + result = String.format("Error creating file \"%s\" !", filename); + } + req.getSession().setAttribute("created", result); + resp.sendRedirect("/dir/view"); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + } +} diff --git a/src/com/geekhub/hw8/IndexServlet.java b/src/main/java/com/geekhub/hw9/IndexServlet.java similarity index 90% rename from src/com/geekhub/hw8/IndexServlet.java rename to src/main/java/com/geekhub/hw9/IndexServlet.java index f80a98b..9e20264 100644 --- a/src/com/geekhub/hw8/IndexServlet.java +++ b/src/main/java/com/geekhub/hw9/IndexServlet.java @@ -1,4 +1,4 @@ -package com.geekhub.hw8; +package com.geekhub.hw9; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -7,7 +7,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -@WebServlet("/") +@WebServlet({"/index"}) public class IndexServlet extends HttpServlet { @Override diff --git a/src/main/java/com/geekhub/hw9/RemoveFileServlet.java b/src/main/java/com/geekhub/hw9/RemoveFileServlet.java new file mode 100644 index 0000000..c72af72 --- /dev/null +++ b/src/main/java/com/geekhub/hw9/RemoveFileServlet.java @@ -0,0 +1,35 @@ +package com.geekhub.hw9; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.file.DirectoryNotEmptyException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@WebServlet("/file/remove") +public class RemoveFileServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String parameter = req.getParameter("path"); + Path path = Paths.get(parameter); + String result = ""; + try { + if (Files.deleteIfExists(path)) { + result = String.format("File \"%s\" deleted!", path.getFileName()); + } + } catch (DirectoryNotEmptyException e) { + result = "Directory is not empty!"; + } catch (IOException e) { + e.printStackTrace(); + } + req.getSession().setAttribute("deleted", result); + req.getSession().setAttribute("path", path.getParent().toString()); + resp.sendRedirect("/dir/view"); + } +} diff --git a/src/main/java/com/geekhub/hw9/ViewDirectoryServlet.java b/src/main/java/com/geekhub/hw9/ViewDirectoryServlet.java new file mode 100644 index 0000000..39bdd46 --- /dev/null +++ b/src/main/java/com/geekhub/hw9/ViewDirectoryServlet.java @@ -0,0 +1,64 @@ +package com.geekhub.hw9; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.file.*; +import java.util.HashMap; +import java.util.Map; + +@WebServlet(value = "/dir/view", initParams = { + @WebInitParam(name = "root", value = "D:\\temp") +}) +public class ViewDirectoryServlet extends HttpServlet { + + private static Path ROOT_PATH; + + @Override + public void init(ServletConfig config) throws ServletException { + ROOT_PATH = Paths.get(config.getInitParameter("root")); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String parameter = req.getParameter("path"); + req.getSession().setAttribute("path", parameter); + resp.sendRedirect("/dir/view"); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Map dirLinks = new HashMap<>(); + Map fileLinks = new HashMap<>(); + + String pathParam = (String) req.getSession().getAttribute("path"); + Path path = (pathParam == null) ? ROOT_PATH : Paths.get(pathParam); + // append files and directories list + try (DirectoryStream directoryStream = Files.newDirectoryStream(path)) { + for (Path entry: directoryStream) { + String linkText = entry.getName(entry.getNameCount()-1).toString(); + Path linkPath = entry.toAbsolutePath(); + if (Files.isDirectory(linkPath, LinkOption.NOFOLLOW_LINKS)) { + dirLinks.put(linkText, linkPath.toString()); + } else if (Files.isReadable(entry.toAbsolutePath())) { + fileLinks.put(linkText, linkPath.toString()); + } else { + fileLinks.put(linkText, ""); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + req.setAttribute("dirLinks", dirLinks); + req.setAttribute("fileLinks", fileLinks); + req.getSession().setAttribute("path", path.toString()); + req.setAttribute("backPath", path.getParent().toString()); + req.setAttribute("root", ROOT_PATH); + req.getRequestDispatcher("/WEB-INF/jsp/viewDirectory.jsp").forward(req, resp); + } +} diff --git a/src/main/java/com/geekhub/hw9/ViewFileServlet.java b/src/main/java/com/geekhub/hw9/ViewFileServlet.java new file mode 100644 index 0000000..ebd7e78 --- /dev/null +++ b/src/main/java/com/geekhub/hw9/ViewFileServlet.java @@ -0,0 +1,47 @@ +package com.geekhub.hw9; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; + +@WebServlet("/file/view") +public class ViewFileServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String parameter = req.getParameter("path"); + Path path = Paths.get(parameter); + ArrayList lines = new ArrayList<>(); + String result = ""; + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path.toString()), "windows-1251"))) { +/* try (BufferedReader reader = Files.newBufferedReader(path)) {*/ + String line; + while ((line = reader.readLine()) != null) { + lines.add(line); + } + } catch (UnsupportedEncodingException e) { + result = "Unknown Encoding!"; + } catch (IOException e) { + result = "Error open file!"; + } catch (Exception e) { + System.out.println(e.getMessage()); + result = "Unknown exception!"; + } + req.getSession().setAttribute("opened", result); + if (result.equals("")) { + req.setAttribute("lines", lines); + req.setAttribute("backPath", path.getParent().toString()); + req.setAttribute("filename", path.getFileName()); + req.getRequestDispatcher("/WEB-INF/jsp/viewFile.jsp").forward(req, resp); + } else { + resp.sendRedirect("/dir/view"); + } + } +} diff --git a/src/main/webapp/WEB-INF/jsp/footer.jsp b/src/main/webapp/WEB-INF/jsp/footer.jsp new file mode 100644 index 0000000..d583d9b --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/footer.jsp @@ -0,0 +1,5 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +
+
© 2015 Sergiy Govorukhin All Rights Reserved :)
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/header.jsp b/src/main/webapp/WEB-INF/jsp/header.jsp new file mode 100644 index 0000000..4192bd7 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/header.jsp @@ -0,0 +1,5 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +
+

Remote File Manager

+
diff --git a/src/main/webapp/WEB-INF/jsp/viewDirectory.jsp b/src/main/webapp/WEB-INF/jsp/viewDirectory.jsp new file mode 100644 index 0000000..f725496 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/viewDirectory.jsp @@ -0,0 +1,111 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + Remote File Manager + + + + + + <%--append file opened message--%> + +
${sessionScope.opened}

+ ${sessionScope.opened = ""} +
+ + <%--append file deleted message--%> + +
${sessionScope.deleted}

+ ${sessionScope.deleted = ""} +
+ + <%--append file created message--%> + +
${sessionScope.created}

+ ${sessionScope.created = ""} +
+ + + <%--"back" link--%> + + + + + + + <%--append "New File" menu--%> + + + + + <%--append current path--%> + + + + + <%--append current path--%> + + + + + + + + + + + + + +
+
+ + +
+
+ +
+
+ ${sessionScope.path} +
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ + + + diff --git a/src/main/webapp/WEB-INF/jsp/viewFile.jsp b/src/main/webapp/WEB-INF/jsp/viewFile.jsp new file mode 100644 index 0000000..b2fcf9b --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/viewFile.jsp @@ -0,0 +1,28 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + File View + + + + + <%--"back" link--%> +
+
+ + +
+
+
+ File: ${requestScope.filename} +
+
+

Contents:

+ + ${line}
+
+
+ + + diff --git a/web/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from web/WEB-INF/web.xml rename to src/main/webapp/WEB-INF/web.xml diff --git a/src/main/webapp/css/styles.css b/src/main/webapp/css/styles.css new file mode 100644 index 0000000..2333a3f --- /dev/null +++ b/src/main/webapp/css/styles.css @@ -0,0 +1,62 @@ +table, tr, td { + background-color: #BCD2EE; + width: 800px; + margin: auto; +} + +input[type=submit] { + background: none; + padding: 0; + border: none; + color: #0000FF; + font: 100% Arial; + cursor: pointer; +} +input[type=submit]:hover { + color: #D02090; +} +input[type=submit].dir { + color: #B03060; + font-weight: bold; +} + +.row { + background-color: white; + padding: 5px; + border: solid 1px black; + height: 15px; +} +.menu { + background: #EED5B7; + padding: 5px 20px 5px 5px; + border: solid 1px black; +} +.path{ + background: #BCD2EE; +} + +.message { + background-color: lightgoldenrodyellow; + color: green; + text-align: center; + padding: 2px 5px; + border: solid 1px green; + margin: 0 auto; +} + +section { + background-color: #e3e3e3; + padding: 5px 20px; + border: solid 1px cornflowerblue; +} + +.copy { + color: gray; + font-style: italic; + font-size: small; + text-align: center; +} + +header { + text-align: center; +} \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..bde806e --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Remote File Manager + + + + +