Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/com/geekhub/hw8/CreateFileServlet.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
20 changes: 19 additions & 1 deletion src/com/geekhub/hw8/RemoveFileServlet.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
76 changes: 73 additions & 3 deletions src/com/geekhub/hw8/ViewDirectoryServlet.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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("<html>");

//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("<br>");
}

if (!Files.isDirectory(NEW_PATH)) {
sb.append("</html>");
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("<br>");
});
}

addMessageIfExist(sb, req);
addFileCreationForm(sb);

sb.append("</html>");
resp.getWriter().write(sb.toString());
}

private List<Path> getSortedDirAndFiles(Path path) throws IOException {
List<Path> 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("<form action='/file/create'>");
sb.append("<input type='hidden' name='path' value='" + ROOT_PATH + "'/>");
sb.append("<input type='text' name='filename' placeholder='file name'/>");
sb.append("<input type='submit' value='create file'/>");
sb.append("</form>");
}

private void addMessageIfExist(StringBuilder sb, HttpServletRequest req) {
String message = req.getParameter("message");
if (message != null && !message.isEmpty()) {
sb.append("message: <i>" + message + "</i>");
}
}

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("<a href='/dir/view?dir=%s'>%s</a>", path.toString(), text));
}

private void appendDeleteLink(StringBuilder sb, Path path) {
sb.append(String.format("<a href='/file/remove?filename=%s' title='delete'>[x]</a>", path.toString()));
}

}
34 changes: 33 additions & 1 deletion src/com/geekhub/hw8/ViewFileServlet.java
Original file line number Diff line number Diff line change
@@ -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("<html>");
sb.append("<h1>File viewer:</h1>");
if (fileName!=null){
Path path = Paths.get(fileName);
sb.append(String.format("<a href='view?dir=%s'>%s</a>",
path.getParent().toString(),
"[exit]"));
sb.append("<br>");
if (Files.exists(path) && Files.isReadable(path)) {
List<String> fileContent = Files.readAllLines(path, Charset.defaultCharset());
String text = fileContent.stream()
.collect(Collectors.joining());
sb.append("<textarea name='textarea' rows=10 cols=50>" + text + "</textarea>");
} else {
String message = "file: <i>" + fileName + "</i> read failed.";
RequestDispatcher rd = req.getRequestDispatcher("/dir/view?dir="+path.getParent().toString()
+"&message="+message);
rd.forward(req,resp);
}
}

sb.append("</html>");
resp.getWriter().write(sb.toString());
}

}