Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
c71b50a041 | |||
af9d5662b1 | |||
a71c1a09a6 | |||
05cc2f83d6 | |||
f94fd7d037 | |||
|
59cb7c3c4f | ||
|
2ac3cf629f | ||
|
506c6f9b09 | ||
|
ba5048e119 | ||
|
26279130b7 | ||
|
30b51f9032 | ||
|
51f6ca8958 | ||
|
f8fd7d1b5e | ||
|
23df933504 | ||
|
3a51b08de8 | ||
|
f4fbce7977 | ||
|
605a2ca33d | ||
|
a633ba42e9 | ||
|
f0e654399a | ||
|
a98c3eae71 | ||
|
3fba0f9933 |
28
.github/workflows/build.yml
vendored
Normal file
28
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# .github/workflows/gradle-build-pr.yml
|
||||||
|
name: Run Gradle on pushs
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
jobs:
|
||||||
|
gradle:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 11
|
||||||
|
- uses: eskatos/gradle-command-action@v1
|
||||||
|
with:
|
||||||
|
gradle-version: rc
|
||||||
|
arguments: build
|
||||||
|
- uses: eskatos/gradle-command-action@v1
|
||||||
|
with:
|
||||||
|
gradle-version: rc
|
||||||
|
arguments: jar
|
35
.gitlab-ci.yml
Normal file
35
.gitlab-ci.yml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# This file is a template, and might need editing before it works on your project.
|
||||||
|
# This is the Gradle build system for JVM applications
|
||||||
|
# https://gradle.org/
|
||||||
|
# https://github.com/gradle/gradle
|
||||||
|
image: gradle:latest
|
||||||
|
|
||||||
|
# Disable the Gradle daemon for Continuous Integration servers as correctness
|
||||||
|
# is usually a priority over speed in CI environments. Using a fresh
|
||||||
|
# runtime for each build is more reliable since the runtime is completely
|
||||||
|
# isolated from any previous builds.
|
||||||
|
variables:
|
||||||
|
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- export GRADLE_USER_HOME=`pwd`/.gradle
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
script: gradle --build-cache assemble
|
||||||
|
cache:
|
||||||
|
key: "$CI_COMMIT_REF_NAME"
|
||||||
|
policy: push
|
||||||
|
paths:
|
||||||
|
- build
|
||||||
|
- .gradle
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script: gradle check
|
||||||
|
cache:
|
||||||
|
key: "$CI_COMMIT_REF_NAME"
|
||||||
|
policy: pull
|
||||||
|
paths:
|
||||||
|
- build
|
||||||
|
- .gradle
|
@ -6,7 +6,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group 'com.wasteinformationserver'
|
group 'com.wasteinformationserver'
|
||||||
version '1.0.1'
|
version '1.1.1'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 1.8
|
||||||
|
|
||||||
|
156
db.sql
156
db.sql
@ -1,156 +0,0 @@
|
|||||||
-- phpMyAdmin SQL Dump
|
|
||||||
-- version 4.9.0.1
|
|
||||||
-- https://www.phpmyadmin.net/
|
|
||||||
--
|
|
||||||
-- Host: localhost
|
|
||||||
-- Erstellungszeit: 06. Dez 2019 um 16:11
|
|
||||||
-- Server-Version: 10.3.11-MariaDB
|
|
||||||
-- PHP-Version: 5.6.40
|
|
||||||
|
|
||||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
|
||||||
SET AUTOCOMMIT = 0;
|
|
||||||
START TRANSACTION;
|
|
||||||
SET time_zone = "+00:00";
|
|
||||||
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Datenbank: `wasteinformation`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Tabellenstruktur für Tabelle `cities`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `cities` (
|
|
||||||
`id` int(11) NOT NULL,
|
|
||||||
`userid` int(11) NOT NULL,
|
|
||||||
`name` varchar(256) NOT NULL,
|
|
||||||
`wastetype` varchar(64) NOT NULL,
|
|
||||||
`zone` int(11) NOT NULL
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Daten für Tabelle `cities`
|
|
||||||
--
|
|
||||||
|
|
||||||
INSERT INTO `cities` (`id`, `userid`, `name`, `wastetype`, `zone`) VALUES
|
|
||||||
(2, 0, 'Steyr', 'Bio', 2),
|
|
||||||
(3, 0, 'Steyr', 'Bio', 3),
|
|
||||||
(4, 0, 'Steyr', 'Bio', 4),
|
|
||||||
(128, 0, 'Steyr', 'Biowaste', 1),
|
|
||||||
(130, 0, 'abc', 'Biowaste', 1);
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Tabellenstruktur für Tabelle `pickupdates`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `pickupdates` (
|
|
||||||
`id` int(11) NOT NULL,
|
|
||||||
`citywastezoneid` int(11) NOT NULL,
|
|
||||||
`pickupdate` date NOT NULL
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Daten für Tabelle `pickupdates`
|
|
||||||
--
|
|
||||||
|
|
||||||
INSERT INTO `pickupdates` (`id`, `citywastezoneid`, `pickupdate`) VALUES
|
|
||||||
(6, 4, '2019-12-06'),
|
|
||||||
(7, 3, '2019-12-06'),
|
|
||||||
(8, 2, '2019-12-06'),
|
|
||||||
(9, 130, '2019-12-26');
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Tabellenstruktur für Tabelle `user`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE `user` (
|
|
||||||
`id` int(11) NOT NULL,
|
|
||||||
`username` varchar(150) NOT NULL,
|
|
||||||
`firstName` varchar(32) NOT NULL,
|
|
||||||
`secondName` varchar(32) NOT NULL,
|
|
||||||
`password` varchar(32) NOT NULL,
|
|
||||||
`permission` int(11) NOT NULL DEFAULT 0,
|
|
||||||
`email` varchar(64) NOT NULL,
|
|
||||||
`logindate` timestamp NOT NULL DEFAULT current_timestamp()
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Daten für Tabelle `user`
|
|
||||||
--
|
|
||||||
|
|
||||||
INSERT INTO `user` (`id`, `username`, `firstName`, `secondName`, `password`, `permission`, `email`, `logindate`) VALUES
|
|
||||||
(2, 'lheilige', 'lukas', 'heiligenbrunner', 'c6e2ddf577e0dfdc4366f788f1b27102', 0, 'lukas.heiligenbrunner@gmail.com', '2019-09-20 12:19:31'),
|
|
||||||
(11, 'meindl', 'emil', 'meindl', '81dc9bdb52d04dc20036dbd8313ed055', 0, 'mailmeindl', '2019-09-27 10:23:46'),
|
|
||||||
(15, 'horni', 'kk', 'kk', 'c4ca4238a0b923820dcc509a6f75849b', 1, 'kk', '2019-09-27 13:19:09');
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indizes der exportierten Tabellen
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indizes für die Tabelle `cities`
|
|
||||||
--
|
|
||||||
ALTER TABLE `cities`
|
|
||||||
ADD PRIMARY KEY (`id`);
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indizes für die Tabelle `pickupdates`
|
|
||||||
--
|
|
||||||
ALTER TABLE `pickupdates`
|
|
||||||
ADD PRIMARY KEY (`id`),
|
|
||||||
ADD KEY `citywastezoneid` (`citywastezoneid`);
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indizes für die Tabelle `user`
|
|
||||||
--
|
|
||||||
ALTER TABLE `user`
|
|
||||||
ADD PRIMARY KEY (`id`);
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT für exportierte Tabellen
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT für Tabelle `cities`
|
|
||||||
--
|
|
||||||
ALTER TABLE `cities`
|
|
||||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=131;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT für Tabelle `pickupdates`
|
|
||||||
--
|
|
||||||
ALTER TABLE `pickupdates`
|
|
||||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT für Tabelle `user`
|
|
||||||
--
|
|
||||||
ALTER TABLE `user`
|
|
||||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Constraints der exportierten Tabellen
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Constraints der Tabelle `pickupdates`
|
|
||||||
--
|
|
||||||
ALTER TABLE `pickupdates`
|
|
||||||
ADD CONSTRAINT `pickupdates_ibfk_1` FOREIGN KEY (`citywastezoneid`) REFERENCES `cities` (`id`);
|
|
||||||
COMMIT;
|
|
||||||
|
|
||||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
@ -1,4 +1,5 @@
|
|||||||
@file:JvmName("Main")
|
@file:JvmName("Main")
|
||||||
|
|
||||||
package com.wasteinformationserver
|
package com.wasteinformationserver
|
||||||
|
|
||||||
import com.wasteinformationserver.basicutils.Info
|
import com.wasteinformationserver.basicutils.Info
|
||||||
@ -7,7 +8,6 @@ import com.wasteinformationserver.basicutils.Storage
|
|||||||
import com.wasteinformationserver.db.JDBC
|
import com.wasteinformationserver.db.JDBC
|
||||||
import com.wasteinformationserver.mqtt.MqttService
|
import com.wasteinformationserver.mqtt.MqttService
|
||||||
import com.wasteinformationserver.website.Webserver
|
import com.wasteinformationserver.website.Webserver
|
||||||
import java.io.IOException
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* application entry point
|
* application entry point
|
||||||
@ -22,14 +22,9 @@ fun main() {
|
|||||||
Log.info("startup of WasteInformationServer")
|
Log.info("startup of WasteInformationServer")
|
||||||
|
|
||||||
Runtime.getRuntime().addShutdownHook(Thread(Runnable {
|
Runtime.getRuntime().addShutdownHook(Thread(Runnable {
|
||||||
try {
|
// shutdown routine
|
||||||
Thread.sleep(200)
|
|
||||||
Log.warning("Shutting down ...")
|
Log.warning("Shutting down ...")
|
||||||
JDBC.getInstance().disconnect();
|
JDBC.getInstance().disconnect();
|
||||||
//shutdown routine
|
|
||||||
} catch (e: InterruptedException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}))
|
}))
|
||||||
|
|
||||||
Log.info("Server version: " + Info.getVersion())
|
Log.info("Server version: " + Info.getVersion())
|
||||||
@ -37,14 +32,8 @@ fun main() {
|
|||||||
|
|
||||||
//initial connect to db
|
//initial connect to db
|
||||||
Log.message("initial login to db")
|
Log.message("initial login to db")
|
||||||
try {
|
|
||||||
val stor = Storage.getInstance();
|
val stor = Storage.getInstance();
|
||||||
JDBC.init(stor.dbUser, stor.dbPassword, stor.dbName, stor.dbhost, stor.dbPort)
|
JDBC.init(stor.dbUser, stor.dbPassword, stor.dbName, stor.dbhost, stor.dbPort)
|
||||||
//JDBC.init("ingproject", "Kb9Dxklumt76ieq6", "ingproject", "db.power4future.at", 3306)
|
|
||||||
//JDBC.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
|
|
||||||
} catch (e: IOException) {
|
|
||||||
Log.error("no connection to db")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//startup web server
|
//startup web server
|
||||||
@ -55,11 +44,7 @@ fun main() {
|
|||||||
//startup mqtt service
|
//startup mqtt service
|
||||||
Log.message("starting mqtt service")
|
Log.message("starting mqtt service")
|
||||||
|
|
||||||
if (JDBC.isConnected()) {
|
val m = MqttService.getInstance()
|
||||||
val m = MqttService(Storage.getInstance().mqttServer, Storage.getInstance().mqttPort.toString())
|
m.init(Storage.getInstance().mqttServer, Storage.getInstance().mqttPort.toString())
|
||||||
// val m = MqttService("mqtt.heili.eu", "1883")
|
|
||||||
m.startupService()
|
m.startupService()
|
||||||
}else{
|
|
||||||
Log.error("could't start mqtt service because of missing db connection!")
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,14 +1,18 @@
|
|||||||
package com.wasteinformationserver.db;
|
package com.wasteinformationserver.db;
|
||||||
|
|
||||||
import com.wasteinformationserver.basicutils.Log;
|
import com.wasteinformationserver.basicutils.Log;
|
||||||
|
import com.wasteinformationserver.basicutils.Storage;
|
||||||
|
import com.wasteinformationserver.mqtt.MqttService;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* basic connection class to a Database
|
* basic connection class to a Database
|
||||||
*
|
*
|
||||||
* @author Lukas Heiligenbrunner
|
* @author Lukas Heiligenbrunner
|
||||||
|
* @author Emil Meindl
|
||||||
*/
|
*/
|
||||||
public class JDBC {
|
public class JDBC {
|
||||||
private static Connection conn;
|
private static Connection conn;
|
||||||
@ -22,7 +26,7 @@ public class JDBC {
|
|||||||
private static String ipc;
|
private static String ipc;
|
||||||
private static int portc;
|
private static int portc;
|
||||||
|
|
||||||
private JDBC(String username, String password, String dbname, String ip, int port) throws IOException {
|
private JDBC(String username, String password, String dbname, String ip, int port) {
|
||||||
logintodb(username, password, dbname, ip, port);
|
logintodb(username, password, dbname, ip, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,11 +70,7 @@ public class JDBC {
|
|||||||
*/
|
*/
|
||||||
public static JDBC getInstance() {
|
public static JDBC getInstance() {
|
||||||
if (!loggedin) {
|
if (!loggedin) {
|
||||||
try {
|
JDBC = new JDBC(usernamec, passwordc, dbnamec, ipc, portc);
|
||||||
logintodb(usernamec, passwordc, dbnamec, ipc, portc);
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.Log.error("no connetion to db - retrying in 5min");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return JDBC;
|
return JDBC;
|
||||||
}
|
}
|
||||||
@ -85,18 +85,47 @@ public class JDBC {
|
|||||||
* @param port Server port
|
* @param port Server port
|
||||||
* @throws IOException thrown if no connection to db is possible.
|
* @throws IOException thrown if no connection to db is possible.
|
||||||
*/
|
*/
|
||||||
private static void logintodb(String username, String password, String dbname, String ip, int port) throws IOException {
|
private boolean logintodb(String username, String password, String dbname, String ip, int port) {
|
||||||
try {
|
try {
|
||||||
DriverManager.setLoginTimeout(1);
|
DriverManager.setLoginTimeout(1);
|
||||||
conn = DriverManager.getConnection(
|
conn = DriverManager.getConnection(
|
||||||
"jdbc:mysql://" + ip + ":" + port + "/" + dbname + "?useSSL=false&serverTimezone=CET",
|
"jdbc:mysql://" + ip + ":" + port + "/" + dbname + "?useSSL=false&serverTimezone=CET",
|
||||||
username,
|
username,
|
||||||
password);
|
password);
|
||||||
|
checkDBStructure();
|
||||||
loggedin = true;
|
loggedin = true;
|
||||||
|
Log.Log.message("Connected to database");
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw new IOException("No connection to database");
|
// reconnect every 10 sec
|
||||||
// todo reconnect every 5mins or something
|
Log.Log.warning("Database-Connection not possible");
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Thread.sleep(10 * 1000);
|
||||||
|
} catch (InterruptedException interruptedException) {
|
||||||
|
interruptedException.printStackTrace();
|
||||||
}
|
}
|
||||||
|
Log.Log.debug("Reading config");
|
||||||
|
Storage st = Storage.Companion.getInstance();
|
||||||
|
st.init();
|
||||||
|
usernamec = st.getDbName();
|
||||||
|
passwordc = st.getDbPassword();
|
||||||
|
dbnamec = st.getDbName();
|
||||||
|
ipc = st.getDbhost();
|
||||||
|
portc = st.getDbPort();
|
||||||
|
Log.Log.info("Retry connection");
|
||||||
|
loggedin = logintodb(usernamec, passwordc, dbnamec, ipc, portc);
|
||||||
|
if (loggedin) {
|
||||||
|
// startup mqtt service if successfully connected
|
||||||
|
MqttService srvc = MqttService.Companion.getInstance();
|
||||||
|
srvc.init(st.getMqttServer(), String.valueOf(st.getMqttPort()));
|
||||||
|
srvc.startupService();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
return loggedin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect() {
|
public void disconnect() {
|
||||||
@ -115,13 +144,20 @@ public class JDBC {
|
|||||||
*/
|
*/
|
||||||
public ResultSet executeQuery(String sql) {
|
public ResultSet executeQuery(String sql) {
|
||||||
try {
|
try {
|
||||||
|
conn.isValid(5);
|
||||||
PreparedStatement stmt = conn.prepareStatement(sql);
|
PreparedStatement stmt = conn.prepareStatement(sql);
|
||||||
return stmt.executeQuery();
|
return stmt.executeQuery();
|
||||||
} catch (SQLException e) {
|
} catch (SQLNonTransientConnectionException ee) {
|
||||||
e.printStackTrace();
|
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
|
||||||
}
|
return this.executeQuery(sql);
|
||||||
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update db in some way
|
* update db in some way
|
||||||
@ -131,9 +167,17 @@ public class JDBC {
|
|||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public int executeUpdate(String sql) throws SQLException {
|
public int executeUpdate(String sql) throws SQLException {
|
||||||
|
try {
|
||||||
|
conn.isValid(2);
|
||||||
PreparedStatement stmt = conn.prepareStatement(sql);
|
PreparedStatement stmt = conn.prepareStatement(sql);
|
||||||
|
|
||||||
return stmt.executeUpdate();
|
return stmt.executeUpdate();
|
||||||
|
} catch (SQLNonTransientConnectionException ee) {
|
||||||
|
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
|
||||||
|
return this.executeUpdate(sql);
|
||||||
|
} else {
|
||||||
|
throw new SQLNonTransientConnectionException();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -144,4 +188,42 @@ public class JDBC {
|
|||||||
public static boolean isConnected() {
|
public static boolean isConnected() {
|
||||||
return loggedin;
|
return loggedin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* validate the correctness of the current sql db structure
|
||||||
|
*/
|
||||||
|
public void checkDBStructure() {
|
||||||
|
try {
|
||||||
|
ResultSet seti = executeQuery("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '" + dbnamec + "'");
|
||||||
|
seti.last();
|
||||||
|
Log.Log.debug("found " + seti.getInt(1) + " tables in db");
|
||||||
|
if (seti.getInt(1) != 5) {
|
||||||
|
// structure not valid
|
||||||
|
Log.Log.info("recreating Database structure!");
|
||||||
|
Scanner s = new Scanner(getClass().getResourceAsStream("/db.sql"));
|
||||||
|
s.useDelimiter("(;(\r)?\n)|(--\n)");
|
||||||
|
Statement st = null;
|
||||||
|
try {
|
||||||
|
st = conn.createStatement();
|
||||||
|
while (s.hasNext()) {
|
||||||
|
String line = s.next();
|
||||||
|
if (line.startsWith("/*!") && line.endsWith("*/")) {
|
||||||
|
int i = line.indexOf(' ');
|
||||||
|
line = line.substring(i + 1, line.length() - " */".length());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.trim().length() > 0) {
|
||||||
|
executeUpdate(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (st != null) st.close();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.Log.message("found valid database structure!");
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
Log.Log.error("a unhandled SQLexception occured at db structure creation.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.wasteinformationserver.mqtt
|
package com.wasteinformationserver.mqtt
|
||||||
|
|
||||||
|
import com.wasteinformationserver.basicutils.Log
|
||||||
import com.wasteinformationserver.basicutils.Log.Log.debug
|
import com.wasteinformationserver.basicutils.Log.Log.debug
|
||||||
import com.wasteinformationserver.basicutils.Log.Log.error
|
import com.wasteinformationserver.basicutils.Log.Log.error
|
||||||
import com.wasteinformationserver.basicutils.Log.Log.info
|
import com.wasteinformationserver.basicutils.Log.Log.info
|
||||||
@ -19,31 +20,38 @@ import java.util.*
|
|||||||
* @author Lukas Heiligenbrunner
|
* @author Lukas Heiligenbrunner
|
||||||
* @author Gregor Dutzler
|
* @author Gregor Dutzler
|
||||||
*/
|
*/
|
||||||
class MqttService(serverurl: String, port: String) {
|
class MqttService {
|
||||||
private val serveruri: String = "tcp://$serverurl:$port"
|
private var serveruri: String = "";
|
||||||
private var client: MqttClient = MqttClient(serveruri, "JavaSample42")
|
private lateinit var client: MqttClient;
|
||||||
private var db: JDBC = JDBC.getInstance()
|
private var db: JDBC = JDBC.getInstance()
|
||||||
|
|
||||||
/**
|
companion object {
|
||||||
* initial login to db
|
private val obj = MqttService()
|
||||||
*/
|
fun getInstance(): MqttService {
|
||||||
init {
|
return obj;
|
||||||
connectToDb()
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun init(serverurl: String, port: String){
|
||||||
|
serveruri = "tcp://$serverurl:$port"
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* startup of the mqtt service
|
* startup of the mqtt service
|
||||||
*/
|
*/
|
||||||
fun startupService() {
|
fun startupService() {
|
||||||
|
if(JDBC.isConnected()) {
|
||||||
try {
|
try {
|
||||||
client = MqttClient(serveruri, "JavaSample42")
|
client = MqttClient(serveruri, "WasteInformationServerID")
|
||||||
val connOpts = MqttConnectOptions()
|
val connOpts = MqttConnectOptions()
|
||||||
connOpts.isCleanSession = true
|
connOpts.isCleanSession = true
|
||||||
client.connect(connOpts)
|
client.connect(connOpts)
|
||||||
client.setCallback(object : MqttCallback {
|
client.setCallback(object : MqttCallback {
|
||||||
override fun connectionLost(throwable: Throwable) {
|
override fun connectionLost(throwable: Throwable) {
|
||||||
error("connection lost")
|
error("connection lost")
|
||||||
connectToDb()
|
Thread.sleep(500)
|
||||||
|
// restart service
|
||||||
|
startupService()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun messageArrived(s: String, mqttMessage: MqttMessage) {
|
override fun messageArrived(s: String, mqttMessage: MqttMessage) {
|
||||||
@ -52,11 +60,13 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
val res = db.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid")
|
val res = db.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid")
|
||||||
try {
|
try {
|
||||||
res.last()
|
res.last()
|
||||||
if (res.row != 0) { //existing device
|
if (res.row != 0) {
|
||||||
|
// existing device
|
||||||
res.first()
|
res.first()
|
||||||
val devicecities = db.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'")
|
val devicecities = db.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'")
|
||||||
devicecities.last()
|
devicecities.last()
|
||||||
if (devicecities.row == 0) { //not configured
|
if (devicecities.row == 0) {
|
||||||
|
// not configured
|
||||||
tramsmitMessage("$deviceid,-1")
|
tramsmitMessage("$deviceid,-1")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -69,7 +79,8 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { //new device
|
else {
|
||||||
|
// new device
|
||||||
db.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)")
|
db.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)")
|
||||||
info("new device registered to server")
|
info("new device registered to server")
|
||||||
tramsmitMessage("$deviceid,-1")
|
tramsmitMessage("$deviceid,-1")
|
||||||
@ -85,6 +96,9 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
} catch (e: MqttException) {
|
} catch (e: MqttException) {
|
||||||
error("Connection to the Broker failed")
|
error("Connection to the Broker failed")
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
Log.error("could't start mqtt service because of missing db connection!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,7 +112,8 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
val set2 = db.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'")
|
val set2 = db.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'")
|
||||||
try {
|
try {
|
||||||
set2.last()
|
set2.last()
|
||||||
if (set2.row != 1) { //error
|
if (set2.row != 1) {
|
||||||
|
//error
|
||||||
warning("multiple Rows with same city id found - DB Error")
|
warning("multiple Rows with same city id found - DB Error")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -111,7 +126,8 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
val result = db.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid")
|
val result = db.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid")
|
||||||
try {
|
try {
|
||||||
result.last()
|
result.last()
|
||||||
if (result.row == 0) { //if not found in db --> send zero
|
if (result.row == 0) {
|
||||||
|
//if not found in db --> send zero
|
||||||
debug("not found in db")
|
debug("not found in db")
|
||||||
tramsmitMessage("$deviceid,$wastetype,0")
|
tramsmitMessage("$deviceid,$wastetype,0")
|
||||||
}
|
}
|
||||||
@ -130,7 +146,8 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} while (result.next())
|
} while (result.next())
|
||||||
tramsmitMessage("$deviceid,$wastetype,0") //transmit zero if not returned before
|
tramsmitMessage("$deviceid,$wastetype,0")
|
||||||
|
//transmit zero if not returned before
|
||||||
}
|
}
|
||||||
} catch (e: SQLException) {
|
} catch (e: SQLException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
@ -165,11 +182,4 @@ class MqttService(serverurl: String, port: String) {
|
|||||||
else -> 0
|
else -> 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* receives connection object and initial connection to db
|
|
||||||
*/
|
|
||||||
private fun connectToDb() {
|
|
||||||
db = JDBC.getInstance()
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -7,7 +7,6 @@ import com.wasteinformationserver.basicutils.Storage
|
|||||||
import com.wasteinformationserver.db.JDBC
|
import com.wasteinformationserver.db.JDBC
|
||||||
import com.wasteinformationserver.website.HttpTools.Companion.stringToMD5
|
import com.wasteinformationserver.website.HttpTools.Companion.stringToMD5
|
||||||
import com.wasteinformationserver.website.basicrequest.PostRequest
|
import com.wasteinformationserver.website.basicrequest.PostRequest
|
||||||
import java.io.IOException
|
|
||||||
import java.sql.SQLException
|
import java.sql.SQLException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -43,7 +42,7 @@ class LoginRequest : PostRequest() {
|
|||||||
s.last()
|
s.last()
|
||||||
if (s.row == 1) {
|
if (s.row == 1) {
|
||||||
//success
|
//success
|
||||||
if (StringToMD5(password!!) == s.getString("password")) {
|
if (stringToMD5(password!!) == s.getString("password")) {
|
||||||
debug("login success")
|
debug("login success")
|
||||||
LoginState.getObject().logIn()
|
LoginState.getObject().logIn()
|
||||||
LoginState.getObject().setAccountData(username, s.getString("firstName"), s.getString("secondName"), s.getString("email"), s.getInt("permission"))
|
LoginState.getObject().setAccountData(username, s.getString("firstName"), s.getString("secondName"), s.getString("email"), s.getInt("permission"))
|
||||||
|
87
src/resources/db.sql
Normal file
87
src/resources/db.sql
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION */;
|
||||||
|
/*!40101 SET NAMES utf8mb4 */;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE cities
|
||||||
|
(
|
||||||
|
id int(11) NOT NULL,
|
||||||
|
userid int(11) NOT NULL,
|
||||||
|
name varchar(256) NOT NULL,
|
||||||
|
wastetype varchar(64) NOT NULL,
|
||||||
|
zone int(11) NOT NULL
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8;
|
||||||
|
|
||||||
|
CREATE TABLE devices
|
||||||
|
(
|
||||||
|
DeviceID int(11) NOT NULL,
|
||||||
|
CityID int(11) NOT NULL DEFAULT '-1',
|
||||||
|
DeviceName varchar(15) DEFAULT NULL,
|
||||||
|
DeviceLocation varchar(15) DEFAULT NULL
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
CREATE TABLE device_city
|
||||||
|
(
|
||||||
|
DeviceID int(11) NOT NULL,
|
||||||
|
CityID int(11) NOT NULL
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
|
CREATE TABLE pickupdates
|
||||||
|
(
|
||||||
|
id int(11) NOT NULL,
|
||||||
|
citywastezoneid int(11) NOT NULL,
|
||||||
|
pickupdate date NOT NULL
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `user`
|
||||||
|
(
|
||||||
|
id int(11) NOT NULL,
|
||||||
|
username varchar(150) NOT NULL,
|
||||||
|
firstName varchar(32) NOT NULL,
|
||||||
|
secondName varchar(32) NOT NULL,
|
||||||
|
password varchar(32) NOT NULL,
|
||||||
|
permission int(11) NOT NULL DEFAULT '0',
|
||||||
|
email varchar(64) NOT NULL,
|
||||||
|
logindate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
) ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE cities
|
||||||
|
ADD PRIMARY KEY (id);
|
||||||
|
|
||||||
|
ALTER TABLE devices
|
||||||
|
ADD PRIMARY KEY (DeviceID);
|
||||||
|
|
||||||
|
ALTER TABLE pickupdates
|
||||||
|
ADD PRIMARY KEY (id),
|
||||||
|
ADD KEY citywastezoneid (citywastezoneid);
|
||||||
|
|
||||||
|
ALTER TABLE `user`
|
||||||
|
ADD PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE cities
|
||||||
|
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
AUTO_INCREMENT = 143;
|
||||||
|
ALTER TABLE pickupdates
|
||||||
|
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
AUTO_INCREMENT = 67;
|
||||||
|
ALTER TABLE `user`
|
||||||
|
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
AUTO_INCREMENT = 17;
|
||||||
|
|
||||||
|
ALTER TABLE pickupdates
|
||||||
|
ADD CONSTRAINT pickupdates_ibfk_1 FOREIGN KEY (citywastezoneid) REFERENCES cities (id);
|
||||||
|
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT = @OLD_CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS = @OLD_CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET COLLATION_CONNECTION = @OLD_COLLATION_CONNECTION */;
|
@ -269,7 +269,7 @@ class Dashboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(".delbtn").click(function (event) {
|
$(".delbtn").click(function (event) {
|
||||||
var id = event.target.getAttribute("dataid");
|
const id = event.target.getAttribute("dataid");
|
||||||
console.log("clicked btn data " + id);
|
console.log("clicked btn data " + id);
|
||||||
$.post('/senddata/wastedata', 'action=deletecity&id=' + id, function (data) {
|
$.post('/senddata/wastedata', 'action=deletecity&id=' + id, function (data) {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
@ -283,12 +283,12 @@ class Dashboard {
|
|||||||
console.log('Popup closed. ')
|
console.log('Popup closed. ')
|
||||||
|
|
||||||
});
|
});
|
||||||
reloadtable();
|
_this.reloadtable();
|
||||||
} else if (data.status === "dependenciesnotdeleted") {
|
} else if (data.status === "dependenciesnotdeleted") {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: "warning",
|
icon: "warning",
|
||||||
title: 'This city is a dependency of a date',
|
title: 'This city is a dependency of a date',
|
||||||
html: 'Do you want do delete it anyway with all dependencies?',
|
html: 'Please delete all dependencies first!',
|
||||||
}).then((result) => {
|
}).then((result) => {
|
||||||
console.log('Popup closed. ')
|
console.log('Popup closed. ')
|
||||||
|
|
||||||
@ -353,7 +353,7 @@ class Dashboard {
|
|||||||
console.log('Popup closed. ')
|
console.log('Popup closed. ')
|
||||||
|
|
||||||
});
|
});
|
||||||
reloadDateTable();
|
_this.reloadDateTable();
|
||||||
} else if (data.status == "dependenciesnotdeleted") {
|
} else if (data.status == "dependenciesnotdeleted") {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: "warning",
|
icon: "warning",
|
||||||
|
@ -3,19 +3,17 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Login Page</title>
|
<title>Login Page</title>
|
||||||
<!--Made with love by Mutiullah Samim -->
|
|
||||||
|
|
||||||
<!-- Latest compiled and minified CSS -->
|
<!-- Latest compiled and minified CSS -->
|
||||||
<link rel="stylesheet" href="lib/bootstrap.min.css">
|
<link rel="stylesheet" href="lib/bootstrap.min.css">
|
||||||
|
|
||||||
<!-- jQuery library -->
|
<!-- jQuery library -->
|
||||||
<script src="lib/jquery.min.js"></script>
|
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
|
||||||
|
|
||||||
<!-- Popper JS -->
|
<!-- Popper JS -->
|
||||||
<script src="lib/popper.min.js"></script>
|
<script src="lib/popper.min.js"></script>
|
||||||
|
|
||||||
<!-- Latest compiled JavaScript -->
|
<!-- Latest compiled JavaScript -->
|
||||||
<script src="lib/bootstrap.min.js"></script>
|
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
<!--Fontawesome CDN-->
|
<!--Fontawesome CDN-->
|
||||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user