MySql.java

package hhn.temp.project.provider;

import hhn.temp.project.Task;
import hhn.temp.project.TaskStatus;
import hhn.temp.project.expections.SQLNoConectionException;
import hhn.temp.project.expections.SQLStatmentException;
import hhn.temp.project.expections.TaskNotExistsException;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MySql {

  private String user;
  private String password;
  private String db;
  private String host;
  private Connection connection;

  public MySql(String user, String password, String db, String host) {
    this.user = user;
    this.password = password;
    this.db = db;
    this.host = host;
  }

  public void connect() {
    String url = "jdbc:mysql://" + host + ":3306/" + db + "?autoReconnect=true&useSSL=false";

    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
      connection = DriverManager.getConnection(url, user, password);
    } catch (SQLException e) {
      throw new SQLNoConectionException("Cant connect to the database");
    } catch (ClassNotFoundException e) {
      throw new SQLNoConectionException("Cant connect to the database: Driver class not found!");
    }
  }

  public void reset() {
    try {
      PreparedStatement stmt = connection.prepareStatement("TRUNCATE task");
      stmt.executeUpdate();
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant insert data in database");
    }
  }

  public int createTask(String name, String description) {
    try {
      PreparedStatement stmt = connection.prepareStatement("INSERT INTO task ( taskName, taskDescription) VALUES ( ? , ? )", Statement.RETURN_GENERATED_KEYS);
      stmt.setString(1, name);
      stmt.setString(2, description);
      stmt.executeUpdate();
      ResultSet rs = stmt.getGeneratedKeys();
      if(rs.next()) {
        return rs.getInt(1);
      }else{
        throw new SQLStatmentException("Can insert data but not select");
      }
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant insert data in database");
    }
  }

//  public void deleteTask(int id) {
//    try {
//      PreparedStatement stmt = connection.prepareStatement("DELETE task WHERE taskID=?");
//      stmt.setString(1, ""+id);
//      stmt.executeUpdate();
//    } catch (SQLException e) {
//      throw new SQLStatmentException("Cant delete data in database");
//    }
//  }

  public boolean existTask(String name) {
    try {
      PreparedStatement stmt = connection.prepareStatement("Select * FROM task WHERE taskName=?");
      stmt.setString(1, name);
      ResultSet rs = stmt.executeQuery();
      return rs.next();
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant select data from database");
    }
  }

  public boolean existTask(int id) {
    try {
      PreparedStatement stmt = connection.prepareStatement("Select * FROM task WHERE taskID=?");
      stmt.setString(1, ""+id);
      ResultSet rs = stmt.executeQuery();
      return rs.next();
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant select data from database");
    }
  }

  public void deleteTask(String name) {
    try {
      PreparedStatement stmt = connection.prepareStatement("DELETE FROM task WHERE taskName=?");
      stmt.setString(1, name);
      stmt.executeUpdate();
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant delete data in database");
    }
  }

  public void updateDescription(int id, String description) {
    try {
      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskDescription=? WHERE taskID=?");
      stmt.setString(1, description);
      stmt.setString(2, ""+id);
      stmt.executeUpdate();

    } catch (SQLException e) {
      throw new SQLStatmentException("Cant update data in database");
    }
  }
//  public void updateDescription(String name, String description) {
//    try {
//      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskDescription=? WHERE taskName=?");
//      stmt.setString(1, description);
//      stmt.setString(2, name);
//      stmt.executeUpdate();
//
//    } catch (SQLException e) {
//      throw new SQLStatmentException("Cant update data in database");
//    }
//  }
  public void updateStatus(int id, TaskStatus status) {
    try {
      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskStatus=? WHERE taskID=?");
      stmt.setString(1, status.name());
      stmt.setString(2, ""+id);
      stmt.executeUpdate();

    } catch (SQLException e) {
      throw new SQLStatmentException("Cant update data in database");
    }
  }
//  public void updateStatus(String name, TaskStatus status) {
//    try {
//      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskStatus=? WHERE taskName=?");
//      stmt.setString(1, status.name());
//      stmt.setString(2, name);
//      stmt.executeUpdate();
//
//    } catch (SQLException e) {
//      throw new SQLStatmentException("Cant update data in database");
//    }
//  }

  public void updateWorker(int id, String worker) {
    try {
      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskWorker=? WHERE taskID=?");
      stmt.setString(1, worker);
      stmt.setString(2, ""+id);
      stmt.executeUpdate();

    } catch (SQLException e) {
      throw new SQLStatmentException("Cant update data in database");
    }
  }

//  public void updateWorker(String name, String worker) {
//    try {
//      PreparedStatement stmt = connection.prepareStatement("UPDATE task SET taskWorker=? WHERE taskName=?");
//      stmt.setString(1, worker);
//      stmt.setString(2, name);
//      stmt.executeUpdate();
//
//    } catch (SQLException e) {
//      throw new SQLStatmentException("Cant update data in database");
//    }
//  }

  public Task getTask(int id) {
    try {
      PreparedStatement stmt = connection.prepareStatement("SELECT * FROM task WHERE taskID=?");
      stmt.setString(1, ""+id);
      ResultSet rs = stmt.executeQuery();
      if(rs.next()) {
        return getTaskFromDatabase(rs);
      } else {
        throw new TaskNotExistsException("No Task found in databse with id: " + id);
      }
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant select data from database");
    }
  }
  public Task getTask(String name) {
    try {
      PreparedStatement stmt = connection.prepareStatement("SELECT * FROM task WHERE taskName=?");
      stmt.setString(1, name);
      ResultSet rs = stmt.executeQuery();
      if(rs.next()) {
        return getTaskFromDatabase(rs);
      }else{
        throw new TaskNotExistsException("No Task found in databse with name: " + name);
      }

    } catch (SQLException e) {
      throw new SQLStatmentException("Cant select data from database");
    }
  }

  public List<Task> getTaskList() {
    try {
      PreparedStatement stmt = connection.prepareStatement("SELECT * FROM task");
      ResultSet rs = stmt.executeQuery();
      List<Task> taskList = new ArrayList<>();
      while(rs.next()) {
        taskList.add(getTaskFromDatabase(rs));
      }
      return taskList;
    } catch (SQLException e) {
      throw new SQLStatmentException("Cant select data from database");
    }
  }

  private Task getTaskFromDatabase(ResultSet rs) throws SQLException {
    Task task = new Task(rs.getInt("taskID"), rs.getString("taskName"), rs.getString("taskDescription"), rs.getString("taskWorker"),TaskStatus.valueOf(rs.getString("taskStatus")), this);
    return task;
  }
}