/** This method gets a list of roles */
  public List getRoles() throws Exception {
    List roles = new ArrayList();

    ResultSet rs = null;
    Connection conn = null;
    PreparedStatement ps = null;

    try {
      String roleNameColumn = this.extraProperties.getProperty("jdbc.roleNameColumn");
      if (roleNameColumn == null || roleNameColumn.equals("")) roleNameColumn = "ROLE_NAME";

      String roleDescriptionColumn = this.extraProperties.getProperty("jdbc.roleDescriptionColumn");
      if (roleDescriptionColumn == null || roleDescriptionColumn.equals(""))
        roleDescriptionColumn = "ROLE_DESCRIPTION";

      String sql = this.extraProperties.getProperty("jdbc.rolesSQL");
      if (sql == null || sql.equals("")) sql = "SELECT * from ROLE ORDER BY ROLE_NAME";

      conn = getConnection();

      ps = conn.prepareStatement(sql);

      rs = ps.executeQuery();
      while (rs.next()) {
        String roleName = rs.getString(roleNameColumn);
        String description = rs.getString(roleDescriptionColumn);

        InfoGlueRole infoGlueRole = new InfoGlueRole(roleName, description, this);
        roles.add(infoGlueRole);

        logger.info("Role created:" + infoGlueRole.getName());
      }
    } catch (Exception e) {
      logger.info("An error occurred trying to get all roles:" + e);
      throw new SystemException(e.getMessage());
    } finally {
      if (rs != null) {
        try {
          rs.close();
        } catch (SQLException e) {
        }
      }
      if (ps != null) {
        try {
          ps.close();
        } catch (SQLException e) {
        }
      }
      if (conn != null) {
        try {
          conn.close();
        } catch (Exception ex) {
        }
      }
    }

    return roles;
  }
  /** Gets an authorized InfoGlueRole. */
  public InfoGlueRole getAuthorizedInfoGlueRole(String roleName) throws Exception {
    InfoGlueRole infoglueRole = null;

    ResultSet rs = null;
    Connection conn = null;
    PreparedStatement ps = null;

    try {
      String roleDescriptionColumn = this.extraProperties.getProperty("jdbc.roleDescriptionColumn");
      if (roleDescriptionColumn == null || roleDescriptionColumn.equals(""))
        roleDescriptionColumn = "ROLE_DESCRIPTION";

      String sql = this.extraProperties.getProperty("jdbc.roleSQL");
      if (sql == null || sql.equals("")) sql = "SELECT * from ROLE where ROLE.ROLE_NAME = ?";

      conn = getConnection();

      ps = conn.prepareStatement(sql);
      ps.setString(1, roleName);

      rs = ps.executeQuery();
      while (rs.next()) {
        String description = rs.getString(roleDescriptionColumn);

        infoglueRole = new InfoGlueRole(roleName, description, this);
      }

      logger.info("Role created:" + infoglueRole.getName());
    } catch (Exception e) {
      logger.info("An error occurred trying to get jdbc user for " + roleName + ":" + e);
      throw new SystemException(e.getMessage());
    } finally {
      if (rs != null) {
        try {
          rs.close();
        } catch (SQLException e) {
        }
      }
      if (ps != null) {
        try {
          ps.close();
        } catch (SQLException e) {
        }
      }
      if (conn != null) {
        try {
          conn.close();
        } catch (Exception ex) {
        }
      }
    }

    return infoglueRole;
  }
  /** Gets an authorized InfoGlueRole. */
  public InfoGlueRole getAuthorizedInfoGlueRole(String roleName) throws Exception {
    InfoGlueRole infoglueRole = null;

    List<InfoGlueRole> roles = getRoles();
    for (InfoGlueRole infoglueRoleCandidate : roles) {
      if (infoglueRoleCandidate.getName().equals(roleName)) {
        infoglueRole = infoglueRoleCandidate;
        break;
      }
    }

    return infoglueRole;
  }
  /**
   * Gets an authorized InfoGluePrincipal. If the user has logged in with the root-account we
   * immediately return - otherwise we populate it.
   */
  public InfoGluePrincipal getAuthorizedInfoGluePrincipal(String userName) throws Exception {
    logger.info("getAuthorizedInfoGluePrincipal with userName:"******"")) {
      logger.warn("userName was null or empty - fix your templates:" + userName);
      return null;
    }

    InfoGluePrincipal infogluePrincipal = null;

    String administratorUserName = CmsPropertyHandler.getAdministratorUserName();
    String administratorEmail = CmsPropertyHandler.getAdministratorEmail();

    final boolean isAdministrator =
        (userName != null && userName.equalsIgnoreCase(administratorUserName)) ? true : false;
    if (isAdministrator) {
      infogluePrincipal =
          new InfoGluePrincipal(
              userName,
              "System",
              "Administrator",
              administratorEmail,
              new ArrayList(),
              new ArrayList(),
              isAdministrator,
              this);
    } else {
      List roles = new ArrayList();
      List groups = new ArrayList();

      ResultSet rs = null;
      Connection conn = null;
      PreparedStatement ps = null;

      try {
        String userFirstNameColumn = this.extraProperties.getProperty("jdbc.userFirstNameColumn");
        if (userFirstNameColumn == null || userFirstNameColumn.equals(""))
          userFirstNameColumn = "USER_FIRSTNAME";

        String userLastNameColumn = this.extraProperties.getProperty("jdbc.userLastNameColumn");
        if (userLastNameColumn == null || userLastNameColumn.equals(""))
          userLastNameColumn = "USER_LASTNAME";

        String userEmailColumn = this.extraProperties.getProperty("jdbc.userEmailColumn");
        if (userEmailColumn == null || userEmailColumn.equals("")) userEmailColumn = "USER_EMAIL";

        String roleNameColumn = this.extraProperties.getProperty("jdbc.roleNameColumn");
        if (roleNameColumn == null || roleNameColumn.equals("")) roleNameColumn = "ROLE_NAME";

        String roleDescriptionColumn =
            this.extraProperties.getProperty("jdbc.roleDescriptionColumn");
        if (roleDescriptionColumn == null || roleDescriptionColumn.equals(""))
          roleDescriptionColumn = "ROLE_DESCRIPTION";

        String sql = this.extraProperties.getProperty("jdbc.userRolesSQL");
        if (sql == null || sql.equals(""))
          sql =
              "SELECT * from USER, ROLE_USER, ROLE where ROLE_USER.USER = USER.ID AND ROLE_USER.ROLE = ROLE.ID AND USER.USER_NAME = ?";

        conn = getConnection();

        ps = conn.prepareStatement(sql);
        ps.setString(1, userName);

        rs = ps.executeQuery();
        while (rs.next()) {
          logger.info("infoGluePrincipal:" + infogluePrincipal);
          if (infogluePrincipal != null) {
            String roleName = rs.getString(roleNameColumn);
            String description = rs.getString(roleDescriptionColumn);

            InfoGlueRole infoGlueRole = new InfoGlueRole(roleName, description, this);
            infogluePrincipal.getRoles().add(infoGlueRole);
            logger.info("Added role:" + infoGlueRole.getName());
          } else {
            String userFirstName = rs.getString(userFirstNameColumn);
            String userLastName = rs.getString(userLastNameColumn);
            String userEmail = rs.getString(userEmailColumn);

            if (userFirstName == null) userFirstName = userName;

            if (userLastName == null) userLastName = userName;

            if (userEmail == null) userEmail = userName;

            String roleName = rs.getString(roleNameColumn);
            String description = rs.getString(roleDescriptionColumn);

            InfoGlueRole infoGlueRole = new InfoGlueRole(roleName, description, this);

            infogluePrincipal =
                new InfoGluePrincipal(
                    userName,
                    userFirstName,
                    userLastName,
                    userEmail,
                    new ArrayList(),
                    groups,
                    false,
                    this);
            infogluePrincipal.getRoles().add(infoGlueRole);

            logger.info("User read:" + infogluePrincipal.getName());
          }
        }

      } catch (Exception e) {
        e.printStackTrace();
        logger.info("An error occurred trying to get jdbc user for " + userName + ":" + e);
        throw new SystemException(e.getMessage());
      } finally {
        if (rs != null) {
          try {
            rs.close();
          } catch (SQLException e) {
          }
        }
        if (ps != null) {
          try {
            ps.close();
          } catch (SQLException e) {
          }
        }
        if (conn != null) {
          try {
            conn.close();
          } catch (Exception ex) {
          }
        }
      }

      logger.info("returning from getAuthorizedInfoGluePrincipal with userName:" + userName);
    }

    return infogluePrincipal;
  }