~ more fixes

#SPM32: add work development 3h
This commit is contained in:
Johannes Theiner 2019-05-29 23:08:32 +02:00
parent 89468525ab
commit e5d55e04d9
22 changed files with 112 additions and 85 deletions

View File

@ -2,8 +2,6 @@
#Kundenkarten Analyse #Kundenkarten Analyse
[![Build Status](https://teamcity.joethei.xyz/app/rest/builds/buildType:(id:Studium_Programmierung_Softwareprojektmanagement_SpmProd)/statusIcon)](https://tcstatus.joethei.space/dashboard/spm) [![Build Status](https://teamcity.joethei.xyz/app/rest/builds/buildType:(id:Studium_Programmierung_Softwareprojektmanagement_SpmProd)/statusIcon)](https://tcstatus.joethei.space/dashboard/spm)
[![Quality Gate Status](https://sonarqube.joethei.xyz/api/project_badges/measure?project=de.hs-el.spm%3AbauDas-kundenkarten&metric=alert_status)](https://sonarqube.joethei.xyz/dashboard?id=de.hs-el.spm%3AbauDas-kundenkarten)
## minimal Requirements ## minimal Requirements

1
password.txt Normal file
View File

@ -0,0 +1 @@
SPM2019SS

View File

@ -0,0 +1,19 @@
package de.hsel.spm.baudas;
import lombok.Getter;
import java.util.logging.Logger;
/**
* general .
*
* @author Johannes Theiner
* @version 0.1
* @since 1.0
*/
public class BauDas {
@Getter
private static Logger logger = Logger.getLogger("BauDas");
}

View File

@ -1,12 +1,12 @@
package de.hsel.spm.baudas.analysis; package de.hsel.spm.baudas.analysis;
import de.hsel.spm.baudas.BauDas;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import weka.core.Instances; import weka.core.Instances;
import weka.core.converters.CSVLoader; import weka.core.converters.CSVLoader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Logger;
/** /**
* base interface for analysis. * base interface for analysis.
@ -32,7 +32,7 @@ public interface Analysis<T> {
loader.setSource(file); loader.setSource(file);
return loader.getDataSet(); return loader.getDataSet();
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "load", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
return null; return null;
} }

View File

@ -1,5 +1,6 @@
package de.hsel.spm.baudas.analysis; package de.hsel.spm.baudas.analysis;
import de.hsel.spm.baudas.BauDas;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import weka.clusterers.SimpleKMeans; import weka.clusterers.SimpleKMeans;
import weka.core.Instances; import weka.core.Instances;
@ -9,7 +10,6 @@ import weka.filters.unsupervised.attribute.Remove;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.logging.Logger;
/** /**
* Cluster Analysis. * Cluster Analysis.
@ -47,7 +47,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
remove.setInputFormat(instances); remove.setInputFormat(instances);
instances = Filter.useFilter(instances, remove); instances = Filter.useFilter(instances, remove);
} catch (Exception e) { } catch (Exception e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
//creating a single cluster to get average, weka has no way to get that from a bigger one. //creating a single cluster to get average, weka has no way to get that from a bigger one.
@ -60,7 +60,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
averageCentroids = averageMeans.getClusterCentroids(); averageCentroids = averageMeans.getClusterCentroids();
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", ex); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), ex);
} }
assert averageCentroids != null; assert averageCentroids != null;
@ -78,7 +78,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
putIntoMap(centroids, count); putIntoMap(centroids, count);
} catch (Exception ex) { } catch (Exception ex) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", ex); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), ex);
} }
return result; return result;
} }

View File

@ -1,5 +1,6 @@
package de.hsel.spm.baudas.analysis; package de.hsel.spm.baudas.analysis;
import de.hsel.spm.baudas.BauDas;
import weka.associations.Apriori; import weka.associations.Apriori;
import weka.associations.AssociationRule; import weka.associations.AssociationRule;
import weka.associations.Item; import weka.associations.Item;
@ -13,7 +14,6 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Logger;
/** /**
* The shopping-cart analysis. * The shopping-cart analysis.
@ -46,7 +46,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
nc.setInputFormat(instances); nc.setInputFormat(instances);
instances = Filter.useFilter(instances, nc); instances = Filter.useFilter(instances, nc);
} catch (Exception e) { } catch (Exception e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
@ -56,7 +56,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
num2nom.setInputFormat(instances); num2nom.setInputFormat(instances);
instances = Filter.useFilter(instances, num2nom); instances = Filter.useFilter(instances, num2nom);
} catch (Exception e) { } catch (Exception e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
Apriori model = new Apriori(); Apriori model = new Apriori();
@ -65,7 +65,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
try { try {
model.buildAssociations(instances); model.buildAssociations(instances);
} catch (Exception e) { } catch (Exception e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
for (int i = 0; i < model.getAssociationRules().getRules().size(); i++) { for (int i = 0; i < model.getAssociationRules().getRules().size(); i++) {

View File

@ -56,7 +56,8 @@ public class AuthorizationFilter implements Filter {
String url = req.getRequestURI(); String url = req.getRequestURI();
if (url.contains("login") || url.contains("logo") || url.contains("js/")) { if (url.contains("login") || url.contains("logo") || url.contains("js/")) {
chain.doFilter(request, response); chain.doFilter(request, response);
} else if (session == null || !((boolean) session.getAttribute("authentication"))) { //checking whether the session exists and if authentication succeed } else if (session == null || session.getAttribute("authentication") == null
|| !((boolean) session.getAttribute("authentication"))) { //checking whether the session exists and if authentication succeed
this.context.log("Unauthorized access request"); this.context.log("Unauthorized access request");
res.sendRedirect(req.getContextPath() + "/login.jsp"); res.sendRedirect(req.getContextPath() + "/login.jsp");
} else { } else {

View File

@ -1,5 +1,6 @@
package de.hsel.spm.baudas.web; package de.hsel.spm.baudas.web;
import de.hsel.spm.baudas.BauDas;
import lombok.Getter; import lombok.Getter;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -16,7 +17,6 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.logging.Logger;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@ -31,6 +31,8 @@ public class DatasetManagement {
@Getter @Getter
private static ConcurrentMap<String, List<SavedFile>> files = new ConcurrentHashMap<>(); private static ConcurrentMap<String, List<SavedFile>> files = new ConcurrentHashMap<>();
private DatasetManagement() {}
/** /**
* adds file to list and generates a new filename. * adds file to list and generates a new filename.
@ -50,7 +52,7 @@ public class DatasetManagement {
try { try {
Files.delete(get(file.getUuid()).toPath()); Files.delete(get(file.getUuid()).toPath());
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "add", e); BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
} }
files.get(session).remove(file); files.get(session).remove(file);
} }
@ -70,7 +72,7 @@ public class DatasetManagement {
try { try {
Files.delete(get(file.getUuid()).toPath()); Files.delete(get(file.getUuid()).toPath());
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", e); BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
} }
} }
files.remove(session); files.remove(session);
@ -87,13 +89,13 @@ public class DatasetManagement {
try { try {
Files.delete(path); Files.delete(path);
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", e); BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
} }
} }
} }
}); });
} catch (IOException ex) { } catch (IOException ex) {
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", ex); BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), ex);
} }
} }
@ -121,6 +123,5 @@ public class DatasetManagement {
return uuid + ".csv"; return uuid + ".csv";
} }
private DatasetManagement() {
}
} }

View File

@ -11,6 +11,8 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
/** /**
* authenticates users. * authenticates users.
@ -23,8 +25,6 @@ import java.io.PrintWriter;
@WebServlet("/login") @WebServlet("/login")
public class LoginServlet extends HttpServlet { public class LoginServlet extends HttpServlet {
private final String password = "SPM2019SS";
/** /**
* reads from HTTP POST parameter 'password' and compares it. * reads from HTTP POST parameter 'password' and compares it.
* *
@ -34,17 +34,19 @@ public class LoginServlet extends HttpServlet {
*/ */
@Override @Override
protected void doPost(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws ServletException, IOException { protected void doPost(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws ServletException, IOException {
String pw = Files.readString(Paths.get("password.txt"));
String password = request.getParameter("password"); String password = request.getParameter("password");
if (this.password.equals(password)) { if (pw.equals(password)) {
HttpSession newSession = request.getSession(true); HttpSession newSession = request.getSession(true);
newSession.setAttribute("authentication", true); newSession.setAttribute("authentication", true);
newSession.setMaxInactiveInterval(5 * 60 * 60); //setting session to expiry in 5 hours newSession.setMaxInactiveInterval(5 * 60 * 60); //setting session to expire in 5 hours
response.sendRedirect("/"); response.sendRedirect("index.jsp");
} else { } else {
RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp"); RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
out.println("<font color='red' class='align-center'>Das eingegebene Passwort ist falsch.</font>");
rd.include(request, response); rd.include(request, response);
out.print("<script>$('#wrong_password').removeClass('hide')</script>");
} }
} }
} }

View File

@ -1,5 +1,6 @@
package de.hsel.spm.baudas.web; package de.hsel.spm.baudas.web;
import de.hsel.spm.baudas.BauDas;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import weka.core.converters.CSVLoader; import weka.core.converters.CSVLoader;
@ -17,7 +18,6 @@ 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.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.logging.Logger;
/** /**
* saves uploaded files. * saves uploaded files.
@ -115,7 +115,7 @@ public class UploadServlet extends HttpServlet {
try { try {
response.sendRedirect("error.jsp?code=" + code); response.sendRedirect("error.jsp?code=" + code);
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(getClass().getName(), "error", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
} }
} }

View File

@ -1,6 +1,7 @@
package de.hsel.spm.baudas.web.depiction; package de.hsel.spm.baudas.web.depiction;
import com.google.gson.Gson; import com.google.gson.Gson;
import de.hsel.spm.baudas.BauDas;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -11,7 +12,6 @@ import java.io.PrintWriter;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@ -51,7 +51,7 @@ interface Depiction {
} }
return uuid; return uuid;
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "init", e); BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
} }
return null; return null;
} }

View File

@ -1,3 +1,6 @@
<% response.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
<% request.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
<%@ page contentType="text/html;charset=UTF-8" %>
<!--Cards--> <!--Cards-->
<!--Analyse-Cards--> <!--Analyse-Cards-->
<div id="analysis" class="row container black-text"> <div id="analysis" class="row container black-text">
@ -62,7 +65,7 @@
<div id="group_overview" class="card white"> <div id="group_overview" class="card white">
<div class="card-content"> <div class="card-content">
<div class="center"> <div class="center">
<span class="card-title center">Gruppenübersicht</span> <span class="card-title center">Clusterübersicht</span>
</div> </div>
<div> <div>
<table id="cluster_table"> <table id="cluster_table">

View File

@ -1,11 +1,20 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"
integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/google-palette@1.1.0/palette.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/google-palette@1.1.0/palette.min.js"></script>
<script> <script>
M.AutoInit(); M.AutoInit();
</script> </script>
<script src="js/upload.js"></script>
<script src="js/datasets.js"></script>
<script src="js/week_overview.js"></script>
<script src="js/shopping_times.js"></script>
<script src="js/sales.js"></script>
<script src="js/clusters.js"></script>
<script src="js/shopping_cart.js"></script>
<!--Ende Skriptbereich--> <!--Ende Skriptbereich-->
</body> </body>

View File

@ -7,4 +7,4 @@
<%@include file="analysis.jsp"%> <%@include file="analysis.jsp"%>
<%@include file="marketing.jsp"%> <%@include file="marketing.jsp"%>
<%@include file="theming.jsp" %> <%@include file="footer.jsp" %>

View File

@ -24,7 +24,7 @@ Chart.plugins.register({
ctx.textAlign = 'center'; ctx.textAlign = 'center';
ctx.textBaseline = 'middle'; ctx.textBaseline = 'middle';
ctx.font = "16px normal 'Helvetica Nueue'"; ctx.font = "16px normal 'Helvetica Nueue'";
ctx.fillText('Kein Datenset ausgewählt', width / 2, height / 2); ctx.fillText('Kein Datensatz ausgewählt', width / 2, height / 2);
ctx.restore(); ctx.restore();
} }
} }

View File

@ -19,6 +19,13 @@ let sales = new Chart($("#sales_chart"), {
}] }]
}, },
options: { options: {
tooltips: {
callbacks: {
label: function (tooltipItems, data) {
return tooltipItems.xLabel + ' Stück';
}
},
},
responsive: true, responsive: true,
title: { title: {
display: false display: false

View File

@ -22,17 +22,6 @@ form.onsubmit = function (event) {
loading.modal('open'); loading.modal('open');
}; };
xhr.upload.addEventListener("progress", function (event) {
if (event.lengthComputable) {
self.progress = Math.round(100 / event.total * event.loaded);
} else if (this.explicitTotal) {
self.progress = Math.min(1, event.loaded / self.explicitTotal);
} else {
self.progress = 0;
}
}, false);
xhr.onloadend = function (e) { xhr.onloadend = function (e) {
clearSelected(); clearSelected();
updateDatasets(); updateDatasets();

View File

@ -17,22 +17,21 @@ let week_overview = new Chart($("#overview_chart"), {
yAxisID: 'y-axis-1', yAxisID: 'y-axis-1',
data: [], data: [],
fill: true, fill: true,
backgroundColor: 'rgba(104, 216, 154, 0.5)', backgroundColor: 'rgba(113, 114, 231, 1)',
lineTension: 0 lineTension: 0
}, { }, {
label: "Einnahmen in €", label: "Einnahmen in €",
yAxisID: 'y-axis-2', yAxisID: 'y-axis-2',
data: [], data: [],
fill: true, fill: true,
backgroundColor: 'rgba(113, 114, 231, 1)', backgroundColor: 'rgba(244, 67, 54, 1)',
lineTension: 0 lineTension: 0
}] }]
}, },
options: { options: {
responsive: true, responsive: true,
title: { title: {
display: false, display: false
text: 'Übersicht'
}, },
legend: { legend: {
display: false display: false

View File

@ -1,26 +1,38 @@
<%@include file="emptyHeader.jsp"%> <%@include file="emptyHeader.jsp" %>
<div class="container row"> <div class="container">
<!--Login--> <div class="row">
<div class="center"> <div class="center">
<div class="card white col s6 push-s3"> <div class="card white col s6 push-s3">
<div class="card-content"> <div class="card-content">
<div class="center"> <div class="center">
<img style="width: 50%" src="logoOrginal.gif"> <img style="width: 50%" src="logoOrginal.gif">
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="row"> <div class="row">
<div class="col s8 push-s2"> <div class="col s8 push-s2">
<form action="login" method="post"> <form action="login" method="post">
<input id="password" type="password" class="validate" placeholder="Passwort" name="password"> <input id="password" type="password" class="validate" placeholder="Passwort"
<input class="white-text btn blue-grey lighten-2" type="submit" value="Login"> name="password">
</form> <input class="white-text btn blue-grey lighten-2" type="submit" value="Login">
</form>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row hide" id="wrong_password">
<div class="col s4 push-s4">
<div class="card-panel red darken-1">
<h5 class="white-text center-align">
Das Passwort ist falsch
</h5>
</div>
</div>
</div>
</div> </div>
<%@include file="footer.jsp"%> <%@include file="footer.jsp" %>

View File

@ -1,3 +1,6 @@
<% response.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
<% request.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
<%@ page contentType="text/html;charset=UTF-8" %>
<!--Marketing-Cards--> <!--Marketing-Cards-->
<div id="marketing" class="row container"> <div id="marketing" class="row container">
<div class="row"> <div class="row">

View File

@ -71,7 +71,7 @@
</div> </div>
</li> </li>
<li> <li>
<div class="col s12"> <div class="col s12 center">
<button class="btn blue-grey waves-effect waves-light" type="submit" name="action">Hochladen<i <button class="btn blue-grey waves-effect waves-light" type="submit" name="action">Hochladen<i
class="material-icons right">file_upload</i></button> class="material-icons right">file_upload</i></button>
</div> </div>

View File

@ -1,17 +0,0 @@
<!--Script für Diagramme-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"
integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="js/upload.js"></script>
<script src="js/datasets.js"></script>
<script src="js/week_overview.js"></script>
<script src="js/shopping_times.js"></script>
<script src="js/sales.js"></script>
<script src="js/clusters.js"></script>
<script src="js/shopping_cart.js"></script>
<%@include file="footer.jsp"%>