@Override
  public iTask[] getTasksByProject(Project pi) throws RemoteException, nqException {
    PreparedStatement stat;
    try {
      stat =
          this.con.prepareStatement(
              "SELECT `idTask`, `idProject`, `idUserCreatedBy`, `idUserAssignedTo`, `idParentTask`, `TaskStatus`, `Title`,"
                  + " `Description`, `Priority`, `CreationDate`, `DeadlineDate`, `MaxHours`, `isSubTask`, `Rating` "
                  + "FROM Tasks WHERE isSubTask = 0 AND idProject = ?");

      stat.setInt(1, pi.getID());

      return TaskManager.getTasks(stat, this.con);
    } catch (SQLException ex) {
      throw new nqException(nqExceptionType.ServerError, "Server error : ".concat(ex.getMessage()));
    }
  }
  @Override
  public iTask createTask(
      Project proj,
      iTask parent,
      String title,
      String description,
      int priority,
      Date deadline,
      int maxhours,
      Ability[] ablist)
      throws RemoteException, nqException {
    System.out.printf("Create task, parent = %s\n", parent == null ? "null" : "something");

    PreparedStatement stat;
    try {
      stat =
          this.con.prepareStatement(
              "INSERT INTO `Tasks` "
                  + "(`idProject`, `idUserCreatedBy`, `idParentTask`, `TaskStatus`, `Title`, `Description`, `Priority`, `CreationDate`, `DeadlineDate`, `MaxHours`, `isSubTask`) VALUES"
                  + " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
              Statement.RETURN_GENERATED_KEYS);

      stat.setInt(1, proj.getID());
      stat.setInt(2, this.u.getID());
      stat.setInt(
          3,
          parent == null
              ? -1
              : ((parent instanceof Task)
                  ? ((Task) parent).getID()
                  : taskPool.get().getimpl(parent).getID()));

      stat.setString(4, eTaskStatus.CREATED.toString());
      stat.setString(5, title);
      stat.setString(6, description);
      stat.setInt(7, priority);
      stat.setObject(8, new Date());
      stat.setObject(9, deadline);
      stat.setInt(10, maxhours);
      stat.setBoolean(11, parent != null);

      if (stat.executeUpdate() != 1) {
        throw new nqException(nqExceptionType.DBError, "DB error");
      }

      int id = -1;

      ResultSet rs = stat.getGeneratedKeys();
      while (rs.next()) {
        if (id != -1) {
          throw new nqException(nqExceptionType.DBError, "Frozen universe broke killed my cat");
        }

        id = rs.getInt(1);
        if (ablist != null) {
          for (Ability ab : ablist) {
            stat =
                this.con.prepareStatement(
                    "INSERT INTO `TaskAbility` (`idTask`, `idAbility`, `Level`) VALUES (?, ?, ?)");
            stat.setInt(1, id);
            stat.setInt(2, ab.getID());
            stat.setInt(3, ab.getLevel());
          }
        }
      }

      if (id != -1) {
        return TaskManager.getTaskByID(id, con);
      }

      throw new nqException(nqExceptionType.ServerError, "Server error : nothing created..");
    } catch (SQLException ex) {
      throw new nqException(nqExceptionType.ServerError, "Server error : ".concat(ex.getMessage()));
    }
  }