@Override
  public Project makeEntity(Session s, String content) throws WPISuiteException {
    User theUser = s.getUser();

    logger.log(Level.FINER, "Attempting new Project creation...");

    Project p;
    try {
      p = Project.fromJSON(content);
    } catch (JsonSyntaxException e) {
      logger.log(Level.WARNING, "Invalid Project entity creation string.");
      throw new BadRequestException(
          "The entity creation string had invalid format. Entity String: " + content);
    }

    logger.log(Level.FINE, "New project: " + p.getName() + " submitted by: " + theUser.getName());
    p.setOwner(theUser);

    if (getEntity(s, p.getIdNum())[0] == null) {
      if (getEntityByName(s, p.getName())[0] == null) {
        save(s, p);
      } else {
        logger.log(Level.WARNING, "Project Name Conflict Exception during Project creation.");
        throw new ConflictException(
            "A project with the given name already exists. Entity String: " + content);
      }
    } else {
      logger.log(Level.WARNING, "ID Conflict Exception during Project creation.");
      throw new ConflictException(
          "A project with the given ID already exists. Entity String: " + content);
    }

    logger.log(Level.FINER, "Project creation success!");
    return p;
  }
 @Override
 public void deleteAll(Session s) throws WPISuiteException {
   User theUser = s.getUser();
   logger.log(Level.INFO, "ProjectManager invoking DeleteAll...");
   if (theUser.getRole().equals(Role.ADMIN)) {
     data.deleteAll(new Project("", ""));
   } else {
     logger.log(
         Level.WARNING, "ProjectManager DeleteAll attempted by user with insufficient permission");
     throw new UnauthorizedException(
         "You do not have the required permissions to perform this action.");
   }
 }
  public Project update(Session s, Project toUpdate, String changeSet) throws WPISuiteException {
    if (s == null) {
      throw new WPISuiteException("Null session.");
    }

    User theUser = s.getUser();
    if (theUser.equals(toUpdate.getOwner()) || theUser.getRole().equals(Role.ADMIN)) {

      // convert updateString into a Map, then load into the User
      try {
        logger.log(Level.FINE, "Project update being attempted...");
        Project change = Project.fromJSON(changeSet);

        // check if the changes contains each field of name
        if (change.getName() != null && !change.getName().equals("")) {
          // check for conflict for changing the project name
          Project isConflict = getEntityByName(s, change.getName())[0];
          if (isConflict != null && !isConflict.getIdNum().equals(change.getIdNum())) {
            throw new ConflictException(
                "ProjectManager attempted to update a Project's name to be the same as an existing project");
          }

          toUpdate.setName(change.getName());
        }

        if (change.getOwner() != null) {
          toUpdate.setOwner(change.getOwner());
        }
      } catch (ConflictException e) {
        logger.log(
            Level.WARNING,
            "ProjectManager attempted to update a Project's name to be the same as an existing project");
        throw e;
      } catch (Exception e) {
        logger.log(Level.WARNING, "ProjectManager.update() had a failure in the changeset mapper.");
        throw new DatabaseException(
            "Failure in the ProjectManager.update() changeset mapper."); // on Mapping failure
      }

      // save the changes back
      this.save(s, toUpdate);

      // check for changes in each field
      return toUpdate;
    } else {
      logger.log(Level.WARNING, "Unauthorized Project update attempted.");
      throw new UnauthorizedException(
          "You do not have the required permissions to perform this action.");
    }
  }
  @Override
  public boolean deleteEntity(Session s1, String id) throws WPISuiteException {
    if (s1 == null) {
      throw new WPISuiteException("Null Session.");
    }
    User theUser = s1.getUser();
    Project[] model = this.getEntity(id);
    if (model[0].getPermission(theUser).equals(Permission.WRITE)
        || theUser.getRole().equals(Role.ADMIN)) {
      Model m = data.delete(data.retrieve(project, "idNum", id).get(0));
      logger.log(Level.INFO, "ProjectManager deleting project <" + id + ">");

      return (m != null) ? true : false;
    } else {
      logger.log(
          Level.WARNING, "ProjectManager Delete attempted by user with insufficient permission");
      throw new UnauthorizedException(
          "You do not have the required permissions to perform this action.");
    }
  }