diff --git a/src/com/geekhub/hw8/CreateFileServlet.java b/src/com/geekhub/hw8/CreateFileServlet.java index 940501f..4376b4f 100644 --- a/src/com/geekhub/hw8/CreateFileServlet.java +++ b/src/com/geekhub/hw8/CreateFileServlet.java @@ -1,17 +1,34 @@ package com.geekhub.hw8; +import javax.servlet.RequestDispatcher; 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.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; @WebServlet("/file/create") public class CreateFileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + String newFile = req.getParameter("path") + req.getParameter("filename"); + Path newPath = Paths.get(newFile); + String message = ""; + try { + Files.createFile(newPath); + } catch (FileAlreadyExistsException x) { + message = "error: file already exists"; + } catch (IOException x) { + message = "error: "+x; + } + RequestDispatcher rd = req.getRequestDispatcher("/dir/view?dir="+newPath.getParent() + + "&message="+message); + rd.forward(req,resp); } } diff --git a/src/com/geekhub/hw8/RemoveFileServlet.java b/src/com/geekhub/hw8/RemoveFileServlet.java index a6322e6..d95d059 100644 --- a/src/com/geekhub/hw8/RemoveFileServlet.java +++ b/src/com/geekhub/hw8/RemoveFileServlet.java @@ -1,17 +1,35 @@ package com.geekhub.hw8; +import javax.servlet.RequestDispatcher; 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/remove") public class RemoveFileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + String fileName = req.getParameter("filename"); + if (null!=fileName && !fileName.isEmpty()) { + Path removeFile = Paths.get(fileName); + String message = ""; + try { + Files.delete(removeFile); + } catch (NoSuchFileException e) { + message = "error: no such file"; + } catch (DirectoryNotEmptyException e) { + message = "error: directory not empty"; + } catch (IOException e) { + message = "error: file permission problems"; + } + RequestDispatcher rd = req.getRequestDispatcher("/dir/view?dir="+removeFile.getParent() + + "&message="+message); + rd.forward(req,resp); + } } } diff --git a/src/com/geekhub/hw8/ViewDirectoryServlet.java b/src/com/geekhub/hw8/ViewDirectoryServlet.java index d915e71..8fc3f46 100644 --- a/src/com/geekhub/hw8/ViewDirectoryServlet.java +++ b/src/com/geekhub/hw8/ViewDirectoryServlet.java @@ -1,5 +1,6 @@ package com.geekhub.hw8; +import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; @@ -8,35 +9,104 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; @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 Path NEW_PATH; @Override public void init(ServletConfig config) throws ServletException { ROOT_PATH = Paths.get(config.getInitParameter("root")); + NEW_PATH = ROOT_PATH; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { StringBuilder sb = new StringBuilder(); + sb.append(""); - //TODO: Implement directory listing here + String dir = req.getParameter("dir") != null ? req.getParameter("dir") : ""; + if (!dir.isEmpty()) { + NEW_PATH = Paths.get(dir); + ROOT_PATH = NEW_PATH.getParent() != null ? NEW_PATH.getParent() : NEW_PATH; + } + + if (null != NEW_PATH.getParent()) { + appendLink(sb, "...", NEW_PATH.getParent()); + sb.append("
"); + } + + if (!Files.isDirectory(NEW_PATH)) { + sb.append(""); + RequestDispatcher rd = req.getRequestDispatcher("/file/view?filename=" + NEW_PATH); + rd.forward(req, resp); + } else { + getSortedDirAndFiles(NEW_PATH).stream() + .forEach(path -> { + appendLink(sb, path.getFileName().toString(), path); + appendDeleteLink(sb, path); + sb.append("
"); + }); + } + + addMessageIfExist(sb, req); + addFileCreationForm(sb); sb.append(""); resp.getWriter().write(sb.toString()); } + private List getSortedDirAndFiles(Path path) throws IOException { + List sortedItem = new ArrayList<>(); + Files.list(path) + .sorted() + .filter(path0 -> Files.isDirectory(path0)) + .forEach(sortedItem::add); + + Files.list(path) + .sorted() + .filter(path0 -> !Files.isDirectory(path0)) + .forEach(sortedItem::add); + + return sortedItem; + } + + private void addFileCreationForm(StringBuilder sb) { + sb.append("
"); + sb.append(""); + sb.append(""); + sb.append(""); + sb.append("
"); + } + + private void addMessageIfExist(StringBuilder sb, HttpServletRequest req) { + String message = req.getParameter("message"); + if (message != null && !message.isEmpty()) { + sb.append("message: " + message + ""); + } + } + private void appendLink(StringBuilder sb, String text, Path path) { - //TODO: Implement link rendering based on path type (directory or file) + if (Files.isDirectory(path)) { + text = String.format("[%s]", text); + } + sb.append(String.format("%s", path.toString(), text)); } + + private void appendDeleteLink(StringBuilder sb, Path path) { + sb.append(String.format("[x]", path.toString())); + } + } diff --git a/src/com/geekhub/hw8/ViewFileServlet.java b/src/com/geekhub/hw8/ViewFileServlet.java index 263194b..761cf48 100644 --- a/src/com/geekhub/hw8/ViewFileServlet.java +++ b/src/com/geekhub/hw8/ViewFileServlet.java @@ -1,18 +1,50 @@ package com.geekhub.hw8; +import javax.servlet.RequestDispatcher; 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.charset.Charset; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; @WebServlet("/file/view") public class ViewFileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doGet(req, resp); + StringBuilder sb = new StringBuilder(); + String fileName = req.getParameter("filename"); + + sb.append(""); + sb.append("

File viewer:

"); + if (fileName!=null){ + Path path = Paths.get(fileName); + sb.append(String.format("%s", + path.getParent().toString(), + "[exit]")); + sb.append("
"); + if (Files.exists(path) && Files.isReadable(path)) { + List fileContent = Files.readAllLines(path, Charset.defaultCharset()); + String text = fileContent.stream() + .collect(Collectors.joining()); + sb.append(""); + } else { + String message = "file: " + fileName + " read failed."; + RequestDispatcher rd = req.getRequestDispatcher("/dir/view?dir="+path.getParent().toString() + +"&message="+message); + rd.forward(req,resp); + } + } + + sb.append(""); + resp.getWriter().write(sb.toString()); } + }