diff --git a/src/com/geekhub/hw8/CreateFileServlet.java b/src/com/geekhub/hw8/CreateFileServlet.java index 940501f..e61100f 100644 --- a/src/com/geekhub/hw8/CreateFileServlet.java +++ b/src/com/geekhub/hw8/CreateFileServlet.java @@ -6,12 +6,36 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DateFormat; +import java.util.Date; @WebServlet("/file/create") public class CreateFileServlet extends HttpServlet { @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setCharacterEncoding("UTF-8"); + String directory = (String) req.getSession().getAttribute("path"); + String fileName = req.getParameter("fileName"); + String result; + Path path; + + try { + path = Paths.get(directory, fileName); + Files.createFile(path); + result = "file " + path.getFileName() + " has been created"; + } catch (InvalidPathException e) { + result = "invalid path"; + } catch (IOException e) { + result = "error while creating file: " + e; + } + + req.getSession().setAttribute("message", "[" + DateFormat.getDateTimeInstance().format(new Date()) + "] " + result); + resp.sendRedirect("/dir/view"); } -} + +} \ No newline at end of file diff --git a/src/com/geekhub/hw8/IndexServlet.java b/src/com/geekhub/hw8/IndexServlet.java index f80a98b..a069116 100644 --- a/src/com/geekhub/hw8/IndexServlet.java +++ b/src/com/geekhub/hw8/IndexServlet.java @@ -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/com/geekhub/hw8/RemoveFileServlet.java b/src/com/geekhub/hw8/RemoveFileServlet.java index a6322e6..7cd0099 100644 --- a/src/com/geekhub/hw8/RemoveFileServlet.java +++ b/src/com/geekhub/hw8/RemoveFileServlet.java @@ -6,12 +6,30 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DateFormat; +import java.util.Date; @WebServlet("/file/remove") public class RemoveFileServlet extends HttpServlet { @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setCharacterEncoding("UTF-8"); + Path path = Paths.get(req.getParameter("path")); + String result; + + try { + Files.delete(path); + result = "file " + path.getFileName() + " has been deleted"; + } catch (IOException e) { + result = "this file can not be deleted"; + } + + req.getSession().setAttribute("message", "[" + DateFormat.getDateTimeInstance().format(new Date()) + "] " + result); + resp.sendRedirect("/dir/view"); } + } diff --git a/src/com/geekhub/hw8/ViewDirectoryServlet.java b/src/com/geekhub/hw8/ViewDirectoryServlet.java index d915e71..16f8f6f 100644 --- a/src/com/geekhub/hw8/ViewDirectoryServlet.java +++ b/src/com/geekhub/hw8/ViewDirectoryServlet.java @@ -8,35 +8,69 @@ 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; +import java.nio.file.*; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; @WebServlet(value = "/dir/view", initParams = { - @WebInitParam(name = "root", value = "D:\\") + @WebInitParam(name = "root", value = "D:\\") }) public class ViewDirectoryServlet extends HttpServlet { private static Path ROOT_PATH; + private static List messages = new ArrayList<>(); @Override public void init(ServletConfig config) throws ServletException { ROOT_PATH = Paths.get(config.getInitParameter("root")); + messages.add("[" + DateFormat.getDateTimeInstance().format(new Date()) + "] " + " launched. Enjoy ) "); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - StringBuilder sb = new StringBuilder(); - sb.append(""); + Map directoryLinks = new HashMap<>(); + Map fileLinks = new HashMap<>(); - //TODO: Implement directory listing here + String pathParam = (String) req.getSession().getAttribute("path"); + Path currentPath = (pathParam == null) ? ROOT_PATH : Paths.get(pathParam); + try (DirectoryStream directoryStream = Files.newDirectoryStream(currentPath)) { + for (Path path : directoryStream) { + String linkView = path.getName(path.getNameCount() - 1).toString(); + Path linkPath = path.toAbsolutePath(); + if (Files.isDirectory(linkPath, LinkOption.NOFOLLOW_LINKS)) { + directoryLinks.put(linkView, linkPath.toString()); + } else { + fileLinks.put(linkView, linkPath.toString()); + } + } + } catch (IOException e) { + req.getSession().setAttribute("path", currentPath.getParent().toString()); + resp.sendRedirect("/dir/view"); + return; + } - sb.append(""); - resp.getWriter().write(sb.toString()); + req.getSession().setAttribute("path", currentPath.toString()); + req.setAttribute("backPath", (!currentPath.equals(ROOT_PATH)) ? currentPath.getParent().toString() : ROOT_PATH.toString()); + req.setAttribute("rootPath", ROOT_PATH.toString()); + req.setAttribute("directoryLinks", directoryLinks); + req.setAttribute("fileLinks", fileLinks); + + Object message = req.getSession().getAttribute("message"); + if (message != null) { + messages.add((String) message); + } + req.getSession().setAttribute("message", null); + req.getSession().setAttribute("messages", messages); + + req.getRequestDispatcher("/WEB-INF/jsp/viewDirectory.jsp").forward(req, resp); } - private void appendLink(StringBuilder sb, String text, Path path) { - //TODO: Implement link rendering based on path type (directory or file) + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setCharacterEncoding("UTF-8"); + req.getSession().setAttribute("path", req.getParameter("path")); + resp.sendRedirect("/dir/view"); } + } diff --git a/src/com/geekhub/hw8/ViewFileServlet.java b/src/com/geekhub/hw8/ViewFileServlet.java index 263194b..b190c1a 100644 --- a/src/com/geekhub/hw8/ViewFileServlet.java +++ b/src/com/geekhub/hw8/ViewFileServlet.java @@ -5,14 +5,47 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; @WebServlet("/file/view") public class ViewFileServlet extends HttpServlet { @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.setCharacterEncoding("UTF-8"); + Path path = Paths.get(req.getParameter("path")); + + List fileLines = new ArrayList<>(); + String exception = ""; + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path.toString()), "windows-1251"))) { + String currentLine; + while ((currentLine = reader.readLine()) != null) { + fileLines.add(currentLine); + } + } catch (IOException e) { + exception = e.getMessage(); + } + + if (exception.equals("")) { + req.setAttribute("backPath", path.getParent().toString()); + req.setAttribute("fileName", path.getFileName()); + req.setAttribute("fileLines", fileLines); + req.getSession().setAttribute("message", "[" + DateFormat.getDateTimeInstance().format(new Date()) + "] file " + path.getFileName() + " has been opened"); + req.getRequestDispatcher("/WEB-INF/jsp/viewFile.jsp").forward(req, resp); + } else { + req.getSession().setAttribute("message", "[" + DateFormat.getDateTimeInstance().format(new Date()) + "] " + exception); + resp.sendRedirect("/dir/view"); + } } + } diff --git a/web/WEB-INF/jsp/ViewDirectory.jsp b/web/WEB-INF/jsp/ViewDirectory.jsp new file mode 100644 index 0000000..a2849c1 --- /dev/null +++ b/web/WEB-INF/jsp/ViewDirectory.jsp @@ -0,0 +1,75 @@ +<%@ 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" %> + + + + + File manager + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ +

+ + + + + diff --git a/web/WEB-INF/jsp/footer.jsp b/web/WEB-INF/jsp/footer.jsp new file mode 100644 index 0000000..6f0fbdf --- /dev/null +++ b/web/WEB-INF/jsp/footer.jsp @@ -0,0 +1,14 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + +
+ + ${message} +
+
+
+ + diff --git a/web/WEB-INF/jsp/viewFile.jsp b/web/WEB-INF/jsp/viewFile.jsp new file mode 100644 index 0000000..92c429d --- /dev/null +++ b/web/WEB-INF/jsp/viewFile.jsp @@ -0,0 +1,27 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=utf-8" language="java" %> + + + + File content + + + +
+
+ + +
+
+

File name: ${fileName}

+ +

File content:

+ +
+ + ${fileLine} +
+
+
+ + diff --git a/web/css/style.css b/web/css/style.css new file mode 100644 index 0000000..e1d2966 --- /dev/null +++ b/web/css/style.css @@ -0,0 +1,43 @@ +table, tr, td { + width: auto; + margin: 0; + padding: 0; + border-collapse: collapse; + border: solid 2px black; +} + +input[type=submit] { + cursor: pointer; + background: none; + padding: 0; + border: none; + color: black; + font: 100% Arial; +} + +input[type=submit]:hover { + color: red; +} + +input[type=submit].dir { + font-weight: bolder; + color: orange; +} + +.row { + background-color: white; + padding: 5px 5px 10px; + height: 15px; +} + +div.fileContent { + padding: 10px; + border: solid 1px black; + width: 50%; +} + +div.operationLog { + padding: 10px; + border: solid 1px black; + width: 50%; +} \ No newline at end of file