Merge remote-tracking branch 'origin/SPM-26'

This commit is contained in:
Johannes Theiner 2019-05-28 16:48:39 +02:00
commit 3e9b38522a
8 changed files with 87 additions and 54 deletions

View File

@ -1,6 +1,12 @@
package de.hsel.spm.baudas.web; package de.hsel.spm.baudas.web;
import javax.servlet.*; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -19,17 +25,19 @@ public class AuthenticationFilter implements Filter{
/** /**
* Called by the web container to indicate to a filter that it is being placed into service. This filter manages the authentication. * Called by the web container to indicate to a filter that it is being placed into service. This filter manages the authentication.
* @param fConfig This parameter provides access to everything the code needs to work. *
* @param filterConfig This parameter provides access to everything the code needs to work.
* @throws ServletException Defines a general exception a servlet can throw when it encounters difficulty. * @throws ServletException Defines a general exception a servlet can throw when it encounters difficulty.
*/ */
public void init(FilterConfig fConfig) throws ServletException { public void init(FilterConfig filterConfig) throws ServletException {
this.context = fConfig.getServletContext(); this.context = filterConfig.getServletContext();
this.context.log("AuthenticationFilter initialized"); this.context.log("AuthenticationFilter initialized");
} }
/** /**
* The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. * The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
*
* @param request This parameter provides access to everything the code needs to work. * @param request This parameter provides access to everything the code needs to work.
* @param response This parameter provides access to everything the code needs to issue a response. * @param response This parameter provides access to everything the code needs to issue a response.
* @param chain This parameter allows passing request along the chain of potential handlers until one of them handles the request. * @param chain This parameter allows passing request along the chain of potential handlers until one of them handles the request.

View File

@ -10,8 +10,12 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/** /**
* manages data about .csv files. * manages data about .csv files.
@ -23,7 +27,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
public class Data { public class Data {
@Getter @Getter
private static ConcurrentLinkedQueue<SavedFile> files = new ConcurrentLinkedQueue<>(); private static ConcurrentMap<String, List<SavedFile>> files = new ConcurrentHashMap<>();
/** /**
@ -33,44 +37,57 @@ public class Data {
* @return path to save file to * @return path to save file to
*/ */
@NotNull @NotNull
static Path add(@NotNull String name) { static Path add(@NotNull String name, @NotNull String session) {
//cleanup old files UUID uuid = UUID.randomUUID();
if (files.isEmpty()) {
if (!files.containsKey(session))
files.put(session, new ArrayList<>());
if (files.get(session).size() >= 5) {
SavedFile file = files.get(session).iterator().next();
if (!get(file.getUuid()).delete()) {
System.err.println("failed to delete file..." + file);
}
files.get(session).remove(file);
}
files.get(session).add(new SavedFile(uuid, name, LocalDateTime.now()));
return Paths.get(getFileName(uuid));
}
/**
* delete all files for session.
*
* @param session session id
*/
static void delete(String session) {
for (SavedFile file : files.get(session)) {
if (!get(file.getUuid()).delete())
System.err.println("failed to delete file..." + file);
}
files.remove(session);
//deleting all files older than x days.
int days = 30;
try { try {
Files.list(Paths.get("")).forEach(path -> { Files.list(Paths.get("")).forEach(path -> {
if (path.toFile().getName().endsWith(".csv")) { if (path.toFile().getName().endsWith("*.csv")) {
long diff = new Date().getTime() - path.toFile().lastModified();
if (diff > (long) days * 24 * 60 * 60 * 1000) {
try { try {
Files.delete(path); Files.delete(path);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
}
}); });
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
Path path;
UUID uuid = UUID.randomUUID();
if (files.size() >= 5) {
//remove last and add new one
SavedFile file = files.poll();
if (!get(file.getUuid()).delete()) {
System.out.println("failed to delete file...");
}
path = Paths.get(getFileName(uuid));
files.offer(new SavedFile(uuid, name, LocalDateTime.now()));
} else {
files.add(new SavedFile(uuid, name, LocalDateTime.now()));
path = Paths.get(getFileName(uuid));
}
return path;
}
/** /**
* generates File from uuid. * generates File from uuid.
* *

View File

@ -31,6 +31,6 @@ public class Files extends HttpServlet {
resp.setCharacterEncoding(StandardCharsets.UTF_8.name()); resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
PrintWriter out = resp.getWriter(); PrintWriter out = resp.getWriter();
Gson gson = new Gson(); Gson gson = new Gson();
out.print(gson.toJson(Data.getFiles())); out.print(gson.toJson(Data.getFiles().get(req.getSession().getId())));
} }
} }

View File

@ -23,6 +23,7 @@ public class LoginServlet extends HttpServlet {
/** /**
* This is a Servlet that manages the Login and creates Sessions. * This is a Servlet that manages the Login and creates Sessions.
*
* @param request This parameter provides access to everything the code needs to work. * @param request This parameter provides access to everything the code needs to work.
* @param response This parameter provides access to everything the code needs to issue a response. * @param response This parameter provides access to everything the code needs to issue a response.
* @throws ServletException Defines a general exception a servlet can throw when it encounters difficulty. * @throws ServletException Defines a general exception a servlet can throw when it encounters difficulty.

View File

@ -1,12 +1,11 @@
package de.hsel.spm.baudas.web; package de.hsel.spm.baudas.web;
import java.io.IOException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.io.IOException;
/** /**
* Servlet implementation class LogoutServlet. * Servlet implementation class LogoutServlet.
@ -19,14 +18,16 @@ public class LogoutServlet extends HttpServlet {
/** /**
* This is a Servlet that manages the Logout and deletes Sessions. * This is a Servlet that manages the Logout and deletes Sessions.
*
* @param request This parameter provides access to everything the code needs to work. * @param request This parameter provides access to everything the code needs to work.
* @param response This parameter provides access to everything the code needs to issue a response. * @param response This parameter provides access to everything the code needs to issue a response.
* @throws IOException Signals that an I/O exception of some sort has occurred. This class is the general class of exceptions produced by failed or interrupted I/O operations. * @throws IOException Signals that an I/O exception of some sort has occurred. This class is the general class of exceptions produced by failed or interrupted I/O operations.
*/ */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession(false); HttpSession session = request.getSession();
if (session != null) { if (session != null) {
Data.delete(session.getId());
session.invalidate(); session.invalidate();
} }
response.sendRedirect(request.getContextPath() + "/"); response.sendRedirect(request.getContextPath() + "/");

View File

@ -12,9 +12,15 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/** /**
* top/flop articles list diagram.
*
* @author Johannes Theiner * @author Johannes Theiner
* @version 0.1 * @version 0.1
* @since 0.1 * @since 0.1

View File

@ -89,7 +89,7 @@ public class Upload extends HttpServlet {
inputStream = filePart.getInputStream(); inputStream = filePart.getInputStream();
} }
Path path = Data.add(fileName); Path path = Data.add(fileName, req.getSession().getId());
if (!Files.exists(path)) { if (!Files.exists(path)) {
Files.createFile(path); Files.createFile(path);
} }

View File

@ -18,12 +18,12 @@
<ul class="right hide-on-med-and-down"> <ul class="right hide-on-med-and-down">
<li><a data-target="slide-out" class="sidenav-trigger show-on-large"><i <li><a data-target="slide-out" class="sidenav-trigger show-on-large"><i
class="material-icons left">menu</i>Men&uuml;</a></li><!--Sidenav--> class="material-icons left">menu</i>Men&uuml;</a></li><!--Sidenav-->
<li><a href="login.html"><i class="material-icons left">person_outline</i>Logout</a></li><!--Logout--> <li><a href="logout"><i class="material-icons left">person_outline</i>Logout</a></li><!--Logout-->
</ul> </ul>
<ul class="right"> <ul class="right">
<li><a href="#" data-target="slide-out" class="sidenav-trigger"><i class="material-icons">menu</i></a> <li><a href="#" data-target="slide-out" class="sidenav-trigger"><i class="material-icons">menu</i></a>
</li><!--Sidenav--> </li><!--Sidenav-->
<li><a href="login.html" class="sidenav-trigger"><i class="material-icons">person_outline</i></a></li> <li><a href="logout" class="sidenav-trigger"><i class="material-icons">person_outline</i></a></li>
<!--Logout--> <!--Logout-->
</ul> </ul>
</div> </div>